서론
과외를 하다 Python을 가르치는 학생을 대상으로 아두이노를 진행하게 되었다.
아두이노는 C++ 언어를 기반으로 동작을 하므로 Python을 사용하는 사람에게는 이용이 어려운게 현실이다.
물론, 시리얼 통신을 하면 되지 않나? 라고 반박한다면 맞는말이다.
학습과 실습이 중심이 되는 시스템에서는 아무런 문제가 발생하지 않을 것이다.
하지만 아두이노에 올린 프로그램을 작품으로 동작하게 하고 싶다면? ( PC와의 연결을 해제하고 )
그때는 얘기가 꽤나 달라진다. 왜냐하면 컴퓨터를 중간에 두고 통신을 진행하고 있기 때문에.
물론 가능하다, 하지만 아두이노가 PC에 연결되어 있지 않다면?
블루투스를 통해 송수신할것인가?
엄청난 노가다가 필요할 것이고 낭비가 심할 것이다.
차라리 C++을 배우는게 편할지도 모른다.
그러므로 필자는 아두이노를 다루고 싶다면 C++을 공부하는것을 강.추. 하지만 Python을 이용하여 환경을 구축하는 것에 대해도 나름의 장점이 있으므로 이에 대해 말해볼까 한다.
C++에 대한 지식이 없지만 학습과 실습을 중심으로 하는 환경을 만들어 아두이노가 어떻게 동작하는지 알고싶은 사람이라면 좋은 시도가 될 것이다.
Serial 통신이란?
일단은 Serial 통신이 무엇인지부터 알아보도록 하자.
Serial은 어떤 뜻을 가진 영단어인가?
혹시 이것을 생각한 독자가 있을지도 모르겠다

잡담은 여기까지 하고 Serial은 영어로 '직렬' 이라는 뜻을 가지고 있다.
자, 직렬까지 말했다면 생각해보자. 직렬의 반댓말은 무엇일까?
똑똑한 독자분들은 모두 알고있듯이 그렇다. '병렬'이다! 영어로는 Parallel 이다!
직렬과 병렬에서 추론할 수 있듯이
직렬통신, Serial Communication 은 직선으로, 하나의 선을 통해 정보를 비트단위로 송수신하는 것이다.
그에 반해 병렬통신, Parallel Communication 은 여러개의 선을 통해 동시에 정보를 비트단위로 송수신하는 것이다.

위 그림에서는 D0~D7 까지의 각각의 비트를 전송하는 방식을 각각의 통신방법을 예를 들어 설명한다.
자, 보면 직렬, 병렬 통신의 모호한 개념이 머리에 잡혔을 것이다.
사실 이에 대해 설명하자면 끝이 없다. 한 포스트로 다 설명할수도 없을 뿐더러..
쨋든 우리의 목적은 아두이노와 파이썬의 연동이므로 아두이노는 시리얼 통신을 이용하는구나~ 까지만 이해하고 넘어가도록 하자.
※ USB의 약자는 Universal Serial Bus 이다! 생각해보면 USB를 통해 아두이노를 컴퓨터로 연결하지 않는가?
아두이노 우노의 경우 Serial 통신 방식을 사용할 수 있다.
우리는 이것을 사용하여 아두이노 - PC - Python 간의 통신방식을 사용할 것이다.
그림으로 표현하자면 이와같다.

파이썬으로 컴퓨터에 연결되어있는 아두이노에 직렬 통신으로 정보를 전달하고,
아두이노는 이 정보을 해석해 미리 정해진 방식대로 동작하게 하는 시스템인 것이다!
문제점
하지만 문제는 또 존재한다.
간단히 예를 들어보자, 아두이노 IDE에 위와 같은 코드를 작성하여 아두이노에 업로드하였다 생각해보자.
void Setup()
{
Serial.begin(9600);
pinMode(13,OUTPUT);
}
void loop()
{
while(Serial.available())
{
serial_data = Serial.read();
}
if(serial_data == '1')
{
digitalWrite(13, HIGH);
}
else if(serial_data == '0')
{
digitalWrite(13, LOW);
}
}
그리고 파이썬에서 아두이노가 연결된 시리얼 포트로 0 혹은 1을 전송하는 코드를 짜서 실행시켰다고 가정해보자.
파이썬에서 아두이노에게 Serial 통신으로 0을 보낸다면 13번 핀이 출력을 멈출 것이고,
파이썬에서 아두이노에게 Serial 통신으로 1을 보낸다면 13번 핀이 출력을 할 것이다.
좋다. 의도한대로 Python에서 정보를 보내면 아두이노가 동작할 수 있을 것이다.
하지만 만약, 13번 핀이 아니라 다른 핀을 제어하고 싶다면?
디지털이 아니라 아날로그 핀을 제어하고 싶다면?
아날로그 입력을 기준으로 어떠한 행동을 하고 싶다면?
매번 아두이노IDE에 시리얼 통신으로 전달된 정보의 의미를 부여하는 코드를 작성해야 할 것이다.
이와같이 각각을 의미하는 정보를 정하고 이를 Python, 아두이노IDE에 코딩을 진행하면,
그게 과연 Python으로 아두이노를 제어하는 이점을 살린 것일까?
필자는 아니라고 말하고 싶다.
그러므로 필자는 조금만 더! 스마트~한 방법을 사용해보고자 한다.
물론, 각 센서와 모듈에 종속된 라이브러리를 사용하고자 할 경우에는 아두이노 IDE에서 코딩이 필요할 것이다.
혹시 파이썬 설치가 제대로 되어 있지 않은 독자들은 이 포스트를 참고해 파이썬과 IDE를 설치하고 오자
[Python] 주식 자동거래 시스템 만들기 - 1 (퀀트 투자, Python 셋업)
자 일단 퀀트 투자란 무엇인지 알아보자. 주식에서 상승, 하락을 결정하는 여러 요소들이 있을 것이다. 퀀트 투자란 객관적인 요소들를 이용해 종목을 수학적, 통계적으로 분석하고 이 정보를
defs-program.tistory.com
자, 글을 읽고온 독자들은 Python과 VSCode가 PC에 있을 것이다. 물론, 혹시 몰라 아두이노 IDE가 없는 독자들을 위해
아두이노 IDE의 사이트를 준비했다.
https://www.arduino.cc/en/software
Software
Open-source electronic prototyping platform enabling users to create interactive electronic objects.
www.arduino.cc
모두 설치하였으면 시작해보자.
자, 방금 코드 예제에서 보았다싶이 우리는 직접 '0을 송신할 경우 13핀의 출력을 종료, 1을 송신할 경우 핀 출력' 을 정의하였다.
하지만 말했듯이 모~든 경우의 수에 대해 우리가 직접 정의를 하는 것은 너무나 번거롭고 귀찮은 일이 아닐 수 없다.
우리의 구세주, Firmata
여기서 등장하는 우리의 구세주는 바로 Firmata이다!
Firmata는 통신 프로토콜이다. 통신 프로토콜이 무엇인지 간단히 설명하고 넘어가자.
통신 프로토콜이란?
통신 프로토콜이란 일종의 규약이다.
대표적으로 HTTP, HTTPS, FTP, SSL, SSH 등의 프로토콜들이 존재한다.
데이터 전송 시, 어떤 데이터를 어떠한 순서대로, 어떠한 크기로 전송할지를 미리 정의한 일종의 약속 이라 할 수 있다.
http 의 예제를 보자.
이러한 정보들을 이러한 순서로 담아서 보내는 약속 이 http 프로토콜인 것이다.
아래의 예제는 웹페이지를 요청하는 Http 프로토콜의 예시이다.
GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
물론 응답의 경우도 이렇게 http에 약속되어 있다.
HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 155
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close
<html>
<head>
<title>An Example Page</title>
</head>
<body>
<p>Hello World, this is a very simple HTML document.</p>
</body>
</html>
자 간단한 예제로 통신 프로토콜이란 일종의 약속, 이라는 것을 알게 되었다.
그렇다면 이제는 Firmata에서 데이터를 전송하기 위해 정한 규칙은 무엇인지 알아봐야 할 것이다.
https://github.com/tino/pyFirmata
GitHub - tino/pyFirmata: Python interface for the Firmata (http://firmata.org/) protocol. It is compliant with Firmata 2.1. Any
Python interface for the Firmata (http://firmata.org/) protocol. It is compliant with Firmata 2.1. Any help with updating to 2.2 is welcome. The Capability Query is implemented, but the Pin State Q...
github.com
위 사이트는 pyFirmata ( Firmata의 Python 버전 ) 이 올라와있는 Github Repository 이다.
이 사이트에서 간단한 Firmata의 통신 약속을 살펴볼 수 있다.
영어로 되있는 사이트 구조상 필자가 간단히 필요한 정보만을 알려줄 것이다.
Firmata 설정
일단 Firmata의 통신 규약에 대해 보기 전에 먼저 Firmata를 사용하기 위한 설정을 해보자.
간단하다, 일단 아두이노를 PC에 연결하고 아두이노IDE를 실행한다.
다음과 같이 파일->예제->Firmata->StandardFirmata를 클릭한다.

열린 새로운 창에서 자신의 아두이노를 포트에서 선택한 후, 업로드를 클릭하여 파일을 아두이노에 업로드한다.

이제 약속한 프로토콜대로 Python 코드를 작성하면, Firmata가 이를 해석하여 아두이노가 동작할 것이다.
위에서 본대로 우리는 Python을 사용하므로 pyFirmata가 필요하다.
윈도우 검색 창 -> cmd 실행 -> pip install pyFirmata 명령을 입력하여 pyFirmata 라이브러리를 설치하자.

필자의 다른 포스트를 보고 Python 설치하였을 경우 경로 에러없이 설치가 가능하였을 것이다.
pip라는 명령이 존재하지 않습니다~ 라는 에러가 나올 경우에는 PATH를 설정하지 않았을 가능성이 존재하므로 직접 환경변수를 설정하던가 Python을 삭제 후 필자의 포스트를 보고 재설치를 진행하자.
자 이제 환경셋업은 완료했다. 다음 예제 코드를 실제 파이썬 파일을 만들어서 따라해보자.
import pyfirmata
import time
board = pyfirmata.Arduino('COM6')
while True:
board.digital[13].write(1)
time.sleep(1)
board.digital[13].write(0)
time.sleep(1)
자, 주의해야 할 사항이 있다.
board = pyfirmata.Arduino('COM6') 에서 COM6 는 아두이노가 연결된 포트를 의미한다.
아두이노 IDE의 툴-> 포트를 설정한 기억이 있을 것이다.
필자의 아두이노는 COM6포트에 연결되었고, 그래서 필자는 COM6를 적어 생성자의 매개변수로 전달한 것이다.
자신의 아두이노가 연결된 COM포트를 매개변수로 제출하여 파일을 실행해보자.
다음과 같이 13번 핀과 연결된 L 우측의 라이트가 1초 간격으로 점멸하는 것을 볼 수 있다.
다음 포스팅에서 다른 제어 방법들을 설명할 것이니 기대해도 좋을 것!이다 아마..ㅎㅎ
못 기다리는 독자들은 Firmata Github Page를 참조하기 바란다.
그럼 20000~
'프로그래밍 > Python' 카테고리의 다른 글
[Python] 여러 개의 오디오 파일을 하나의 오디오 파일로 (pydub) (0) | 2023.05.06 |
---|---|
[Python] 주식 자동거래 시스템 만들기 - 1 (퀀트 투자, Python 셋업) (1) | 2022.06.23 |
[Python] 주식 자동거래 시스템 만들기 - Prologue (0) | 2022.06.23 |