본문 바로가기
아두이노 센서

[센서/Tachometer] 무언가 반복해서 지나가는 속도를 측정할때는 IR(적외선) 기반 Tachometer를 사용하세요

by 작동미학 2015. 10. 26.
반응형

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

반응형