12. 아두이노와 센서를 이용한 제어 - 스마트 폰으로 제어하는 아두이노 -
강의 개요 우리 주변에서 일어나는 여러 가지 정보들을 받아들여 아두이노와 같은 마이크로프로세서 기반의 제어하려면 물리적인 현상의 정보를 전기적인 신호로 변환해 주는 센서(sensor)가 필요 이 장에서는 아두이노 보드에서 일반적으로 많이 사용되는 센서들을 중심으로 신호를 받아 제어하는 방법에 대하여 간단하고 실용적인 예제들을 다루어 본다.
12.1 센서 사람이 접하는 대부분의 현상 빛, 열, 바람, 냄새, 기울기나 속도 등에 의하여 발생하는 연속적인 변화를 갖는 아날로그적 특성 센서 아날로그적인 현상을 전기적으로 다루고 제어하기 위해서 물리적 정보를 전기적 신호로 변환해 주는 장치 센서를 통하여 얻어지는 전기적 신호는 단순히 "0"과 "1"의 디지털 정보로 제공되기도 하지만 대부분은 연속적인 전압이나 전류의 변화를 갖는 아날로그 신호 연속적인 아날로그 신호를 마이크로프로세서를 사용하여 제어하려면 디지털 값으로 변환하는 AD변환기(Analog-Digital Converter) 기능을 사용
센서의 종류 빛 세기의 변화를 감지하는 센서 물체까지의 거리를 측정하는 방법 온도 센서를 사용 기울기 센서나 모션 센서 Cds나 LDR을 사용 다양한 포토 센서를 사용하여 물체를 감지하는 기능으로 사용 물체까지의 거리를 측정하는 방법 초음파 센서나 적외선 센서 사용 적외선 센서는 산업 현장에서 물체까지의 거리를 측정하는 용도로 많이 사용 온도 센서를 사용 열 발생의 상태를 확인 기울기 센서나 모션 센서 물체가 기울어지거나 흔들리는 등의 정보를 얻기 위하여 사용 스마트 폰에 설치된 센서 위치정보를 얻을 수 있는 GPS 센서 RFID나 XBee를 센서
12.2 빛 감지 센서 빛의 밝기 변화를 인식하는 센서 CDS 많이 사용 CDS는 빛 세기가 변하면 저항 값이 변화 아두이노 아날로그 입력 핀에 빛 센서를 연결하면 빛의 량에 따라서 전압 값이 변화
회로 구성 아두이노 보드는 아날로그 입력 A0를 통하여 빛의 변화 값을 0~5[V] 사이의 전압변화 값으로 입력 받아 0~1023 사이의 디지털 값으로 인식.
예제 12.1 CDS로 측정된 빛의 밝기를 시리얼 모니터에 표시 빛의 밝기에 따라 변화되는 광센서(CDS)의 입력 값을 AD 변환하여 시리얼 통신으로 PC로 전송하여 시리얼 모니터에 표시 주요개념 아두이노 보드에서 아날로그 입력핀 A0를 통하여 입력되는 0~5[V]사이의 아날로그 값을 analogReade( )함수를 사용하여, 입력 입력된 아날로그 값이 0~1023의 디지털 값으로 변환된 값을 Serial.println( ) 함수 시리얼 모니터에 출력
예제 12.1의 스케치 int val = 0; AD 변환값을 저장할 변수 void setup() { Serial.begin(9600); } 시리얼 통신 속도 지정 void loop() { val = analogRead(0); Serial.print("CDS = "); Serial.print(val); Serial.print("\n"); delay(200); 아날로그 0번 핀 (CDS) 값을 입력 변환된 디지털 값을 시리얼 모니터로 전송
예제 12.1의 스케치(백분율 표현) int val = 0; int percent; AD 변환값을 저장할 변수 void setup() { Serial.begin(9600); } 시리얼 통신 속도 지정 void loop() { val = analogRead(0); percent = map(val,0,1023,0,100); Serial.print("CDS(%) = "); Serial.print(percent); Serial.print("\n"); delay(200); 아날로그 0번 핀 (CDS) 값을 입력 변환된 디지털 값을 %로 변환 변환된 %값을 시리얼 모니터로 전송
예제 12.2 CDS로 ON/OFF 제어하기 광센서의 값을 받아들여 어두우면 LED를 켜고, 그렇지 않으면 LED를 끄기 아두이노 보드 핀 A0 GND D2 연결 +(풀업저항) - + CDS 센서 LED
예제 12.2의 스케치 int val = 0; int LED=7; int percent; CDS의 값을 저장할 변수 void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); } 시리얼 통신 속도 지정 디지털입출력 2번 핀 출력모드 지정 void loop() { val = analogRead(0); percent = map(val,0,1023,0,100); if(percent>50) digitalWrite(LED, LOW); else digitalWrite(LED, HIGH); Serial.println(percent); delay(100); 아날로그 0번 핀 (CDS) 값을 입력 변환된 디지털 값을 %로 변환 빛이 많으면 LED OFF 그렇지 않으면 LED ON 변환된 디지털 값을 시리얼 모니터로 전송
12.3 포토 센서 포토 센서는 발광부에서 빛을 공급하고 수광부에서 그 빛을 다시 받아들이는 형태로 동작 투과형과 미러 반사형 형태
예제 12.3 포토 센서로 ON/OFF 제어하기 포토 센서의 변화 인식하여 포토센서 사이에 물체가 있으면 LED를 켜고, 그렇지 않으면 LED를 끄기 주요개념 아두이노 보드에서 디지털 입력출력핀 2번에 포토센서 입력을 연결하고, 8번에 LED를 연결 2번 핀을 통하여 포토센서의 값을 받아들여 물체가 감지되면 LED가 ON 움직임을 감지하는 포토 센서가 LED를 ON/OFF하는 스위치 같은 역할 수행
예제 12.3의 스케치 const int LED_pin = 8; const int Photo_pin = 2; 출력 동작 LED 입력 신호 핀 void setup() { pinMode(LED_pin, OUTPUT); pinMode(Photo_pin, INPUT); } LED를 출력 설정 포토 센서 입력 설정 void loop(){ int val = digitalRead(Photo_pin); if (val == HIGH){ digitalWrite(LED_pin, HIGH); delay(500); digitalWrite(LED_pin, LOW); 포토 센서의 디지털 입력 읽기 입력 판별 움직임이 감지되면, LED ON 움직임이 감지되지 않으면 LED OFF
12.4 초음파 센서 아두이노를 사용하여 앞에서 움직이는 물체나 장애물의 거리를 측정하려면 초음파 센서를 사용 초음파 센서는 일반적으로 2cm~3m까지 거리를 측정 가능 초음파 센서의 초음파 발생기에서 발생한 초음파가 전방에 있는 물체에 반사되어 센서로 돌아오는 시간을 측정하여 거리를 측정 소리의 속도는 340m/s이므로 1cm를 가는데 29μ초가 소요
초음파 센서 SRF04의 거리 측정 방식 ⓐ 10μ초 간격으로 트리거 펄스를 발생 ⓑ 40kHz초음파 신호를 8사이클 송출 (25μ초×8=200μ초) ⓒ 되돌아오는 반사 펄스를 계측
센서 연결 아두이노 보드 디지털입출력 핀 +5V 2 3 GND 초음파센서 ECHO TRIG
예제 12.4 초음파 센서값을 시리얼 모니터에 표시하기 주요개념 아두이노 보드에서 디지털 입력출력핀 3번을 통하여 10μ초 동안 트리거 펄스를 발생시킨 후 pulseIn( )함수를 사용하여 펄스의 지속시간을 측정 소리의 속도는 340m/s이고, 1cm를 가는데 29μ초가 소요 pulseIn( )함수로 시간 측정 측정된 시간은 물체에 붙이여 돌아오는 왕복 시간이므로 58μ초로 나누면 cm단위의 거리 계산
예제 12.4의 스케치 int ECHO_pin = 2; 반사 신호 수신 핀 int TRIG_pin = 3; int distance; 반사 신호 수신 핀 트리거 신호 발생 핀 void setup(){ Serial.begin(9600); pinMode(ECHO_pin, INPUT); pinMode(TRIG_pin, OUTPUT); } 반사 신호 수신 핀 입력모드 설정 트리거 신호 발생 핀 출력모드 설정 void loop(){ digitalWrite(TRIG_pin, LOW); delayMicroseconds(2); digitalWrite(TRIG_pin, HIGH); delayMicroseconds(10); distance = pulseIn(ECHO_pin, HIGH); distance= distance/58; Serial.print("Distance(cm) -> "); Serial.println(distance); delay(100); 트리거 핀을 2μ초 동안 “LOW” 트리거하기 위하여 10μ초 동안 “HIGH” 트리거 핀을 다시 “LOW” 펄스 지속 시간 읽기 펄스 시간을 거리로 계산 시리얼 모니터에 출력 다음 측정까지 100mS 대기
12.5 적외선 센서 물체까지의 거리를 측정하기 위하여 다양한 센서가 사용되는데 그 가운데 가장 대표적인 센서 적외선 센서는 일반적으로 산업 현장에서 거리를 측정하는 용도로 많이 사용 측정 범위 : 약 10~80[cm] 정도 analogRead( )함수를 사용하여 입력 아두이노 보드 디지털입출력 핀 A0 +5V GND 적외선 센서 OUT
회로 구성
12.6 온도 센서 온도를 인식하는 센서 온도가 변하면 저항 값이 변하므로, 아두이노 아날로그 입력 핀에 온도 센서를 연결하면 온도 변화에 따라 전압 값 변화 LM35가 많이 사용 0.1 당 1mV 출력으로 온도에 비례하는 아날로그 전압 생성 온도측정 범위 : 일반적으로 -40~+100
회로 구성
예제 12.5 온도센서로 측정한 결과를 시리얼 모니터에 출력하기 주요개념 LM35는 0.1 당 1mV 출력으로 온도에 비례하는 아날로그 전압을 만들며, 정밀도는 약 0.5도 아두이노의 아날로그 입력핀으로부터 입력된 값을 다음과 같이 변환하고, 10으로 나누어 온도를 계산 온도를 계산하기 위하여 32비트 정수를 사용 millivolts = (value/1024.0) * 5000; celsius = millivolts/10;
예제 12.5의 스케치 int THR_pin = 0; 아날로그 센서 입력 핀 int value; void setup() { Serial.begin(9600); } void loop(){ value = analogRead(THR_pin); Serial.print(value); Serial.print(" -> "); float millivolts = (value/1024.0) * 5000; float celsius = millivolts/10; Serial.print(celsius); Serial.print(" degrees Celsius, "); delay(1000); 센서 출력 10[mV]/ 섭씨 1도 화씨로 변환하기 1초 대기
12.7 광센서, 초음파, 온도 모듈 HBE-MCU-Multi의 온도, 초음파, 광센서로 구성된 센서 모듈 Sensor Module 구성 - Temperature -40~+124℃ Range, I2C Interface - Humidity 0~100% Range, I2C Interface - CDS - Infrared Light Sensor Size : 56mm x 45mm, 5 Test Point
센서 회로 온도 센서 초음파 센서 광 센서
예제 12.6 CDS로 측정된 빛의 밝기에 따라 LED의 점멸 상태 변화 Sensor 모듈의 CDS 센서와 LED 모듈을 사용하여 빛의 밝기에 따라 지정된 밝기 보다 어두우면 LED0가 점등되고, 밝으면 LED1이 점등되도록 만들기 연결 아두이노 보드 핀 A0 D6 D7 연결 모듈 CDS_OUT LED0 LED1 센서 모듈 LED 모듈
Mega 보드-SENSOR모듈과 LED 연결
예제 12.6의 스케치 const int CDS_pin=0; int LED0_pin = 6; int LED1_pin = 7; int val = 0; CDS_OUT를 A0에 설정 LED0를 D6에 설정 LED1를 D7에 설정 void setup() { Serial.begin(9600); pinMode(LED0_pin, OUTPUT); pinMode(LED1_pin, OUTPUT); } 시리얼 모니터 설정 ledPin을 출력으로 설정 void loop() { val = analogRead(CDS_pin); Serial.println(val); analogWrite(LED0_pin, val/4); analogWrite(LED1_pin, 1023-val/4); delay(100); cds에서 전압 읽는 함수 val=0~1023 시리얼 모니터로 출력 LED0에 CDS출력에 비례하는 밝기출력 LED1에 LED0의 반전 0.1초 간격으로 센싱
예제 12.7 빛의 변화로 소리내기 광센서 CDS 소자와 피에조 소자를 연결하여 빛의 양에 따라 소리를 다르게 내도록 하기 주요개념 Sensor 모듈의 CDS 센서 출력 CDS_OUT와 아두이노 MEGA 보드의 아날로그입력 A0를 연결 Mega 보드의 디지털입출력핀 7번과 AUDIO모듈 PIEZO 연결 광센서 CDS로 부터 값을 읽어 현재 센서 값이 이전 센서 값에서 ±10 범위를 벗어나면 광센서 값의 2배로 소리 출력 아두이노 보드 핀 A0 D7 연결 모듈 CDS_OUT PIEZO SENSOR 모듈 AUDIO 모듈
Mega-SENSOR모듈과 PIEZO 연결 회로
예제 12.7의 스케치 int val = 0; int old_val = 0; void setup() { Serial.begin(9600); pinMode(7, OUTPUT); } void loop() { val = analogRead(0); Serial.println(val); if ( (val<old_val-10) || (val> old_val+10) ) { tone(7, val*2); old_val = val; 현재 센서 값이 이전 센서 값에서 ±10 범위를 벗어나면 광센서 값 * 2배로 소리 냄 현재 값으로 이전 값 새로 고침
연습문제 빛의 밝기에 따라 LED의 깜박이는 속도가 4단계로 조정되는 스케치를 만들어 보자. 빛이 특정한 밝기가 되면 멜로디가 연주되는 스케치를 만들어 보자. 특정 온도가 되면 경고음이 발생하는 스케치를 만들어 보자. 물쳉의 거리에 따라 경고음의 크기가 변하는 스케치를 만들어 보자. if-else문과 case문을 사용하여 제어 할 때의 장단점을 비교해 보자.