컨베이어 벨트 시스템

발행일 : 2018-12-10 12:30  

  • 안녕하세요~ 추운 날씨 속 주말은 잘 보내셨나요?
    오늘은 지난 주 과제에 대해 알아보려고 합니다. 지난 주 과제는 평소 안전한 상태일 때 녹색 LED가 점등되고 비상 상태일 때 빨간색 LED가 점등되도록 시스템을 구현하는 것 입니다. 복잡한 제어는 아니지만 약간의 시행착오가 있었다고 판단됩니다. 
    먼저, 회로를 구현해보겠습니다. 
  • LED, 스위치를 1개씩 추가하여 구현한 회로도 입니다. 복잡해보이지만 지난 주 학습한 회로도를 1회 반복한다고 생각하시면 됩니다. 

    13번 핀으로 빨간색 LED를 제어하고, 9번 핀은 비상 상태(빨간색 LED)를 제어하는 핀입니다. 12번 핀은 녹색 LED를 제어하고, 8번 핀은 안전 상태(녹색 LED)를 제어하는 핀입니다. 

    이제 남은 과제는 내가 원하는 동작을 할 수 있도록 프로그래밍을 해야합니다. 다양하게 프로그래밍하여 결과를 나타낼 수 있기 때문에 제가 소개하는 코드가 절대 정답은 아닙니다. 참고 자료로 활용하시면 좋을 듯 합니다. 
  • #define RED_PIN 13    //13을 RED_PIN로 사용한다는 것을 의미
    #define GREEN_PIN 12
    #define RED_SW 9
    #define GREEN_SW 8
    bool pre_State = 0;   //LED의 이전 상태를 나타내는 변수 

    void setup() {
      // put your setup code here, to run once:
      pinMode(RED_PIN, OUTPUT);    //빨간색 LED 점등, 소등 제어핀
      pinMode(GREEN_PIN, OUTPUT);  //녹색 LED 점등, 소등 제어핀
      pinMode(RED_SW, INPUT);      //빨간색 LED 상태 입력핀
      pinMode(GREEN_SW, INPUT);    //녹색 LED 상태 입력핀
    }

    void loop() {
      // put your main code here, to run repeatedly:
      int red_State = digitalRead(RED_SW);       //빨간색 LED 제어 스위치의 상태를 red_State에 저장
      int green_State = digitalRead(GREEN_SW);   //녹색 LED 제어 스위치의 상태를 green_State에 저장

      if(green_State == HIGH || pre_State == LOW) //녹색 LED 제어 스위치가 눌려졌거나 이전 상태가 안전(녹색) 상태일 때
      {
        digitalWrite(RED_PIN, LOW);      //빨간색 LED 소등
        digitalWrite(GREEN_PIN, HIGH);   //녹색 LED 점등
        pre_State = 0;                   //이전 LED 상태는 안전(녹색)을 의미하는 0 저장
      }
      
      if(red_State == HIGH || pre_State == HIGH)  //빨간색 LED 제어 스위치가 눌려졌거나 이전 상태가 비상(빨간색) 상태일 때
      {
        digitalWrite(GREEN_PIN, LOW);  //녹색 LED 소등
        digitalWrite(RED_PIN, HIGH);   //빨간색 LED 소등
      /*  delay(200);
        digitalWrite(RED_PIN, LOW);
        delay(200);*/
        pre_State = 1;    //이전 LED 상태는 비상(빨간색)을 의미하는 1 저장
      }
    }
  • 코드에 대해 간단하게 설명드리면 #define 이라는 코드가 나옵니다. '정의하다' 라는 의미에 맞게 '13을 RED_PIN으로 사용하겠다' 라는 의미입니다. 해당 코드를 사용한 이유는 프로그램 코드의 가독성과 코드를 편리하게 수정이 가능하다는 점입니다. 예를들어 13이라는 숫자를 그냥 사용한다면 다른 사람이 코드를 볼 때 회로와 코드를 비교하여 13번 핀의 기능에 대해 이해를 해야할 것입니다. 그러나 13번 핀의 기능을 설명할 수 있는 단어로 표시한다면 프로그램 코드의 이해는 더욱 빨라질 것입니다. 다음으로 편리한 코드 수정은 프로그램 모든 코드에 숫자 13을 사용했는데 수정을 해야하는 상황이 발생하면 13으로 된 코드를 모두 찾아 변경을 해야합니다. 그러나 위 처럼 사용한다면 #define RED_PIN 변경할 숫자 로 수정하면 아래 코드들은 자동적으로 수정이 되는 효과를 가져옵니다. 

    setup 함수에서는 핀에 대해 입력, 출력으로 정의를 해줍니다. loop 함수에서 digitalRead 함수를 사용하여 빨간색, 녹색 LED 상태를 읽어와 변수에 저장하게 됩니다. 
    if 함수에서는 두 가지 조건이 사용되었습니다. green_State == HIGH는 녹색 LED를 제어하는 스위치가 눌러졌을 경우 즉 비상 상태에서 안전 상태로 상황이 바뀌었을 때 누르게 됩니다. 그리고 pre_State == LOW는 이전의 상태가 안전 상황일 때 if의 조건은 참이 됩니다. | | 기호는 OR을 의미하고 왼쪽 조건과 오른쪽 조건 중 하나라도 참이면 전체 조건은 참을 의미합니다. 해당 if문은 안전 상태를 처리하는 구문이기 때문에 빨간색 LED는 소등되어야 하고 녹색 LED는 점등되어야 합니다. 그리고 상태는 안전 상태를 의미하는 0을 pre_State에 저장하게 됩니다. 

    두 번째 if 함수는 비상 상태를 처리하는 구문으로 빨간색 LED 상태를 제어하는 핀이 눌러졌거나 이전 상태가 HIGH일 때 실행됩니다. 이 때는 비상 상황이기 때문에 녹색 LED는 소등하고 빨간색 LED를 점등하게 됩니다. 그리고 이전 상태는 1로 저장합니다. /* , */으로 묶어진 코드가 있는데 이는 주석 처리를 한 것으로 프로그램 실행에는 영향을 미치지 않습니다. 두 가지 기능을 소개시켜드리고자 일단 주석으로 처리하였습니다. 
    프로그램 코드를 복사하여 아두이노 IDE에 붙여넣기 한 후 업로드를 클릭하시면 업로딩이 되고 다음과 같이 실행 결과를 확인할 수 있습니다. 
  • 위 코드에서 주석 처리 기호 /*  */ 를 삭제하고 업로드를 하면 다른 결과를 확인할 수 있습니다. 비상등이 깜빡인다면 사람들의 주의 효과가 더욱 클 것 입니다. 차후 학습할 내용이지만 비상 상황일 때 소리까지 추가한다면 견고한 시스템이 구축될 것 입니다. 

댓글(0)

이모티콘