본문 바로가기

아두이노 (Arduino)/통신 (Communication)

[Serial] 3. C# 아두이노 센서값 실시간 동기화하기

이전에는 아두이노에 시리얼 값을 전송하여 RGB LED를 제어하였다.

이번에는 반대로 아두이노에서 측정한 센서값을 데스크탑 C# 프로그램에 동기화를 해보자

윈도우 폼을 위와 같이 심플하게 구성한다.

TrackBar의 Value 범위는 0 - 1000으로 설정한다.

센서는 HC-SR04 초음파 센서를 mm 단위로 측정하여 C# 프로그램에 송신 및 동기화할 것이다.

실시간 동기화를 위해서는 쓰레드가 필요하다.

쓰레드를 사용하기 위해 using 해주자

거리변수 Distance와 쓰레드 객체를 만든다.

Thread1의 Update 레퍼런스 값은 함수이다.

Update 함수는 static 으로 정의하자

쓰레드 자동시작 및 종료를 위해서 폼을 열고 닫을 때 이벤트 코드를 작성해준다.

이전 타이머 이벤트 함수를 위와 같이 정의해주자.

Update 함수는 위와 같이 심플하게 작성할 수 있다.

시리얼 포트 연결이 안되는 경우 1ms 딜레이 및 무한 루프를 진행한다.

딜레이가 없으면 빈 코드를 무한 루프로 실행하므로 CPU가 해당 루프를 계속해서 스케줄러에 등록하기 때문에 1ms 정도의 대기시간을 넣는다.

아두이노 코드는 위와 같이 작성한다. 초음파 센서는 ECHO를 2번, TRIG를 3번 핀에 연결한다.

시리얼 통신 패킷의 경우 헤더를 [ 0xff , 0xff ] 로 시작하는 것이다.

전송하는 변수의 값을 0 ~ 1000 정도로 지정하였기 때문에 0xff를 연속으로 잡아 겹치는 패킷 데이터가 없도록 한다.

전송 패킷은 헤더 바이트 [ 0xff, 0xff, (Value High), (Value Low) ] 로 변수값의 상위 비트 8개와 하위 비트 8개를 연속으로 보내는 것이다.

이를 C# 쓰레드에서 실시간으로 읽어 상위, 하위 비트를 하나로 합쳐 TrackBar에 동기화 하는 것이다.

헤더를 0xFF 두 개로 지정하였기 때문에 변수 값은 약 0 ~ 65000의 데이터를 전송할 수 있다.

최대한 0xFF가 연속으로 두 값이 겹치지 않도록 설계하면 되는 것이다.

이렇게 실시간으로 초음파의 측정값을 데스크탑 C# 프로그램으로 동기화하여 확인할 수 있다.

 

C_Sharp_Serial3.zip
0.04MB