brunch

You can make anything
by writing

C.S.Lewis

by Cylogic Dec 10. 2020

53. PC 프로그램으로 아두이노 컨트롤 하기

C# 프로그램으로 아두이노와 커뮤니케이션

지금까지의 연재에서 다양한 센서와 액츄에이터를 이용하여 작품을 만들어 보았다.

이제 IOT(사물인터넷)이나 원격조종 장난감 등의 작업에 본격적으로 진입하기 위해서는 다른 장치와의 연결이 매우 중요하다. 앞서 블루투스로 연결된 스마트폰을 이용한 장난감 자동차를 만들어 보았고, 이제는 좀 더 다양한 원격 조종을 위하여 PC 프로그램을 통한 아두이노 프로그램을 만들어 보려고 한다.


제대로 된 작품을 만들기 이전에 원격 조종에 대한 이해를 위하여 샘플 작품을 만들어 보았다.

모두 이전에 만들었던 작품을 기반으로 하여 제작 자체에 대한 설명을 생략하도록 하고,  PC에서 Serial 통신을 통하여 자료를 주고받고, 주어진 자료를 분석하여 아두이노를 조종하는 방법에 대해 설명하려고 한다.


샘플 작품은 아래의 사진과 같은 형태를 가진다. 이미 앞 선 연재에서 여러 번 보았던 모습일 것이다.


12개의 LED를 가지는 네오픽셀 스트립을 6번 핀에 연결하고,
9번 핀에는 서보모터를 연결하였다.
10, 11번 핀에는 초음파 센서의 Trig, Echo 핀을 각각 연결한 형태이다.
모든 장치의 VCC 또는 5V 핀은 아두이노의 5V 핀에 연결하였고, GND는 GND 핀과 연결하였다.


서보모터 위에 초음파 센서를 설치하여 각도를 변경하며 장애물을 감지하도록 하였다.
자율 주행 자동차를 만들며 설치했던 모습과 동일하다.

네오픽셀의 설치 모습은 51. 열두 번째 작품:네오픽셀과 서보모터 장식 만들기의 그것과 같다.


이른 조종하기 위한 PC용 프로그램의 화면은 다음과 같다.


장치의 기능과 목적은 다음과 같다.


1. 좌측의 Color라고 적힌 버튼은 네오픽셀의 색을 변경하고.

2. 바로 밑은 트랙 바는 서보모터를 좌우 0~180도로 움직이기 위한 장치이다.
    트랙 바 옆의 숫자는 현재의 각도를 표시한다.

3. Distance 옆의 값은 트랙 바가 움직였을 때 초음파 센서가 감지한 장애물의 거리이다.

4. 가장 아래에 숫자가 적힌 박스는 디버깅을 위하여 정확한 값이 전달되는 지를 확인하기 위한 자리이다.
Clear 버튼을 누르면 해당 자료는 삭제된다.

5. 상단의 COM5는 아두이노가 PC의 COM5와 연결되었음을 알리고 통신을 위하여 지정한 콤보박스의 값이다.  Stop 버튼을 누르면 통신이 해제된다.


이 장치를 통하여 PC에서 변경한 값이 아두이노로 잘 전달되는지와 역으로 아두이노에서 감지한 값이 PC로 잘 전달되는지를 확인할 수 있다.


이 장치를 이용하여 차후에 이 장치를 이용한 간단한 레이더 장치(엄밀하게 말하자면 쏘나)를 만들 예정이다.


장치가 동작하는 모습은  다음 동영상과 같다.

컬러 버튼을 클릭하여 네오픽셀 LED의 색을 변경하고, 서보모터를 변경하며 초음파 센서를 작동하는 모습을 보여 준다.


PC용 프로그램은 Visual Studio와 C#을 이용하여 만들었는데, 이 글을 읽으시는 분들이 이를 직접 이해하고 만들기 위한 과정이 아니므로, C# 코딩에 대해 굳이 설명하지는 않을 것이고, 아두이노에서 어떻게 입력된 자료를 분석하여 액츄에이터나 센서를 사용하는지에 대한 설명을 하려고 한다. 


아두이노 프로그램은 단순하다.


앞에 링크를 넣어둔 자료들을 이미 읽어 보았다면 모두 이해되는 코드일 것이고, PC에서 전달된 자료를 받아서 분석하는 부분만이 새로 추가된 내용이다.

이해가 필요한 내용은 다음 부분이다.


PC에서 컬러 버튼을 이용하여 색을 변경하면 

아래 String Str에 입력되는 데이터는

C;128;89;98

과 같은 형태이다. 여기 포함된 세 숫자는 각각  Red, Green, Blue 컬러의 색 농도이고 이는 0부터 254 사이의 정수일 것이다. 

      String Str=Serial.readString();

      if (Str.indexOf("C;")>-1){

          int ptr1=Str.substring(2) .indexOf(";");

          int ptr2=Str.substring(ptr1+3).indexOf(";");          

          int R=Str.substring(2, ptr1+2).toInt();

          int G=Str.substring(ptr1+3, ptr1+ptr2+3).toInt();

          int B=Str.substring(ptr1+ptr2+4).toInt();


아두이노 코드이기는 하나 C 프로그램과 라이브러리에 대한 이해가 조금 필요하다.

세 개의 값을 각 R, G, B 값에 입력하기 위하여 아래의 과정이 필요하다. 위의 코드는 과정을 보여주기 위한 방법이고 스트링을 Split(자르기)하는 함수 하나를 만들어서 ; 로 나누어진 각각의 데이터를 이용하는 것이 더 좋은 방법이다.


https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

아두이노 레퍼런스 사이트를 검색해 보면 위와 같이 String에서 사용할 수 있는 많은 함수들이 보인다.

그중 substring 자료를 확인해 보면...

위와 같이 상세한 설명이 나온다.

이를 이용하여 R, G, B 데이터를 분석하고  이를 이용하여 

 pixels.setPixelColor(i, pixels.Color(R, G, B));

 pixels.show();

이 코드를 이용하여 LED 색을 변경하는 것이다.


서보모터의 위치를 변경하는 자료도 S;128처럼 전달이 되므로 

         servo.write(Str.substring(2).toInt());

         float val=chk_Distance();

         Serial.println(val);


substring(2)로 S; 를 건너뛰고 128만을 toInt()로 정수화하여 해당 위치로 이동하고, chk_Distance를 이용하여 거리를 측정한 수 Serial.println을 통하여 PC에 그 값을 전달한다.


PC와 아두이노 사이에서  Serial 포트를 통하여 오고 가는 데이터를 처리하는 방법을 배웠다.

장치의 연결과 데이터 통신 자체의 문제보다는 오가는 데이터를 어떻게 서로가 이해하기 좋게 만들어서 작품을 만들 것인가에 대해 고민해 보는 기회가 되기를 바란다.

이를 기반으로 Wifi, Bluetooth, 기타 무선 통신 등에서 자료를 주고받는 작품을 만들 수 있을 것이다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari