반응형

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

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

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

 


아주 오래 전에 아두이노로 파이썬으로 제어하는 법을 알아보고 모터 제어하는 방법도 포스팅 하겠다고 해놓고 이제서야 포스팅 해봅니다.

 

2021.12.18 - [파이썬 패키지/아두이노] - [Python/Serial] 파이썬으로 아두이노 제어하기

 

[Python/Serial] 파이썬으로 아두이노 제어하기

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

coding-kindergarten.tistory.com

 

예전에 했던 프로젝트를 정리하는 느낌으로 포스팅 해보겠습니다.

 

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

 

1. 개념도

 

저의 경우엔 차트를 180도 회전시키는 프로젝트를 진행했었는데 전원이 꺼지면 원점 정보를 잃어버리는 스텝 모터를 보완해주기 위해서 리미트 센서도 함께 사용했었습니다.

 

2. 준비물

 

1) 스테핑모터 NK243-01AT 2상스테핑모터, 23,100

     (모터 구매 링크)

 

2) 아두이노 우노

 

3) 아두이노 L293D 모터 드라이버 쉴드

 

DC모터 최대 4개, 스탭모터 최대 2개까지 제어 가능

 

4) 리미트 센서

 

5) 9V 1A 전원 어댑터

 

3. 배선

 

저는 모터 구매 사이트에서 알려주는 배선도와 모터 케이블의 색깔이 달라서 배선에 매우 애를 먹었었습니다.

 

참고로 GND에 빨간색과 파란색 선을 연결해주지 않아도 모터가 돌아는 가지만 소음이 심하고 힘도 부족합니다. 

 

모터 드라이버 쉴드  –  모터  ( 방향에 주의할 것 )

 

아두이노 - 리미트 센서

 

4. 아두이노

 

아두이노 모터 드라이버 쉴드를 사용하기 위해서는 Adafruit Motor Shield library라는 라이브러리를 설치해주어야 합니다.

 

라이브러리 설치방법
검색 후 설치 버튼 클릭

 

아래는 아두이노 코드입니다. 앞서 말씀드렸 듯이 스텝모터와 리미트 센서를 함께 사용했기에 조금 코드가 깁니다.

혹시나 필요하실 분들을 위해 함께 남겼고, 스텝모터만 제어하실 분들은 더 아래의 코드를 이용해주세요. 

#define OFFMODE 0
#define CW 1
#define CCW 2

#include <AFMotor.h>

int sensorPin = 2;
int flag_start;

AF_Stepper motor(200, 2);

char cmd;
int state = OFFMODE;

void setup() {
  Serial.begin(9600);
  motor.setSpeed(8);
  pinMode(sensorPin, INPUT);

  // 가장 처음 스텝모터의 원점을 잡기 위한 코드
  while(true){

    int val = digitalRead(sensorPin);

    if(val==1){
      break;
    }

    Serial.println(val);

    if(val==0){
      motor.step(1, FORWARD, MICROSTEP);
    }
    
    Serial.println(val);
  
    if(val==1){
      break;
    }
  }

}

void loop() {

  if(Serial.available()){
  cmd = Serial.read();
  }
  if(cmd=='a'){
    state=CW;
  }else if(cmd=='b'){
    state=CCW;
  }else{
    state=OFFMODE;
  }

  if(state==CW){
  motor.step(100, FORWARD, MICROSTEP);
  delay(1000);
  state=OFFMODE;
  }
  
  else if(state==CCW){
  motor.step(100, BACKWARD, MICROSTEP);
  delay(1000);
  state=OFFMODE;
  }
  
  else{
  state=OFFMODE;
  }
}

 

<리미트 센서 제외한 스텝모터 제어 코드>

#define OFFMODE 0
#define CW 1
#define CCW 2

#include <AFMotor.h>

//모터 셋팅(360도를 200step으로 설정, 모터 드라이버 쉴드 2번 포트 사용)
AF_Stepper motor(200, 2);

char cmd;
int state = OFFMODE;

void setup() {
  Serial.begin(9600);
  motor.setSpeed(8);
  pinMode(sensorPin, INPUT);
}

void loop() {

  if(Serial.available()){
  cmd = Serial.read();
  }
  if(cmd=='a'){
    state=CW;
  }else if(cmd=='b'){
    state=CCW;
  }else{
    state=OFFMODE;
  }

  //모터 정회전(180도)
  if(state==CW){
  motor.step(100, FORWARD, MICROSTEP);
  delay(1000);
  state=OFFMODE;
  }
  
  //모터 역회전(180도)
  else if(state==CCW){
  motor.step(100, BACKWARD, MICROSTEP);
  delay(1000);
  state=OFFMODE;
  }
  
  else{
  state=OFFMODE;
  }
}

 

 

5. 파이썬 코드

 

import serial
import time

py_serial = serial.Serial(

    # serial port 설정
    port = "com3",
    # 보드 레이트 (통신 속도)
    baudrate=9600
)

while True:

    commend = input('아두이노에게 내릴 명령:')
    
    #정회전
    commend = 'a'
    py_serial.write(commend.encode())
    
    #역회전
    commend = 'b'
    py_serial.write(commend.encode())

 


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

 

감사합니다.

반응형
반응형

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

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

업무는 물론 투자에도 도움이 될만한 전자공시시스템(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