知之者 不如好之者, 好之者 不如樂之者

기계처럼 살지 말고, 즐기는 인간이 되자

Project/ROS2 + CV + Robot (2023.12~2024.02)

MKS 42C 드라이버를 이용한 Step Motor 제어와 Gripper 작동 시키기

코방코 2024. 1. 4. 22:45
728x90

 

Ali Express에서 저가로 구매 가능한 Nema17 스텝 모터 드라이버인 MKS 42C 와 Gripper를 이용하여 

Serial 통신을 이용하여 Python3 코드로 간단하게 그립 동작을 구현하여 보았습니다.

 

 

MKS SERVO42C Closed loop Stepper Motor Manual(3) Serial communication

MKS SERVO42C, an upgraded version of MKS SERVO42B, built-in Field-Oriented control algorithm, position/speed/ torque closed-loop, 4 Half bridge driver with 8 MOSFET, it makes the motor quieter, l...

github.com

위 드라이브 제작사 원본 Github 설명을 참조하여 수행하였습니다.

 

MKS 42C Stepper Motor 의 회전 방법에 대해 설명하겠습니다.

먼저 모터에 드라이버를 장착시킵니다.

만약 드라이버와 모터 중심 축 사이에 동봉된 자석이 들어갈 공간이 있다면 해당 공간에 자석을 부착해줍니다.

그러지 않으면 Magnet Loss 라는 에러가 발생합니다.

Magnet Loss 라는 에러가 발생하지 않아도 자석과 드라이버 간의 거리,

자석의 수평 상태 등에 드라이버가 민감하게 반응하니 주의하셔야 합니다.

뭐가 문제인지 몰라서 꽤 고생했습니다.

 

모터를 장착시키고 선을 연결합니다.

드라이버의 Tx와 Rx 가 반대로 되어있습니다.

 

이 점 고려하여 컴퓨터 USB 포트에 시리얼 단자를 연결하고,

GND, RX, TX만 적절하게 연결해줍니다.

모터드라이버는 전원 선만 12V~24V, 4A 이하로 공급되면 됩니다.

물론 동봉된 드라이버와 모터를 연결하는 선을 위쪽 4개 단자에 연결해야 합니다.

 

이제 모터에서 Cal 을 한번 선택해줍니다.

모터의 Calibration 과정이 수행됩니다.

스텝 모터에서 calibration 을 수행하는 이유는 다음과 같습니다:

1. 정확도 향상 : calibration 은 모터의 정밀도를 향상시키고, 예상치 못한 동작을 최소화합니다. 

이를 통해 모터가 정확한 위치로 이동하고, 정확한 속도로 회전하도록 보장합니다.


2. 시스템 오류 보정 : 모든 기계적 시스템에는 약간의 오차가 있습니다. calibration 을 통해 이러한 오차를 파악하고 보정할 수 있습니다. 예를 들어, 기어의 마모, 축의 휨, 또는 스텝 손실과 같은 요소들을 조정할 수 있습니다.

 

그리고 Mode를 선택하여 CR_UART 를 선택합니다.

UART_baud 에서 38400을 선택합니다.

UART_Addr 에서 0xe0 을 선택합니다.

MotType 을 1.8도로 선택합니다.

Mstep을 16으로 선택합니다.

 

이제 github에서 소프트웨어를 다운로드해 시리얼로 작동시키는 법을 설명하겠습니다.

https://github.com/makerbase-mks/MKS-SERVO42C/tree/MKS-SERVO42C-V1.1/MKS SERVO42C CONTROL TOOL/MKS SERVO42C CONTROL TOOL V1.1

이 경로에서 소프트웨어를 설치합니다.

실행하면 다음과 같은 화면이 나타납니다.

 

먼저 Port 를 scan합니다.

나타나는 COM을 선택하고 Baudrate를 38400, Address 를 0xe0으로 맞춥니다.

Read Parameter에서 Hex를 선택하고 아래 버튼들을 눌러 정상적으로 시리얼 데이터 수신이 되는지 확인합니다.

 

만약 정상적으로 수신이 된다면 이제 Motor Control 영역에서 Enable Driver를 선택하고,

Forward 또는 Reverse를 선택한 뒤 숫자를 입력하여 start를 눌렀을 때 모터가 돌아가는지 확인합니다.

stop 또는 Disable을 눌러 멈출 수 있습니다.

 

이제 serial 을 직접 보내 통신하는 소프트웨어를 사용해보겠습니다.

MKS-SERVO42C/01_Makerbase SERVO42C Related documents/MKS SERVO42C Closed-loop stepper motor data.zip at main · makerbase-mks/MKS-SERVO42C · GitHub

위 경로에서 다운받으실 수 있습니다.

 

모터 제작사 회사에서 serial 통신에 필요한 여러 시리얼을 확인할 수 있습니다.

 

Serial communication description

MKS SERVO42C, an upgraded version of MKS SERVO42B, built-in Field-Oriented control algorithm, position/speed/ torque closed-loop, 4 Half bridge driver with 8 MOSFET, it makes the motor quieter, l...

github.com

 

저는 간단하게 회전과 정지를 수행해보았습니다.

정상적으로 명령이 보내지면 초록색으로 RX data가 수신됩니다.

만약 보내지지 않으면, 포트 설정, 하드웨어 연결 문제, 드라이버 문제 등 여러 문제를 검토하셔야 합니다.

 

E0 F6 10 E6

 

각 16진수를 설명하면, E0 주소에 대해 ID = F6 동작을 수행,

10 = 16 만큼 시계방향으로 (16진수 10 → 2진수일 때 최상위 비트가 0) 회전시킨다는 의미입니다.

마지막 E6은 모든 16진수를 더하고 256으로 나눈 나머지에 대해 검사를 위한 비트로 남겨두는 것입니다.

 

이는 Checksum-8 알고리즘을 기반으로 하는데,

Checksum-8 알고리즘은 데이터의 무결성을 확인하기 위해 사용되는 간단한 방법입니다.

이 방법은 데이터를 바이트 단위로 처리하고,

각 바이트의 값을 더한 다음 결과값을 256으로 나누어 나머지를 취합니다.

여기서 나머지는 checkSum 값이 되며, 이는 8비트(1바이트)로 표현됩니다.

이 checkSum 값은 원래 데이터에 추가되어 전송되며, 수신 측에서 데이터의 무결성을 확인하는 데 사용됩니다.

'Checksum-8' 알고리즘을 사용하여 'e0 f6 10'에 대한 checkSum을 계산하는 과정은 다음과 같습니다:

  1. 각 16진수 값을 10진수로 변환합니다.
    • 'e0' -> 224
    • 'f6' -> 246
    • '10' -> 16
  2. 이 값을 모두 더합니다.
    • 224 + 246 + 16 = 486
  3. 더한 값을 256으로 나누고 나머지를 구합니다 (checkSum 값).
    • 486 % 256 = 230
  4. 이 나머지를 다시 16진수로 변환합니다.
    • 230 -> 'e6'

따라서, checkSum 값은 'e6'이며, 이 값은 원래 데이터 시퀀스에 추가되어 'e0 f6 10 e6'이 됩니다.

이 checkSum 값은 데이터가 전송 과정에서 변경되지 않았음을 확인하는 데 사용됩니다.

수신 측에서는 동일한 checkSum 계산을 수행하여 수신된 데이터의 checkSum 값과 비교합니다.

만약 값이 일치하면 데이터가 정상적으로 전송된 것으로 간주합니다.

 

하지만 이렇게 나타난 E6는 checkSum 바이트이기 때문에 각 명령마다 계산해주기가 어렵습니다.

 

따라서 Auto Append Bytes 옵션을 선택하고

CHECKSUM-8 알고리즘을 선택합니다.

 

그러면 이제 E0 F6 10 까지만 입력해도 회전이 수행되는 것을 확인할 수 있습니다.

반시계 방향으로는 E0 F6 80 부터 반대 방향으로 회전이 발생하게 됩니다.

(최상위 비트가 1이기 때문)

 

동일한 방법으로 E0 F7 을 입력하면 회전이 멈추게 됩니다.

f6 명령을 통해서는 회전이 계속 영구적으로 발생합니다.

 

필요한 각도 만큼을 정해진 속도로 회전하면 좋겠다면 아래와 같이 명령을 보냅니다.

 

예시는 다음과 같습니다.

e0 fd 01 00 00 0c 80 + checksum byte = the motor rotates forward 360 °in speed 1.

e0 fd 86 00 00 0c 80 + checksum byte = the motor rotates reverses 360 °in speed 6.

0c 80 이 360도를 의미하고 (MotType 1.8도Mstep 16 기준)

16진수 값이 커질수록 더 큰 각도를 돌게됩니다.

 

 

이를 이용하여 python 코드를 작성하였습니다.

회전 속도를 -127~127 범위에서 입력합니다. 음수와 양수로 나눈 이유는 회전 방향 때문입니다.

그리고 회전 각도를 양수로 ˚ 단위로 입력합니다.

주석에 설명을 최대한 자세히 적었으니 참조하시기 바랍니다.

 

 

그 외 다양한 시리얼 명령은 위에서 첨부드린 원본 Github를 참조하시기 바랍니다.

 

 

이를 이용해서 간단하게 Gripper를 열고 닫는 코드를 작성해보았습니다.

 

작동 영상입니다.

 

 

728x90
반응형