아두이노 Arduino/파이썬(Python)

[아두이노] 파이썬 threading timer 로 주기적으로 LED 켜고 끄기(타이머, 인터럽트, Interrupt)

끄적끄적아무거나 2022. 5. 18. 08:38
반응형

 

목차

     

    [Arduino] Python threading timer 함수

     

    이번 포스트에서는 파이썬의 스레딩(Threading)의 타이머(timer) 함수에 대해 알아보겠습니다. 타이머의 말 자체가 알려 주듯이 타이머는 정해진 시간(Time)이 지났을 때 사용자가 원하는 동작을 하게 도와주는 함수 입니다. 

     

    Syntax는 아래와 같습니다.

     

        인스턴스명 = threading.Timer(타이머시간, 실행시킬함수명)
        인스턴스명.daemon = True
        인스턴스명.start()

     

     

    입력 값에 타이머 시간은 시간 단위이고 밀리초 (mili second)는 소수점 형식으로 표기하시면 됩니다. 실행 시킬 함수 명은 타이머가 시간이 되었을 때 구현할 함수 명을 입력 하시면 됩니다. 리턴 값을 인스턴스(Instance)에 입력 하시고 daemon으로 프로그램이 종료되었을 때 같이 종료하도록 설정 합니다.

     

    그리고 스레드 실행을 위해 start 함수를 실행 합니다. 

     

     

     

    아래에 간단한 예제로 쉽게 이해해보도록 하겠습니다.

     

    <<예제에 대한 설명>>

     

    예제는 1초 단위로 컴퓨터의 파이썬에서 serial 통신을 이용해서 on, off 메세지를 전달 합니다. 메세지를 전달 받은 아두이노(Arduino)는 Uno 보드의 LED 등을 켰다 껐다 해줍니다.

     

     

     

    Arduino 실행 코드

     

    아두이노는 "on"이라는 메세지(message)가 들어오면 보드의 LED를 켜고 "off"라는 메세지에 보드의 LED를 꺼줍니다.

     

    예제 코드>>

    void setup() {
      pinMode(LED_BUILTIN, OUTPUT);
      Serial.begin(9600);
      while (!Serial) {
        ;
      }
    }
    
    int blk_on = 0;
    
    void loop() {
      if (Serial.available() > 0)
      {
        String cmmd = Serial.readStringUntil('\n');
        Serial.println(cmmd);
        if (cmmd == "on")
        {
          blk_on = 1;
        }
        else if (cmmd == "off")
        {
          blk_on = 0;
        }    
      }
      if (blk_on ==1){
        digitalWrite(LED_BUILTIN, HIGH); 
      }
      else {
        digitalWrite(LED_BUILTIN, LOW);  
      }
    }

     

    1~4번 라인: PC와 시리얼 통신 연결

    9번 라인: LED 초기값 설정

    16번 라인: 메세지가 on 인경우 blk_on을 1로 변경함

    25~29번 라인: blk_on에 따라 LED를 켜거나 끔

     

     

     

     

     

     

    파이썬 Thread Timer 함수 실행 예제

     

     

    앞서 아두이노 코드와 연계해서 파이썬 코드를 작성하겠습니다. 

     

    파이썬 코드애서는 두개의 함수를 정의 합니다. 하나는 2초 간격으로 LED 켜는 on 메세지를 보내는 함수이고 나머지는 2초 간격으로 LED를 끄는 off 메세지를 보내는 함수 입니다. 

     

    두 함수는 sleep 함수를 통해 1초의 간격을 두고 진행됩니다. 즉, 1초 간격으로 LED on, off 메세지가 전달 됩니다. 해당 메세지는 반복 송신됩니다. 

     

     

    예제 코드>>

    import serial
    import threading
    import time
    import datetime
    
    ser = serial.Serial("COM6", 9600)
    
    def send_on_msg_to_arduino():
        msg = "on\n"
        ser.write(msg.encode())
        thread1 = threading.Timer(2, send_on_msg_to_arduino)
        thread1.daemon = True
        thread1.start()    
        print("ON  msg sent at : ", datetime.datetime.now())
    
    def send_off_msg_to_arduino():
        msg = "off\n"
        ser.write(msg.encode())
        thread1 = threading.Timer(2, send_off_msg_to_arduino)
        thread1.daemon = True
        thread1.start()    
        print("OFF msg sent at : ", datetime.datetime.now())
    
    if __name__ == "__main__":
        send_on_msg_to_arduino()
        time.sleep(1)
        send_off_msg_to_arduino()
        while True:
            time.sleep(10)

    8~14번 라인: on 메세지를 2초 간격으로 보내는 함수 입니다.

    11번 라인: timer 함수를 함수 내부에 실행 시켜서 반복 실행되게 설정했습니다.

    16~22번 라인: off 메세지를 2초 간격으로 보내는 함수 입니다.

    25~27번 라인: 함수를 각 각 실행하고 사이에 1초 sleep을 진행 합니다.

    28~29번 라인: 프로그램 종료를 막기 위해 while 문을 진행합니다.

     

     

    결과>>

    ON  msg sent at :  2022-05-18 08:35:15.806915
    OFF msg sent at :  2022-05-18 08:35:16.812057
    ON  msg sent at :  2022-05-18 08:35:17.821817
    OFF msg sent at :  2022-05-18 08:35:18.817879
    ON  msg sent at :  2022-05-18 08:35:19.832559
    OFF msg sent at :  2022-05-18 08:35:20.829230
    ON  msg sent at :  2022-05-18 08:35:21.832707
    OFF msg sent at :  2022-05-18 08:35:22.841439
    ON  msg sent at :  2022-05-18 08:35:23.838608

    1초 간격으로 메세지가 전달됩니다.

     

     

    LED가 1초 간격으로 정확하게 켜졌다가 꺼집니다.

     

     

    반응형