Presentation on theme: “Smart IoT 설계 시스템 Lecture 09. 스마트 팜 실습 1.”— Presentation transcript:
1 Smart IoT 설계 시스템 Lecture 09. 스마트 팜 실습 1
2 스마트 농장 개요 IoT 스마트 농장관리 시스템은 Gateway시스템과 모바일 프로그램으로 구성된다. 농장관리 Gateway는 온습도 센서와 조도 센서에서 수집한 데이터를 Database에 저장하고, 센서 데이터를 판단하여 다양한 액츄에이터(워터펌프, 팬, DC모터, 식물 LED)를 구동한다. 또한 안드로이드 폰과의 연동을 통해 원격지의 사용자 요청이 발생할 경우 Ehernet이나 Wi-Fi를 통해 센서데이터나 영상 정보를 송신한다. 사용자는 실제 농장이나 화분 등에 실제와 거의 유사하게 구현할 수 있다. Gateways에는 라즈베리파이 기반으로 리눅스 운영체제를 최적화한 Rasbian이 설치되어 있다. 특히 다양한 액츄에이터의 하나인 워터 펌프는 실제 화분이나 농작물에 물을 줄 수 있도록 튜브로 연결되어 있다. 시험은 가능한 한 실제 현장에서 발생하는 상황과 유사하게 설계하여 실습한다. ○ 스마트폰을 이용한 스마트 식물농장시스템 Actuator의 원격제어 ○ 토양의 온도와 습도를 감지하여 워터펌프를 가동하여 물주기 ○ 온도와 습도를 감지하여 환기 팬 동작 및 외부 창문제어(모터) ○ 조도 상태를 통한 식물용 LED 작동제어 ○ 원격영상을 통한 실시간 모니터링 및 Actuator의 원격제어 주요기능 센서 온도센서, 습도 센서, 조도센서 액츄에이터 워터펌프, 팬, DC Motor, RGB Led
3 스마트 농장 소프트웨어 구성 Internet Gateway System TCP/IP 서버 실행 안드로이드 앱 워터 펌프제어
온도 센서 데이터 수집 센서데이터 조회 Gateway System 팬 제어 습도 센서 데이터 수집 액츄에이터 제어 DC 모터 제어 카메라 영상 확인 조도센서 데이터 수집 RGB Led 제어 이벤트 수신 카메라 영상 Database 조회/저장 이벤트 DB 기후 DB 농장기후DB 사진 DB
4 스마트 농장관리 시스템 하드웨어 구성
5 스마트 농장 소프트웨어 기능 I 구 분 기능블록 규 격 구동 Software OS
구 분 기능블록 규 격 구동 Software OS RASPBIAN – Debian Wheezy. Release date: Android Jelly Bean 4.3 Compiler GCC Compiler – 리눅스 커널 기반 센서 프로그램 C, C++, Python, Java Actuator 프로그램 Gateway CPU Board ARM/Linux 기반 싱글보드컴퓨터로 센서어댑터, 액츄에이터 어댑터 와 연동하고 인터넷에 연결되어 Gateway 역할을 수행. 센서로부터 수집한 정보를 저장하고 원격지의 사용자에게 전송하거나 제어 신호 에 따라 해당 액츄에이터를 On/Off 기능 Camera Module Gateway에 CSI 인터페이스 및 커넥터로 연결되는 카메라 모듈로 주 요기능은 설치 장소의 환경과 액츄에이터가 동작하는 상황을 사진이 나 동영상으로 촬영하여 사용자에게 제공 SD Card Gateway의 부팅과 Linux기반의 운영 체제가 저장된 저장장치이며 G ateway의 실행 application Software 탑재
6 스마트 농장 소프트웨어 기능 II 구 분 규 격 센서 S/W 센서에서 다양한 데이터를 수집하고, 분석하는 소프트웨어
구 분 규 격 센서 S/W 센서에서 다양한 데이터를 수집하고, 분석하는 소프트웨어 액츄에이터 S/W 센서 입력 정보 및 사용자의 요구에 따라 모터, 팬, 펌프와 같은 동작 장치를 제어하는 소 프트웨어 Web Software Ethernet을 통해 스마트 농장 서버에 접속하고, 웹 서버와 데이터 베이스를 이용하여 Gate way가 수집한 센서데이터를 조회하고, 현장 환경을 영상을 통해 확인하고 설치된 시설을 직접 제어 Smart Phone Application Android 기반으로 하는 Mobile Application Software를 통하여 사용자는 스마트폰으로 G ateway의 센서에서 수집된 데이터 및 영상정보를 수신하여 적절한 액츄에이터를 구동 제 어. 사용자는 스마트폰을 통해 이미지나 동영상 Play기능, Gateway에 저장된 이벤트와 lo g기록 확인 가능.
7 스마트 농장 Software Data Flow Diagram
8 스마트 농장 센서/액츄에이터 연결
9 IO 어댑터 보드 – old
10 IO 어댑터 보드 – new GPIO 40pin 커넥터 DC 12V 전원 12V 전원 스위치 UART 커넥터
DC 3.3V Analog 센서 커넥터 8채널 AD 컨버터 DC 3.3V 디지털 출력커넥터 Servo 모터 RGB LED 초음파 센서
11 개발환경 – HDMI 모니터 연결 Internet 공유기 HDMI 케이블 Ethernet 케이블 USB 키보드
Gateway(R-Pi) USB 키보드 Micro USB 5V 전원 WiFi 동글 사용시 공유기 설정을 참고하여 라즈베리 파이 Wlan0 설정 필요함.
12 개발환경 – HDMI 모니터 연결 부팅 후 로그인 Raspberrypi login : pi
Password : raspberry 암호 안보임. 유/ 무선네트워크 연결 확인 $ ifconfig eth0 유선 네트워크 정보 wlan0 무선 네트워크 정보 할당받은 ip 주소 :
13 개발환경 – 노트북 연결 Micro USB 5V 전원 Internet 공유기 Ethernet 케이블 USB 키보드 USB 연결
Gateway(R-Pi) USB 키보드 USB 연결 IO Adapter 보드 + OTG 케이블 WiFi 동글 사용시 공유기 설정을 참고하여 라즈베리 파이 Wlan0 설정 필요함. 구글에서 cp2104 검색 CP2104 Mini Evaluation Kit | Silicon Labs 으로 이동 Software Downloads CP210x VCP Drivers Drivers for Windows and Mac and Linux Download 후 설치
14 제어판 – 장치관리자에서 COM 포트 확인 COM14
15 씨리얼 포트로 부팅 후 $ifconfig 부팅 후 로그인 Raspberrypi login : pi Password : raspberry $ifconfig 명령어로 아이피 주소 적어둔다. 라즈베리 파이 IP 주소 :
16 윈도우 환경에서 개발 \\ 주소\ 위치 : pi 아이디 : pi 패스워드 : raspberry
17 MCP3208 ADC(12bit, SPI)
18 GPIO 제어와 Wiring Pi 설치 패키지 관리 서버로부터 이용 가능한 프로그램 패키지의 목록을 최신버전으로 업데이트
$sudo apt-get update 컴퓨터에 설치된 프로그램이 업데이트 되었으면 새로운 버전으로 설치하게 해주는 명령어 $sudo apt-get upgrade 1. 소스관리툴 git 를 다운로드한다. (오픈소스 의 소스를 체크아웃하기 위해서) $sudo apt-get install git-core 2. “wiringPi” 프로젝트를 통째로 받아온다. $git clone git://git.drogon.net/wiringPi 3. 빌드 및 설치를 진행한다. $cd wiringPi $./build 4. 설치가 잘 되었는지 아래의 명령어로 확인해 본다. $gpio -v $gpio readall
19 GPIO Pin 과 wiringPi Pin 할당 – $gpio readall
20 폴링 과 인터럽트 방식 Polling Interrupt
#define LIGHTSEN_OUT 2 //gpio27 – J13 connect pinMode(LIGHTSEN_OUT, INPUT); if(digitalRead(LIGHTSEN_OUT) == 0) printf(“light full !
“); if(digitalRead(LIGHTSEN_OUT) == 1) printf(“dark
“); Interrupt #define Man_Detect 0 //gpio17 // myInterrupt: called every time an event occurs void myInterrupt(void) { alert_flag = 1; } //main if ( wiringPiISR (Man_Detect , INT_EDGE_RISING, &myInterrupt) < 0 ) fprintf (stderr, "Unable to setup ISR: %s
", strerror (errno)); return 1; while ( 1 ) { if(alert_flag ==1) alert_flag=0; }
21 온도 / 습도 센서 특징 전기적 특성 1. 모델명 : AM2302 2. 정밀도 및 해상도 : 0.1
3. 습도 측정 범위 : 0-100%RH 4. 온도 측정 범위 : -40~80℃ 5. 습도 측정 오차 : ±2%RH 6. 온도 측정 오차 : ±0.5℃ 7. 저전력소모 8. 부가회로가 불필요 - 사용 전압 : 3.3-6V DC - 싱글핀 디지털 데이터 출력 - 측정 응답 시간 : min 2초 - 측정 조건 VDD = 5V , T = 25 ℃ - Pin Connection Pin 1 – 전원 VCC 3.5~5.5V DC Pin 2 - DATA (시리얼 양방향) Pin 3 – 사용안함(No Connection) Pin 4 - GND
22 온도 습도 센서 소스코드 온도데이터 : get_temperature.c 파일 습도데이터 : get_humidity.c 파일
#include ~ static int DHTPIN = 11; //GPIO Port static uint8_t sizecvt(const int read) { ~ } int read_dht22_dat() { ~ } int main (void) { DHTPIN = 11; while (read_dht22_dat() == 0) delay(500); // wait to refresh } received_temp = ret_temp ; printf(“Temperature = %d
“, received_temp); return 0;
23 컴파일 – 실행 – 코드수정 작업 폴더 변경 pi@raspberrypi ~ $ cd smartfarm
GNU Compiler Collection 처리과정 작업 폴더 변경 ~ $ cd smartfarm ~/smartfarm $ 소스코드 편집 : $nano get_temperature.c 편집 후 ctrl-x 입력 y 치고 엔터로 나옴 컴파일 : $gcc –o get_temperature temperature.c –l wiringPi 실행 : $sudo ./get_temperature 소스코드 편집 : $nano get_humidity.c 편집 후 ctrl-x 입력 y 치고 엔터로 나옴 컴파일 : $gcc –o get_humidity get_humidity.c –l wiringPi 실행 : $sudo ./get_humidity
24 Analog to Digital – ADC 컨버터 사용
ADC 컨버터 MCP3208 사용 MCP3208 Pin Description MCP3208 Pin Map SPI 연결 회로 (CD 첨부 파일 참고)
25 조도(빛) 센서 Analog 출력 연결 특징 전기적 특성
1. 감도 조절 (파란색 가변저항 조정)밝기와 주 변 빛의 세기를 감지 2. 출력 : 아날로그 전압 출력, 디지털 스위치 출력 (0, 1) 3. 온도 측정 범위 : -40~80℃ 4. 습도 측정 오차 : ±2%RH 5. 온도 측정 오차 : ±0.5℃ 6. 저전력소모 7. 부가회로가 불필요 – 작동 전압 : 3.3V ~ 5V DC – 출력 : 아날로그 전압 출력, 디지털 스위치 출력 (0, 1) – lm393 칩 – 측정 조건 VDD = 5V , T = 25 ℃ – Pin Connection Pin 1 – 아날로그 출력 Pin 2 – 디지털 출력 Pin 3 – GND) Pin 4 – 전원 VCC 3.5~5.5V DC
26 조도(빛) 센서 Analog 실습 SPI및I2C활성화
$sudo nano /etc/modprobe.d/raspi-blacklist.conf # blacklist spi and i2c by default (many users don’t need them) #blacklist spi-bcm2708 #blacklist i2c-bcm2708 blacklist snd-soc-pcm512x blacklist snd-soc-wm8804 소스코드 #include #include #define CS_MCP //GPIO 8 #define SPI_CHANNEL 0 int read_mcp3208_adc(unsigned char adcChannel) { ~ } int main(void) { pinMode(CS_MCP3208, OUTPUT); adcValue_light = read_mcp3208_adc(adcChannel_light); }
27 조도(빛) 센서 컴파일 – 실행 — 편집 소스코드 편집 : $nano getlightsensor.c 편집 후 ctrl-x 입력 y 치고 엔터로 나옴 컴파일 : $gcc –o getlightsensor getlightsensor.c –l wiringPi 실행 : $sudo ./getlightsensor 밝음 중간 어두움 light sensor = 254 light sensor = 255 light sensor = 256 light sensor = 253 light sensor = 1262 light sensor = 1260 light sensor = 1259 light sensor = 1256 light sensor = 1255 light sensor = 1253 light sensor = 1254 light sensor = 1258 light sensor = 2324 light sensor = 2323 light sensor = 2322 light sensor = 2321 light sensor = 2319 light sensor = 2318 light sensor = 2317 light sensor = 2316 light sensor = 2315 light sensor = 2314 light sensor = 2313 light sensor = 2312
28 조도(빛) 센서 Digital 출력 연결 컴파일 명령
가변저항을 사용하여 밝기의 기준값을 설정하여 High, Low 신호 출력을 사용한다. #include #define LIGHTSEN_OUT 2 //gpio27 – J13 connect int main(void) { pinMode(LIGHTSEN_OUT, INPUT); if(digitalRead(LIGHTSEN_OUT) == 0) printf(“light full !
“); if(digitalRead(LIGHTSEN_OUT) == 1) printf(“dark
“); } 컴파일 명령 $gcc –o lightdetect lightdetect.c –lwiringPi 실행명령 $sudo ./lightdetect 편집 명령 $nano lightdetect.c 편집 후 ctrl-x 입력 y 치고 엔터로 나옴 light full ! dark
29 액츄에이터 스마트 식물농장의 액츄에이터는 워터펌프, 팬, DC Motor, RGB Led 와 같이 4가지를 사용한다. 토양이 말라 있을 때 물을 뿌려주고, 실내 농장의 온도에 따라 환기 팬을 작동하고, 야간이나 구름이 낀 날은 청색과 적색의 식물 Led 를 켜준다. 또한 차양을 올린다거나 문을 열기 위해 DC 모터를 사용하는 것으로 가정한다. 워터펌프 FAN DC Motor 식물 LED 5V, 12V 구동회로 RGB Led 구동회로
30 워터펌프 – DWP2760 워터펌프 외관 워터펌프 기구도면 전기적 사양 정격전압 DC 12V 구동전압 DC 9V ~ DC15V
전류 무부하시 280mA 이하 최대입력 >14.5 PSI Water Flow ≥400(±20%)mL/Min at 90℃ 소음 65dB 용도 커피머신용, 90℃ 뜨거운 물 사용가능 수명 정격전류에서 50초 동작, 20초 멈춤이 1Cycle – 6,000번
31 워터펌프 구동 소스 – pumpon.c #include //Signal 사용 헤더파일
#include #include #include #include #include //exit() 사용 헤더파일 #include #define PUMP 21 // BCM_GPIO 5 void sig_handler(int signo); // 마지막 종료 함수 int main (void){ signal(SIGINT, (void *)sig_handler); //시그널 핸들러 함수 if (wiringPiSetup () == -1) { fprintf(stdout, “Unable to start wiringPi: %s
“, strerror(errno)); return 1 ; } pinMode (PUMP, OUTPUT) ; for (;;) printf(“here – pump on
“); digitalWrite (PUMP, 1) ; // On delay (2000) ; // ms digitalWrite (PUMP, 0) ; // Off delay (2000) ; return 0 ; void sig_handler(int signo) { printf(“process stop
“); digitalWrite (PUMP, 0) ; // Off exit(0); }
32 워터 펌프 구동 소스 컴파일 – 실행 — 편집 소스코드 편집 : $nano pumpon.c 편집 후 ctrl-x 입력 y 치고 엔터로 나옴 컴파일 : $gcc –o pumpon pumpon.c –l wiringPi 실행 : $sudo ./ pumpon 실행 종료 : Ctrl-c (컨트롤(Ctrl) 키 + c 키)
33 Fan – KD1205PFS1 FAN 외관 FAN 기구도면 FAN 전기적 사양 Size (㎜) 50*50*10mm
정격전압(VDC) 12 전류 (A) 0.1 기동전압(V) 10.8~13.8 속도 (RPM) 5500 풍량(㎥/min) 0.29 풍압(Pa) 36 소음(db) 28 권장사용온도(℃) 10~60 무게(g) 20
34 FAN 소스코드 – fanon.c #include //Signal 사용 헤더파일
#include #include #include #include #include //exit() 사용 헤더파일 #include #define FAN 22 // BCM_GPIO 6 void sig_handler(int signo); // 마지막 종료 함수 int main (void) { signal(SIGINT, (void *)sig_handler); //시그널 핸들러 함수 if (wiringPiSetup () == -1) fprintf(stdout, “Unable to start wiringPi: %s
“, strerror(errno)); return 1 ; } pinMode (FAN, OUTPUT) ; for (;;) digitalWrite (FAN, 1) ; // On return 0 ; void sig_handler(int signo) { printf(“process stop
“); digitalWrite (FAN, 0) ; // Off exit(0); }
35 FAN 구동 소스 컴파일 – 실행 — 편집 소스코드 편집 : $nano fanon.c 편집 후 ctrl-x 입력 y 치고 엔터로 나옴 컴파일 : $gcc –o fanon fanon.c –l wiringPi 실행 : $sudo ./fanon 실행 종료 : Ctrl-c (컨트롤(Ctrl) 키를 누르고 c 키를 누른다. )
36 DC Motor DC Motor 기구도면 DC Motor 전기적 사양 DC Motor 외관 품명 마이크로 DC 모터
Rated Voltage(V) 12 No load speed(rpm) 9,100 No load current(mA) 60 Rated speed(rpm) 7800 Rated torque(gf.츠) 20 Rated current(mA) 350 Size 23.8Φ ⅹ 30.5mm Noise level(유) 55
37 DC Motor 소스코드 – dcmotoron.c
#include //Signal 사용 헤더파일 #include #include #include #include #include //exit() 사용 헤더파일 #include #define DCMOTOR 23 // BCM_GPIO 13 void sig_handler(int signo); // SIGINT 사용 마지막 종료 함수 int main (void) { signal(SIGINT, (void *)sig_handler); //시그널 핸들러 함수 if (wiringPiSetup () == -1) fprintf(stdout, “Unable to start wiringPi: %s
“, strerror(errno)); return 1 ; } pinMode (DCMOTOR, OUTPUT) ; for (;;) //printf(“here – DCMOTOR on
“); digitalWrite (DCMOTOR, 1) ; // On return 0 ; void sig_handler(int signo) { printf(“process stop
“); digitalWrite (DCMOTOR, 0) ; // Off exit(0); }
38 DC Motor – PWM 제어 모터 (PWM: Pulse Width Modulation) 제어
모터 구동전원을 일정 주기로 On/Off 하는 펄스 형상으로 하고, 그 펄스의 duty비(On 시간과 Off 시간의 비)를 바꿈으로써 속도를 제어한다. 이것은 DC 모터가 빠른 주파수의 변화에는 기계 반응을 하지 않는다는 것을 이용하는 방법이다. #include //pwm 헤더파일 추가 #define MOTORCONTROL 23 //GPIO 13 – Motor void sig_handler(int signo); // SIGINT 핸들러 함수 int main (void) { ~ softPwmCreate(MOTORCONTROL, 0, 100); int i; int delaytime = 100; while(1) { printf(“here
“); softPwmWrite(MOTORCONTROL, 5); // 5를 0부터 100까지 가변 속도조절 delay(delaytime); } return 0 ; 컴파일 $ gcc -o motorsoftpwm motorsoftpwm.c –lwiringPi 실행하면 낮은 속도로 회전하는 모터를 보게 된다. $ sudo ./motorsoftpwm
39 DC Motor 구동 소스 컴파일 – 실행 — 편집
소스코드 편집 : $nano dcmotoron.c 편집 후 ctrl-x 입력 y 치고 엔터로 나옴 컴파일 : $gcc –o dcmotoron dcmotoron.c –l wiringPi 실행 : $sudo ./dcmotoron 실행 종료 : Ctrl-c (컨트롤(Ctrl) 키를 누르고 c 키를 누른다. ) 소스코드 편집 : $nano motorsoftpwm.c 편집 후 ctrl-x 입력 y 치고 엔터로 나옴 컴파일 : $gcc –o motorsoftpwm motorsoftpwm.c –l wiringPi 실행 : $sudo ./ motorsoftpwm 실행 종료 : Ctrl-c (컨트롤(Ctrl) 키를 누르고 c 키를 누른다. )
40 RGB Led RGB LED 외관 RGB LED 전기적 사양 RGB LED 회로도 품명 RGB LED
Rated Voltage(V) 12V 표시 색 1600만 소비전류 Red=2V/20mA GREEN=3.4V/20mA Blue=3.4V/20mA 품번 IWS-506-RGB-K3 RGB LED 회로도
41 RGB Led 제어 – rgbtest.c RED, GREEN, BLUE 순서로 LED on/off
#include //Signal 사용 헤더파일 #include //exit() 사용 헤더파일 #include #define RGBLEDPOWER //BCM_GPIO 19 #define RED 27 #define GREEN 28 #define BLUE 29 int main (void) { pinMode(RGBLEDPOWER, OUTPUT); pinMode(RED, OUTPUT); pinMode(GREEN, OUTPUT); pinMode(BLUE, OUTPUT); int i; return 0 ; } for (i =0; i<10 ;i++) { digitalWrite(RGBLEDPOWER, 1); digitalWrite(RED, 1); digitalWrite(BLUE, 0); digitalWrite(GREEN, 0); delay(1000); digitalWrite(RED, 0); digitalWrite(BLUE, 1); digitalWrite(GREEN, 1); }
42 RGB Led PWM 제어 – allrgbcolor.c
int i; digitalWrite(RGBLEDPOWER, 1); while(1) { int i = 0, j = 0, k=0; printf("RGB LED Various Color"); softPwmCreate(RED, 0, 255); softPwmCreate(GREEN, 0, 255); softPwmCreate(BLUE, 0, 255); for (i = 0; i <= 250; i=i+10){ for (j = 0; j <= 250; j=j+10){ for (k = 0; k <= 250; k=k+10){ setRGB(i,j,k); delay(50); printf("R:%d G:%d B:%d
", i, j, k); } } } setRGB(0,0,0);//clear LED delay(50); } return 0 ; } #include //Signal 사용 헤더파일 #include #include #include #include //exit() 사용 헤더파일 #include #include #define RGBLEDPOWER 24 //BCM_GPIO 19 #define RED 29 // BCM_GPIO 16 – OUT #define GREEN 28 // BCM_GPIO 20 – OUT #define BLUE 27 // BCM_GPIO 21 – OUT void Bpluspinmodeset(void); void setRGB(int r, int g, int b); void sig_handler(int signo); // SIGINT 핸들러 함수 int main (void) { if(wiringPicheck()) printf(“Fail”); Bpluspinmodeset(); signal(SIGINT, (void *)sig_handler);
43 RGB Led PWM 제어 – allrgbcolor.c
int wiringPicheck(void) { if (wiringPiSetup () == -1) fprintf(stdout, “Unable to start wiringPi: %s
“, strerror(errno)); return 1 ; } void Bpluspinmodeset(void) pinMode(RGBLEDPOWER, OUTPUT); pinMode (RED, OUTPUT); pinMode (GREEN, OUTPUT); pinMode (BLUE, OUTPUT); void sig_handler(int signo) // ctrl-c 로 종료시 실행되는 함수 { printf(“process stop
“); digitalWrite(RED, 0); digitalWrite(GREEN, 0); digitalWrite(BLUE, 0); digitalWrite(RGBLEDPOWER, 0); //Off exit(0); } void setRGB(int r, int g, int b){ softPwmWrite(RED, 255-r); softPwmWrite(GREEN, 255-g); softPwmWrite(BLUE, 255-b);
44 RGB LED 구동 소스 컴파일 – 실행 — 편집
소스코드 편집 : $nano rgbtest.c 편집 후 ctrl-x 입력 y 치고 엔터로 나옴 컴파일 : $gcc –o rgbtest rgbtest.c –l wiringPi 실행 : $sudo ./rgbtest 실행 종료 : Ctrl-c (컨트롤(Ctrl) 키를 누르고 c 키를 누른다. ) 소스코드 편집 : $nano allrgbcolor.c 편집 후 ctrl-x 입력 y 치고 엔터로 나옴 컴파일 : $gcc –o allrgbcolor allrgbcolor.c –l wiringPi 실행 : $sudo ./ allrgbcolor 실행 종료 : Ctrl-c (컨트롤(Ctrl) 키를 누르고 c 키를 누른다. )
45 액츄에이터 전체 구동 전체 포트 번호 설정 핀 모드 설정 구동 코드 #define PUMP 21 // BCM_GPIO 5
액츄에이터 전체 구동 전체 포트 번호 설정 핀 모드 설정 #define PUMP 21 // BCM_GPIO 5 #define FAN 22 // BCM_GPIO 6 #define DCMOTOR 23 // BCM_GPIO 13 #define RGBLEDPOWER 24 //BCM_GPIO 19 #define RED 27 //GPIO 16 #define GREEN 28 //GPIO 20 #define BLUE 29 //GPIO 21 void Bpluspinmodeset(void) { pinMode (PUMP, OUTPUT); pinMode (FAN, OUTPUT); pinMode (DCMOTOR, OUTPUT); pinMode(RGBLEDPOWER, OUTPUT); pinMode(RED, OUTPUT); pinMode(GREEN, OUTPUT); pinMode(BLUE,OUTPUT); } 구동 코드 digitalWrite (PUMP, 1) ; // On digitalWrite (FAN, 1) ; // On digitalWrite(DCMOTOR, 1); //On digitalWrite(RGBLEDPOWER, 1);//On delay (5000) ; / / ms digitalWrite (PUMP, 0) ; // Off digitalWrite (FAN, 0) ; // Off digitalWrite(DCMOTOR, 0); //Off digitalWrite(RGBLEDPOWER, 0); //Off
46 액츄에이터 전체 구동 소스 컴파일 – 실행 — 편집
액츄에이터 전체 구동 소스 컴파일 – 실행 — 편집 소스코드 편집 : $nano actu_all_on.c 편집 후 ctrl-x 입력 y 치고 엔터로 나옴 컴파일 : $gcc –o actu_all_on actu_all_on.c -l wiringPi -pthread 실행 : $sudo ./ actu_all_on 실행 종료 : Ctrl-c (컨트롤(Ctrl) 키를 누르고 c 키를 누른다. )
47 스마트 농장 스토리 프로그램 순서도 프로그램 : farmstory.c 참고
48 스마트 농장 스토리 프로그램 실행 소스코드 편집 : $nano farmstory.c 편집 후 ctrl-x 입력 y 치고 엔터로 나옴 컴파일 : $gcc –o farmstory farmstory.c –l wiringPi 실행 : $sudo ./farmstory.c 실행 종료 : Ctrl-c (컨트롤(Ctrl) 키를 누르고 c 키를 누른다. )
49 스마트 농장 서버 실행 Test pi@raspberrypi ~ $ cd iot_farmserver
~/iot_farmserver $ cd output ~/iot_farmserver/output $ ls mjpg.sh server_farm 서버실행 : $sudo ./server_farm ~/iot_farmserver/output $ sudo ./server_farm validate database… iot_send_query : query – CREATE TABLE IF NOT EXISTS tfarmsensorvalue (id INT AUTO_INCRE ) iot_send_query : query – CREATE TABLE IF NOT EXISTS tfarmsensorcheck (id INT AUTO_INCRE ) data: 1 validate setting data… : 1 starting server… Humidity = % Temperature = *C Humidity = 52 Temperature = 25 Temperature = 25 Data not good, skip Humidity = % Temperature = *C Humidity = 52 SensorInterruptLoop : write to DB – INSERT INTO tfarmsensorvalue values (null ,now(), now(), , , 0) iot_insert_data_from_db : query – INSERT INTO tfarmsensorvalue values (null ,now(), now(), , , 0) 실행 종료 : ctrl – x
50 카메라 구동 테스트 $sudo apt-get update $sudo apt-get upgrade
카메라 모듈 사양 센서 OmniVision OV5647(8.5 x 8.5 x 5mm) PCB 크기 25 x 20 x 9 mm 무게 3 g 해상도 5 Megapixels 지원 비디오 모드 1080p30, 720p60 and 640x480p60/90 영상/스팅 지원 정지영상 캡처 2592×1944 초당 30프레임의 1080p 지원 초당 60프레임의 720p 지원 초당 90프레임의 640x480p 지원 $sudo apt-get update $sudo apt-get upgrade $sudo raspi-config – 카메라의 설정값은 disable 디폴트. Enable 시켜준다. $sudo apt-get install mplayer netcat ffmpeg gpac – 부가적인 패키지를 설치 명령을 실행하고 24M의 공간이 필요하다는 메시지가 나오면 ‘Y’ 입력하여 설치를 진행한다.
51 카메라 캡쳐 jpg 포맷으로 이미지를 캡처하려면 다음과 같이 입력한다. $raspistill -o image.jpg
$ls 명령어로 image.jpg 파일이 생성된 것을 볼 수 있다. 이번에는 h264 포맷으로 5초 동안 동영상을 캡처해 보는 명령이다. $raspivid -o video.h264 –fps 30 –t 10000 -o : 출력파일 이름 -t : 촬영시간 밀리세컨드(10000 = 10초) -fps : 초당프레임 $ls 명령어로 확인하면 video.h264 파일이 생성되었다. 10초로 늘리려면 다음과 같이 입력한다. $raspivid -o video.h264 -t 10000 라즈베리 파이 카메라 프로그램은 H264 포맷을 사용하고 있기에 별도의 프로그램으로 보거나 일반적인 동영상 파일로 변환하려면 별도로 파일을 변환시켜줘야 한다. 다음의 명령어는 ffmpeg을 이용하여 H264 포맷을 mkv 포맷으로 변환시키는 예제다. $ffmpeg –r 30 –i video.h264 –vcodec copy video.mkv 확인해 보면 video.mkv 파일이 생성되었다. 다음의 명령어로도 가능하다. $MP4Box –add video.h264 video.mp4 $raspivid | less $raspistill | less
52 동영상 스트리밍 카메라 모듈을 이용하여 mjpg-stream 을 구현한다. 속도가 많이 느린 편이지만 현장 상황을 웹을 이용하여 모니터링 하기에는 무리가 없다. 웹스트리밍 또는 기타 외부 기기에서 라즈베리 파이 카메라 모듈을 이용한 웹스트리밍 서비스를 하기 위해선 mjpg-stream 이 가장 최적화 되어 있다. Mjpg-stream 컴파일을 위해 아래 영상관련 라이브러리 및 cmake 패키지를 설치 해 주도록 한다. $udo apt-get install git cmake libjpeg8-dev imagemagick -y videodev2.h 헤더파일 링크gksmsep[ mjpg-streamer 를 컴파일 진행 시에는 요구하는 videodev.h 헤더파일을 변경된 videodev2.h 파일로 링크 하자. $ sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h mjpg-streamer 다운로드 및 컴파일 하기 $ git clone
53 $ pi@raspberrypi ~ $sh mjpg.sh
동영상 스트리밍 Test $cd ~/mjpg-streamer/mjpg-streamer-experimental ~/mjpg-streamer/mjpg-streamer-experimental $ make clean all 앞의 과정들을 통해 mjpg-streamer 를 실행 할 수 있는 환경이 갖추어 졌으니, 마지막으로 파이 캠에서 mjpg-streamer 를 이용 할 수 있도록 자동 스크립트를 작성하고 명령어를 입력 해 웹 스트리밍을 구현 해 보자. $ ~ $cd ~ $ ~ $sudo nano mjpg.sh export STREAMER_PATH=$HOME/mjpg-streamer/mjpg-streamer-experimental export LD_LIBRARY_PATH=$STREAMER_PATH $STREAMER_PATH/mjpg_streamer -i “input_raspicam.so -d 200” -o “output_http.so -w $STREAMER_PATH/www” CTRL-X 를 누르고 Y 누르고 Enter 저장하고 나온다. $ ~ $sh mjpg.sh $ ~ $sh mjpg.sh 확인 주소 : 아이피 :8080 종료 Ctrl -c
54 스마트 농장 Database 설계 DB Name : iotfarm
Table : tfarmsensorvalue 센서값 저장 테이블 1분마다 센서 값을 저장한다. 날짜 day / 조도 int / 온도 float / 습도 float Table : tfarmsensorcheck 센서 정상/불량 저장 테이블 센서 정상 불량 확인하여 저장 10분마다. 날짜 day / 조도센서 (정상, 오류) / 온도센서 (정상, 오류) / 습도센서(정상, 오류) Table : tfarmactuoperate 액츄에이터 동작상태(동작중/정지중) 액츄 동작시 데이터베이스 업데이트 하고, 동작 끝날 때 업데이트 날짜 day / pump(on,stop) / fan(on, stop) / dcmotor(on, stop) / rgbled(on, stop) Table : tfarmactucheck 액츄에이터가 정상/불량 저장 데이블 액츄에이터 정상 불량 기록 – 현재는 모두 정상 pump(normal, fail), fan(normal, fail), dcmotor(normal, fail), rgbled(normal, fail) Table : tfarmsetting 설정값 저장 테이블 Now(), 매일/2일/3일(0,1,2)
55 스마트 농장 User Interface 설계
56 Android App 개발 이클립스 개발환경
File – Import 선택 – Existing Projects into Workspace Zip 파일 혹은 프로젝트 파일 선택 Activity_main.xml 파일 – Layout 파일 편집
57 Android App 개발 MainActivity.java 파일 스마트 폰에서 실행
58 Smart IoT 블로그 : http://smartiot.tistory.com
스마트 농장 앱 다운로드 설치 Smart IoT 블로그 : 스마트 팜 앱 :
59 스마트 농장 전체 실습 연결도 ssid : iptime key : 12345678 Wire Ethernet
스마트 농장 전체 실습 연결도 Wire Ethernet 카메라 Internet Router Gateway(R-Pi) WiFi 동글 사용시 공유기 설정을 참고하여 라즈베리 파이 Wlan0 설정 필요함. – 같은 네트워크에 접속되어야 함 할당받은 ip 주소 : 교육실 : ssid : iptime key :
60 스마트 농장 실습 과 스마트 폰 앱 Test $sudo ./s-farm 으로 동영상 스트리밍 서버와 스마트 팜 서버를 동시에 실행 스마트 농장 시스템 서버실행 1. 스마트 팜 서버 실행 백그라운드 실행 ~/iot_farmserver/output $ sudo ./server_farm & 2. 동영상 스트리밍 서버 실행 $sh mjpg.sh export STREAMER_PATH=/home/pi/mjpg-streamer/mjpg-streamer-experimental export LD_LIBRARY_PATH=$STREAMER_PATH $STREAMER_PATH/mjpg_streamer -i “input_raspicam.so -d 200” -o “output_http.so -$
61 스마트 농장 앱 실행 1
62 스마트 농장 앱 실행 2
63 참고자료 [1] (주)휴인스 : http://www.huins.com
[2] (주)휴인스 IoT Blog : smartiot.tistory.com [3] 라즈베리 파이 활용백서 : 실전 프로젝트 20 – 이재상 표윤석 지음, 비제이 퍼블릭 [4] 라즈베리 파이 산딸기 마을 카뮤니티 [5] 리눅스와 함께하는 라즈베리 파이 – 피터 멤브리, 배장열 옮김, 제이펍 [6] ITU-T Internet Report “The Internet of Things – Executive Summary”, Nov [7] 민경식, Net Term, 인터넷 & 시큐리티 이슈, “사물 인터넷 (Internet of Things)”, 2012. [8] 전자부품연구원(KETI), “IoT(Internet of Things) Presentation Design”, Nov [9] 이준섭, TTA 표준화 교육, 스마트 통신시장의 핵심열쇠 “M2M”, “M2M/IoT Standardization in ITU-T”, Oct. 23, 2012. [10] ITU-T, ITU-T SG13, “Y.WoT, Framework of Web of Things”, Oct. 10, 2011. [11] ITU-T, ITU-T SG13, “Y.2060, Overview of the Internet of Things”, July 04, 2012. [12] IETF, Draft-lee-iot-problem-statement-05.txt [13] JP Vasseur, IETF 77, Internet Area Meeting, “The Internet of Things”, March 2010. [14] Internet of Things – Feb , Yim Hyung-jun, Database Systems Lab. Dept. of Computer Engineering Chungnam National University [15] 사물인터넷(IoT)분야의 주요 임베디드 SW기술 – MDS 테크놀로지㈜ 장성균(2014/07/24) [16] 사물인터넷 글로벌 생태계 구축 및 서비스 활성화를 위한 개방형 IoT 소프트웨어 플랫폼 기술 , [17] Opensource H/W + Node js 로 IoT 따라잡기 – Circulus