제어기 활용 -GPIO Ch.05 RaspberryPi Sejin Oh
Raspberry Pi 제어기 활용 -GPIO GPIO (General Purpose Input Output) 마이크로프로세서가 주변장치와 통신하기 위해 범용으로 사용되는 입출력 포트 입력과 출력을 마음대로 선택할 수 있고, 0 과 1 의 출력 신호를 임의로 만들어줄 수 있는 구조를 가진다. GPIO 라이브러리 라즈베리 파이의 GPIO 를 제어할 수 있는 언어 C, C++, C#, Python Perl, Ruby, Java 등 매우 다양함 각 언어에 따라 사용자들이 GPIO 라이브러리를 제작하여 공유하고 있다. wiringPi : 공개된 라이브러리 중 GPIO 제어 속도가 빠름 2 GPIO
Raspberry Pi 제어기 활용 -GPIO Raspberry Pi b+ GPIO 핀 배치 3 GPIO
Raspberry Pi 제어기 활용 -GPIO 1. 라즈베리 파이의 업데이트 및 업그레이드 실시 2. 소스 관리 툴인 git 을 다운로드 3.Git 을 이용하여 “Wiring Pi” 라이브러리를 다운로드 4 GPIO Library 설치 $ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install git-core $ git clone git://git.drogon.net/wiringPi
Raspberry Pi 제어기 활용 -GPIO 4. 빌드 및 설치 진행 5. 설치 확인 5 GPIO Library 설치 $ cd wiringPi $./build $ gpio -v 설치 확인 ( 예시 ) Gpio version: 2.08 Copyright © Gordon Henderson This is free software with ABSOLUTELY NO WARRANTY For details type: gpio –warranty This Raspberry Pi is a reversion 2 board
Raspberry Pi 제어기 활용 -GPIO GPIO 의 출력을 이용하여 LED on/off 제어 테스트 LED 회로를 구성하여 GPIO 에 High 값을 출력해주면 LED 는 켜짐 GPIO 에 Low 값을 출력하게 되면 LED 는 꺼짐 LED 2 개, 저항 220Ω 2 개, GPIO 23 번 핀, 24 번 핀 이용 6 GPIO 출력 테스트
Raspberry Pi 제어기 활용 -GPIO 1. 작업 폴더 생성 및 이동 2. 프로그램 작성 7 GPIO 출력 테스트 $ mkdir gpio $ cd gpio $ sudo nano output.c
Raspberry Pi 제어기 활용 -GPIO 8 GPIO 출력 테스트 #include #define LED1 23 #define LED2 24 int main(void) { if(wiringPiSetupGpio()==-1) return 1; pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); while(1) { digitalWrite(LED1, 1); digitalWrite(LED2, 1); delay(500); // ms digitalWrite(LED1, 0); digitalWrite(LED2, 0); delay(500); } return 0; }
Raspberry Pi 제어기 활용 -GPIO 3. 프로그램 빌드 4. 프로그램 실행 9 GPIO 출력 테스트 $ gcc –o output output.c -lwiringPi $ sudo./output
Raspberry Pi 제어기 활용 -GPIO python 을 이용한 LED on/off 테스트 $ sudo python 10 GPIO 출력 테스트 import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(23, GPIO.OUT) GPIO.setup(24, GPIO.OUT) while (True): GPIO.output(23, True) GPIO.output(24, True) time.sleep(0.5) GPIO.output(23, False) GPIO.output(24, False) time.sleep(0.5)
Raspberry Pi 제어기 활용 -GPIO 스위치 회로 스위치의 on/off 신호에 따라 LED 가 켜지고 꺼지는 실습 GPIO 입력 테스트에 사용될 GPIO 는 25 번 스위치에 10KΩ 연결 11 GPIO 입력 테스트
Raspberry Pi 제어기 활용 -GPIO 프로그램 작성 1. 작업 폴더로 이동 $ sudo cd ~/gpio 2. 프로그램 작성 $ sudo nano input.c 12 GPIO 입력 테스트 #include #define LED 23 //gpio 23 #define LED 24 //gpio 24 #define SW 25 //gpio 25 int main(void) { if(wiringPiSetupGpio() == -1) return 1; pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(SW, INPUT); while(1) { digitalWrite(LED1, 0); digitalWrite(LED2, 0); if(digitalRead(SW) == 1) { digitalWrite(LED1, 1); digitalWrite(LED2, 1); delay(1000); } return 0; }
Raspberry Pi 제어기 활용 -GPIO 프로그램 작성 3. 프로그램 빌드 $ sudo –o input input.c -lwiringPi 4. 프로그램 실행 $ sudo./input 13 GPIO 입력 테스트
Raspberry Pi 제어기 활용 -GPIO 초음파 센서 우선 trigger 핀에서 10us 정도의 High 신호를 주면 초음파 센서는 40Khz 펄스를 자동으로 8 번 발생시킴 펄스 발생 후 echo 핀은 High 로 되고 반사된 초음파가 감지될때 Low 가 됨 거리 측정 echo 핀이 High 에서 Low 로 걸리는 시간을 측정 측정된 시간을 초음파의 속도 ( 즉, 58) 로 나누면 거리가 측정됨 14 Ultra Sonic Sensor
Raspberry Pi 제어기 활용 -GPIO 15 Ultra Sonic Sensor VCC 5V 연결 GND GND 연결 Echo GPIO 23 연결 Trigger GPIO 24 연결
Raspberry Pi 제어기 활용 -GPIO 16 Ultra Sonic Sensor – ultrasonic.c #include #define TRIG 24 #define ECHO 23 int main(void) { int distance = 0; int pulse = 0; if(wiringPiSetupGpio() == -1) return 1; pinMode(TRIG,OUTPUT); pinMode(ECHO,INPUT); for(;;){ digitalWrite(TRIG,LOW); usleep(2); digitalWrite(TRIG,HIGH); usleep(20); digitalWrite(TRIG,LOW); while(digitalRead(ECHO) == LOW); long startTime = micros(); while(digitalRead(ECHO) == HIGH); long travelTime = micros() - startTime; int distance = travelTime / 58; printf("Distance: %d cm\n", distance); delay(100); }
Raspberry Pi 제어기 활용 -GPIO 17 Ultra Sonic Sensor
Raspberry Pi 제어기 활용 -GPIO 온습도 센서 (DHT11 Sensor) 18 온습도 센서 VCC 3V 연결 GND GND 연결 Data GPIO 4 연결 Resistance10K
Raspberry Pi 제어기 활용 -GPIO Raspberry Pi b+ GPIO 핀 배치 19 온습도 센서
Raspberry Pi void read_dht11_dat() { uint8_t laststate = HIGH ; uint8_t counter = 0 ; uint8_t j = 0, i ; uint8_t flag = HIGH ; uint8_t state = 0 ; float f ; 제어기 활용 -GPIO 20 온습도 센서 – C file #include #define MAXTIMINGS 83 #define DHTPIN 7 int dht11_dat[5] = {0, } ; uint8_t 는 unsigned 8 bit 타입 변수 char, int 가 word 의 크기에 따라 달라지는 것을 방지하기 위함
Raspberry Pi 제어기 활용 -GPIO 21 온습도 센서 – C File dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0 ; pinMode(DHTPIN, OUTPUT) ; digitalWrite(DHTPIN, LOW) ; delay(18) ; digitalWrite(DHTPIN, HIGH) ; delayMicroseconds(30) ; pinMode(DHTPIN, INPUT) ; for (i = 0; i < MAXTIMINGS; i++) { counter = 0 ; while ( digitalRead(DHTPIN) == laststate) { counter++ ; delayMicroseconds(1) ; if (counter == 200) break ; } 처음 신호선으로 LOW 를 18ms 동안, 20~40us 동안 HIGH 신호를 보내주면 Start 신호 본소스에서는 중간값 30 사용 라즈베리 파이가 신호를 받아야하므로 INPUT MAXTIMINGS 개 데이터 비트 * 2(Low, High) + 3 개 처음비트 high->low/low->high 반대안되면 카 운트 증가 시키며 200us 대기 200us 동안 변화 없을시 break
Raspberry Pi 제어기 활용 -GPIO 22 온습도 센서 – C File laststate = digitalRead(DHTPIN) ; if (counter == 200) break ; //0~3 비트 버리고 짝수 번째 비트인지 확인 if ((i >= 4) && (i % 2 == 0)) { dht11_dat[j / 8] <<= 1 ; if (counter > 20) dht11_dat[j / 8] |= 1 ; j++ ; } // 0,1,2,3 더해서 패리티 비트 4 와 비교 if ((j >= 40) && (dht11_dat[4] == ((dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xff))) { printf("humidity = %d.%d % Temperature = %d.%d *C \n", dht11_dat[0], dht11_dat[1], dht11_dat[2], dht11_dat[3]) ; } else printf("Data get failed\n") ; } 온습도 센서는 신호의 길이로 데이 터를 쓰기 때문에 counter 가 20 넘어 가면 1 을 씀 (or 연산 사용 ) 체크썸 0xff
Raspberry Pi 제어기 활용 -GPIO 23 온습도 센서 – C File int main(void) { printf("dht11 Raspberry pi\n") ; if (wiringPiSetup() == -1) exit(1) ; while (1) { read_dht11_dat() ; delay(1000) ; } return 0 ; }
Raspberry Pi 제어기 활용 -GPIO 24 온습도 센서 – 결과
Raspberry Pi 제어기 활용 -GPIO 안전 종료를 위한 매크로 버튼 page 165 버튼과 스피커를 이용한 전자 피아노 건반 page 170 초음파 센서를 이용한 후방감지 시스템 온 / 습도 센서를 이용한 디지털 온도계 25 실습
Raspberry Pi 제어기 활용 -GPIO WebIOPi WebIOPi 는 라즈베리 파이의 GPIO 를 웹 브라우저에서 제어하기 위 해 만들어진 라즈베리 파이의 GPIO 제어 프레임워크. 라즈베리 파이를 파이썬으로 GPIO 를 제어하면서 동시에 서버로써 구동하여 원격 제어도 가능 웹 브라우저에서는 HTTP REST API 를 이용하여 서버에 원격 접속 및 GPIO 를 제어할 수 있다. 26 WebIOPi
Raspberry Pi 제어기 활용 -GPIO webiopi 다운로드 및 설치 $ wget $ tar xvzf WebIOPi tar.gz $ cd WebIOPi $ sudo./setup.sh 27 WebIOPi 설치
Raspberry Pi 제어기 활용 -GPIO webiopi Patch $ wget tar.gz $ tar xvzf WebIOPi tar.gz $ cd WebIOPi $ wget pi2bplus.patch $ patch -p1 -i webiopi-pi2bplus.patch $ sudo./setup.sh 28 WebIOPi 설치
Raspberry Pi 제어기 활용 -GPIO webiopi 시작 $ sudo service webiopi start webiopi 종료 $ sudo service webiopi stop 29 WebIOPi 설치
Raspberry Pi 제어기 활용 -GPIO webiopi 를 이용한 gpio 제어 데스크톱에서 자신의 ip 주소로 접속하면 webiopi 메인화면 출력 브라우저 주소 :8000http://IP 주소 :8000 인증 id: webiopi pass: raspberry 30 WebIOPi 설치
Raspberry Pi 제어기 활용 -GPIO LED 제어 예제 프로그램 다운로드 $ git clone $ cd traffic_light $ sh setup.sh 접속 후 예제 프로그램 확인 브라우저에서 주소 :8000 접속 확인 31 WebIOPi 를 이용한 LED 제어
Raspberry Pi 제어기 활용 -GPIO 회로 구성 LED 8 개, 220Ω 8 개 연결 GPIO Pin 번호 10, 9, 11, 25, 7, 24, 8, 18 번 핀에 LED 연결 32 WebIOPi 를 이용한 LED 제어
Raspberry Pi 제어기 활용 -GPIO 결과확인 브라우저 및 휴대폰을 이용한 결과확인 33 WebIOPi 를 이용한 LED 제어 – 결과 확인
Raspberry Pi Thank you 34