아두이노 레오나르도 보드는 흔히 많이 사용하는 아두이노 Uno, Nano 등의 보드와는 특성이 틀립니다. 핀 배열 자체가 표준 보드인 Uno 보드와 틀리기 때문에 라이브러리가 호환되지 않을 가능성이 크고 핀 연결도 주의해야 합니다. 하지만 레오나르도 보드만의 중요한 장점들이 있기 때문에 특성을 파악하고 사용하신다면 정말 유용할 수도 있습니다.
(아두이노 레오나르도 보드를 키보드, 마우스 처럼 동작시키기 위해서는 링크를 참고하세요)
USB 통신 기능을 통합한 Atmega32U4 칩
가장 큰 차이점은 PC와의 통신을 위해 별도의 FTDI 칩을 사용하지 않고 이 기능이 포함된 Atmega32U4 칩을 사용한다는 점입니다. 실제로는 레오나르도에 전원이 입력되고 부트로더가 실행될 때 직렬 인스턴스를 생성하고, PC에서는 USB의 Communications Device Class (CDC) 드라이버의 인스턴스가 생성되면서 연결됩니다.
따라서 레오나르도 보드를 리셋시키면 시리얼 통신이 끊어져버리고 다시 연결을 하게됩니다. 그래서 PC에서 보면 마치 장치의 USB 연결을 끊었다 다시 연결한 것처럼 보입니다. 아두이노 Uno, Nano, Mega 등등의 보드에서는 리셋 버튼을 누르더라도 PC에서 장치를 다시 찾거나 하지는 않는 것과 대조적인데 이들 보드에서는 별도의 FTDI 칩이 PC와의 연결을 담당하기 때문에 Reset 버튼의 영향을 받지 않기 때문입니다.
레오나르도 보드 스케치 업로드
아두이노 개발환경에서 작성한 스케치를 업로딩 하면 [스케치 컴파일] 과정을 진행하고 [업로딩] 과정을 진행합니다. 이 두 과정 사이에 PC에서 리셋 신호를 주기 때문에 보드가 리셋 되는데, 앞서 얘기했다시피 아두이노 레오나르도 보드는 리셋을 하면 PC와의 연결이 끊어져 버립니다. 즉, 업로딩 하려고 PC에서 리셋 신호를 주면 레오나르도 보드 연결이 끊어져 버리는거죠. 그래서 레오나르도 보드와 Micro 보드(레오나르도 보드의 축소형)는 업로딩시 우회적인 방법을 사용합니다.
먼저 레오나르도 보드의 리셋 버튼을 누르고 있는 상태에서 PC의 업로딩 과정을 시작합니다. [스케치 컴파일] 과정이 끝나고 [업로딩] 과정으로 바뀔 때 레오나르도 보드의 리셋 버튼에서 손을 뗍니다. 그러면 레오나르도 보드가 리셋되고 아두이노 개발환경에서는 새롭게 발견된 레오나르도 보드의 포트를 찾아 스케치를 올려줍니다.
레오나르도 보드의 Serial 통신
레오나르도 보드의 Serial 클래스는 USB로 PC와 가상 시리얼 드라이버로 연결되는데 사용합니다. 다른 말로 PC와의 USB 통신에 Serial 클래스가 사용되므로 Serial.print() 함수로 글자를 찍으면 PC 아두이노 개발환경의 시리얼 모니터에 보이는데… 이걸 Atmega32U4 칩 자체에서 구현하고 다른 보드처럼 D0, D1 핀을 사용하지 않는다는 겁니다. 즉 레오나르도 보드에서는 USB통신을 하기위해 Serial 클래스를 사용하더라도 D0, D1 핀이 남기 때문에 이 핀들을 다른 시리얼 통신 모듈과 연결해서 쓸 수 있습니다.
레오나르도 보드에서 남는 D0, D1 핀을 이용해 시리얼 통신을 할 때는 Serial1 클래스를 사용합니다. Uno, Nano 와 같은 Atmega328 계열 보드에서는 PC와 Serial 통신을 하려면 D0, D1 핀을 사용하므로 시리얼 통신을 사용하는 다른 모듈들, BT, WiFi, RF 모듈 등등을 SoftwareSerial로 연결합니다. 레오나르도 보드에서는 내장 클래스인 Serial1으로 사용할 수 있다는 것이 장점입니다. SoftwareSerial 보다 내장 Serial 클래스(하드웨어 시리얼)가 더 높은 통신 속도를 사용할 수 있고, 클래스에서 제공하는 함수도 더 많습니다.
그래서 레오나르도 보드의 중요한 장점 중 하나는 통신 모듈과 연결해서 사용하기 좋다는 점입니다.
시리얼 모니터 시작과 아두이노 리셋
아두이노 Uno, Nano 보드를 연결한 상태에서 아두이노 개발환경의 시리얼 모니터를 실행(직렬 포트 오픈)하면 아두이노가 자동으로 리셋됩니다. 하지만 아두이노 레오나르도 보드는 시리얼 모니터를 실행해도 리셋되지 않습니다. 레오나르도 보드가 리셋되면 연결이 재설정되기 때문입니다. 따라서 레오나르도 보드를 리셋 혹은 업로드 후에 아무리 빨리 시리얼 모니터를 실행해도 잽싸게 실행되는 setup() 함수 안에서 발생한 메시지는 보기 어렵습니다. 그래서 아래와 같은 코드를 이용해 시리얼 모니터(직렬 포트)가 열려 있는지 확인하고, 열려 있을 때만 실행하게 만들곤 합니다.