728x90

이 때까지 여러분은 UART통신을 사용해서 모니터에 값을 출력하고 값을 쓰는 행동을 하였다.

만약 이걸 프로그래밍으로 코딩하기 위해서는 어떻게 해야할까?

그걸 하기위해서는 여러가지 방법과 여러가지 언어가 있다.

가장 쉬운 방법은 Python으로 하는 것이다.

필자는 C, Java로도 해봤지만 초보자가 하기에는 라이브러리 문제가 있어서 조금 힘들 수 있다.

애당초 필자는 보통의 경우 맥에서 하는데 C와 Java는 Native 라이브러리를 추가해줘야해서 쉬운것과는 조금 거리가있다.

그래서 이번에는 Python으로 쉽고 간편하게 하는 방법을 보자.


먼저 라이브러리가 필요하다 아래의 명령어로 설치하자.


pip install pyserial


이제 아두이노와 본체쪽을 유선연결해야한다.

특별한건 없고 이 때까지 연결했던것 처럼 컴퓨터와 연결해있으면된다.

애당초 그게 유선으로 연결하는 UART통신이였으니까.


양쪽다 코딩을 해야한다. 먼저 아두이노에서 컴퓨터쪽으로 Serial통신하는 예제를 보도록하자.


int val;

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.println(val++);
}

이 코드는 아두이노에서 시리얼 모니터에 val을 지속적으로 출력하고 있다.

val은 1씩계속해서 증가해서 시리얼통신으로 보내고 있는 상태이다.

원래는 우리는 이 시리얼통신의 값을 시리얼 모니터로 봤지만 이번에는 그 출력을 파이썬 어플리케이션 쪽으로 잡아보자.


import serial

ser = serial.Serial(
port='/dev/cu.usbmodem1421',
baudrate=9600,
)

while True:
if ser.readable():
res = ser.readline()
print(res.decode()[:len(res)-1])

이쪽은 파이썬 코드이다. 포트는 여러분이 사용하는 포트를 쓰자.

윈도우 계열은 COM<숫자>로 뜬다. baudrate는 여러분이 열었을 때의 보드레이트를 사용하자.

코드를 보면 간단하다.

아두이노가 무한반복하면서 코드를 실행하듯 받는 시리얼 모니터도 지속적으로 코드를 받아야한다.

그래서 값이 있는지를 체크하는 ser.readable()로 값이 들어왔는지 확인한다.

그래서 값이 있으면 readLine으로 한줄을 받는다. 이때 바이트 단위로 받으므로 받은 값은 바이트로 넘어온다.

따라서 디코딩을 해준다. decode함수를 사용하면 우리가 사용할 수 있는 일반 문자열로 변환된다.

마지막으로 슬라이싱으로 끝을 잘라주는데 그 이유는 끝에 개행문자가 있기 때문이다.

이제 실행해보자.



값이 정상적으로 넘어오는 것을 확인할 수 있다.


이제 값을 받아봤으니 아두이노로 보내보도록하자.

단 아두이노로 보낼때 아두이노로 값이 전달됬는지 확인할 수 있는 방법이 마땅히 없다.

따라서 우리는 아두이노로 값이 전달이 성공했다면 아두이노에서 LED를 켜지게 할 것이다.


그냥 켜면 재미 없으니까 a가 전달되면 불이 계속 켜지게,

b가 전달되면 불이 점멸하게,

그 이외가 전달되면 불이 꺼지게하자.


#define OFFMODE -1
#define ONMODE 0
#define BLINKMODE 1
const int pinLED = 3;

char ch;
int state = OFFMODE;

void setup() {
pinMode(pinLED,OUTPUT);
Serial.begin(9600);
}

void loop() {
if(Serial.available()){
ch = Serial.read();
}
if(ch=='a'){
state=ONMODE;
}else if(ch=='b'){
state=BLINKMODE;
}else{
state=OFFMODE;
}

if(state==ONMODE){
digitalWrite(pinLED,HIGH);
}else if(state==BLINKMODE){
digitalWrite(pinLED,HIGH);
delay(100);
digitalWrite(pinLED,LOW);
delay(100);
}
else{
digitalWrite(pinLED,LOW);
}
}

아두이노쪽의 코드이다. 길어보이지만 내용은 길지 않다.

먼저 상태를 지정한다. ONMODE, BLINKMODE, OFFMODE는 이름만으로도 뭐하는 녀석들인지 알 수 있다.

그리고 만약 데이터를 입력받았을 때 그게 a면 ONMODE를 b면 BLINKMODE를 나머지는 OFFMODE를 켠다.

그게 전부이다.


이제 컴퓨터쪽 코드를 보자.

import serial

ser = serial.Serial(
port='/dev/cu.usbmodem1421',
baudrate=9600,
)

while True:
print("insert op :", end=' ')
op = input()
ser.write(op.encode())

컴퓨터쪽에서는 내가받은 데이터를 바이트로 인코딩해서 넘겨준다.

이제 제대로 실행되는지 확인해보도록하자.



제대로 실행되는것을 확인할 수 있다.

'Microprocessor > Arduino' 카테고리의 다른 글

Arduino Bluetooth(HC-06)  (1) 2018.04.03
Arduino Button  (0) 2018.04.03
Arduino 가변저항(아날로그 입력)  (0) 2018.04.03
Arduino PWM(아날로그처럼 출력하기)  (0) 2018.04.03
Arduino LED 켜기(저항,LED,digital출력)  (0) 2018.04.02

+ Recent posts