티스토리 뷰

Arduino

[Arduino] 아두이노와 시리얼통신으로 대화하기

생각많은 소심남 2012. 5. 16. 22:02

이번에 다룰 내용은 아주 기초적이지만 사용자가 준값을 토대로 LED를 제어하는 것에 대해서 언급해보도록 하겠습니다.

일단은 다음과 같이 회로를 구성해줍니다.

 

 

잘 안보이실수도 있겠지만 digital Input 13번 핀에 LED의 +단자를 연결하고 -단자는 gnd에 연결했습니다. 무척 쉬운 회로입니다. 당연히 코드상에서 LED를 제어하기 위해서는 13번핀을 LED의 output으로 선언해줘야 합니다. 이부분에 대한 정의는 setup에서 이러집니다. 물론 포스트에서 계속 나오는 것처럼 baudrate의 설정도 같이 진행되어야 합니다.

 

(참 blinkRate입니다. 오타났네요)

그리고 loop함수에서 다음과 같이 구성해줍니다. 참고로 우리가 하려는 것은 아두이노가 사용자로부터 문자열을 입력받아서 그 값의 조건에 따라서 깜빡이는 속도를 제어하고자 하는 겁니다.

 

 

이 구문을 분석하자면 Serial을 통해서 입력이 들어온 경우에만 조건문인 실행되는 구조입니다. 물론 blink라는 함수는 조건문과 별개이기 때문에 당연히 주기적으로 실행됩니다. 우리가 Serial Monitor를 통해서 받아오는 데이터는 ch라는 char형 변수에 저장되어 이 값이 9 자리인지를 확인해야 하고 나서 그걸 정수형으로 바꿔주는 작업을 합니다. 저번에도 이야기 했지만 우리가 쓰는 데이터는 ASCII라고 해서 각각의 코드값이 매핑되어 있습니다. 따라서 그 값에서 0일때의 ASCII값을 빼준다면 상대적인 차이를 알수 있겠지요. 거기에 100을 곱함으로써 blinkRate가 결정됩니다.

 

자 이제 받아온 입력값에 대한 설정이 끝났으니까 LED를 켜는 함수인 blink 함수를 표현해줘야 합니다. 그건 다음과 같이 작성해줍니다.

 

 

의외로 간단하게 표현됩니다. 그냥 출력값에 1과 0을 반복해서 넣어주면 LED는 깜빡거릴 겁니다. 다만 이때의 딜레이값을 앞의 loop함수에서 정의한 blinkRate에 따르도록 한겁니다. 그럼 넣어준 값에 따라서 불이 깜빡이는 정도가 달라지는 것이겠죠.

한번 결과를 확인해보겠습니다.

 



지금 순차적으로 값을 다르게 줌으로써 LED가 깜빡이는 정도가 달라지는 것을 볼 수 있습니다. 참고로 0이라는 숫자는 ASCII코드로 48입니다. 그럼 9까지의 수는 각각의 ASCII 코드에서 0에 해당하는 ASCII코드로 빼주면 값이 나올것이고 그 값에 100ms를 곱해서 딜레이를 나타내는 겁니다. 예를 들어 3을 입력한 경우에는 깜빡이는 정도가 300ms가 되겠지요. 이번에는 loop함수를 조금 수정해보겠습니다. 그냥 바로 입력한 값이 딜레이가 되도록 말이지요.

 

 

이렇게 바꾸면 어떻게 될까요? 참고로 ASCII코드로 10은 newline 즉 개행입니다.

 이 말은 개행이 있을 경우에는 value를 blinkRate로 바꾸고 다시 초기화하겠다는 겁니다. 즉 우리가 입력값을 넣고 send를 누르는 순간 그 값이 blinkRate가 되고 value가 초기화가 되는 과정을 거치는 겁니다.

다시 롬업을 하고 Serial Monitor를 실행시킵니다. 이때는 이 SerialMonitor의 설정을 수정을 가해야 합니다.

 

 

원래 기본 옵션은 No line ending으로 되어 있을겁니다. 이걸 Newline으로 바꿔주어야 send를 누를 때마다 그 값이 적용됩니다. 한번 결과를 확인해보겠습니다. 제가 입력한 값은 다음과 같습니다.

 

 

이에 대한 결과는 영상으로 확인해보시죠.

 

 

솔직히 지난 포스트에서 이야기한 것은 컴퓨터를 통해서 결과를 확인하는 것이었기에 확 안 와닿은 감이 있었겠지만 이번처럼 뭔가 시각적으로 결과를 확인할 수 있는 게 있다면 조금더 하는 재미가 있겠지요.

 

댓글