Hermit Under the Cliff

[Arduino] 아두이노 코딩봇 만들기 (5) - 아두이노로 CM-50 제어하기 본문

Personal Projects/아두이노 코딩봇

[Arduino] 아두이노 코딩봇 만들기 (5) - 아두이노로 CM-50 제어하기

AnonymousDeveloper 2022. 2. 21. 15:52

지난번 포스트에서는 아두이노를 USB to Serial 보드로 활용하여

이미 제공되고 있는 소프트웨어를 이용해서 CM-50을 제어를 해 보았습니다.

저의 목적은 아두이노를 통해서 CM-50을 컨트롤을 하고,

이를 다시 블록코딩을 통해서 간단한 코딩봇을 만드는 것 입니다.

그러기 위해서는 PC의 소프트웨어가 아니라

아두이노에서 직접 CM-50을 컨트롤 할 수 있어야 합니다.

 

이에 앞서 간단한 구조를 정합니다.

제가 쓰기로 결정한 블록코딩 툴인 Mblock은 물론이고 다른 블록코딩 툴 대부분이

아두이노와 시리얼 통신으로 명령어를 전달 합니다.

이 말은 아두이노의 시리얼 포트는 이미 사용이 된다고 가정을 해야 하기 때문에

기본 시리얼 포트를 사용할 수 없다고 봐야 합니다.

제가 쓰는 아두이노 Uno 보드는 시리얼 포트가 하나만 존재하기 때문에

이 포트는 블록코딩 툴과 통신으로 사용해야 하고

CM-50과 통신을 해야하는 포트는 따로 설정을 해야 합니다.

 

다행히 아두이노에서는 다른 I/O 핀들을 시리얼 포트로 사용할 수 있게 만드는

SoftwareSerial 라이브러리가 존재 합니다.

이를 이용해서 CM-50과 통신을 하면 됩니다.

간단하게 아래와 같이 구성을 합니다.

 

가장 먼저 확인 해볼 것은 아두이노의 Software serial을 통해서 CM-50을 제어할 수 있는지 입니다.

위와 같이 연결해 준 뒤 간단한 코드를 작성해서 테스트 해봅니다.

#include "SoftwareSerial.h"
SoftwareSerial mySerial(2,3);

// 파란색 LED를 켜기위한 Instruction Packet (80번 주소에 1을 쓰기)
byte blueledOn[] = {0xFF, 0xFF, 0xFD, 0x00, 0xC8,  0x06, 0x00, 0x03,      0x50, 0x00, 0x01, 0x08, 0x22};
//                 |       Header         |ID(200)|  Length  |Write(0x03)|Addr|    value |    CRC    |

// 파란색 LED를 끄기 위한 Instrunction Packet (80번 주소에 0을 쓰기)
byte blueledOff[] = {0xFF, 0xFF, 0xFD, 0x00, 0xC8,  0x06, 0x00, 0x03,      0x50, 0x00, 0x00, 0x0D, 0xA2};
//                 |       Header         |ID(200)|  Length  |Write(0x03)| Addr|   value   |    CRC    |


void setup() {
  mySerial.begin(57600); // 57600 baud rate로 CM-50과 시리얼 통신 시작
}

void loop() {
  mySerial.write(blueledOn, sizeof(blueledOn));
  delay(2000);
  mySerial.write(blueledOff, sizeof(blueledOff));
  delay(2000);
}

위에 정적으로 선언해 놓은 blueledOn / blueledOff의 byte array는

앞 포스트에서 소개했던 다이나믹셀 위자드의 패킷 메뉴에서 가져온 값 입니다.

자동으로 CRC 값이 계산이 되어서 동작을 확인 하는데에는 아주 편합니다.

 

위 코드를 아두이노에 업로드해서 테스트를 해보면

정상적으로 파란색 LED가 2초 간격으로 꺼졌다 켜졌다 하는 것을 확인 할 수 있습니다.

 

간단하게 코드를 작성하려면 위 예제 처럼 다이나믹셀 위자드에서 패킷을 확인한 다음

원하는 명령어에 대해서 미리 instruction packet의 byte array 들을 선언해 놓고 사용을 해도 됩니다.

하지만 코드를 깔끔하고 또한 가변적으로 속도 등의 값을 조정할 수 있으려면

패킷을 직접 만들어 쓰는게 좋은 선택일 것 같습니다.

 

여러번 말하지만 근본 회사인 로보티즈는 아두이노에 대한 다이나믹셀 라이브러리를 제공합니다.

Dynamixel2Arduino 라는 라이브러리인데, 소스코드는 아래 GitHub에서 관리하고 있습니다.

https://github.com/ROBOTIS-GIT/Dynamixel2Arduino

 

GitHub - ROBOTIS-GIT/Dynamixel2Arduino: DYNAMIXEL protocol library for Arduino

DYNAMIXEL protocol library for Arduino. Contribute to ROBOTIS-GIT/Dynamixel2Arduino development by creating an account on GitHub.

github.com

 

이 녀석을 바로 사용할 수 있으면 좋겠지만 두 가지 큰 문제가 있습니다.

  • CM-50에 대한 모델이 라이브러리에 정의되지 않아 바로 사용이 힘들다.
  • 다이나믹셀과 통신을 하기 위해 SW Serial이 지원되지 않는다.

앞서 알아본바, 다이나믹셀과 마찬가지로 CM-50 역시 Dynamixel protocol 2.0을 사용하고 있으니

위 소스에서 아래 protocol 부분만 가져와서 사용하면 될 듯 합니다.

 

다음번 포스트에서는 이제까지 알아보고 확인해본 내용을 바탕으로

블록코딩에서 사용될 아두이노의 펌웨어를 만들어 보도록 하겠습니다.

Comments