Download presentation
Presentation is loading. Please wait.
1
IoT(사물인터넷) 보안 2016년 2학기 3. 라즈베리파이 gpio
2
3. 라즈베리파이 GPIO
3
GPIO 기본 연결 방법
4
GPIO
5
GPIO
6
GPIO Extension Board
7
$ gpio readall
8
센서 종류
9
3가지 구현 프로그래밍 1. C 프로그래밍 2. node.js 프로그래밍 3. python 프로그래밍
루트 폴더에 프로젝트용 하부 폴더 작성 $ mkdir rpi $ mkdir c $ mkdir node $ mkdir python
10
3.1 LED 점등 예제 단자가 긴 쪽이 (+) LED소자의 깎인 쪽이 (-)
11
Breadboard (빵판) 납땜없이 회로를 손쉽게 구성 선 방향으로 회로 연결됨 - GND 연결 + VCC 연결
12
저항 (register) 성능이 낮은 전도체의 양쪽 끝 또는 측면에 도선이나 전 도체 2개가 붙어있는 형태로 되어 있음 단위는 옴(ohm) 이며, 기호로는 그리스어의 오메가를 사용 용도 캐패시터 충전율 제한 양극성 트랜지스터와 같은 반도체 부품의 전압 제어 LED 또는 기타 반도체 부품의 과다 전류 방지 다른 부품과 결합하여 사용하는 오디오 회로에서 주파수 응답의 조정 또는 제한 디지털 논리 회로에 입력되는 전압의 풀업 저항 또는 풀다운 저 항용 회로 내 한 지점에서의 전압 제어용
13
저항 (register)
14
회로 구성 GPIO.BOARD - 11번 GPIO.BCM – 17번 wiringPI GPIO – 0번
LED 불빛을 밝게 하려면 저항값이 작은 저항을 이용
15
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
16
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); }
17
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
18
Python GPIO 번호 GPIO.BOARD GPIO.BCM Broadcom SOC channel
19
LED Blink – node.js 개발 회로 구성
20
회로 구성
21
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); }
22
3.2 LED+스위치 활용 스위치와 LED를 이용한 활용
Yellow, Red, Green 3개의 LED를 3개의 스위치에 연결 스위치를 누르면 LED가 잠시 켜지도록 구성 프로그래밍에 의한 SW적인 스위치 동작
23
LED+스위치 활용 회로 구성
24
LED+스위치 활용 3.3v GND
25
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);
26
3.3 초음파 센서 제어 초음파 센서 제어 초음파 센서를 이용한 거리 측정 가까운 거리에 물체 또는 사람이 있는지 확인 음파를 발사하여 반사되는 신호의 시간을 측정하여 거리를 계산 거리 = uS / 58 centimeters HC-SR04 5V Supply Trigger Pulse Input Echo Pulse Output 0V Ground
27
초음파 센서 제어 회로 구성 VCC 위치 확인 GND 위치 확인
28
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);
29
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++;
30
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( ) 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()
31
초음파센서+LED 초음파센서와 LED의 결합 활용 접근을 감지하면 LED에 불을 켜도록 만들어보자.
앞의 두가지 소스를 결합 활용
32
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);
33
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++;
34
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( ) 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()
35
3.4 적외선 물체감지센서 제어 적외선 물체감지센서 제어
적외선을 이용하여 물체 존재를 감지
36
적외선 물체감지센서 제어 회로 구성
37
적외선 물체감지센서 제어 $ 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;
38
3.5 온습도 센서 온습도 센서 DHT11 제품에 따라 핀 배치가 다르므로 주의
39
온습도 센서 회로 연결 VCC GND DOUT: GPIO 23
40
패키지 설치 Adafruit 패키지 설치 테스트
$ git clone $ cd Adafruit_Python_DHT $ sudo python setup.py install 테스트 $ cd Adafruit_Python_DHT #소스코드 다운로드한 곳으로 이동 $ cd examples $ sudo ./AdafruitDHT.py # 온도센서는 DHT11이고 GPIO 포트는 2번으로 설정 $ sudo ./AdafruitDHT.py 11 23 Temp=31.0* Humidity=41.0% $ 실행 파일
41
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." $ sudo python dht.py Temp=31.0*C Humidity=41.0% $
42
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"
43
GPIO GUI 스위치 Raspberry Pi Node.js Server - GPIO GUI 방법
webserver-control-gpios/ 그래픽 UI를 이용한 스위치 조작 방법 $ git clone Web-GPIO-GUI $ cd Raspberry-Pi-Simple-Web-GPIO-GUI $ npm install $ sudo npm start 또는 sudo node ./bin/www
44
GPIO GUI 스위치 사용된 기술 Node.js Express Ajax Bootstrap Jade
Similar presentations