Introducción a los Motores de la Serie MyActuator X
Este artículo presentará cómo comenzar con los motores de la serie MyActuator y cómo usarlos con C++ y Python en el reComputer Mini Jetson Orin.

Especificaciones
Aquí está la tabla completa con todos los parámetros completados para todos los modelos de motores:
Parámetro | X2-7 | X4-10 | X4-36 | X8-120 | X12-320 | X15-450 |
---|---|---|---|---|---|---|
Relación de Engranaje | 28.17 | 12.6 | 36 | 19.61 | 20 | 20.25 |
Voltaje de Entrada (V) | 24 | 24 | 24 | 48 | 48 | 72 |
Velocidad Sin Carga (RPM) | 178 | 317 | 111 | 158 | 125 | 108 |
Corriente de Entrada Sin Carga (A) | 1 | 1 | 0.9 | 1.6 | 2.7 | 3.5 |
Velocidad Nominal (RPM) | 142 | 238 | 83 | 127 | 100 | 98 |
Par Nominal (N.m) | 2.5 | 4 | 10.5 | 43 | 85 | 145 |
Potencia de Salida Nominal (W) | 37 | 100 | 100 | 574 | 900 | 1480 |
Corriente de Fase Nominal A(rms) | 3 | 7.8 | 6.1 | 17.6 | 30 | 25 |
Par Máximo (N.m) | 7 | 10 | 34 | 120 | 320 | 450 |
Corriente de Fase Máxima A(rms) | 8.1 | 19.5 | 21.5 | 43.8 | 100 | 69.2 |
Eficiencia (%) | 63 | 69.5 | 63.1 | 79 | 75 | 82.4 |
Constante de FEM del Motor (Vdc/Krpm) | 4.3 | 6 | 6 | 19.2 | 17.9 | 29.9 |
Constante de Par del Módulo (N.m/A) | 0.8 | 0.8 | 1.9 | 2.4 | 3.3 | 5.8 |
Resistencia de Fase del Motor (Ω) | 0.61 | 0.32 | 0.35 | 0.18 | 0.12 | 0.08 |
Inductancia de Fase del Motor (mH) | 0.13 | 0.14 | 0.17 | 0.31 | 0.05 | 0.14 |
Par de Polos | 13 | 13 | 13 | 10 | 20 | 20 |
Conexión de 3 Fases | Y | |||||
Par de Retroceso (N.m) | 0.4 | 0.8 | 1.14 | 3.21 | 3.8 | 4 |
Holgura (Arcmin) | 12 | 10 | 10 | 10 | 10 | 10 |
Tipo de Rodamiento de Salida | Rodamientos de Bolas de Ranura Profunda | Rodamientos de Rodillos Cruzados | ||||
Resistencia Axial (KN) | 0.25 | 1.2 | 1.3 | 4 | 4.5 | 5.4 |
Esfuerzo 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 |
Inercia (Kg.cm²) | 0.17 | 0.25 | 0.3 | 1.5 | 12.9 | 31.6 |
Tipo de Codificador e Interfaz | Codificador Dual ABS-17BIT (Entrada) / 17-18BIT (Salida) | |||||
Precisión de Control (Grados) | <0.01 | |||||
Comunicación | CAN BUS / EtherCAT | |||||
Peso (Kg) | 0.26 | 0.33 | 0.36 | 1.40 | 2.37 | 3.50 |
Grado de Aislamiento | F |
Convenciones de Nomenclatura de la Serie RMD-X V4
- RMD: Nombre de Marca R-Reductor M-Motor D-Accionamiento
- X2: X Representa el Nombre de la Serie: Actuador Planetario Integrado, 2 representa el número de modelo del motor ej:X2 X4 X6 X8 etc
- P28: Relación de engranaje planetario ej:P12 P28 P32 etc
- 7: Torque máximo 7N.m
- E: Comunicación E: CAN BUS & EtherCAT
Características Principales
- CAN BUS & EtherCAT
- Rodamientos de Rodillos Cruzados
- Codificador Dual
- Alta Densidad de Torque
- Alta Precisión
- Diseño Hueco
Comenzar
Preparación del Entorno Antes del Uso
Sistema Windows en PC
-
Descarga el Descarga el manual del producto correspondiente.
-
Descarga el MYACTUATOR_Setup Software_V4.0.zip
-
Extrae
MYACTUATOR_Setup Software_V4.0.zip
e instala lo siguiente:USBCAN_AllInOne_x86_x64_2.0.0.1.exe
ubicado en el directorioRequired Runtime Environment\ZLGUSBCAN_Driver
MSVBCRT.AIO.2019.10.19.X86 X64.exe
ubicado en el directorioRequired Microsoft Runtime Libraries
Conectar el Circuito
Aquí hemos seleccionado el motor X4-36, y su diagrama de interfaz se muestra a continuación.

Definición del Puerto | Descripción del Puerto |
---|---|
① VCC | Positivo de alimentación |
② GND | Negativo de alimentación |
③ CAN_H | Terminal de señal de red CAN_H |
④ CAN_L | Terminal de señal de red CAN_L |
⑤ EtherCAT_IN | Terminal de entrada EtherCAT |
⑥ EtherCAT_OUT | Terminal de salida EtherCAT |
⑦ T+ | Maestro envía comandos de control al módulo |
⑧ T- | Módulo envía retroalimentación de estado al maestro |
⑨ R+ | Maestro refleja datos de estado del módulo |
⑩ R- | Módulo refleja comandos de control del maestro |
Aquí, utilizamos el método de comunicación CAN, que requiere una interfaz USB-CAN adicional para la depuración a través de una computadora superior en Windows.

Aquí, necesitas proporcionar una fuente de alimentación de 24V separada para el motor y conectar el USB a tu computadora.
Usa el MYACTUATOR Setup Software 250206.exe
para Probar el Motor
Establecer ID y Conexión | Leer Información del Motor | Calibrar el motor | Calibrar el motor | Ejecutar una prueba de rotación del motor. |
---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
El ID predeterminado del motor es 1. Ingresa ID como 1 y haz clic en "Connect". | Después de conectar, haz clic en "Read" para recuperar la información actual del motor. | Para el primer uso, haz clic en "Calibrate Motor" para realizar la calibración. | Después de la calibración, haz clic en "Read" y "Save". | Ahora puedes probar diferentes modos de control del motor en la sección Motor Running. |
Para más características detalladas, consulte el Manual de Instrucciones del Software de Configuración - V3.0.pdf incluido en el archivo MYACTUATOR_Setup Software_V4.0.zip.
Controlar el Motor Usando el reComputer Mini Jetson Orin.
Actualmente, las interfaces de comunicación CAN más comunes para motores en el mercado utilizan XT30 (2+2) y conectores JST. Nuestro dispositivo reComputer Mini Jetson Orin y reComputer Robotics está equipado con puertos XT30 (2+2) duales e interfaces CAN basadas en JST, proporcionando compatibilidad perfecta.
reComputer Mini:

reComputer Robotics

Para más detalles sobre el uso de CAN, puede consultar esta wiki.
Habilitar Interfaces CAN
Paso1: Antes de usar CAN0 y CAN1, retire la cubierta inferior y configure ambas resistencias de terminación de 120Ω en la posición ON.

Paso2: Conecte el motor directamente al CAN0 del reComputer Mini a través de la interfaz XT30 (2+2).
Esta es la interfaz CAN0 para reComputer Mini


Esta fuente de alimentación es solo para aprendizaje y pruebas de un solo motor. Para múltiples motores, diseñe una placa de alimentación separada y aísle la fuente de alimentación del Jetson de la fuente de alimentación del motor para evitar que pase alta corriente directamente a través del Jetson.
Habilitar comunicación CAN del Jetson
Abra una terminal e ingrese el siguiente comando para poner el pin GPIO en alto y activar CAN0:
gpioset --mode=wait 0 43=0
Si estás usando la interfaz JST CAN1, pon el pin 106 en alto.
gpioset --mode=wait 0 106=0
Mantén esta terminal abierta, abre una nueva terminal y configura CAN0.
sudo modprobe mttcan
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up
Construir el Entorno de Python y C++
Paso1: Clonar el SDK con Git.
git clone https://github.com/ZhuYaoHui1998/myactuator_rmd.git
Paso 2: Este SDK del controlador requiere que se instalen las siguientes dependencias. Para Debian Linux se pueden instalar a través de apt de la siguiente manera:
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
En caso de que quieras usar los enlaces de Python, tendrás que instalar adicionalmente Python 3, pip y pybind11:
sudo apt-get install -y python3 python3-pip python3-pybind11 python3-setuptools
Después de haber instalado sus dependencias, tendrás que instalar el SDK del controlador ya sea como una biblioteca de C++ o un paquete de Python como se describe en los siguientes pasos. Ambos usarán CMake para compilar el código de C++.
Compilando la Biblioteca de C++
Para compilar el SDK del controlador de C++, abre una nueva terminal dentro de esta carpeta y ejecuta los siguientes comandos. En versiones más antiguas de Linux, la compilación podría fallar con el mensaje de error error: 'const struct can_frame' has no member named 'len' y tendrás que aplicar la modificación de código discutida en issue 5.
cd ~/myactuator_rmd
mkdir build
cd build
cmake .. -D PYTHON_BINDINGS=on
make -j $(nproc)
sudo make install
La bandera PYTHON_BINDINGS (por defecto desactivada) construye los enlaces de Python adicionalmente a la biblioteca de C++. En caso de que solo estés interesado en usar la biblioteca de C++, siéntete libre de dejarla desactivada. Cuando construyas los enlaces de Python de esta manera, se compilarán a una biblioteca compartida pero no se instalarán. Esto significa que tendrás que instalar la biblioteca manualmente o solo podrás importarlos localmente dentro de la carpeta de construcción.
Para desinstalar el paquete nuevamente puedes usar el siguiente comando xargs rm < install_manifest.txt
.
Construyendo la Biblioteca de Python
Para construir e instalar los enlaces de Python para este SDK, abre una nueva terminal dentro de la carpeta principal y ejecuta el siguiente comando:
cd ~/myactuator_rmd
pip3 install .
Esto utilizará el setup.py para invocar CMake e instalar los enlaces como una biblioteca de C++. Si deseas eliminarlos nuevamente, simplemente ejecuta pip3 uninstall myactuator-rmd-py
.
Control Usando C++
- Crear la estructura del directorio del proyecto
Crea tu directorio de proyecto bajo el directorio src del código, por ejemplo, nómbralomyactuator_example
, y crea una carpeta src bajo el subdirectorio.
cd ~/myactuator_rmd
mkdir -p ~/myactuator_rmd/src/myactuator_example/src
cd ~/myactuator_rmd/src/myactuator_example
- Escribir CMakeLists.txt
En el archivo~/myactuator_rmd/src/myactuator_example/CMakeLists.txt
, escriba el siguiente contenido:
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
)
- Escribir main.cpp
En el archivo~/myactuator_rmd/src/myactuator_example/src/main.cpp
, escriba el siguiente 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;
}
- Construir el proyecto
cd ~/myactuator_rmd/src/myactuator_example
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
- Ejecutar el programa
sudo ./myactuator_node

Prerrequisitos
- La interfaz CAN
can0
debe estar configurada correctamente (asegúrese de que su motor y el bus CAN estén conectados correctamente). - La biblioteca
myactuator_rmd
debe estar instalada correctamente (si no, instálela primero).
Para más detalles de implementación en C++, consulte todo el contenido en myactuator_rmd.hpp
. Proporcionaremos una introducción detallada a los métodos de uso de Python.
Control Usando Python
Cree una carpeta llamada scripts bajo el directorio ~/myactuator_rmd/src/myactuator_example
para almacenar scripts de Python.
cd ~/myactuator_rmd/src/myactuator_example
mkdir scripts
Obtener número de versión
Crea un script personalizado de Python llamado test.py
bajo el directorio scripts y llénalo con el siguiente 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())

Carga la biblioteca y continúa creando un controlador para una interfaz de red particular (aquí can0) y unidad (aquí 1 correspondiente a la dirección CAN 0x140 + 1 = 0x141).
Obtener Estado del 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 Control
- Obtener Modo de Control Actual
# -*- 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}")

- Control de Posición 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()

Verás que tu motor gira a la posición de 180 grados.
- Control de Posición 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()

Observarás que el motor gira 90 grados en sentido antihorario.
- Control de Velocidad
# -*- 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}")

- Control de Par
# -*- 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}")

- Control de Movimiento en Bucle Cerrado
# -*- 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()

Control de Freno del 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")
Control de Energía del 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")
Funciones del Codificador
- Obtener Posición del Codificador Multi-vuelta
# -*- 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}")
- Establecer la Posición Actual como Punto Cero (Requiere Reinicio)
# -*- 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")
- Establecer Punto Cero Personalizado (Requiere Reinicio)
# -*- 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}")
Configuración de Aceleración
# -*- 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)
Soporte Técnico y Discusión de Productos
¡Gracias por elegir nuestros productos! Estamos aquí para brindarte diferentes tipos de soporte para asegurar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para satisfacer diferentes preferencias y necesidades.