오늘은 블루투스 모듈을 이용한 시리얼 통신을 해봤습니다.
회사에 기자재 중에서 5V 전원을 사용하는 블루투스 모듈이 있어서 연결해 보았는데 잘 동작하네요.
VCC, GND, RX, TX 핀을 제공하는 모든 블루투스는 아마 동일한 방법으로 제어를 할 것이라 생각됩니다.
자 시작하겠습니다.
1. 하드웨어 구현
사진에서 보이는 붉은 선은 5V 전원, 검은색은 GND, 파란색 2가닥은 RX, TX를 각각 디지털 단자에 연결한 것입니다.
좀 더 깔끔하게 Fritzing으로 그린 그림을 보면 다음과 같습니다.
파츠가 동일한 것이 없어서 그냥 4PIN연결이 가능한 블루투스 모듈에서 골랐습니다. 배선만 정확하게 하면 별차이없습니다. 전원은 정확하게 연결하여야 하며, RX, TX는 배선에 따라서 원하는 핀에 연결하시면 됩니다. 저는 USB시리얼용 0, 1 핀 이후의 2, 3번 핀을 사용하도록 연결하였습니다.
스케메틱은 위와 같은데 RN-41 블루투스 모듈이 잔여 핀이 많아서 복잡해보이지만 결국 연결되는 선은 4가닥이 전부라는 거^^;
PCB디자인입니다. 그냥 배선이 간단합니다. GND는 연습삼아 그려보았습니다;;;
자 하드웨어는 이제 완성되었습니다. 프로그램을 만들어야 겠지요?
2. 소프트웨어 구현
/** * USB시리얼과 블루투스 모듈을 이용한 통신 * * 아두이노에서 제공되는 Serial 클래스와 SoftwareSerial을 * 이용하여 2개의 시리얼통신을 제어하는 예제 * * @auth 김은중 * @email dante2k@gmail.com * @since 2015-08-13 */ // 블루투스 시리얼을 생성하기 위한 라이브러리 #include// 블루투스 시리얼 통신 PIN 정의 #define PIN_RX 2 #define PIN_TX 3 // 블루투스 시리얼 초기화 SoftwareSerial bluetooth = SoftwareSerial(PIN_RX, PIN_TX); // 데이터 전달을 위한 변수 String str; /** * USB시리얼과 블루투스시리얼 속도 설정 및 변수 초기화 */ void setup() { Serial.begin(115200); bluetooth.begin(115200); str = ""; } /** * 블루투스를 통하여 전달된 문자열을 USB시리얼을 통하여 * 전달 */ void loop() { while (bluetooth.available()) { char c = (char) bluetooth.read(); str = str + c; delay(2); } if (str != "") { Serial.println("RCVDAT:" + str); str = ""; } }
소스는 간단합니다. USB시리얼을 정의하여 초기화하고, SoftwareSerial을 이용하여 블루투스 모듈이 연결된 RX, TX로 소프트웨어 시리얼을 생성하고 사용하는 것입니다.
저는 간단히 휴대폰의 블루투스를 이용하여 본 예제의 블루투스 모듈에 접속을 하였고, 안드로이드 플레이스토어의 BluetoothTerminal 이라는 프로그램을 이용하여 테스트하였습니다.
휴대폰에서 전송한 데이터 입니다.
PC와 연결된 아두이노 USB시리얼을 통해서 전달받은 데이터 입니다. 마지막에 B0는 휴대폰앱을 끌때 전송된 데이터로 이상하게 생각하지마시기 바랍니다;;;
또한 시리얼 통신을 하면서 이상한 점을 참 많이 느꼈습니다. 여지껏 소프트웨어 프로그램만 개발하다가 하드웨어에 밀접한 통신을 구현하다보니, MCU나 보드의 CPU의 성능이 어느정도 받쳐줘야 한다는 느낌이 많이 듭니다. 아두이노의 경우 사용가능한 램이 2KB뿐이고, MCU의 속도도 16Mhz 수준입니다. 115200의 시리얼통신에서 64바이트 이상의 데이터를 전달하는 경우 데이터를 잃어버리거나 60바이트이후 데이터가 소실되는 경우가 상당히 자주 일어납니다. 아마도 시리얼통신에 버퍼로 설정된 값이 64바이트인데, MCU의 한계치인것 같습니다. 최대한 전송할 패킷을 작은 사이즈로 구현해야 하며, 대량의 데이터를 전송하는 경우 확실하게 패킷사이즈를 줄여서 전송함은 물론 에러체크를 위한 CRC구현 등은 필수로 보입니다. (아니면 좀 비싼? 속도가 빠른 CPU, 버퍼에 사용할 메모리가 넉넉한 제품을 구입하는것이...;;)
위에 데이터만 보더라도 중간에 1234577890 으로 엉뚱한 숫자가 하나 끼워져 들어온 것을 볼 수 있을 겁니다. 이런 일이 발생하는 이유는 MCU의 속도가 SoftwareSerial의 115200 baudrate를 감당하지 못하는 것이라 생각됩니다. 블루투스 모듈을 좀 더 느린 것을 사용하던지, UNO보다 더 높은 처리속도를 갖는 보드를 사용해야 하겠지요.
이상 USB시리얼과 블루투스 시리얼을 사용한 통신 제어를 구현해 보았습니다.
위 예제에 대한 Arduino IDE 소스와 Fritzing 설계 파일을 공유합니다.
SerialAndBluetoothCommunication.fzz
끝.