IR송수신기를 사용한 주기적인 속도 측정(RPM 등)용 센서를 활용해보자..
▶ 이 가이드를 따라하면
- 회전하는 바퀴의 RPM 등을 측정할 수 있는 Tachometer 센서를 이해할 수 있다.
▶ 부품 설명 및 회로 구성
IR(Infra Red/적외선)은 다양한 활용도가 있는데, 그 중에 하나가 바로 이 타코미터(Tachmeter)이다. 따로 적외선 송수신기를 달아 만들기도 하지만, 이미 만들어진 모듈이 존재한다. 바로 아래 그림이다. RPM 측정에도 광범위하게 사용되는데, 무언가 사이를 지나가는 것을 측정할 수 있다. 기본적으로는 양 옆에는 IR 송출부와 수신부가 있고, 가운데를 막으면 IR 신호가 막히는 것을 이용해 digital로 signal을 내어준다(해당 IR 센서의 측정 값을 analog로도 같이 내주는 경우도 흔하다.) 레이저와 광센서로도 유사한 측정이 가능한데 물론 이 IR이 훨씬 저렴하게 가능하다.
<FC-03 Tachometer, VCC/GND/D0/A0가 보인다. A0는 analog 센서 측정 값으로, 필요시만 사용한다.>
상기 센서 모듈의 검은색 두개의 타워 사이에 무언가 지나가면, 노란색LED(On/Off)에 불이 꺼졌다가 들어오게 된다(빨간색 LED는 전원 유무). 배선은 간단해서 모듈과 보드를 VCC->5V, GND->GND, D0->D2에 연결하면 된다.
<모듈의 D0를 D2에 연결했다.>
이 센서는 매우 정확하게 지나간 타이밍을 측정하는데, 어떤 책에서는 이를 통해 중력가속도를 측정하는 예를 본 적도 있다.(진자의 통과 시간을 측정해서 계산하면 되었던 것 같다. 해당 사이 간격이 넓은 유사 센서가 존재한다.)
실제에서는 바퀴에 구멍을 뚫어서 회전시에 구멍이 주기적으로 노출되는 시간 간격을 측정해 RPM(회전속도)을 계산한다. 아래가 그 개념도이다.
<반사되어 온다는게 FC-03과 다르나 RPM 측정 원리는 같다. 구멍이 지나가는 시간을 측정한다. www.ikalogic.com 발췌>
여기서는 간단하게 무언가 사이를 지나가는 횟수를 count하는 방법을 보자.
▶ 소스 코드 입력 및 구동
attachInterrupt라는 function을 사용하게 되는데, 센서의 디지털 핀이 HIGH->LOW로 바뀔때마다 이벤트 기반으로 숫자를 세준다(지속적으로 해당 핀의 HIGH/LOW를 검사해서 숫자를 세는 것보다 훨씬 더 효율적이다). 다만, 신기한 것은 다양한 이유로 생기는 잡음 때문에 이 HIGH->LOW로 변하는 것이, 순간적으로 잠깐씩 발생할 수 있어서 생각보다 count가 많이 잡힌다. 대표적인 것이 센서의 상태가 변하는 바로 전후인데, 이를 위해 아래의 소스코드에서는 상태 변화 후, 10msec미만에서 발생한 것들은 무시한다. 이 이슈 관련한 글은, 영문이지만 궁금한 분들을 위해 참조로 밝힌다. http://forum.arduino.cc/index.php?topic=342650.0
GitHub 원본 소스 링크 / https://github.com/bbangpan/bbangpan.com/blob/master/neibc_fc03_tachometer/neibc_fc03_tachometer.ino
------------------------------------------------------------------------------------------------------------
/* Originally posted on www.bbangpan.com
Program Description: FC-03 IR tachometer sensor test code
Tested on : Arduino 1.7.6, Arduino UNO R3, FC-03
Copyright (c) 2015 www.bbangpan.com. All rights reserved.
This program can be used for any non-commercial purpose freely. */
#define encdpin 2
volatile int count, countold;
unsigned long ignoremilli = 10; // to prevent unexpected peak (무시할 시간 타이밍을 결정한다.)
unsigned long oldtime = 0;
unsigned long time = 0;
void setup()
{
count = 0;
countold = 0;
oldtime = millis();
pinMode(encdpin, INPUT);
pinMode(13, OUTPUT);
attachInterrupt(digitalPinToInterrupt(encdpin), sensor1, FALLING); // 장애물이 지나가면 Digital pin의 상태가 변하는 것을 감지하여 sensor1이라는 function을 실행한다
Serial.begin(9600);
Serial.println("start");
}
void loop()
{
if (countold != count)
{
Serial.println(count);
countold = count;
}
}
void sensor1()
{
time = millis();
if( (time - oldtime) > ignoremilli ) {
count++;
}
oldtime = millis();
}
<실행 후 tachometer 사이에 무언가를 통과시키면 count가 올라간다>
이렇게 잡음에 유의해도, 두 센서 사이가 막힐 때 한번, 열릴 때 한번 해서 총 2번이 카운트 된다. 왜일까? 아래 실제 막힘과 digital output의 출력을 보면 이유를 알 수 있다. 따라서 이러한 점을 감안하여 제공된 소스를 수정해 해당 처리를 할 필요가 있다(나누기 2를 하는 방법 등이 있다)
<센서 값 변화에 따른 실제 Digital pin의 신호 변화 개념도. 초기 신호 전환시 잡음까지 있다. forum.arduino.cc 발췌>
만약에 시간 간격 정보가 필요하면 time, oldtime 변수의 차를 이용하자. millis()함수는 아두이노 부팅 후 지나간 시간을 msec단위로 값을 리턴하므로 정확한 시간 간격을 구하는데 사용될 수 있다.
▶ 구매 가이드
Infrared speed sensor : http://www.aliexpress.com/wholesale?catId=0&initiative_id=SB_20151025091018&SearchText=LM393+infrared+speed ($ 2)
▶ 강의 키워드
Tachometer, RPM sensor, FC-03, LM393, 타코미터, 포토 인터럽터, photo interrupter, 속도측정, 아두이노, Arduino
'아두이노 센서' 카테고리의 다른 글
[센서/조도,움직임] GY-9960LLC, APDS-9960 RGB and gesture sensor, 조도 및 움직임 센서 (0) | 2017.06.08 |
---|---|
[센서/컬러센서] TCS34725 센서를 통해 RGB 값을 읽어보자 (6) | 2017.02.12 |
[센서/전압측정] 전압 센서(Voltage Sensor)를 통해 전압을 측정하자 (4) | 2016.05.06 |
[센서/회전검출] Keyes rotary encoder, shaft encoder (0) | 2016.03.06 |
[센서/움직임감지센서] PIR(passive infrared) motion sensor로 움직임을 감지해보자 (0) | 2015.11.10 |
[센서/진동] 가변 진동 센서-디지탈/Adjustable vibration sensor-digital with potentiometer (0) | 2015.08.24 |
[센서/충격] 충격(진동) 감지 센서/Knock sensor/Vibration sensor (0) | 2015.08.17 |
[센서/조도] Lux(룩스)단위로 빛의 밝기를 읽어주는 GY-302센서(BH1750) (1) | 2015.08.12 |
[센서/CO2] 이산화탄소 농도를 알려주는 MG811 CO2 센서 모듈 (1) | 2015.07.14 |
[센서/먼지] 공기의 탁함, 먼지 농도 등을 측정하는 샤프(sharp)의 GP2Y1010AU 센서 (7) | 2015.06.26 |