
<* 포토 인터럽터 속도 센서 모듈 Photo Interrupter Speed Sensor Module *>
포토 인터럽터는 투과형 포토 센서라고하며, 발광 소자와 수광 소자를 1개의 패키지에 마주보도록 배열하고,
그 사이를 검출물이 통과할 때 빛이 차단되는 현상을 통해 물체의 유무를 검출하는 광 센서이다.
■ 포토 인터럽터는 송신부(다이오드)와 수신부(트랜지스터)로 구성
---> 송신부와 수신부 사이의 물체나 장애물의 유무를 감지할 수 있는 소자
▶ 송신부와 수신부 사이에 물체가 없을 경우 송신부(다이오드)에서 발산한 빛이 수신부(포토 트랜지스터)를 Turn On 시켜 LOW를 출력하게 된다
▶ 송신부와 수신수 사이에 물체가 있을 경우 송신부(다이오드)에서 발산한 빛이 차단되어 수신부(포토 트랜지스터)가 Turn Off 되어 HIGH를 출력하게 된다
■ 포토인터럽터의 송신부와 수신부 사이의 물체나 장애물을 감지하고, 측정할 수 있기 때문에 모터의 속도나 RPM 측정 등에 활용할 수 있다.
----- < 적외선 송수신 센서 모듈 장물체가 있으면 LOW, 없으면 HIGH 소스 코드 > -----------------------------------------
const int sensorPin = 3;
int value = 0;
void setup() {
Serial.begin(9600);
pinMode(sensorPin , INPUT);
}
void loop() {
value = digitalRead(sensorPin );
if (value == LOW) {
Serial.println("Active");
}
if (value == HIGH) {
Serial.println("No-Active");
}
delay(1000);
}
----- < 적외선 송수신 센서 모듈 물체 통과한 갰수를 카운트하기 소스 코드 > -----------------------------------------
#define sensorPIN 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(sensorPIN, INPUT);
pinMode(13, OUTPUT);
attachInterrupt(digitalPinToInterrupt(sensorPIN), countRNT, FALLING);
Serial.begin(9600);
Serial.println("start");
}
void loop() {
if (countold != count)
{
Serial.println(count);
countold = count;
}
}
void countRNT()
{
time = millis();
if( (time - oldtime) > ignoremilli ) {
count++;
}
oldtime = millis();
}
----- < 적외선 송수신 센서 모듈 모터의 회전 속도 계산 소스 코드 > -----------------------------------------
int pinNum = A0;
float distance = 0.0;
void setup() {
Serial.begin(9600);
pinMode (pinNum, INPUT);
}
void loop() {
int data = analogRead(pinNum);
int volt = map(data, 0, 1023, 0, 5000);
distance = (22.5/(volt-0.1696))*1000;
Serial.print(" 거리센서 LOW 데이터 : ");
Serial.print(data);
Serial.print(" LOW 데이터 범위조정 : ");
Serial.print(volt);
Serial.print(" 측정거리 : ");
Serial.print(distance);
Serial.print("cm");
Serial.println();
delay(100);
}
----- < 적외선 송수신 센서 모듈 장애물을 감지 시 LED ON 소스 코드 > -----------------------------------------
- 스위치를 이용하여 스위치가 On 일 때만 동작 한다.
int ledPIN = 3;
int switchPIN = 7;
int sensorPIN = 2;
void setup() {
pinMode(ledPIN, OUTPUT);
pinMode(switchPIN, INPUT);
pinMode(sensorPIN, INPUT);
}
void loop() {
while(digitalRead(switchPIN) == HIGH){
if( digitalRead(sensorPIN) == LOW )
digitalWrite(ledPIN, HIGH);
else
digitalWrite(ledPIN, LOW);
}
delay(100);
}
----- < 적외선 송수신 센서 모듈 모터 속도 Char LCD에 표시하기 소스 코드 > -----------------------------------------
#include <LiquidCrystal.h>
int IRsensorPIN = 2;
unsigned int rpm;
volatile byte pulses;
unsigned long timeold;
unsigned int pulsesperturn = 1;
int num_blade = 1;
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);
void setup() {
Serial.begin(9600);
pinMode(IRsensorPIN, INPUT);
attachInterrupt(digitalPinToInterrupt(IRsensorPIN), counter, FALLING);
pulses = 0;
rpm = 0;
timeold = 0;
lcd.begin(16, 2);
}
void loop() {
if (millis() - timeold >= 1000){
detachInterrupt(digitalPinToInterrupt(IRsensorPIN));
rpm = (60 * 1000 / pulsesperturn / num_blade)/ (millis() - timeold)* pulses;
timeold = millis();
pulses = 0;
if (Serial.available()) {
num_blade=Serial.parseInt();
}
Serial.print("NUM BLADE = ");
Serial.println(num_blade);
Serial.print("RPM = ");
Serial.println(rpm, DEC);
//Write out to LCD
lcd.setCursor(0, 0);
lcd.print("NUM BLADE = ");
lcd.print(num_blade);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("RPM = ");
lcd.print(rpm, DEC);
lcd.print(" ");
//Restart the interrupt processing
attachInterrupt(digitalPinToInterrupt(IRsensorPIN), counter, FALLING);
}
}
void counter() {
//Update count
pulses++;
}