본문 바로가기
  • 다음에는 무엇을 해볼까 | 공대생의 취미 전시
Information | 잡학다식 정보

MDH250과 MD400T를 이용한 BLDC 모터 제어 | 이륜, 사륜 제어 순서 및 방법 알아보기

by 이예승539 2025. 7. 28.

졸업 논문으로 제작한 자율주행 로버. 하드웨어 담당으로 진행했다

 

 나는 25년도 1학기 졸업 논문으로 LIDAR를 이용한 자율주행 로버를 제작했고, 하드웨어 담당으로 로봇을 제작하였다. 솔리드웍스로 알루미늄 프레임 가공, 외장 아크릴 제작부터 바퀴 마운트 제작과 차량 배선을 하였고, 그 중 제일 중요한 MD로봇 사의 BLDC 모터와 모터 드라이버를 이용해 2륜 및 4륜 제어를 적어보고자 한다. 처음 프로젝트를 실행할 때 모터 제어법에 대해 내용이 너무 중구난방이며 정리되지 않아 몇 달 간 고생했는데, 이번에 싹 정리하면서 초보자 및 기업 하드웨어 개발 인원이 모터 제어에 쉽게 접근할 수 있으면 좋겠다.


왜 MD로봇인가?

 ※ 이 글은 MD로봇에게 전혀 금전적 지원을 받지 않았다. 하지만 준다면 감사히 받겠다.

 나는 로봇 제작을 위해 여러 모터와 드라이버를 찾아보았고, 처음 프로토타입은 호버보드 모터드라이버였다. 팀의 사비로 로봇을 제작하는 거라 저가의 모터를 찾았고, 주위에서 찾으면 나올 것 같은 드라이버로 선정했다. 다만 호버보드 모터는 저속에서 약하고, 드라이버는 단순한 PWM 제어로 진행되어 말 그래도 주행만 가능한 하드웨어들이다. 우리는 주행을 통해 엔코더 정보도 얻고, 이를 기반으로 3D 맵 상 위치도 알아야 하는데 이런 모터로는 불가능할 것이라 생각했다. 

좌측이 6.5인치 모터, 우측이 BLC-160 드라이버이다

 

 모터는 인휠모터로 UVW선과 홀 센서를 지원한다. 모터 드라이버는 단순 가변 저항으로 속도를 제어하는 방식으로, UVW, 전원, 가변 저항 선만 있으면 주행이 가능하다. 이런 모터와 드라이버가 나쁘다는 것은 아니며, 우리의 프로젝트 방향과 맞지 않아 사용하지 않았다. 다만 단순히 카트를 만들거나, 다이얼을 돌려 모터가 굴러가게만 만들거라면 이런 하드웨어를 사용해도 된다. 제일 싸고 간단하게 만들 것이다. 마운트도 파니 이를 이용해 원하는 곳에 부착하면 된다.

 인터넷에 이 하드웨어로 프로젝트를 한 것도 많다. 원격 조종 외부 로버 제작 프로젝트, 호버보드 모터 제어법 등 해외에선 라즈베리파이와 함께 잘 쓰는 것 같다.

 

 따라서 나는 정밀 제어를 위해 모터와 드라이버를 업그레이드 했다. 모터는 peipeiscooter사의 phub-11hs이며, 모터 드라이버는 ODrive사의 ODrive v3.6를 선정했다. 이 조합은 구글링 과정에서 발견한 슈퍼 메가 울트라봇 프로젝트에서 사용했던 조합이다. 

혼자서 만드신 로버. 개고수다

 

 이 조합의 좋은 점은 컴퓨터와의 통신에 필요한 센서가 있다는 점이다. 모터에는 엔코더가 있어 위치 정보를 확인할 수 있고, Odrive에는 CAN 통신으로 제어가 지원되기 때문에 위의 프로젝트처럼 실시간성 제어가 가능하다. 또한 모터는 감속기가 있어 저속에서도 높은 토크가 가능하고, Odrive는 해외 포럼에서도 많이 쓰는 인증된 드라이버라 자료만 잘 찾아보면 제어할 수 있을 것이다. 또한 가격도 싸다.

 

 하지만 이 조합도 폐기되었다. 이 조합이 사용되지 않은 이유는, 부품을 모두 해외 주문으로만 구매할 수 있기 때문이다. 나는 이번 졸업 논문을 학부 연구생과 같이 진행했는데 랩실에서 부품 지원을 해주신다고 하셨기에 국내 기업으로 찾을 수 밖에 없었다, 결국 인터넷의 여러 드라이버와 모터를 찾은 결과 MD로봇의 부품을 선택하였다. 국내 드라이버 회사 중에선 MD로봇이 데이터시트도 정리가 잘 되어있고 사용된 여러 프로젝트를 찾았기 때문이다. (MD200T, MDH100을 RS485로 구동 프로젝트)

 

MD로봇의 MDH250 인휠모터와 MD400T를 사용하였다.

 

 나는 이전의 모터를 검색하면서, 우리 로봇이 저속 주행으로 제어될 것 같아 감속기가 있고, 로버의 크기를 고려해 제일 사이즈가 큰 MDH250 인휠 모터를 선택했다. 또한 초기 설계는 4륜 주행을 생각해서 두 개의 채널 제어가 되는 MD400T를 골랐다. 따라서 랩실 지원으로 MDH250 4개와 MD400T 2개를 지원받았다.

 ※ 추후 제어를 시도해보면서 문의한 결과, MDH250에는 감속기가 없다는 것을 알았다. 회사 잘못으로 데이터시트엔 없지만 사이트 설명란에는 적어놓은 것이었다... 약간 당황했지만 우리 로버의 하중이 많이 무겁지 않아 단순 모터의 힘으로 잘 굴러갔다. 감속기가 있는 모델은 MDH300이니 꼭 참고하도록 하자.

 

MDH250은 감속기가 없으니 꼭 참고하자. 아마도 MDH300의 설명을 실수로 복붙한 것 같다.


하드웨어 배선

 모터와 모터 드라이버의 배선은 많이 어렵지 않으나, 드라이버와 컴퓨터와의 연결이 문제다. 천천히 해보자.

 기본적으로 모터에는 3상 전력 UVW, 홀 센서 쪽 Hv, Hw, Hu와 엔코더 A, B, 전원 5V, GND로 총 10개의 선이 있다. 이 중 3상은 굵은 선, 나머지 7개의 신호선은 얇은 선으로 되어있고 색깔 별로 되어있어 구분하기 쉽다. 모터 드라이버에는 홀 센서 Hv, Hw, Hu, 5V, GND 5개와 엔코더 A, B, Z, 5V, GND가 존재한다. 우리는 이를 알맞게 배선해줘야 한다.

 주의할 점은 세 가지이다.

  1. 모터 드라이버 쪽에는 센서별로 커넥터가 있어 홀 센서에도 전원부가, 엔코더에도 전원부가 있다. 나는 이 두 전원부를 같이 이은 뒤 모터와 연결했다.
  2. 모터 드라이버의 엔코더에 Z핀이 있긴 하지만 MDH250에는 Z가 없다. 이는 연결하지 않아도 된다.
  3. 모터 선 중 Brown, Grey 선은는 NC(No Connection)이니 안 쓴다.

색이 달라도 선의 두께가 달라 충분히 구분할 수 있다.

 

 배선은 모터 드라이버와 같이 오는 커넥터를 사용하여 배선하면 쉽다. 착하게도 커넥터와 전선을 다 배선해서 주기 때문에 우리는 단순히 신호선을 올바르게 연결하고 수축튜브 및 납땜을 진행하면 된다. 여기서 U, V, W는 커넥터가 따로 없기 때문에 총알 단자와 같은 커넥터를 이용해 연결하는 것을 추천한다. 섣불리 납땜해버리면 추후 모터 마운트에 설치할 때 곤란해진다.

갖고 있던 총알 단자보다 전선이 두꺼워 어거지로 끼워서 사용했다

 

 우리가 사용하는 드라이버는 2채널이므로 위의 모터와 드라이버 간의 연결을 한번 더 하면 된다. MOT1, HALL1, ENC1에 모터 하나씩 총 2번 연결하면 된다.

 

 모터 드라이버와 모터 2개를 연결하고 커넥터를 연결했으면 통신을 위해 연결을 해야 한다. 다른 방법도 있겠지만 나는 RS485 통신을 사용하였고 이를 위해선 RS485 to USB Converter를 구매해야 한다. 

처음 시도해보면 브레드보드로 간단하게 연결하는 것도 좋다.
컨버터와 RJ45 커넥터 간의 통신은 위와 같이 하면 된다
RS485로 2개의 데이터선과 4개의 RX, TX 통신을 위해선 이렇게 연결해야 된다.

 

 통신용 커넥터는 MD400T의 RJ45 포트에 다 있다. 랜선 포트인 이 곳에 통신 포트들이 커넥터로 묶여 연결되어 있는데, 485+, 485-에는 GND가 같이 있지 않아 데이터시트를 읽어 GND와도 연결해야 된다. 

 위와 같이 모터 - 드라이버 배선과 드라이버 - RS485 Converter 간의 배선을 마치면 통신을 할 준비가 된다.

 

※ 25/9/28. (수정) 내가 사용하는 컨버터가 RS422와 RS485를 호환해서 핀이 5개가 있는데, RS485는 (GND 제외) 2개, RS422는 4개를 사용한다. 즉 위의 R-, R+, T-, T+ 중 2개는 RS485를 사용할 때 필요 없다는 것이다. 테스트 결과 T+ → 485+, T- → 485-에 연결해도 통신이 될 것이다.


MD400T 펌웨어 업데이트

 우리가 했던 배선이 잘 맞는 지 확인하기 위해선 MD로봇에서 제공하는 MDAS 프로그램을 이용해 테스트를 해봐야 한다. 하지만 이전에 우리는 MD400T의 펌웨어를 업데이트해야 한다. 이는 데이터시트에서도 확인할 수 있지만, 이를 따라하는 사람이 내 사이트를 보고 한번에 할 수 있도록 하는 게 목적이기 때문에 처음부터 설명해보겠다.

 모터 드라이버를 부트로더 모드로 진입시키기 위해선 몇 가지 단계를 거쳐야 한다.

  1.  MD400T에 있는 딥스위치 1~4를 모두 ON으로 설정한 뒤 모터1의 ENC1, 모터 2의 ENC2 커넥터를 해지한다.
  2. 모터 드라이버에 있는 DC 선으로 전원을 인가한다. 나는 전원을 48V를 MEANWELL의 SMPS로 인가했다. 부트로더 모드로 정상적으로 들어갔다면 버저가 울림과 동시에 드라이버에 있는 적색 LED가 5Hz(1초에 5번) 정도로 빠르게 깜박인다.
    MEALWELL의 48V SMPS에 220VAC를 연결해 전원을 인가했다. 귀찮아서 커넥터를 연결하지 않았지만 저러면 안된다
  3. 이후 MD로봇 사이트 > 배너의 Tech Support > 부트로더를 통한 프로그램 업그레이드 방법을 눌러 PC_loader.zip 파일과 mdtV72.hex 파일을 다운받는다. 권한이 만료되었다는 에러가 발생하면 네이버 로그인을 한 후에 다운로드 하자.
  4. 자신 컴퓨터에 연결된 Com Port을 확인해서 설정하고, Baud Rate은 초기값인 115200으로 설정한다. 자신의 COM이 뭔지 모른다면 링크를 참고해서 알아보자. 이후 Connect를 눌러 연결한다.
    COM 설정 이후 Connect를 눌러 연결하자. 위와 같은 그림이면 연결 성공이다
  5. Load Hex File을 눌러 우리 MD400T에 맞는 Hex 파일인 mdtV72를 선택하고, Erase-Program-Verify를 눌러 펌웨어 업데이트를 진행한다.
    Load Hex File 이후 Erase-Program-Verify를 눌러 펌웨어 업데이트를 진행하자. 1~2분 정도 소요된다
  6. Verification Successfull이란 문구가 뜨면 꼭! Run Application을 눌러 펌웨어를 실행시킨 후 프로그램을 종료해야 한다. 이를 누르지 않으면 전원을 다시 넣으면 부트모드로 재진입한다. 이런 중요한 내용이 부트 로더 매뉴얼에는 없고 드라이버 메뉴얼에만 있다.
    이것 때문에 하루는 날렸다

 

 위의 과정을 거쳐 펌웨어 업데이트를 했다면, 다시 엔코더 센서를 드라이버에 둘 다 꽂아준 뒤 모터 드라이버 전원을 넣어준다. 지금까지 잘 따라왔으면 녹색 LED가 1Hz(1초에 한번씩)로 점등할 것이다.


MDAS 통신법

 배선도 했고, 펌웨어 업데이트도 했으니 실제 모터를 구동시켜볼 시간이다. 완벽한 배선 상황에 모터 드라이버에 전원을 넣어 녹색 LED가 1Hz로 점등하는 단계에서 시작한다.

  RS485 to USB 컨버터를 컴퓨터에 연결한 뒤 MDAS를 실행시킨다. 우측 상단의 Ports에 자신의 COM 번호를 맞춰주고 Baudrate는 초기값인 19200을 유지한다. 이후 Connect를 누르면 되는데 에러가 발생하지 않으면 성공이다. 통신이 잘 되는 지 확인하고 싶다면 Main Data Req. 버튼을 눌러 드라이버의 데이터를 받아올 수 있다. 중앙에 여러 숫자들이 나열되면 성공이다. (드라이버 동작 시 사용했던 컴퓨터를 사용하지 않아 그림은 이 사이트에서 가져왔다)

Main Data Req를 통해 모터 드라이버에 있는 데이터를 갖고오면 성공이다

 

 아래의 Dual Motor Control를 눌러 모터 속도 제어 콘솔로 넘어간 뒤, 맨 아래의 숫자 입력란에 원하는 RPM을 적어 동작시킨다. (+)와 (-)는 방향 차이니 테스트론 아무거나 눌러도 된다. 또한 All Brake는 내부를 단락시켜 갑작스럽게 멈추고, All TqOff는 토크를 없애 부드럽게 멈추니 마운트의 고정에 따라 선택해서 멈추자.

버튼을 눌러 원하는 RPM으로 제어가 가능하다

 

 근데 단순시 Run(+)을 눌러 동작시켰는데, 5초 정도 뒤에 에러가 발생해 버저음이 울리면서 모터 동작이 멈출 것이다. LED의 점멸 횟수로 원인을 알 수 있기에 적색 LED를 확인하면 점등 없이 쭉 켜져있을 것이다. 이 에러는 홀 센서 에러 또는 모터 역방향 속도 감지 에러이며 나는 이를 해결하려고 약 3~4주를 고생했다. 데이터시트에도 없고, 뭐가 문제인지도 몰랐다. MD로봇 사에 문의해보니 확실한 답도 못 얻어서 결국 온갖 부분을 건드려 알게 되었다.

 

 이 에러를 끄기 위해선 모터 주행 전 모터의 정보를 드라이버에 넣어야 한다. 즉 변수를 변경해줘야 되는 것이다. 이를 하지 않으면 모터에서 받는 센서 정보가 정상임에도 에러로 판단하고 주행을 시작할때마다 자꾸 멈추는 것이다. 변수를 바꾸는 방법은 다음과 같다. 좌측의 Read/Write Parameter에서 Data Request를 누른다. 그러면 모터 드라이버 펌웨어에 저장되어있는 변수가 아래 Read Data에 나온다. (데이터의 정보와 어떤 의미가 있는 지 궁금하면 그 위의 설명을 읽자) 이를 이용해 먼저 BAUD_RATE와 USE_ LIMIT_SW를 각각 57600과 0으로 설정하자. Baudrate는 아래의 드롭박스를 이용해 57600을 넣고, USE_LIMIT_SW는 Write Datad에 0을 각각 넣은 뒤 Send Write Data를 누르면 된다.

 

BaudRate 통신 속도를 바꾸고, 안전 리미트스위치 기능을 해제하였다

 

 이후 우리가 사용하는 모터의 정보를 넣어줘야 한다. 우측 중간의 메뉴들 중 Select Motor 선택한 뒤 Select Motor Type 아래 드롭박스를 눌러 MDH250을 선택한다. 만약 리스트에 없는 모터를 사용하거나 Motor Type을 모른다면 모터의 정보를 위에서 변수를 넣던 것처럼 일일이 넣어줘야 한다. 모터 극수, 속도 등의 정보를 넣어야 한다.

우리는 MDH250을 모터를 사용한다

 

  만약 다른 드라이버에도 우리가 설정한 변수를 똑같이 넣고 싶다면, 가운데 있는 Read/W Param 버튼을 눌러 전체 변수를 읽거나 파일을 다운받을 수 있다. 변수를 읽어오려면 Read Param > Save File로 .param 형식의 파일로 저장하며 저장한 .param 형식 파일을 저장하려면 Open File > .param 파일 선택 > Write Param을 눌러 작성하자.

.param으로 쉽게 변수를 쓰고 읽을 수 있다.

 

 위와 같은 과정을 거치면 이제 에러음이 없이 모터는 잘 굴러갈 것이다.


4륜 제어법

 위를 통해 2륜 제어는 가능하다. 나는 이를 넘어 2륜 제어 2개를 합쳐 4륜 제어를 하고자 했다. 물론 드라이버 시스템 상 잘 안됐긴 하지만, 동작은 잘 한다. 어떻게 하는 지 천천히 얘기하며 문제점을 알려주겠다.

 4륜 제어를 하기 위해선 기존의 모터 2개 + 드라이버 1개의 시스템 2개를 CAN으로 이어야 한다. 드라이버 RJ45에 있는 CAN_H, CAN_L를 같이 연결해야 한다.

RJ45 포트에 있는 CAN_H, CAN_L로 드라이버 간 CAN 통신을 구현한다

 

 따라서 블럭 다이어그램으로 설명하면 컴퓨터 --[RS485]-- MD400T(Master) --[CAN]-- MD400T(Slave)로 연결되는 것이다. 이때 컴퓨터와 직접 연결된 드라이버는 Master가 되고, CAN으로 연결된 다른 드라이버가 Slave가 된다.

 하지만 배선만 이렇게 해주면 바로 되는 게 아니다, 우리는 CAN을 연결하기 전 두 개의 드라이버의 ID와 Sync_type 변수를 다시 설정해줘야 한다. 컴퓨터와 바로 연결된 드라이버에는 ID를 1로, SYNC_TYPE을 9로 설정하고 나머지 드라이버에는 ID를 2로, SYNC_TYPE을 0으로 설정한다. 주의할 점은 ID를 바꾸면 이후 통신 연결 시 ID 값을 바꾸는 것을 잊지 말아야 한다.

 

SYNC_TYPE과 ID 값만 바꾸면 된다. 이후 연결을 끊고 다시 통신할 때 ID를 바꾸는 걸 잊지 말자!

 

 이렇게 연결하면 이후 MDAS로 모터를 구동시킬 때 MOT1에 Master 드라이버가, MOT2에 Slave 드라이버가 설정되어 같은 속도로 모터를 회전시킨다.

 

 다만, 이 4륜 주행은 우리의 자율 주행에는 사용하지 못했는데 두 드라이버의 제어 방식이 달라 4륜 주행 시 로봇이 미끌어졌기 때문이다. 심지어 Master에 연결된 모터를 움직이면 Slave 드라이버에 연결된 모터가 자동으로 돌아갔다.MD로봇에 이를 문의했을 때 아래와 같은 답을 받았다.

 

 Q. Master 모터를 손으로 회전시켰을 때 Slave 모터가 자동으로 돌아갔다. 이게 맞는 동작인가?

 A. 맞는 동작이다. CAN 통신으로 두 모터 드라이버를 연결시키면 Master는 Closed Loop, Slave는 Open Loop로 바퀴의 RPM을 제어하도록 설계되었다. 이는 4륜 제어 시 스키드 조향을 사용하면 바퀴가 미끌리게 되는데, 이때 의도적으로 바퀴가 미끌리지 않도록 둘 다 Closed Loop로 제어하면 모터 드라이버의 과부하로 터질 것이다.

 Q. 그럼 미끌리지 않는 4륜 주행은 어떻게 하면 되나?

 A. 두 드라이버끼리 연결하지 않고 RS485 컨버터를 또 이용해 컴퓨터와 두 개의 RS485 통신을 이용해라. 아니면 MD로봇에서 제작한 로봇 플랫폼을 이용하면 된다.

 

 우리는 모터 드라이버에서 받은 정보들 중에서 엔코더를 이용해 3D 맵 상 오도메트리를 계산했다. 하지만 바퀴가 미끌리면서 로봇의 진행 방향을 알려주던 엔코더 정보는 더 이상 정확하지 않게 되며 센서 퓨징 및 자율 주행이 불가능했다. 따라서 우리는 결국 2륜 MD 로봇과 캐스터 휠을 사용해 자율 주행 로봇을 제작했다.


ROS를 이용한 드라이버 제어

 내가 하드웨어 담당이라 ROS 및 우분투 등에 관한 내용은 거의 전무하다. MD 로봇에서 제공한 ROS 패키지에서 똑같이 COM 포트, 모터에 관한 변수만 변경한 뒤 연결하면 된다고 들었다. 참고가 안 돼서 미안하다.


추가. MDH250 모터 마운트

 모터 마운트를 3030 알루미늄 프레임에 M7 볼트로 부착하기 위해서 내가 솔리드웍스 2020으로 마운트를 만들었다. 모터의 나사산으로 쉽게 체결이 가능하니 편하게 사용하기 바란다. 배선하기 전에 끼워 놓는 게 추후 귀찮지 않을 것이다.

MDH250용 마운트. 움푹 파인 곳이 바깥쪽으로 가게 설치하자.
MDH250_Mount.SLDPRT
0.09MB
MDH250_Mount.STL
0.02MB


 마무리

 MD로봇의 드라이버는 한국어 데이터시트도 있고, 아날로그용 커넥터와 엔코더가 있는 다른 모터들이 호환된다는 점에서 다 좋았지만 설명서에 동작에 관한 부분이 부실하다는 점에서 아쉬웠다. 동작을 위해서 어떤 식으로 배선하고, 업데이트하고 변수를 설정하는 지 회사 측에서 처음부터 차근차근 알려준다면 더 많은 사용자들이 MD로봇의 편리함을 알고 이용할 것이라 생각된다.

 그래도 국내에서 랩실이나 대학생이 사용해보기에는 좋다고 생각한다. Odrive는 데이터시트 수십 장을 영어로 읽어야 하는 것에 비해, AS 및 문의 전화도 쉽게 걸 수 있는 환경이기에 처음으로 대형 프로젝트를 진행한다면 추천해볼만 하다고 생각한다. 비싼 값은 충분히 하는 것 같다고 생각한다.