본문 바로가기
아두이노/제품 검사 센서

#9 제작 - 기능 개선

by songbum 2023. 7. 18.

테스트 및 검수 과정에서 개선해야 할 사항들이 나왔다.

 

오류 발생 시의 부저 소리가 모두 동일해 구분이 어렵다는 것과, 센서 양 쪽에 물체가 감지돼 엔터키 출력이 가능해질 때 이를 사용자에게 알려줘야 한다는 점이었다.  그리고 아두이노 회로를 보호할 케이스도 필요했다.

 

 

우선 부저 소리를 다양하게 하기 위해 장착돼있던 능동부저를 떼어내고 수동부저로 교체했다.  수동부저를 이용하면 주파수를 달리해서 도레미파솔라시 음을 낼 수 있다.  사용한 주파수는 다음과 같다.

도 - 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