테스트 및 검수 과정에서 개선해야 할 사항들이 나왔다.
오류 발생 시의 부저 소리가 모두 동일해 구분이 어렵다는 것과, 센서 양 쪽에 물체가 감지돼 엔터키 출력이 가능해질 때 이를 사용자에게 알려줘야 한다는 점이었다. 그리고 아두이노 회로를 보호할 케이스도 필요했다.
우선 부저 소리를 다양하게 하기 위해 장착돼있던 능동부저를 떼어내고 수동부저로 교체했다. 수동부저를 이용하면 주파수를 달리해서 도레미파솔라시 음을 낼 수 있다. 사용한 주파수는 다음과 같다.
도 - 261, 레 - 294, 미 - 330, 파 - 349, 솔 - 392, 라 - 440, 시 - 494
부저 소리는 총 4가지 경우에 나오게 했다.
센서1에만 미감지된 경우 - 도
센서2에만 미감지된 경우 - 레
엔터키 출력 - 시
엔터키 출력 성공 이후 다시 시도할 경우 - 미
그리고 LED 를 추가하여, 센서 양 쪽에 모두 감지되면 LED 가 점등 돼 엔터키 출력이 가능함을 알려주도록 했다. 엔터키 출력과 동시에 LED 는 꺼진다. 사용한 녹색 LED 와 저항(220옴)은 모두 교재에 포함된 제품을 사용했다.
아두이노 IDE 에서 다음과 같이 코드를 수정했다.
#include <Keyboard.h>
int buzzerPin = 2;
int sensor1Pin = 4;
int sensor2Pin = 6;
int rotary1Pin = 7;
int rotary2Pin = 8;
int led1Pin = 15;
int touchButtonPin = 16;
int buzzerTones[7] = {261, 294, 330, 349, 392, 440, 494};
int delaySeconds;
boolean keyboardSend = false;
void setup() {
Serial.begin(9600);
while(!Serial && millis()<5000) {
}
Keyboard.begin();
pinMode(buzzerPin, OUTPUT);
pinMode(sensor1Pin, INPUT_PULLUP);
pinMode(sensor2Pin, INPUT_PULLUP);
pinMode(rotary1Pin, INPUT_PULLUP);
pinMode(rotary2Pin, INPUT_PULLUP);
pinMode(led1Pin, OUTPUT);
pinMode(touchButtonPin, INPUT);
}
void get_delay() {
// "1" 핀과 "2" 핀 모두 선택 됨 = 딥 스위치의 "3" 선택
if ( (digitalRead(rotary1Pin) == LOW) && (digitalRead(rotary2Pin) == LOW) ) {
delaySeconds = 800;
}
// "1" 핀은 선택 안 되고, "2" 핀만 선택 됨 = 딥 스위치의 "2" 선택
else if ( (digitalRead(rotary1Pin) == HIGH) && (digitalRead(rotary2Pin) == LOW) ) {
delaySeconds = 600;
}
// "1" 핀만 선택 되고, "2" 핀은 선택 안 됨 = 딥 스위치의 "1" 선택
else if ( (digitalRead(rotary1Pin) == LOW) && (digitalRead(rotary2Pin) == HIGH) ) {
delaySeconds = 400;
}
// "1" 핀과 "2" 핀 모두 선택 안 됨 = 딥 스위치의 "0" 선택
else if ( (digitalRead(rotary1Pin) == HIGH) && (digitalRead(rotary2Pin) == HIGH) ) {
delaySeconds = 200;
}
//Serial.println(delaySeconds);
delay(delaySeconds);
}
void loop() {
// 어느 한 센서에라도 물체가 들어오면 시작
if ( (digitalRead(sensor1Pin) == HIGH) || (digitalRead(sensor2Pin) == HIGH) ) {
// 나머지 센서에도 물체가 들어오는지 체크하기 전에 잠시 대기
get_delay();
// 나머지 센서 체크
while (1) {
// case 1 : 처음 센서와 나중 센서 모두 물체 감지
if ( (digitalRead(sensor1Pin) == HIGH) && (digitalRead(sensor2Pin) == HIGH) ) {
Serial.println("PASS");
digitalWrite(led1Pin, HIGH);
// 센서에서 물체를 빼는 것 체크
while (1) {
//Serial.println(digitalRead(touchButtonPin));
// 터치 스위치를 누르면 엔터키 출력
if (digitalRead(touchButtonPin) == HIGH) {
// 일단 한번 엔터키 출력을 했으면, 터치 스위치를 계속 누르더라도 중복해서 출력하지 않음
if (keyboardSend == false) {
Serial.println("Touch");
keyboardSend = true;
tone(buzzerPin, buzzerTones[6]);
Keyboard.press(KEY_RETURN);
delay(500);
Keyboard.release(KEY_RETURN);
noTone(buzzerPin);
digitalWrite(led1Pin, LOW);
delay(1000);
}
else {
tone(buzzerPin, buzzerTones[2]);
delay(300);
noTone(buzzerPin);
}
}
if ( (digitalRead(sensor1Pin) == LOW) || (digitalRead(sensor2Pin) == LOW) ) {
keyboardSend = false;
digitalWrite(led1Pin, LOW);
// 검사 종료됐으니 처음부터 다시 시작
goto gotoNextLoop;
}
//delay(500);
}
}
// case 2 : 처음 센서는 물체 감지했으나 나중 센서는 미감지
else if ( (digitalRead(sensor1Pin) == HIGH) && (digitalRead(sensor2Pin) == LOW) ) {
Serial.println("Fail 2");
tone(buzzerPin, buzzerTones[0]);
// 센서에서 물체를 빼는 것 또는 뒤늦게 넣는 것 체크
while (1) {
if ( (digitalRead(sensor1Pin) == LOW) || (digitalRead(sensor2Pin) == HIGH) ) {
noTone(buzzerPin);
// 검사 종료됐으니 처음부터 다시 시작
goto gotoNextLoop;
}
}
}
// case 3 : 처음 센서는 물체 미감지했으나 나중 센서는 감지
else if ( (digitalRead(sensor1Pin) == LOW) && (digitalRead(sensor2Pin) == HIGH) ) {
Serial.println("Fail 1");
tone(buzzerPin, buzzerTones[1]);
// 센서에서 물체를 빼는 것 또는 뒤늦게 넣는 것 체크
while (1) {
if ( (digitalRead(sensor1Pin) == HIGH) || (digitalRead(sensor2Pin) == LOW) ) {
noTone(buzzerPin);
// 검사 종료됐으니 처음부터 다시 시작
goto gotoNextLoop;
}
}
}
// case 4 : 이상 발생시, 처음부터 다시 시작
else {
break;
}
}
}
gotoNextLoop:;
}
보호용 케이스는 종이클립을 담을 때 사용되는 플라스틱 케이스를 활용했다. 상면에는 부저와 로터리스위치, LED, 터치키보드 가 보이도록 구멍을 똟어줬고, 측후면에는 전선과 USB-C 케이블을 꼽을 수 있도록 구멍을 뚫어줬다. 그리고 만능기판을 고정할 수 있도록 프라판과 프라봉으로 가이드를 만들어 내부에 부착했다.
센서와 아두이노 회로 사이의 복잡한 케이블들을 압축튜브를 이용해 튼튼하고 깔끔하게 정리했다.
납품 전 최종 테스트도 무사히 통과했다.
'아두이노 > 제품 검사 센서' 카테고리의 다른 글
#8 제작 (0) | 2023.06.12 |
---|---|
#7 기획 및 검토 - 로터리 딥 스위치 (0) | 2023.06.10 |
#6 기획 및 검토 - 터치 스위치 (0) | 2023.06.05 |
#5 기획 및 검토 - 아두이노 Micro (0) | 2023.06.03 |
#4 제작 (0) | 2023.05.30 |