GPIO Ch 05 Raspberry Pi Sejin Oh GPIO
제어기 활용-GPIO Ch. 05 Raspberry. Pi Sejin Oh
제어기 활용-GPIO v Raspberry Pi b+ GPIO 핀 배치 Raspberry Pi 3
제어기 활용-GPIO Library 설치 1. 라즈베리 파이의 업데이트 및 업그레이드 실시 $ sudo apt-get update $ sudo apt-get upgrade 2. 소스 관리 툴인 git을 다운로드 $ sudo apt-get install git-core 3. Git을 이용하여 “Wiring Pi” 라이브러리를 다운로드 $ git clone git: //git. drogon. net/wiring. Pi Raspberry Pi 4
제어기 활용-GPIO Library 설치 4. 빌드 및 설치 진행 $ cd wiring. Pi $. /build 5. 설치 확인 $ gpio -v 설치 확인 (예시) Gpio version: 2. 08 Copyright © 2012 -2013 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 5
제어기 활용-GPIO 출력 테스트 #include <stdio. h> #include <wiring. Pi. h> #define LED 1 23 #define LED 2 24 while(1) { digital. Write(LED 1, 1); digital. Write(LED 2, 1); delay(500); // ms int main(void) { if(wiring. Pi. Setup. Gpio()==-1) return 1; digital. Write(LED 1, 0); digital. Write(LED 2, 0); pin. Mode(LED 1, OUTPUT); pin. Mode(LED 2, OUTPUT); delay(500); } return 0; } Raspberry Pi 8
제어기 활용-GPIO 출력 테스트 3. 프로그램 빌드 $ gcc –o output. c -lwiring. Pi 4. 프로그램 실행 $ sudo. /output Raspberry Pi 9
제어기 활용-GPIO 출력 테스트 v python을 이용한 LED on/off 테스트 § $ sudo python 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, GPIO. output(24, time. sleep(0. 5) Raspberry Pi True) False) 10
제어기 활용-GPIO 입력 테스트 v 프로그램 작성 1. 작업 폴더로 이동 • $ sudo cd ~/gpio pin. Mode(SW, INPUT); 2. 프로그램 작성 • $ sudo nano input. c while(1) { digital. Write(LED 1, 0); digital. Write(LED 2, 0); #include <stdio. h> #include <wiring. Pi. h> #define LED 23 //gpio 23 #define LED 24 //gpio 24 #define SW 25 //gpio 25 if(digital. Read(SW) == 1) { digital. Write(LED 1, 1); digital. Write(LED 2, 1); delay(1000); } int main(void) { if(wiring. Pi. Setup. Gpio() == -1) return 1; } pin. Mode(LED 1, OUTPUT); pin. Mode(LED 2, OUTPUT); Raspberry Pi 12 } return 0;
제어기 활용-GPIO Ultra Sonic Sensor Raspberry Pi 15 VCC 5 V연결 GND연결 Echo GPIO 23 연결 Trigger GPIO 24 연결
제어기 활용-GPIO Ultra Sonic Sensor – ultrasonic. c #include <stdio. h> #include <wiring. Pi. h> digital. Write(TRIG, LOW); #define TRIG 24 #define ECHO 23 while(digital. Read(ECHO) == LOW); long start. Time = micros(); while(digital. Read(ECHO) == HIGH); long travel. Time = micros() - start. Time; int main(void) { int distance = 0; int pulse = 0; if(wiring. Pi. Setup. Gpio() == -1) return 1; pin. Mode(TRIG, OUTPUT); pin. Mode(ECHO, INPUT); } } int distance = travel. Time / 58; printf("Distance: %d cmn", distance); delay(100); for(; ; ){ digital. Write(TRIG, LOW); usleep(2); digital. Write(TRIG, HIGH); usleep(20); Raspberry Pi 16
제어기 활용-GPIO Ultra Sonic Sensor Raspberry Pi 17
제어기 활용-GPIO 온습도 센서 v 온습도 센서(DHT 11 Sensor) Raspberry Pi 18 VCC 3 V연결 GND연결 Data GPIO 4 연결 Resistance 10 K
제어기 활용-GPIO 온습도 센서 v Raspberry Pi b+ GPIO 핀 배치 Raspberry Pi 19
제어기 활용-GPIO 온습도 센서 – C file #include <wiring. Pi. h> #include <stdio. h> #include <stdlib. h> #include <stdint. h> #define MAXTIMINGS 83 #define DHTPIN 7 void read_dht 11_dat() { uint 8_t laststate = HIGH ; uint 8_t counter = 0 ; uint 8_t j = 0, i ; uint 8_t flag = HIGH ; uint 8_t state = 0 ; float f ; int dht 11_dat[5] = {0, } ; uint 8_t는 unsigned 8 bit 타입 변수 char, int가 word의 크기에 따라 달라지는 것을 방지하기 위함 Raspberry Pi 20
제어기 활용-GPIO 온습도 센서 – C File dht 11_dat[0] = dht 11_dat[1] = dht 11_dat[2] = dht 11_dat[3] = dht 11_dat[4] = 0 ; pin. Mode(DHTPIN, OUTPUT) ; digital. Write(DHTPIN, LOW) ; delay(18) ; 처음 신호선으로 LOW를 18 ms 동안, 20~40 us 동안 HIGH 신호를 보내주면 Start 신호 본소스에서는 중간값 30 사용 digital. Write(DHTPIN, HIGH) ; delay. Microseconds(30) ; pin. Mode(DHTPIN, INPUT) ; 라즈베리 파이가 신호를 받아야하므로 INPUT MAXTIMINGS 83 40개 데이터 비트 * 2(Low, High) + 3개 처음비트 for (i = 0; i < MAXTIMINGS; i++) { counter = 0 ; while ( digital. Read(DHTPIN) == laststate) { high->low/low->high 반대안되면 카운트 증가 시키며 200 us 대기 counter++ ; delay. Microseconds(1) ; if (counter == 200) break ; 200 us 동안 변화 없을시 break } Raspberry Pi 21
제어기 활용-GPIO 온습도 센서 – C File 온습도 센서는 신호의 길이로 데이 터를 쓰기 때문에 counter가 20넘 어가면 1을 씀(or연산 사용) laststate = digital. Read(DHTPIN) ; if (counter == 200) break ; } //0~3비트 버리고 짝수 번째 비트인지 확인 if ((i >= 4) && (i % 2 == 0)) { dht 11_dat[j / 8] <<= 1 ; if (counter > 20) dht 11_dat[j / 8] |= 1 ; j++ ; } // 0, 1, 2, 3 더해서 패리티 비트 4와 비교 if ((j >= 40) && (dht 11_dat[4] == ((dht 11_dat[0] + dht 11_dat[1] + dht 11_dat[2] + dht 11_dat[3]) & 0 xff))) { printf("humidity = %d. %d %% Temperature = %d. %d *C n", dht 11_dat[0], dht 11_dat[1], dht 11_dat[2], dht 11_dat[3]) ; } 체크썸 0 xff else printf("Data get failedn") ; } Raspberry Pi 22
제어기 활용-GPIO 온습도 센서 – C File int main(void) { printf("dht 11 Raspberry pin") ; if (wiring. Pi. Setup() == -1) exit(1) ; } while (1) { read_dht 11_dat() ; delay(1000) ; } return 0 ; Raspberry Pi 23
제어기 활용-GPIO 온습도 센서, My. SQL 연동 v My. SQL 설치 § $ sudo apt-get install mysql-server mysql-client libmysqlclient-dev § 외부에서도 My. SQL에 접속할 수 있도록 다음의 명령어를 이용하여 “my. cnf” 파일을 열고 주석처리한다. • $ sudo nano /etc/mysql/my. cnf • #bind-address = 127. 0. 0. 1 v PHP 설치 § $ sudo apt-get install php 5 php-common libapache 2 -mod-php 5 v php. My. Admin 설치 § $ sudo apt-get install phpmyadmin Raspberry Pi 27
제어기 활용-GPIO 온습도 센서, My. SQL 연동 v My. SQL 기본 설정 및 DB구성 § rpidb 데이터베이스 생성 mysql> create database rpidb; mysql> show databases; § 데이터베이스 선택 및 테이블 보기 mysql> use rpidb; mysql> show tables; Raspberry Pi 30
제어기 활용-GPIO 온습도 센서, My. SQL 연동 v My. SQL 기본 설정 및 DB구성 § 테이블 생성 mysql> create table envdata( -> time varchar(30) primary key, -> humidity 0 int(4), -> humidity 1 int(4), -> temperature 0 int(4), -> temperature 1 int(4)) -> character set utf 8; § 테이블 확인 mysql> show tables; mysql> explain envdata Raspberry Pi 31
제어기 활용-GPIO 온습도 센서, My. SQL 연동 v 온습도 센서 C 코드의 My. SQL 연동 – (1) #include <wiring. Pi. h> #include <wiring. Pi. SPI. h> #include </usr/include/mysql. h> #include #include <time. h> <math. h> <string. h> <errno. h> <stdio. h> <stdlib. h> <stdint. h> 아래 명령으로 C코드 작성 $ sudo nano dht 11_Connected_My. SQL. c #define MAXTIMINGS 83//DHT 11 #define DHTPIN 7//DHT 11 #define DBHOST "localhost" DBUSER "root" DBPASS "raspberry" DBNAME "rpidb" MYSQL *connector; MYSQL_RES *result; MYSQL_ROW row; int dht 11_dat[5] = { 0, }; int DB_dat[4] = { 0, }; Raspberry Pi 33
제어기 활용-GPIO 온습도 센서, My. SQL 연동 v 온습도 센서 C 코드의 My. SQL 연동 – (2) void read_dht 11_dat() { uint 8_t laststate = HIGH; uint 8_t counter = 0; uint 8_t j = 0, i; uint 8_t flag = HIGH; uint 8_t state = 0; float f; dht 11_dat[0] = dht 11_dat[1] = dht 11_dat[2] = dht 11_dat[3] = dht 11_dat[4] = 0; pin. Mode(DHTPIN, OUTPUT); digital. Write(DHTPIN, LOW); delay(18); digital. Write(DHTPIN, HIGH); delay. Microseconds(30); pin. Mode(DHTPIN, INPUT); for (i = 0; i < MAXTIMINGS; i++) { counter = 0; while (digital. Read(DHTPIN) == laststate) { counter++; delay. Microseconds(1); if (counter == 200) break; } Raspberry Pi 34
제어기 활용-GPIO 온습도 센서, My. SQL 연동 v 온습도 센서 C 코드의 My. SQL 연동 – (3) while (digital. Read(DHTPIN) == laststate) { counter++; delay. Microseconds(1); if (counter == 200) break; } laststate = digital. Read(DHTPIN); if (counter == 200) break; if ((i >= 4) && (i % 2 == 0)) { dht 11_dat[j / 8] <<= 1; if (counter > 20) dht 11_dat[j / 8] |= 1; j++; } } if ((j >= 40) && (dht 11_dat[4] == ((dht 11_dat[0] + dht 11_dat[1] + dht 11_dat[2] + dht 11_dat[3]) & 0 xff))) { printf("humidity = %d. %d %% Temperature = %d. %d *C n", dht 11_dat[0], dht 11_dat[1], dht 11_dat[2], dht 11_dat[3]); DB_dat[0] = dht 11_dat[0]; DB_dat[1] = dht 11_dat[1]; DB_dat[2] = dht 11_dat[2]; DB_dat[3] = dht 11_dat[3]; } else printf("Data get failedn"); } Raspberry Pi 35
제어기 활용-GPIO 온습도 센서, My. SQL 연동 v 온습도 센서 C 코드의 My. SQL 연동 – (4) int main(void) { printf("dht 11 Raspberry pin"); char query[1024]; //MYSQL Connection connector = mysql_init(NULL); if (!mysql_real_connect(connector, DBHOST, DBUSER, DBPASS, DBNAME, 3306, NULL, 0)) { fprintf(stderr, "%sn", mysql_error(connector)); return 0; } printf("My. SQL(rpidb) connected. n"); if (wiring. Pi. Setup() == -1) exit(1); while (1) { read_dht 11_dat(); if ((DB_dat[0] != 0) && (DB_dat[2] != 0)){ sprintf(query, "INSERT INTO envdata VALUES " "(now(), '%d', '%d')", DB_dat[0], DB_dat[1], DB_dat[2], DB_dat[3]); mysql_query(connector, query); } } } return 0; Raspberry Pi delay(3000); 36
제어기 활용-GPIO 온습도 센서, My. SQL 연동 v 온습도 센서 C 코드의 My. SQL 연동 – (5) 컴파일 § 작성된 C코드 컴파일 $ sudo gcc -o dht 11_Connected_My. SQL. c -lwiring. Pi -L/usr/local/lib/mysql -lmysqlclient Raspberry Pi 37
제어기 활용-GPIO 온습도 센서, My. SQL 연동 v My. SQL에 저장된 정보 php로 출력 – (2) <? php $servername = "localhost"; $username = "root"; $password = "raspberry"; $dbname = "rpidb"; 아래의 코드를 dht 11. php 이름으로 /var/www에 저장 // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: ". $conn->connect_error); } $sql = "SELECT time, humidity 0, humidity 1, temperature 0, temperature 1 FROM envdata ORDER BY time DESC LIMIT 0, 12"; $result = $conn->query($sql); $time = ""; $humidity = ""; $temperature = ""; if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { //echo "time: ". $row["time"]. " - humidity: ". $row["humidity 0"]. ". ". $row["humidity 1"]. " - temperature: ". $row["temperature 0"]. ". ". $row["temperature 1"]. " "; Raspberry Pi 39
제어기 활용-GPIO 온습도 센서, My. SQL 연동 v My. SQL에 저장된 정보 php로 출력 – (3) if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { //echo "time: ". $row["time"]. " - humidity: ". $row["humidity 0"]. ". ". $row["humidity 1"]. " - temperature: ". $row["temperature 0"]. ". ". $row["temperature 1"]. " "; //$time = $time. ", '". substr($row["time"], 5, 11). "'"; $time = "'". substr($row["time"], 5, 11). "', ". $time; $humidity = $row["humidity 0"]. ". ". $row["humidity 1"]. ", ". $humidity; $temperature = $row["temperature 0"]. ". ". $row["temperature 1"]. ", ". $temperature; } $humidity = substr($humidity, 0, -2); $temperature = substr($temperature, 0, -2); $time = substr($time, 0, -1); $time = str_replace("-", "/", "$time"); } else { echo "0 results"; } $conn->close(); ? > <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Temperature Example</title> <script type="text/javascript" src="http: //ajax. googleapis. com/ajax/libs/jquery/1. 8. 2/jquery. min. js"></script> <style type="text/css"> Raspberry Pi 40
제어기 활용-GPIO 온습도 센서, My. SQL 연동 v My. SQL에 저장된 정보 php로 출력 – (4) <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Temperature Example</title> <script type="text/javascript" src="http: //ajax. googleapis. com/ajax/libs/jquery/1. 8. 2/jquery. min. js"></script> <style type="text/css"> ${demo. css} </style> <script type="text/javascript"> $(function () { $('#container'). highcharts({ chart: { type: 'line' }, title: { text: 'Humidity and Temperature of Raspberry. Pi' }, subtitle: { text: 'for Kyungwoon Univ. ' }, x. Axis: { categories: [<? php echo $time? >] }, y. Axis: { title: { Raspberry Pi 41
제어기 활용-GPIO 온습도 센서, My. SQL 연동 v My. SQL에 저장된 정보 php로 출력 – (5) y. Axis: { title: { text: 'Values' } }, plot. Options: { line: { data. Labels: { enabled: true }, enable. Mouse. Tracking: false } }, series: [{ name: 'Humidity', data: [<? php echo $humidity? >] }, { name: '$Temperature', data: [<? php echo $temperature? >] }] }); </script> </head> <body> <script src="/highchart/js/highcharts. js"></script> Raspberry Pi 42
제어기 활용-GPIO 온습도 센서, My. SQL 연동 v My. SQL에 저장된 정보 php로 출력 – (6) </script> </head> <body> <script src="/highchart/js/highcharts. js"></script> <script src="/highchart/js/modules/exporting. js"></script> <div id="container" style="min-width: 310 px; height: 400 px; margin: 0 auto"></div> </body> </html> Raspberry Pi 43
제어기 활용-GPIO Web. IOPi 설치 v webiopi 다운로드 및 설치 § $ wget http: //webiopi. googlecode. com/files/Web. IOPi-0. 6. 0. tar. gz § $ tar xvzf Web. IOPi-0. 6. 0. tar. gz § $ cd Web. IOPi-0. 6. 0 § $ sudo. /setup. sh Raspberry Pi 49
제어기 활용-GPIO Web. IOPi 설치 v webiopi Patch § $ wget http: //sourceforge. net/projects/webiopi/files/Web. IOPi 0. 7. 1. tar. gz § $ tar xvzf Web. IOPi-0. 7. 1. tar. gz § $ cd Web. IOPi-0. 7. 1 § $ wget https: //raw. githubusercontent. com/doublebind/raspi/master/webio pi-pi 2 bplus. patch § $ patch -p 1 -i webiopi-pi 2 bplus. patch § $ sudo. /setup. sh Raspberry Pi 50
제어기 활용-GPIO Web. IOPi 설치 v webiopi 시작 § $ sudo service webiopi start v webiopi 종료 § $ sudo service webiopi stop Raspberry Pi 51
제어기 활용-GPIO Web. IOPi를 이용한 LED 제어 v LED 제어 예제 프로그램 다운로드 § $ git clone https: //github. com/rasplay/traffic_light. git § $ cd traffic_light § $ sh setup. sh v 접속 후 예제 프로그램 확인 § 브라우저에서 http: //IP주소: 8000 접속 확인 Raspberry Pi 53
Thank you Raspberry Pi 56
- Slides: 56