Primeiros Passos com os Motores MyActuator X Series
Este artigo apresentará como começar a usar os motores da série MyActuator e como utilizá-los com C++ e Python no reComputer Mini Jetson Orin.

Especificações
Aqui está a tabela completa com todos os parâmetros preenchidos para todos os modelos de motor:
| Parâmetro | X2-7 | X4-10 | X4-36 | X8-120 | X12-320 | X15-450 |
|---|---|---|---|---|---|---|
| Relação de Engrenagem | 28.17 | 12.6 | 36 | 19.61 | 20 | 20.25 |
| Tensão de Entrada (V) | 24 | 24 | 24 | 48 | 48 | 72 |
| Velocidade em Vazio (RPM) | 178 | 317 | 111 | 158 | 125 | 108 |
| Corrente de Entrada em Vazio (A) | 1 | 1 | 0.9 | 1.6 | 2.7 | 3.5 |
| Velocidade Nominal (RPM) | 142 | 238 | 83 | 127 | 100 | 98 |
| Torque Nominal (N.m) | 2.5 | 4 | 10.5 | 43 | 85 | 145 |
| Potência de Saída Nominal (W) | 37 | 100 | 100 | 574 | 900 | 1480 |
| Corrente de Fase Nominal A(rms) | 3 | 7.8 | 6.1 | 17.6 | 30 | 25 |
| Torque de Pico (N.m) | 7 | 10 | 34 | 120 | 320 | 450 |
| Corrente de Fase de Pico A(rms) | 8.1 | 19.5 | 21.5 | 43.8 | 100 | 69.2 |
| Eficiência (%) | 63 | 69.5 | 63.1 | 79 | 75 | 82.4 |
| Constante de Força Contraeletromotriz do Motor (Vdc/Krpm) | 4.3 | 6 | 6 | 19.2 | 17.9 | 29.9 |
| Constante de Torque do Módulo (N.m/A) | 0.8 | 0.8 | 1.9 | 2.4 | 3.3 | 5.8 |
| Resistência de Fase do Motor (Ω) | 0.61 | 0.32 | 0.35 | 0.18 | 0.12 | 0.08 |
| Indutância de Fase do Motor (mH) | 0.13 | 0.14 | 0.17 | 0.31 | 0.05 | 0.14 |
| Par de Polos | 13 | 13 | 13 | 10 | 20 | 20 |
| Conexão Trifásica | Y | |||||
| Torque de Retorno (N.m) | 0.4 | 0.8 | 1.14 | 3.21 | 3.8 | 4 |
| Folga (Arcmin) | 12 | 10 | 10 | 10 | 10 | 10 |
| Tipo de Rolamento de Saída | Rolamentos de Esferas de Ranhura Profunda | Rolamentos de Rolos Cruzados | ||||
| Carga Axial (KN) | 0.25 | 1.2 | 1.3 | 4 | 4.5 | 5.4 |
| Tensão Axial (KN) | 0.25 | 1.2 | 1.3 | 1 | 4.5 | 5.4 |
| Carga Radial (KN) | 1 | 1.2 | 1.5 | 4.5 | 5 | 6 |
| Inércia (Kg.cm²) | 0.17 | 0.25 | 0.3 | 1.5 | 12.9 | 31.6 |
| Tipo de Encoder e Interface | Encoder Duplo ABS-17BIT (Entrada) / 17-18BIT (Saída) | |||||
| Precisão de Controle (Grau) | <0.01 | |||||
| Comunicação | CAN BUS / EtherCAT | |||||
| Peso (Kg) | 0.26 | 0.33 | 0.36 | 1.40 | 2.37 | 3.50 |
| Classe de Isolação | F | |||||
Convenções de Nomenclatura da Série RMD-X V4
- RMD: Nome da marca R-Redutor M-Motor D-Drive
- X2: X Representa o Nome da Série: Atuador Planetário Integrado, 2 representa o número do modelo do motor, por exemplo: X2 X4 X6 X8 etc.
- P28: Relação de engrenagem planetária, por exemplo: P12 P28 P32 etc.
- 7: Torque de pico 7N.m
- E: Comunicação E: CAN BUS & EtherCAT
Principais Características
- CAN BUS & EtherCAT
- Rolamentos de Rolos Cruzados
- Encoder Duplo
- Alta Densidade de Torque
- Alta Precisão
- Design Vazado
Primeiros Passos
Preparação do Ambiente Antes do Uso
Sistema Windows no PC
-
Baixe o manual de produto correspondente.
-
Extraia
MYACTUATOR_Setup Software_V4.0.zipe instale o seguinte:USBCAN_AllInOne_x86_x64_2.0.0.1.exelocalizado no diretórioRequired Runtime Environment\ZLGUSBCAN_DriverMSVBCRT.AIO.2019.10.19.X86 X64.exelocalizado no diretórioRequired Microsoft Runtime Libraries
Conectar o Circuito
Aqui selecionamos o motor X4-36, e seu diagrama de interface é mostrado abaixo.

| Definição da Porta | Descrição da Porta |
|---|---|
| ① VCC | Alimentação positiva |
| ② GND | Alimentação negativa |
| ③ CAN_H | Terminal de sinal de rede CAN_H |
| ④ CAN_L | Terminal de sinal de rede CAN_L |
| ⑤ EtherCAT_IN | Terminal de entrada EtherCAT |
| ⑥ EtherCAT_OUT | Terminal de saída EtherCAT |
| ⑦ T+ | O mestre envia comandos de controle para o módulo |
| ⑧ T- | O módulo envia o feedback de status para o mestre |
| ⑨ R+ | O mestre reflete os dados de status do módulo |
| ⑩ R- | O módulo reflete os comandos de controle do mestre |
Aqui, usamos o método de comunicação CAN, que requer uma interface USB-CAN adicional para depuração via computador superior no Windows.

Aqui, você precisa fornecer uma fonte de alimentação separada de 24V para o motor e conectar o cabo USB ao seu computador.
Use o MYACTUATOR Setup Software 250206.exe para Testar o Motor
| Definir ID e Conexão | Ler Informações do Motor | Calibrar o motor | Calibrar o motor | Executar um teste de rotação do motor. |
|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
| O ID padrão do motor é 1. Insira o ID como 1 e clique em "Connect". | Após a conexão, clique em "Read" para obter as informações atuais do motor. | Para uso pela primeira vez, clique em "Calibrate Motor" para realizar a calibração. | Após a calibração, clique em "Read" e "Save". | Agora você pode testar diferentes modos de controle do motor na seção Motor Running. |
Para mais detalhes sobre os recursos, consulte o Setup Software Instruction Manual - V3.0.pdf incluído no arquivo MYACTUATOR_Setup Software_V4.0.zip.
Controle o Motor Usando o reComputer Mini Jetson Orin.
Atualmente, as interfaces de comunicação CAN mais comuns para motores no mercado usam XT30 (2+2) e conectores JST. Nossos dispositivos reComputer Mini Jetson Orin e reComputer Robotics estão equipados com duplas portas XT30 (2+2) e interfaces CAN baseadas em JST, proporcionando compatibilidade perfeita.
reComputer Mini:

reComputer Robotics

Para mais detalhes sobre o uso de CAN, você pode consultar este wiki.
Habilitar Interfaces CAN
Passo 1: Antes de usar CAN0 e CAN1, remova a tampa inferior e ajuste ambos os resistores de terminação de 120Ω para a posição ON.

Passo 2: Conecte o motor diretamente ao CAN0 do reComputer Mini através da interface XT30 (2+2).
Esta é a interface CAN0 para o reComputer Mini


Esta fonte de alimentação é apenas para aprendizado e teste de um único motor. Para múltiplos motores, projete uma placa de alimentação separada e isole a fonte de alimentação do Jetson da fonte de alimentação do motor para evitar que uma corrente alta passe diretamente pelo Jetson.
Habilitar comunicação CAN do Jetson
Abra um terminal e insira o seguinte comando para colocar o pino GPIO em nível alto e ativar o CAN0:
gpioset --mode=wait 0 43=0
Se você estiver usando o CAN1 com interface JST, coloque o pino 106 em nível alto.
gpioset --mode=wait 0 106=0
Mantenha este terminal aberto, abra um novo terminal e configure o CAN0.
sudo modprobe mttcan
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up
Construir ambiente Python e C++
Passo 1: Faça o git clone do SDK.
git clone https://github.com/ZhuYaoHui1998/myactuator_rmd.git
Passo 2: Este SDK de driver requer a instalação das seguintes dependências. Para Debian Linux elas podem ser instaladas via apt da seguinte forma:
sudo apt-get install -y build-essential cmake
sudo apt install linux-modules-extra-5.15.0-1025-nvidia-tegra # For Jetson Jetpack 6.0
Caso queira usar os bindings Python, você terá que instalar adicionalmente Python 3, pip e pybind11:
sudo apt-get install -y python3 python3-pip python3-pybind11 python3-setuptools
Depois de instalar as dependências, você deverá instalar o SDK do driver como uma biblioteca C++ ou como um pacote Python, conforme descrito nos passos a seguir. Ambos usarão CMake para compilar o código C++.
Compilando a biblioteca C++
Para compilar o SDK do driver em C++, abra um novo terminal dentro desta pasta e execute os seguintes comandos. Em versões mais antigas do Linux, a compilação pode falhar com a mensagem de erro error: 'const struct can_frame' has no member named 'len' e você terá que aplicar a modificação de código discutida na issue 5.
cd ~/myactuator_rmd
mkdir build
cd build
cmake .. -D PYTHON_BINDINGS=on
make -j $(nproc)
sudo make install
A flag PYTHON_BINDINGS (por padrão desligada) compila os bindings Python adicionalmente à biblioteca C++. Caso você esteja interessado apenas em usar a biblioteca C++, sinta-se à vontade para deixá-la desligada. Ao compilar os bindings Python desta forma, eles serão compilados como uma biblioteca compartilhada, mas não serão instalados. Isso significa que você terá que instalar a biblioteca manualmente ou só poderá importá-la localmente dentro da pasta de compilação.
Para desinstalar o pacote novamente, você pode usar o seguinte comando xargs rm < install_manifest.txt.
Compilando a biblioteca Python
Para compilar e instalar os bindings Python para este SDK, abra um novo terminal dentro da pasta principal e execute o seguinte comando:
cd ~/myactuator_rmd
pip3 install .
Isso usará o setup.py para invocar o CMake e instalar os bindings como uma biblioteca C++. Se quiser removê-los novamente, basta executar pip3 uninstall myactuator-rmd-py.
Controle usando C++
- Criar estrutura de diretórios do projeto
Crie o diretório do seu projeto dentro do diretório src do código, por exemplo, nomeie-o comomyactuator_example, e crie uma pasta src dentro deste subdiretório.
cd ~/myactuator_rmd
mkdir -p ~/myactuator_rmd/src/myactuator_example/src
cd ~/myactuator_rmd/src/myactuator_example
- Escrever CMakeLists.txt
No arquivo~/myactuator_rmd/src/myactuator_example/CMakeLists.txt, escreva o seguinte conteúdo:
touch CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(myactuator_example)
# Find the myactuator_rmd library
find_package(myactuator_rmd REQUIRED)
# Create executable
add_executable(myactuator_node
src/main.cpp
)
# Use C++17 standard
target_compile_features(myactuator_node PUBLIC
cxx_std_17
)
# Link the myactuator_rmd library
target_link_libraries(myactuator_node PUBLIC
myactuator_rmd::myactuator_rmd
)
- Escrever main.cpp
No arquivo~/myactuator_rmd/src/myactuator_example/src/main.cpp, escreva o seguinte código:
touch src/main.cpp
#include <cstdlib>
#include <iostream>
#include <myactuator_rmd/myactuator_rmd.hpp>
int main() {
myactuator_rmd::CanDriver driver {"can0"};
myactuator_rmd::ActuatorInterface actuator {driver, 1};
std::cout << actuator.getVersionDate() << std::endl;
std::cout << actuator.sendPositionAbsoluteSetpoint(180.0, 500.0) << std::endl;
actuator.shutdownMotor();
return EXIT_SUCCESS;
}
- Compilar o projeto
cd ~/myactuator_rmd/src/myactuator_example
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
- Executar o programa
sudo ./myactuator_node

Pré-requisitos
- A interface CAN
can0deve estar devidamente configurada (garanta que o seu motor e o barramento CAN estejam corretamente conectados). - A biblioteca
myactuator_rmddeve estar devidamente instalada (se não estiver, instale-a primeiro).
Para mais detalhes de implementação em C++, consulte todo o conteúdo em myactuator_rmd.hpp. Forneceremos uma introdução detalhada aos métodos de uso em Python.
Controle usando Python
Crie uma pasta chamada scripts no diretório ~/myactuator_rmd/src/myactuator_example para armazenar os scripts Python.
cd ~/myactuator_rmd/src/myactuator_example
mkdir scripts
Obter número da versão
Crie um script Python personalizado chamado test.py no diretório scripts e preencha-o com o seguinte código.
import myactuator_rmd_py as rmd
import time
# Initialize CAN driver and actuator interface
driver = rmd.CanDriver("can0") # Using can0
actuator = rmd.ActuatorInterface(driver, 1) # CAN ID set to 1
# Get version number
print("Version number:", actuator.getVersionDate())

Carregue a biblioteca e continue criando um driver para uma determinada interface de rede (aqui can0) e drive (aqui 1 correspondendo ao endereço CAN 0x140 + 1 = 0x141).
Obter status do motor
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
# Motor Status 1
status1 = actuator.getMotorStatus1()
print(f"""
Motor Status 1:
Temperature: {status1.temperature}°C
Brake Status: {'Released' if status1.is_brake_released else 'Locked'}
Voltage: {status1.voltage}V
Error Code: {status1.error_code}
""")
# Motor Status 2
status2 = actuator.getMotorStatus2()
print(f"""
Motor Status 2:
Temperature: {status2.temperature}°C
Current: {status2.current}A
Shaft Speed: {status2.shaft_speed} RPM
Shaft Angle: {status2.shaft_angle}°
""")
# Motor Status 3
status3 = actuator.getMotorStatus3()
print(f"""
Motor Status 3:
Temperature: {status3.temperature}°C
Phase A Current: {status3.current_phase_a}A
Phase B Current: {status3.current_phase_b}A
Phase C Current: {status3.current_phase_c}A
""")
## Torque Calculation
import myactuator_rmd_py as rmd
from myactuator_rmd_py.actuator_constants import X4_24 # Import according to your motor model
def get_normalized_torque(actuator):
"""Calculate normalized torque from current"""
# Get current value
status = actuator.getMotorStatus2()
current = status.current
# Calculate normalized torque (current/rated)
torque_ratio = current / X4_24.rated_current
actual_torque = torque_ratio * X4_24.rated_torque
return actual_torque
# Usage example
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
try:
while True:
torque = get_normalized_torque(actuator)
print(f"Current Torque: {torque:.3f} Nm (Rated: {X4_24.rated_torque} Nm)", end='\r')
time.sleep(0.1)
except KeyboardInterrupt:
actuator.shutdownMotor()

Modo de controle
- Obter modo de controle atual
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
mode = actuator.getControlMode()
print(f"Current Control Mode: {mode}")

- Controle de posição absoluta
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
# Move to 180 degree position at 100 deg/s
actuator.sendPositionAbsoluteSetpoint(180.0, 300.0)
time.sleep(5) # Wait for motor to reach target position
# Get current position
angle = actuator.getMultiTurnAngle()
print(f"Current position: {angle}°")
time.sleep(5)
mode = actuator.getControlMode()
print(f"Current control mode: {mode}")
actuator.shutdownMotor()

Você verá o seu motor girar até a posição de 180 graus.
- Controle de posição relativa
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
# Move an additional 90 degrees from current position
current_angle = actuator.getMultiTurnAngle()
target_angle = current_angle + 90.0
actuator.sendPositionAbsoluteSetpoint(target_angle, 50.0)
time.sleep(3)
angle = actuator.getMultiTurnAngle()
print(f"Current position: {angle}°")
mode = actuator.getControlMode()
print(f"Current control mode: {mode}")
actuator.shutdownMotor()

Você observará o motor girar 90 graus no sentido anti-horário.
- Controle de velocidade
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
# Continuous rotation at 500 RPM
actuator.sendVelocitySetpoint(500.0)
time.sleep(15)
# Stop motor
actuator.stopMotor()
# Get current position
angle = actuator.getMultiTurnAngle()
print(f"Current position: {angle}°")
mode = actuator.getControlMode()
print(f"Current control mode: {mode}")

- Controle de Torque
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
# Apply 0.5A current (torque)
actuator.sendCurrentSetpoint(0.5)
time.sleep(2)
# Stop torque output
actuator.stopMotor()
# Get current position
angle = actuator.getMultiTurnAngle()
print(f"Current position: {angle}°")
mode = actuator.getControlMode()
print(f"Current control mode: {mode}")

- Controle de Movimento em Malha Fechada
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
# Initialization
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
# Position control with feedback
feedback = actuator.sendPositionAbsoluteSetpoint(180.0, 100.0)
time.sleep(5)
print(feedback)
# Velocity control with feedback
feedback = actuator.sendVelocitySetpoint(20.0)
time.sleep(5)
print(feedback)
# Torque control with feedback
torque_constant = 0.32 # Set according to motor model
feedback = actuator.sendTorqueSetpoint(1.5, torque_constant)
time.sleep(5)
print(feedback)
actuator.stopMotor()

Controle de Freio do Motor
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
# Engage brake
actuator.lockBrake()
print("Brake engaged")
# Release brake
actuator.releaseBrake()
print("Brake released")
Controle de Alimentação do Motor
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
# Power off motor
actuator.shutdownMotor()
print("Motor powered off")
Funções do Encoder
- Obter Posição do Encoder Multivoltas
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
encoder_pos = actuator.getMultiTurnEncoderPosition()
print(f"Multi-turn encoder position: {encoder_pos}")
- Definir a Posição Atual como Ponto Zero (Requer Reinicialização)
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
actuator.setCurrentPositionAsEncoderZero()
print("Current position set as encoder zero point")
- Definir Ponto Zero Personalizado (Requer Reinicialização)
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
# Get current position as zero point
current_pos = actuator.getMultiTurnEncoderOriginalPosition()
print(f"Raw encoder position: {current_pos}")
# Set zero offset
actuator.setEncoderZero(current_pos)
print(f"Encoder zero point set to: {current_pos}")
# Reboot to apply settings
actuator.shutdownMotor()
time.sleep(1) # Wait for shutdown
actuator = rmd.ActuatorInterface(driver, 1) # Reinitialize
# Verify
new_pos = actuator.getMultiTurnEncoderPosition()
print(f"Post-reboot position (should be near 0): {new_pos}")
Configurações de Aceleração
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
from myactuator_rmd_py.actuator_state import AccelerationType
# Initialization
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
## Get initial acceleration
print(f"Initial acceleration: {actuator.getAcceleration()}")
actuator.setAcceleration(5000, AccelerationType.POSITION_PLANNING_ACCELERATION)
## Get modified acceleration
print(f"Modified acceleration: {actuator.getAcceleration()}")
# Set different acceleration types
actuator.setAcceleration(1000, AccelerationType.POSITION_PLANNING_ACCELERATION)
actuator.setAcceleration(800, AccelerationType.POSITION_PLANNING_DECELERATION)
actuator.setAcceleration(1200, AccelerationType.VELOCITY_PLANNING_ACCELERATION)
actuator.setAcceleration(1000, AccelerationType.VELOCITY_PLANNING_DECELERATION)
Suporte Técnico & Discussão de Produto
Obrigado por escolher nossos produtos! Estamos aqui para fornecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.




