IoT(사물인터넷) 보안 2016년 2학기 3. 라즈베리파이 gpio
3. 라즈베리파이 GPIO
GPIO 기본 연결 방법
GPIO
GPIO
GPIO Extension Board
$ gpio readall
센서 종류
3가지 구현 프로그래밍 1. C 프로그래밍 2. node.js 프로그래밍 3. python 프로그래밍 루트 폴더에 프로젝트용 하부 폴더 작성 $ mkdir rpi $ mkdir c $ mkdir node $ mkdir python
3.1 LED 점등 예제 단자가 긴 쪽이 (+) LED소자의 깎인 쪽이 (-)
Breadboard (빵판) 납땜없이 회로를 손쉽게 구성 선 방향으로 회로 연결됨 - GND 연결 + VCC 연결
저항 (register) 성능이 낮은 전도체의 양쪽 끝 또는 측면에 도선이나 전 도체 2개가 붙어있는 형태로 되어 있음 단위는 옴(ohm) 이며, 기호로는 그리스어의 오메가를 사용 용도 캐패시터 충전율 제한 양극성 트랜지스터와 같은 반도체 부품의 전압 제어 LED 또는 기타 반도체 부품의 과다 전류 방지 다른 부품과 결합하여 사용하는 오디오 회로에서 주파수 응답의 조정 또는 제한 디지털 논리 회로에 입력되는 전압의 풀업 저항 또는 풀다운 저 항용 회로 내 한 지점에서의 전압 제어용
저항 (register)
회로 구성 GPIO.BOARD - 11번 GPIO.BCM – 17번 wiringPI GPIO – 0번 LED 불빛을 밝게 하려면 저항값이 작은 저항을 이용 http://blog.naver.com/elepartsblog/220284169123
blink.c - C언어 개발 blink.c // blink.c #include <wiringPi.h> int main(void) { wiringPiSetup(); int pin=0; pinMode(pin, OUTPUT); for(;;) { digitalWrite(pin, HIGH); delay(1000); digitalWrite(pin, LOW); } return 0; } wiringPi 설치 $ sudo apt-get install wiringpi 소스 작성 $ nano blink.c 컴파일 $ gcc -Wall -o blink blink.c -lwiringPi 실행 $ sudo ./blink
blink.js – node.js 개발 $ cd rpi/node 패키지 설치 소스 작성 실행 $ npm install wiring-pi $ npm install sleep node_modules 폴더에 설치됨 소스 작성 $ vi blink.js 실행 $ sudo node blink.js 루트 권한이어야 실행 가능 컴파일 없이 직접 실행 // blink.js var wpi = require('wiring-pi'); var sleep = require('sleep'); wpi.setup('gpio'); wpi.wiringPiSetup(); wpi.pinMode(0, wpi.OUTPUT); while(true) { wpi.digitalWrite(0, wpi.HIGH); sleep.sleep(1); wpi.digitalWrite(0, wpi.LOW); }
blink.py – python 개발 $ cd rpi/python 소스 작성 실행 $ vi blink.py $ sudo python blink.py 컴파일 없이 직접 실행 import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) pin = 11 GPIO.setup(pin, GPIO.OUT) try: while True: GPIO.output(pin, True) time.sleep(1) GPIO.output(pin, False) finally: print("Cleaning up") GPIO.cleanup() GPIO.setmode(GPIO.BOARD) pin = 11 GPIO.setmode(GPIO.BCM) pin = 17
Python GPIO 번호 GPIO.BOARD GPIO.BCM Broadcom SOC channel
LED Blink – node.js 개발 회로 구성
회로 구성
LED 제어 프로그래밍 LED 제어 프로그램 패키지 설치 소스 작성 실행 두개의 LED를 번갈아 켜고 끄기 $ npm install wiring-pi $ npm install sleep 소스 작성 $ vi led.js 실행 $ sudo node led.js 루트 권한이어야 실행 가능 // led.js 파일 var wpi = require('wiring-pi'); var sleep = require('sleep'); wpi.setup('gpio'); wpi.wiringPiSetup(); wpi.pinMode(3, wpi.OUTPUT); wpi.pinMode(4, wpi.OUTPUT); while(true) { wpi.digitalWrite(3, wpi.LOW); wpi.digitalWrite(4, wpi.HIGH); sleep.sleep(1); wpi.digitalWrite(4, wpi.LOW); wpi.digitalWrite(3, wpi.HIGH); }
3.2 LED+스위치 활용 스위치와 LED를 이용한 활용 http://blog.naver.com/elepartsblog/220285369508 Yellow, Red, Green 3개의 LED를 3개의 스위치에 연결 스위치를 누르면 LED가 잠시 켜지도록 구성 프로그래밍에 의한 SW적인 스위치 동작
LED+스위치 활용 회로 구성
LED+스위치 활용 3.3v GND
LED+스위치 활용 $ vi sw-led.c for(;;) { digitalWrite(LED_Y, 0); { digitalWrite(LED_Y, 0); digitalWrite(LED_R, 0); digitalWrite(LED_G, 0); if(digitalRead(SW_Y)==0) { digitalWrite(LED_Y, 1); delay(1000); } if(digitalRead(SW_R)==0) { digitalWrite(LED_R, 1); if(digitalRead(SW_G)==0) { digitalWrite(LED_G, 1); } return 0; } #include <stdio.h> #include <wiringPi.h> #define SW_Y 21 // GPIO 5 Yellow SW #define SW_R 22 // GPIO 6 Red SW #define SW_G 23 // GPIO 13 Green SW #define LED_Y 27 // GPIO 16 Yellow LED #define LED_R 28 // GPIO 20 Red LED #define LED_G 29 // GPIO 21 Green LED int main(void) { // if(wiringPiSetup()== -1) return 1; wiringPiSetup(); pinMode(SW_Y, INPUT); pinMode(SW_R, INPUT); pinMode(SW_G, INPUT); pinMode(LED_Y, OUTPUT); pinMode(LED_R, OUTPUT); pinMode(LED_G, OUTPUT);
3.3 초음파 센서 제어 초음파 센서 제어 http://blog.naver.com/elepartsblog/220288246775 초음파 센서를 이용한 거리 측정 가까운 거리에 물체 또는 사람이 있는지 확인 음파를 발사하여 반사되는 신호의 시간을 측정하여 거리를 계산 거리 = uS / 58 centimeters HC-SR04 5V Supply Trigger Pulse Input Echo Pulse Output 0V Ground
초음파 센서 제어 회로 구성 VCC 위치 확인 GND 위치 확인
sonic.c for(;;) #include <stdio.h> { #include <wiringPi.h> { digitalWrite(TRIG,LOW); usleep(2); digitalWrite(TRIG,HIGH); usleep(20); while(digitalRead(ECHO)==LOW); long startTime = micros(); while(digitalRead(ECHO)==HIGH); long travelTime = micros() - startTime; int distance = travelTime / 58; printf("Distance %3d : %d cm \n", i, distance); i++; delay(500); } } #include <stdio.h> #include <wiringPi.h> #define TRIG 5 #define ECHO 4 int main(void) { int distance = 0; int pulse = 0; int i=0; if(wiringPiSetup()==-1) return 1; pinMode(TRIG,OUTPUT); pinMode(ECHO,INPUT);
Sonic.js // sonic.js var wpi = require("wiring-pi"); var sleep = require("sleep"); var microtime = require('microtime'); var TRIG = 5; var ECHO = 4; wpi.setup('gpio'); wpi.wiringPiSetup(); wpi.pinMode(TRIG, wpi.OUTPUT); wpi.pinMode(ECHO, wpi.INPUT); function getDistance(TRIG, ECHO) { wpi.digitalWrite(TRIG, wpi.LOW); sleep.usleep(2); wpi.digitalWrite(TRIG, wpi.HIGH); sleep.usleep(20); while(wpi.digitalRead(ECHO) == wpi.LOW); var startTime = microtime.now(); while(wpi.digitalRead(ECHO) == wpi.HIGH); var endTime = microtime.now(); var travelTime = endTime - startTime; var distance = travelTime/58; return distance; } var i = 0; while(true) { var d = Math.round(getDistance(TRIG, ECHO)); console.log("Distance "+i+" : "+ d + " cm"); sleep.sleep(1); i++;
Sonic.py import RPi.GPIO as GPIO try: import time while True: GPIO.setmode(GPIO.BOARD) trig = 18 echo = 16 GPIO.setup(trig, GPIO.OUT) GPIO.setup(echo, GPIO.IN) distance = 0 i = 0 try: while True: GPIO.output(trig, False) time.sleep(0.5) GPIO.output(trig, True) time.sleep(0.00001) while GPIO.input(echo)==0 : timeStart = time.time() while GPIO.input(echo)==1 : timeEnd = time.time() travelTime = timeEnd - timeStart distance = travelTime * 17000 distance = round(distance, 2) print "Distance : ", distance, " cm" time.sleep(1) finally: print("Cleaning up") GPIO.cleanup()
초음파센서+LED 초음파센서와 LED의 결합 활용 접근을 감지하면 LED에 불을 켜도록 만들어보자. 앞의 두가지 소스를 결합 활용
sonic-led.c for(;;) { digitalWrite(TRIG,LOW); usleep(2); { digitalWrite(TRIG,LOW); usleep(2); digitalWrite(TRIG,HIGH); usleep(20); while(digitalRead(ECHO)==LOW); long startTime = micros(); while(digitalRead(ECHO)==HIGH); long travelTime = micros() - startTime; int distance = travelTime / 58; printf("Distance %3d : %d cm \n", i, distance); if (distance < 10) { digitalWrite(pin, HIGH); delay(500); digitalWrite(pin, LOW); } i++; delay(500); } } #include <stdio.h> #include <wiringPi.h> #define TRIG 5 #define ECHO 4 #define pin 0 int main(void) { int distance = 0; int pulse = 0; int i=0; if(wiringPiSetup()==-1) return 1; pinMode(TRIG,OUTPUT); pinMode(ECHO,INPUT); pinMode(pin,OUTPUT);
sonic-led.js // sonic.js var wpi = require("wiring-pi"); var sleep = require("sleep"); var microtime = require('microtime'); var TRIG = 5; var ECHO = 4; var led = 0; wpi.setup('gpio'); wpi.wiringPiSetup(); wpi.pinMode(TRIG, wpi.OUTPUT); wpi.pinMode(ECHO, wpi.INPUT); wpi.pinMode(led, wpi.OUTPUT); function getDistance(TRIG, ECHO) { wpi.digitalWrite(TRIG, wpi.LOW); sleep.usleep(2); wpi.digitalWrite(TRIG, wpi.HIGH); sleep.usleep(20); while(wpi.digitalRead(ECHO) == wpi.LOW); var startTime = microtime.now(); while(wpi.digitalRead(ECHO) == wpi.HIGH); var endTime = microtime.now(); var travelTime = endTime - startTime; var distance = travelTime/58; return distance; } var i = 0; wpi.digitalWrite(led, wpi.LOW); while(true) { var d = Math.round(getDistance(TRIG, ECHO)); console.log("Distance "+i+" : "+ d + " cm"); if (d < 10) { wpi.digitalWrite(led, wpi.HIGH); sleep.sleep(1); console.log(" - LED on"); } i++;
sonic-led.py try: import RPi.GPIO as GPIO while True: import time GPIO.setmode(GPIO.BOARD) led = 11 trig = 18 echo = 16 GPIO.setup(led, GPIO.OUT) GPIO.setup(trig, GPIO.OUT) GPIO.setup(echo, GPIO.IN) distance = 0 i = 0 try: while True: GPIO.output(trig, False) time.sleep(0.5) GPIO.output(trig, True) time.sleep(0.00001) while GPIO.input(echo)==0 : timeStart = time.time() while GPIO.input(echo)==1 : timeEnd = time.time() travelTime = timeEnd - timeStart distance = travelTime * 17000 distance = round(distance, 2) print "Distance : ", distance, " cm" if distance < 10 : GPIO.output(led, True) GPIO.output(led, False) print " -- LED on " time.sleep(1) finally: print("Cleaning up") GPIO.cleanup()
3.4 적외선 물체감지센서 제어 적외선 물체감지센서 제어 http://blog.naver.com/elepartsblog/220294594150 적외선을 이용하여 물체 존재를 감지
적외선 물체감지센서 제어 회로 구성
적외선 물체감지센서 제어 $ vi pir.c #include <stdio.h> #include <wiringPi.h> #define PIR 4 // BCM_GPIO 23 int main(void) { if(wiringPiSetup()==-1) return 1; pinMode(PIR, INPUT); for(;;) if(digitalRead(PIR)==0) { printf("Detected \n"); delay(1000); } else { printf(" -- not detected \n"); return 0;
3.5 온습도 센서 온습도 센서 DHT11 제품에 따라 핀 배치가 다르므로 주의
온습도 센서 회로 연결 VCC GND DOUT: GPIO 23
패키지 설치 Adafruit 패키지 설치 테스트 $ git clone https://github.com/adafruit/Adafruit_Python_DHT.git $ cd Adafruit_Python_DHT $ sudo python setup.py install 테스트 $ cd Adafruit_Python_DHT #소스코드 다운로드한 곳으로 이동 $ cd examples $ sudo ./AdafruitDHT.py 11 23 # 온도센서는 DHT11이고 GPIO 포트는 2번으로 설정 pi@rpi-sultan:~/rpi/python/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 23 Temp=31.0* Humidity=41.0% pi@rpi-sultan:~/rpi/python/Adafruit_Python_DHT/examples $ 실행 파일
dht.py 코드 작성 실행 $ vi dht.py import Adafruit_DHT sensor = Adafruit_DHT.DHT11 # GPIO23 (pin no: #16) pin = 23 humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) if humidity is not None and temperature is not None: print "Temp={0:0.1f}*C Humidity={1:0.1f}%".format(temperature, humidity) else: print "Failed to get reading." pi@rpi-sultan:~/rpi/python/Adafruit_Python_DHT/examples $ sudo python dht.py Temp=31.0*C Humidity=41.0% pi@rpi-sultan:~/rpi/python/Adafruit_Python_DHT/examples $
dht.py import Adafruit_DHT import time sensor = Adafruit_DHT.DHT11 # GPIO23 (pin no: #16) pin = 23 try: while True: humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) print "Temp={0:0.1f}*C Humidity={1:0.1f}%".format(temperature, humidity) time.sleep(3) finally: print "Cleaning up"
GPIO GUI 스위치 Raspberry Pi Node.js Server - GPIO GUI 방법 https://www.youtube.com/watch?v=sRuG9X2dEOo https://tutorials-raspberrypi.com/setup-raspberry-pi-node-js- webserver-control-gpios/ 그래픽 UI를 이용한 스위치 조작 방법 $ git clone https://github.com/tutRPi/Raspberry-Pi-Simple- Web-GPIO-GUI $ cd Raspberry-Pi-Simple-Web-GPIO-GUI $ npm install $ sudo npm start 또는 sudo node ./bin/www
GPIO GUI 스위치 사용된 기술 Node.js Express Ajax Bootstrap Jade