아두이노/제품 검사 센서
#2 기획 및 검토 - 포토 인터럽터 센서
songbum
2023. 5. 27. 20:20
지인이 요청한 검사기는 포토 인터럽터 센서가 두 개 필요하다. 센서 두 곳에서 물체가 감지되면 합격이고, 어느 한 쪽만 감지되면 불량품이라서 경보를 울려야 한다.
지난 번에 테스트한 회로에 동일한 포토 인터럽터 센서를 하나 더 추가했다.
추가된 센서의 값을 이용하여 아래의 결과 값이 나오도록 프로그램도 수정했다.
센서1 미감지 | 센서1 감지 | |
센서2 미감지 | 대기 상태 유지 | "Fail 2" 출력 |
센서2 감지 | "Fail 1" 출력 | "PASS" 출력 |
그런데, 센서가 두 개가 되면서 고려해야 하는 것이 생겼다.
센서에 물체를 넣는 게 사람이 하는 것이다보니 각각의 센서에 정확하게 동시에 넣을 수 없다는 것이다. 수백분의 1초의 아주 짧은 시간이지만, 어느 한쪽 센서에 먼저 넣는 것을 아두이노 프로그램에서는 충분히 구분이 가능하다. 그러다보니 내가 아무리 동시에 물체를 넣으려해도 항상 "Fail 1" 이나 "Fail 2" 메시지가 출력된다.
프로그램에서 결과를 판정하기 위해서는 두 센서의 값이 모두 필요하므로, 한 센서에서 값을 받으면 일정 시간 대기하며 나머지 센서의 값을 받도록 했다.
대기시간은 delaySeconds 변수에 우선 0.5 초로 저장했는데, 테스트 하면서 계속 수정할 생각이다.
int buzzerPin = 2;
int sensor1Pin = 3;
int sensor2Pin = 4;
int delaySeconds = 500;
void setup() {
Serial.begin(9600);
pinMode(buzzerPin, OUTPUT);
pinMode(sensor1Pin, INPUT_PULLUP);
pinMode(sensor2Pin, INPUT_PULLUP);
}
void loop() {
// 어느 한 센서에라도 물체가 들어오면 시작
if ( (digitalRead(sensor1Pin) == HIGH) || (digitalRead(sensor2Pin) == HIGH) ) {
// 나머지 센서에도 물체가 들어오는지 체크하기 전에 잠시 대기
delay(delaySeconds);
// 나머지 센서 체크
while (1) {
// case 1 : 1번 센서와 2번 센서 모두 물체 감지
if ( (digitalRead(sensor1Pin) == HIGH) && (digitalRead(sensor2Pin) == HIGH) ) {
Serial.println("PASS");
// 센서에서 물체를 빼는 것 체크
while (1) {
if ( (digitalRead(sensor1Pin) == LOW) || (digitalRead(sensor2Pin) == LOW) ) {
// 양쪽 센서 모두에서 빼낼때까지 잠시 대기
delay(delaySeconds);
// 검사 종료됐으니 처음부터 다시 시작
goto gotoNextLoop;
}
}
}
// case 2 : 1번 센서는 물체 감지했으나 2번 센서는 미감지
else if ( (digitalRead(sensor1Pin) == HIGH) && (digitalRead(sensor2Pin) == LOW) ) {
Serial.println("Fail 2");
digitalWrite(buzzerPin, HIGH);
// 센서에서 물체를 빼는 것 또는 뒤늦게 넣는 것 체크
while (1) {
if ( (digitalRead(sensor1Pin) == LOW) || (digitalRead(sensor2Pin) == HIGH) ) {
digitalWrite(buzzerPin, LOW);
// 양쪽 센서 모두에서 빼낼때까지 잠시 대기
delay(delaySeconds);
// 검사 종료됐으니 처음부터 다시 시작
goto gotoNextLoop;
}
}
}
// case 3 : 1번 센서는 물체 미감지했으나 2번 센서는 감지
else if ( (digitalRead(sensor1Pin) == LOW) && (digitalRead(sensor2Pin) == HIGH) ) {
Serial.println("Fail 1");
digitalWrite(buzzerPin, HIGH);
// 센서에서 물체를 빼는 것 또는 뒤늦게 넣는 것 체크
while (1) {
if ( (digitalRead(sensor1Pin) == HIGH) || (digitalRead(sensor2Pin) == LOW) ) {
digitalWrite(buzzerPin, LOW);
// 양쪽 센서 모두에서 빼낼때까지 잠시 대기
delay(delaySeconds);
// 검사 종료됐으니 처음부터 다시 시작
goto gotoNextLoop;
}
}
}
// case 4 : 이상 발생시, 처음부터 다시 시작
else {
break;
}
}
}
gotoNextLoop:;
}
다음과 같이 잘 작동한다.