2. 아두이노로부터 수신 실험

 실험을 위해서 다음과 같은 간단한 프로그램을 아두이노 우노에 다운로드 하였다. 이 프로그램은 전원이 켜지면(또는 리셋 버튼을 누르면) "Hello python." 이라는 문자열을 보낸다.


void setup() {
   Serial.begin(9600);
   Serial.println("Hello python.");
}

void loop() {
}


그리고 파이썬에서 Serial 객체의 인스턴스를 다음과 같이 생성한다.


>>> ard = serial.Serial('COM22')


이렇게 하면 ard 변수에 Serial 클래스의 인스턴스가 생성된다. 이제 이 변수를 이용해서 아두이노에서 보내는 값을 읽어들일수 있다.


>>> obj = ard.readline()
>>> obj
b'Hello python.\r\n'


아두이노 쪽에서 println()함수를 썼기 때문에 끝에 \r\n 두 개의 개행 제어 문자가 붙어서 넘어왔다.


 한 가지 주의할 것은 Serial.readlin() 함수의 반환 객체가 문자열이 아니라 bytes 라는 파이썬 객체로서 각각의 문자의 아스키코드 바이트 값의 배열이라는 점이다. 이것을 파이썬 문자열(string)로 변환하려면 bytes.decode()함수를 이용하면 된다.


>>> str = obj[:-2].decode()
>>> str
'Hello python.'


이제 str 변수에 아두이노로 부터 전송된 문자열이 정확히 저장되었다. 여기서 obj[:-2] 와 같이 인덱싱을 한 것은 \r\n 두 문자를 제외하기 위한 것이다.





Posted by 살레시오

댓글을 달아 주세요

  1. 익명 2016.10.25 07:25  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

3. 두 번째 실험 : 송신


  이번에는 파이썬에서 값을 송신하면 그에 따라서 아두이노의 LED를 점멸시키는 예제를 해 보겠다. 파이썬에서 데이터를 쓰는 함수로 Serial.write() 함수가 있는데 전송할 바이트 데이터를 리스트나 튜플로 묶어서 넘겨주면 된다. 반환값은 전송한 데이터의 바이트 수이다. 예를 들면 다음과 같다.


-------------------------------------------------------------------------

>>> ard.write( [0] ) # 0이라는 데이터를 전송한다.

>>> ard.write( [10, 150, 255] ) # 10,150,255를 차례로 전송한다.

>>> ard.write( 123 ) # 예외 발생!

-------------------------------------------------------------------------


전송되는 데이터는 바이트 데이터이므로 0~255 사이의 정수여야 하며 마지막 예와 같이 리스트나 튜플이 아니라면 예외가 발생함을 유의하여야 한다.


만약 문자열을 한꺼번에 전송하고 싶다면 encode() 라는 문자열 내장 함수를 이용하면 된다. 이 함수는 파이썬 문자열을 아스키값의 bytes 배열로 변환시켜준다.


-------------------------------------------------------------------------

>>> ard.write( 'Hello arduino.\r\n'.encode() )

-------------------------------------------------------------------------


이 명령은 'H' 부터 맨 마지막 '\n' 까지 14개의 문자의 아스키코드를 차례로 전송한다.


이제 실험을 위해서 아두이노에 다음과 같은 프로그램을 작성하여 다운로드 했다.



아두이노 프로그램 : 전원이 켜지면(또는 리셋 버튼을 누르면) "Hello python." 이라는 문자열을 보낸다. 그리고 데이터가 들어오면 0값이면 LED를 끄고 아니라면 켠다.

-------------------------------------------------------------------------

void setup() {

Serial.begin(9600);

Serial.println("Hello python.");

pinMode(LED_BUILTIN, OUTPUT);

}


void loop() {

if( Serial.available() )

digitalWrite(LED_BUILTIN, Serial.read());

}

-------------------------------------------------------------------------


이제 ard.write([0]) 이라고 명령을 내리면 LED가 꺼지고 ard.write([1])이라고 하면 LED가 켜지는 것을 다음과 같이 확인할 수 있다. 




위 동영상을 보면 1을 쓰면 LED가 켜지고 0을 쓰면 꺼지는 것을 볼 수 있다.


Posted by 살레시오

댓글을 달아 주세요