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

[아두이노] 파이썬 threading 함수로 통신하기 (threading, target, daemon

끄적끄적아무거나 2022. 5. 17. 08:58
반응형

 

목차

     

     

     

    [Arduino] 파이썬 threading 함수 사용법

     

    thread 는 실이라는 의미가 있습니다. 파이썬(Python)에서 threading(쓰레드, 드레딩) 이란 CPU 칩이 여러개의 실로 구성되어 있고 한 줄 한줄 다른 일을 처리할 수 있는 것입니다

     

    일반적으로 코드를 작성하면 위에서 아래로 순차적으로 진행되는 데 하나의 작업이 진행되는 동안 다른 작업을 실행할 수 없습니다. 하지만 thread 를 사용하면 2개 3개 멀티플(Multiple) 한 동작을 동시에 할 수 있게 됩니다. 

     

    threading 함수에서 사용하는 주인자는 2개 입니다. 

     

    • target : threading으로 동작 시킬 함수를 연결합니다.
    • daemon : True 일 경우 메인 프로그램이 종료 시 threading 함수도 종료 합니다.

     

    이번 포스트에서는 간단하게 아두이노에서 1초 단위로 메세지를 주기적으로 보냅니다. 1초 단위로 주기적으로 보내는 방법은 링크를 참조하시면 됩니다. (https://scribblinganything.tistory.com/521)

     

    컴퓨터에서는 파이썬(Python)을 동작 시켜서 1초 단위로 전달되는 메세지 값을 받아서 디코드 후에 출력 합니다. 그리고 동시에 sleep 함수를 사용해서 2초 마다 slept 라는 문자열을 출력 해줍니다. 일반적으로 time의 sleep 함수를 사용하면 다른 동작은 못하지만 thread 함수를 이용해서 두가지를 동시에 동작 시킵니다.

     

     

     

     

     

    [Arduino] 아두이노 1초 메세지 보내기 코드

     

    아래 예제 코드를 통해 쉽게 이해할 수 있습니다.

     

    예제 코드>>

    void setup() {
    Serial.begin(9600);
    while (!Serial) {
       ;
      }
    }
    unsigned long cur_time = 0;
    unsigned long pre_time = 0;
    
    void loop() {
      cur_time = millis();
      if(cur_time%1000 == 0)
      {
        Serial.print(cur_time);
        Serial.println("ms");
        delay(2);
      }
    }

    11번 라인: millis 함수를 사용해서 시간 값을 가져 옵니다.

     

     

     

     

     

     

    [Python] 파이썬 threading 함수로 2가지 동작 하기

     

    예제 코드>>

    import serial
    import threading
    import time
    
    ser = serial.Serial("COM6", 9600)
    
    def read_from_arduino():
        while True:
            time_value = ser.readline().decode()
            print(time_value)
    
    if __name__ == "__main__":
        thread1 = threading.Thread(target=read_from_arduino, daemon=True)
        thread1.start()
        while True:
            time.sleep(2)
            print("slept")

     

    5번 라인: 아두이노와 시리얼 통신 연결합니다.

    7~10번 라인: 아두이노에서 보낸 값을 송신해서 출력합니다. while true: 로 묶여 있습니다.

    13번 라인: threading 을 사용해서 read_from_arduino 함수를 동작 시킵니다.

    15번 라인: while True: 로 두번째 함수를 동작 시킵니다.

     

     

    결과>>

    0ms
    
    slept
    1000ms
    
    2000ms
    
    slept
    3000ms
    
    4000ms
    
    slept
    5000ms
    
    6000ms

    아두이노의 메세지와 파이썬의 메세지가 정상적으로 출력되었음을 확인할 수 있습니다.

     

     

     

    반응형