반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 


오늘은 아주 유명한 마이크로 컨트롤러 중의 하나인 아두이노를 파이썬으로 제어하는 법에 대해 알아보겠습니다.

 

저의 경우엔 컴퓨터의 GUI 프로그램으로 모터를 제어하기 위해서 파이썬과 아두이노를 결합하는 방법을 공부했습니다.

 

이 글을 보시는 대부분의 분들께서는 이미 아두이노를 아신다는 가정하에 글을 썼으니, 이 점 참고 부탁드립니다.

 

1. 개념도

 

파이썬이 어떻게 아두이노를 제어할 수 있는지 한 눈에 이해하기 쉽도록 개념도를 그려보았습니다.

 

 

기본적으로 아두이노는 UART 방식의 Serial 통신을 지원하며, 이 통신 방식으로 컴퓨터와 통신이 가능합니다.

 

여기서 말씀드리고 싶은 것은 아두이노를 파이썬이 직접 제어하는 것이 아니라, 아두이노는 컴퓨터와 통신을 하고, 파이썬은 pyserial 모듈을 이용해서 컴퓨터(정확히는 컴퓨터의 시리얼 통신 기능)를 제어 한다는 것입니다.

 

즉, 아두이노 IDE로 코딩을 해서 아두이노 보드에 시리얼 통신 기능이 포함된 코드를 컴파일 해주고, 별도로 파이썬으로 코딩을 해줘야 한다는 말입니다. 

 

 

 

2. pySerial 사용법

 

우선 pySerial을 설치해보겠습니다. 무난하게 pip 명령어를 이용해서 설치해주세요.

 

# 터미널 창에서 pip로 설치
pip install pyserial

# conda로도 설치 가능
conda install pyserial

 

설치가 완료되었으면 오늘은 간단하게 아두이노-파이썬 시리얼 통신의 개념에 대해 이해할 수 있는 예제를 함께 살펴보겠습니다.

 

 

<아두이노 코드>

 

먼저 아두이노 코드는 아래와 같이 작성하고, 아두이노에 '업로드' 해주시면 됩니다.

 

시리얼 통신을 통해 아두이노로 명령이 전달될 때마다, 명령어를 파악해서 명령어의 종류에 따라 시리얼 통신으로 특정 메시지를 전송하는 코드입니다.

 

char cmd;

void setup() {
  
  // 시리얼 통신 시작 (boadrate: 9600)
  Serial.begin(9600);
}

void loop() {

  // 컴퓨터로부터 시리얼 통신이 전송되면, 한줄씩 읽어와서 cmd 변수에 입력
  if(Serial.available()){
    cmd = Serial.read(); 

    if(cmd=='a'){
      Serial.println("아두이노: a");
      delay(100);
    }
    else if(cmd=='b'){
      Serial.println("아두이노: b");
      delay(100);
    }
  }
}

시리얼 모니터에서 아두이노 코드 작동 확인

 

 

<파이썬 코드>

 

파이썬 코드는 아래와 같이 작성해서 파이썬 파일(.py)로 실행시켜주시면 됩니다.

 

여기서 주의하실 점은 꼭 아두이노의 시리얼 모니터를 종료하고 실행시켜주셔야 한다는 것입니다.

 

이를 지키지 않을 시, 아래와 같은 에러를 출력합니다.

 

raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError()))
serial.serialutil.SerialException: could not open port 'COM3': PermissionError(13, '액세스가 거부되었습니다.', None, 5)

 

import serial
import time

py_serial = serial.Serial(
    
    # Window
    port='COM3',
    
    # 보드 레이트 (통신 속도)
    baudrate=9600,
)

while True:
      
    commend = input('아두이노에게 내릴 명령:')
    
    py_serial.write(commend.encode())
    
    time.sleep(0.1)
    
    if py_serial.readable():
        
        # 들어온 값이 있으면 값을 한 줄 읽음 (BYTE 단위로 받은 상태)
        # BYTE 단위로 받은 response 모습 : b'\xec\x97\x86\xec\x9d\x8c\r\n'
        response = py_serial.readline()
        
        # 디코딩 후, 출력 (가장 끝의 \n을 없애주기위해 슬라이싱 사용)
        print(response[:len(response)-1].decode())

 

코드를 나누어서 설명드리자면,

 

1) 먼저 아까 설치한 pyserial 모듈과 파이썬 내장 라이브러리에 있는 time 모듈을 불러와줍니다.

 

import serial
import time

 

2) serial 모듈의 Serial 함수를 이용해서 port와 baudrate를 설정해줍니다.

py_serial = serial.Serial(
    
    # Window
    port='COM3',
    
    # 보드 레이트 (통신 속도)
    baudrate=9600,
)

 

3) 아두이노에게 내릴 명령을 input 함수를 이용해서 입력해주고, 그 명령어를 시리얼 통신을 이용해서 보내주는 부분입니다.

 

아두이노와 같이 무한 루프(loop)를 돌기 위해서 while문을 사용한다는 점 꼭 기억해 주세요. 아니면 한 번 실행되고 그냥 프로그램이 종료됩니다.

 

while True:
      
    commend = input('아두이노에게 내릴 명령:')
    
    py_serial.write(commend.encode())
    
    time.sleep(0.1)

 

여기서 encode( )와 decode( )에 대해서 아셔야 하는데요.

 

encode란 우리가 사용하는 한글이나 영어를 시리얼 통신에 최적화된 상태로 변형시켜 주는 것을 말하며,

decode란 시리얼 통신에 최적화된 형태의 문자열을 다시 원래의 형태로 원상복구 시켜주는 것을 말합니다.

 

그 형태는 아래의 코드에서 주석으로 설명해 두었으니 주의깊게 봐주세요.

 

 

4) 아두이노에서 보낸 시리얼 통신(명령에 대한 반응 메시지)을 받는 부분입니다.

 

아두이노와 마찬가지로 메시지가 들어오면, 해당 메시지를 한 줄 읽고, 디코딩해줍니다.

 

    if py_serial.readable():
        
        # 들어온 값이 있으면 값을 한 줄 읽음 (BYTE 단위로 받은 상태)
        # BYTE 단위로 받은 response 모습 : b'\xec\x95\x84\xeb\x91\x90\xec\x9d\xb4\xeb\x85\xb8: a\r\n'
        response = py_serial.readline()
        
        # 디코딩 후, 출력 (가장 끝의 \n을 없애주기위해 슬라이싱 사용)
        print(response[:len(response)-1].decode())

 

위에서 설명드린 파이썬 코드를 실행하면 아래와 같이 터미널 창을 마치 아두이노 시리얼 모니터 처럼 사용할 수 있습니다.

 

 

오늘 준비한 내용은 여기까지입니다.

 

다음에 기회가 된다면 GUI 프로그램으로 아두이노 모터 제어를 해보는 프로젝트를 포스팅 해보겠습니다.

 

2022.09.28 - [파이썬 패키지/아두이노] - [Python/Serial] 파이썬과 아두이노로 스텝모터 제어하기

 

[Python/Serial] 파이썬과 아두이노로 스텝모터 제어하기

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도

coding-kindergarten.tistory.com

 

감사합니다.

 

 


<참고 자료>

 

https://pyserial.readthedocs.io/en/latest/pyserial.html

 

pySerial — pySerial 3.4 documentation

 

pyserial.readthedocs.io

 

https://kamang-it.tistory.com/entry/Arduino-Python%EC%9C%BC%EB%A1%9C-UARTSerial%ED%86%B5%EC%8B%A0%ED%95%98%EA%B8%B0

 

Arduino Python으로 UART(Serial)통신하기

이 때까지 여러분은 UART통신을 사용해서 모니터에 값을 출력하고 값을 쓰는 행동을 하였다. 만약 이걸 프로그래밍으로 코딩하기 위해서는 어떻게 해야할까? 그걸 하기위해서는 여러가지 방법과

kamang-it.tistory.com

 

반응형

+ Recent posts