Raspberry Pi 입출력디바이스 II 1 제 05 강 입출력디바이스 II 터치스위치자석스위치움직임감지센서부저모듈 LED Array RGB LED 릴레이모듈초음파센서 ( 거리측정 ) 적외선센서및리모콘 ( 미작성 )
터치스위치 * IM120710023 터치스위치 : 유형... 토글형및비토글형 Raspberry Pi 입출력디바이스 II 2 : S( 디지털출력 ), V(5V), G(GND) : 토글형... 터치시이전상태의보신호출력 : 비토글형... 터치시 Low 신호출력, 비터치시 High 신호출력
Raspberry Pi 입출력디바이스 II 3 터치스위치 ( 계속 ) [ 실습 1] 터치스위치 /LED 제어 : 비토글형터치스위치를터치중인동안 LED ON하는프로그램 : 회로도 $ sudo nano touch_01.c //======================================= // touch_01.c // direct touch sensor //======================================= #include <stdio.h>
Raspberry Pi 입출력디바이스 II 4 #include <wiringpi.h> #define P_TCH 1 // BCM_GPIO 18 #define P_LED 4 // BCM_GPIO 23 int main(void) { printf("[p_tch testing...]\n"); if(wiringpisetup() == -1) return 1; pinmode(p_tch, INPUT); pinmode(p_led, OUTPUT); // input // output while(1) { if(digitalread(p_tch)==high) { digitalwrite(p_led, LOW); printf("."); else{ digitalwrite(p_led, HIGH); // not touch // touch
printf("\ntouched!!"); Raspberry Pi 입출력디바이스 II 5 return 0; $ make touch_01 $./touch_01
자석스위치 * 자석 ( 리드 ) 스위치 Raspberry Pi 입출력디바이스 II 6 : 한쪽은스위치이며, 다른한쪽은자석으로구성 : 자석을가까이하면스위치 ON되는형, : 자석을가까이하면스위치 Off되는형의 2유형 : 자석이붙어있을때 high 신호출력, 떨어졌을때 low 신호...
자석스위치 ( 계속 ) [ 실습 2] 자석스위치 /LED 제어 Raspberry Pi 입출력디바이스 II 7 : 자석이붙어있는동안 LED 를 ON 하는프로그램 $ sudo nano magnetic_01.c //======================================= // magnetic_01.c // LED ON while magnetic ON //======================================= #include <stdio.h> #include <wiringpi.h> #define P_LED 1 // BCM_GPIO #18 #define P_MAG 5 // BCM_GPIO #24 int main(void) { int status; printf("[led/mag testing...]\n");
Raspberry Pi 입출력디바이스 II 8 if(wiringpisetup() == -1) return 1; pinmode(p_led, OUTPUT); pinmode(p_mag, INPUT); printf("p_led ON while P_MAG ON...\n"); status = 0; while(1) { status = digitalread(p_mag); if(status==1) { digitalwrite(p_led, HIGH); printf("on...\n"); else { digitalwrite(p_led, LOW); printf("off...\n"); delay(10);
Raspberry Pi 입출력디바이스 II 9 return 0; $ make magnetic_01 $./magnetic_01
움직임감지센서 * SEN0171 PIR 센서 : 외형 Raspberry Pi 입출력디바이스 II 10 : 감지거리최대 7m 정도 : 3 핀인터페이스 ( 빨강 Vcc, 검정 Gnd, 초록감지신호선 )
움직임감지센서 ( 계속 ) [ 실습 3] 움직임감지센서 I : SEN0171 PIR 센서활용 : 적절히회로구현할것 Raspberry Pi 입출력디바이스 II 11 $ sudo nano motion_01.c //======================================= // motion_01.c // LED ON while detecting motion //======================================= #include <stdio.h> #include <wiringpi.h> #define P_LED 1 // BCM_GPIO #18 #define P_MOT 5 // BCM_GPIO #24 int main(void) {
Raspberry Pi 입출력디바이스 II 12 int status; printf("[led/mot testing...]\n"); if(wiringpisetup() == -1) return 1; pinmode(p_led, OUTPUT); pinmode(p_mot, INPUT); printf("p_led ON while P_MOT ON...\n"); status = 0; while(1) { status = digitalread(p_mot); if(status==1) { digitalwrite(p_led, HIGH); printf("on...\n"); else { digitalwrite(p_led, LOW); printf("off...\n");
Raspberry Pi 입출력디바이스 II 13 delay(10); return 0; $ make motion_01 $./motion_01
부저모듈 * 피에조부저 (SM-1212C) : 외형 Raspberry Pi 입출력디바이스 II 14 : 회로도
부저모듈 ( 계속 ) Raspberry Pi 입출력디바이스 II 15 * 음악연주를위한계이름에따른주파수
Raspberry Pi 입출력디바이스 II 16 부저모듈 ( 계속 ) * softtone.h 라이브러리 : 핀에주파수신호출력과관련한함수 extern int softtonecreate(int pin); : 주파수신호를출력하도록핀설정 extern void softtonewrite(int pin, int freq); : 특정주파수의신호를출력 extern void softtonestop(int pin); : 주파수신호의출력을정지
Raspberry Pi 입출력디바이스 II 17 부저모듈 ( 계속 ) [ 실습 4] 부저모듈제어 I : 주파수를가변하여음출력하는프로그램 $ sudo nano buzer_01.c //======================================= // buzer_01.c // //======================================= #include <stdio.h> #include <wiringpi.h> #include <softtone.h> // * #define P_BUZ 1 // BCM_GPIO #13 int main(void) { int freq;
Raspberry Pi 입출력디바이스 II 18 if(wiringpisetup() == -1) return 1; pinmode(p_buz, OUTPUT); softtonecreate(p_buz); freq = 262; // Do while(1) { softtonewrite(p_buz, freq); delay(1000); // 주파수발생 freq += 20; softtonestop(p_buz); delay(1000); // 음정지 return 0;
Raspberry Pi 입출력디바이스 II 19 $ make buzer_01 $./buzer_01
Raspberry Pi 입출력디바이스 II 20 LED 어레이 [ 실습 5] LED 어레이제어 : 4개 LED에이진수로 0~15까지반복표시하는프로그램 ( 비트필드, 구조체활용 ) : 회로연결 ( 소스참조 ), 도트매트릭스모듈활용가능 $ sudo nano ledary_01.c //======================================= // ledary_01.c // LED Array(4 LED) control //======================================= #include <stdio.h> #include <stdint.h> #include <wiringpi.h> #define P_LED_D0 26 // BCM_GPIO #12, LSB
#define P_LED_D1 27 // BCM_GPIO #16 #define P_LED_D2 28 // BCM_GPIO #20 #define P_LED_D3 29 // BCM_GPIO #21, MSB struct leds { unsigned int led0 : 1; // LSB unsigned int led1 : 1; unsigned int led2 : 1; unsigned int led3 : 1; // MSB unsigned int higher : 4; // higher nibble ; Raspberry Pi 입출력디바이스 II 21 union ucode { uint8_t val; struct leds pin; ; // bit-field void setup(void) { pinmode(p_led_d0, OUTPUT); pinmode(p_led_d1, OUTPUT); pinmode(p_led_d2, OUTPUT); pinmode(p_led_d3, OUTPUT);
Raspberry Pi 입출력디바이스 II 22 void out_data(union ucode acode) { digitalwrite(p_led_d0, acode.pin.led0); digitalwrite(p_led_d1, acode.pin.led1); digitalwrite(p_led_d2, acode.pin.led2); digitalwrite(p_led_d3, acode.pin.led3); int main(void) { union ucode acode; int i; printf("[led Array testing...]\n"); if(wiringpisetup() == -1) return 1; setup(); while(1) { for(i=0; i<16; i++) {
acode.val = i; out_data(acode); printf("... HEX : %0X, DEC : %2d \n", acode.val, acode.val); delay(1000); Raspberry Pi 입출력디바이스 II 23 return 0; $ gcc o ledary_01 ledary_01.c lwiringpi 혹은, $ make ledary_01 $./ledary_01
RGB LED * RGB LED : 140C05 RGB LED 모듈 Raspberry Pi 입출력디바이스 II 24 1) Common Anode 타입 : 다리가긴것이 + 2) Common Cathode 타입
RGB LED( 계속 ) [ 실습 6] RGB LED 제어 Raspberry Pi 입출력디바이스 II 25 : 몇가지색상을조합하여표시하는프로그램 : 각 LED를 ON하려면 Low 신호를출력하여함 $ sudo nano rgbled_01.c //======================================= // rgbled_01.c // led ON (Low signal) //======================================= #include <stdio.h> #include <wiringpi.h> #define P_LED_R 0 // BCM_GPIO #17 #define P_LED_G 2 // BCM_GPIO #27 #define P_LED_B 3 // BCM_GPIO #22
int main(void) { printf("[rgbled testing...]\n"); if(wiringpisetup() == -1) return 1; pinmode(p_led_r, OUTPUT); pinmode(p_led_g, OUTPUT); pinmode(p_led_b, OUTPUT); // all OFF digitalwrite(p_led_r, HIGH); digitalwrite(p_led_g, HIGH); digitalwrite(p_led_b, HIGH); delay(3000); while(1) { printf("rled ON...\n"); digitalwrite(p_led_r, LOW); digitalwrite(p_led_g, HIGH); digitalwrite(p_led_b, HIGH); delay(1000); Raspberry Pi 입출력디바이스 II 26
Raspberry Pi 입출력디바이스 II 27 printf("gled ON...\n"); digitalwrite(p_led_r, HIGH); digitalwrite(p_led_g, LOW); digitalwrite(p_led_b, HIGH); delay(1000); printf("bled ON...\n"); digitalwrite(p_led_r, HIGH); digitalwrite(p_led_g, HIGH); digitalwrite(p_led_b, LOW); delay(1000); printf("(r+g)led ON...\n"); digitalwrite(p_led_r, LOW); digitalwrite(p_led_g, LOW); digitalwrite(p_led_b, HIGH); delay(1000); printf("(r+g+b)led ON...\n"); digitalwrite(p_led_r, LOW); digitalwrite(p_led_g, LOW);
digitalwrite(p_led_b, LOW); delay(1000); Raspberry Pi 입출력디바이스 II 28 printf("all LED OFF...\n"); digitalwrite(p_led_r, HIGH); digitalwrite(p_led_g, HIGH); digitalwrite(p_led_b, HIGH); delay(2000); return 0; $ gcc o rgbled_01 rgbled_01.c lwiringpi 혹은, $ make rgbled_01 $./rgbled_01
Raspberry Pi 입출력디바이스 II 29 Relay 모듈 * 릴레이모듈 (DFR0017) : 외양 NC(Normally Closed), COM(Common), NO(Normally Open) : 유형 -구동전압에따라 5V, 12V 등 -채널개수에따라 1CH, 2CH, 4CH, 8CH 등 : 실습모듈 (5V 1CH 250ACV 10A) -5V 로구동, 고압회로는 250V...
Raspberry Pi 입출력디바이스 II 30 Relay 모듈 ( 계속 ) * 회로연결 -Normally Open 방식 : 고압회로단자를 COM, NO 단자에연결 : 릴레이에 High 신호출력으로 ON 상태 -Normally Closed 방식 : 고압회로단자를 NC, COM 단자에연결 : 릴레이에 Low 신호출력으로 ON 상태
Raspberry Pi 입출력디바이스 II 31 Relay 모듈 ( 계속 ) [ 실습 7] 릴레이모듈제어 I : Normally Open 방식 ( 고압회로는 NO와 COM 단자에연결 ) : 릴레이모듈에 High신호인가시릴레이 ON하는프로그램 $ sudo nano relay_01.c //======================================= // relay_01.c // Normally Open (COM, NO)... ON at High signal //======================================= #include <stdio.h> #include <wiringpi.h> #define P_RLY 29 // BCM_GPIO #21
// funciton definition void run(void) { digitalwrite(p_rly, HIGH); printf("on...\n"); delay(5000); Raspberry Pi 입출력디바이스 II 32 digitalwrite(p_rly, LOW); printf("off...\n"); delay(5000); int main(void) { printf("[relay testing...normally Open]\n"); if(wiringpisetup() == -1) return 1; pinmode(p_rly, OUTPUT); while(1) { run();
Raspberry Pi 입출력디바이스 II 33 return 0; $ make relay_01 $./relay_01 참고 ) Normally Closed 방식 (relay_02.c 소스참조 ) ( 고압회로는 NC 와 COM 단자에연결 )
초음파센서모듈 * 초음파센서모듈 (HC-SR04) : Ultrasonic Ranging Module(HC-SR04) Raspberry Pi 입출력디바이스 II 34 : 송신기가초음파전송한후, 수신기는그반향된신호를수신
초음파센서모듈 ( 계속 ) * 초음파센서제어절차 Raspberry Pi 입출력디바이스 II 35 1) 10us TTL 신호로 Trigger 2) 송신기는 8개 40Hz 버스트신호발사 ( 대기 ) 3) 수신기는반향신호수신 (High 레벨신호의지속시간측정 ) 4) 지속시간과음속활용하여거리계산 5) 충분한대기시간 ( >60ms )
초음파센서모듈 ( 계속 ) * wiringpi.h 라이브러리 Raspberry Pi 입출력디바이스 II 36 : 시간지연함수들이유용하게사용될수있음 - 시간지연함수 void delay(unsigned int howlong); void delaymicroseconds(unsigned int howlong); // millisec // microsec - 단위시간반환함수 unsigned int millis(void); unsigned int micros(void); // 현시각을 millisec 단위로 // 현시각을 microsec 단위로
초음파센서모듈 ( 계속 ) [ 실습 8] 초음파센서제어 Raspberry Pi 입출력디바이스 II 37 : 거리측정하는프로그램 : 회로연결 ( 소스참조 )... trig, echo 단자사용 $ sudo nano usonic_01.c //======================================= // usonic_01.c // HC-SR04 module //======================================= #include <stdio.h> #include <wiringpi.h> #define P_USO_TRIG 5 // Trigger Pulse, BCM_GPIO #24 #define P_USO_ECHO 4 // Echo Pulse, BCM_GPIO #23 int main(void) { long start, end;
Raspberry Pi 입출력디바이스 II 38 int duration; float distance; if(wiringpisetup() == -1) return 1; pinmode(p_uso_trig, OUTPUT); pinmode(p_uso_echo, INPUT); printf("[ultrasonic testing...]\n"); while(1) { // sending 2us signal digitalwrite(p_uso_trig, LOW); delaymicroseconds(2); // sending 10microSec high signal digitalwrite(p_uso_trig, HIGH); delaymicroseconds(10); digitalwrite(p_uso_trig, LOW); // 10us // wait for burst signal, 8x40kHz=8x25us=200us delaymicroseconds(200);
Raspberry Pi 입출력디바이스 II 39 // receiving echo signal while(digitalread(p_uso_echo)==low) // wait until 1 ; start = micros(); // us unit while(digitalread(p_uso_echo)==high) // wait until 0 ; end = micros(); // get High level duration(us) duration = end - start; // calculate the distance(cm) distance = duration / 58.; if(distance > 400) // invalid distance printf(""); else { printf("%d,%d duration:%d... ", start, end, duration); printf("distance : %.2f cm\n", distance);
Raspberry Pi 입출력디바이스 II 40 // delay for measurement cycle, > 60milliSec delay(100); $ make usonic_01 $./usonic_01
Raspberry Pi 입출력디바이스 II 41 응용과제 [ 응용 1] 부저모듈 : 동요 학교종 연주하는프로그램 $ sudo nano buzer_03.c //======================================= // buzer_03.c // deangdeangdeang... //======================================= #include <stdio.h> #include <wiringpi.h> #include <softtone.h> #define P_BUZ 1 // BCM_GPIO #13 #define Do 262 #define Re 294
Raspberry Pi 입출력디바이스 II 42 #define Mi 330 #define Pa 349 #define Sol 392 #define Ra 440 #define Si 494 #define Do1 523 // 학교종이땡땡땡음계및지속시간 int MusicData[] = {Sol, Sol, Ra, Ra, Sol, Sol, Mi, Sol, Sol, Mi, Mi, Re, Sol, Sol, Ra, Ra, Sol, Sol, Mi, Sol, Mi, Re, Mi, Do; int DelayTime[] = {400, 400, 400, 400, 400, 400, 800, 400, 400, 400, 400, 800, 400, 400, 400, 400, 400, 400, 800, 400, 400, 400, 400, 800; int main(void) { int i; printf("[music Play...]\n");
Raspberry Pi 입출력디바이스 II 43 if(wiringpisetup() == -1) return 1; pinmode(p_buz, OUTPUT); softtonecreate(p_buz); for(i=0; i<24; i++) { softtonewrite(p_buz, MusicData[i]); delay(delaytime[i]); softtonestop(p_buz); // 음정지 delay(1000); return 0; $ make buzer_03 $./buzer_03
응용과제 ( 계속 ) [ 응용 2] RGB LED 제어 : [ 실습6] 소스참조 : PWM 방식으로제어하도록재구현 (256x256x256 가지색상표시토록 ) Raspberry Pi 입출력디바이스 II 44 [ 응용 3] Relay 모듈 : Normally Closed 방식으로.. [ 응용 4] 여러모듈활용 : 몇개의모듈을조합한응용과제각자정의하여구현
Raspberry Pi 입출력디바이스 II 45
이하무시!!!! Raspberry Pi 입출력디바이스 II 46
움직임감지센서 ( 계속 ) * SEN0192 마이크로웨이브센서 - Raspberry Pi 입출력디바이스 II 47 - 감지거리최대 16m 정도 - 벽을통과하여움직임감지가능 -3 핀인터페이스 ( 빨강 Vcc, 검정 Gnd, 초록감지신호선 )
움직임감지센서 ( 계속 ) [ 실습 2] 움직임감지센서 II -SEN0192 마이크로웨이브센서활용 Raspberry Pi 입출력디바이스 II 48 //=======================================
Relay 모듈 ( 계속 ) HK4100F-DC5V-SHG Raspberry Pi 입출력디바이스 II 49
적외선센서및리모콘 * VS1838B 적외선센서 - 거리 Raspberry Pi 입출력디바이스 II 50 * 리모콘 * lirc 라이브러리