Meow motor protocol
Node-IDs 100 and 101 are prohibited
Do not assign decimal Node-ID 100 (0x64) or 101 (0x65) to motors or other CANopen devices. Motor firmware-update requests use 0x780 + Node-ID; these values produce 0x7E4 and 0x7E5, which collide with the LSS response/request IDs. LSS scanning or configuration can therefore interfere with motor-update traffic.
Device Settings rejects these new IDs. Motor Control and firmware update report an error and refuse operations on motors using them. If an existing device uses one, change it to another valid, unused ID in Device Settings, save and power-cycle it before control or update. Recovery probing also skips these IDs.
Meow uses CANopen CiA301 NMT, heartbeat, SDO and PDO communication with its own motor states and object dictionary. Motion control uses 0x4401/0x4402, with Profile Position, Profile Velocity, Torque and MIT modes.
Use the quick start and GUI guide for connection and a first low-speed test, or the API and PDO guide to develop a controller.
Identify the motor
Read 0x1018:01 (Vendor ID) and 0x1018:02 (Product Code) and match both values. The GUI opens the Meow panel from this identity. The optional 0x1008 product name may be absent and does not identify the model.
| Meow model | Vendor ID | Product Code | Nominal gear ratio |
|---|---|---|---|
| hexmeow 4310 | 0x00686578 |
0x6C64BC78 |
10:1 |
| hexmeow 4342 (HEX 4342P) | 0x00686578 |
0x6C64BCAA |
42:1 |
| hexmeow 3525 (also supported by the driver) | 0x00686578 |
0x6C64AE8D |
25:1 |
0x1018:03 is the firmware revision and :04 is the serial number. Resolve unknown identities before sending control commands. Hardware ratings and dimensions are in the 4310 and 4342P data centers.
CAN bus
Use a linear bus with one termination at each end. Count the USB-CANFD-HUB's built-in termination as one end. See the unpacking guide and CAN connector reference for wiring.
The normal GUI motor connection uses these profiles. The host and all devices must agree:
| Item | Configuration |
|---|---|
| Nominal phase | 1 Mbit/s, sample point 0.8 |
| Data phase | 1 / 2 / 4 / 5 Mbit/s; GUI default 5 Mbit/s |
| Data sample point | 0.8 at 1 / 2 / 4 Mbit/s; 0.75 at 5 Mbit/s |
| Node-ID | Protocol range 1–127; unique among devices and the host |
| GUI host Node-ID | Default 0x0A (decimal 10) |
Avoid the host ID and system-reserved IDs 100, 101 and 127 when allocating motors. The motor settings object also accepts nominal rates of 125 / 250 / 500 / 800 kbit/s, but the normal GUI motor connection checks for 1 Mbit/s.
Frame type and BRS
NMT, heartbeat and SDO use Classic CAN with standard 11-bit IDs. PDO frame type depends on 0x2001:04 and payload length:
| PDO BRS | PDO payload ≤ 8 bytes | PDO payload > 8 bytes |
|---|---|---|
| 0 | Classic CAN | CAN FD without BRS |
| 1 | CAN FD + BRS | CAN FD + BRS |
Even the 8-byte TPDO1 and 7-byte TPDO2 must be received as FD+BRS when BRS is enabled. Do not filter out FD frames merely because the payload is short. SDO requests use 0x600 + Node-ID, responses use 0x580 + Node-ID, and heartbeat uses 0x700 + Node-ID.
States and modes
Motor state is Disabled, Enabled in a particular mode, or Error. NMT state and motor mode are independent: NMT Operational does not mean torque is enabled. A disabled motor can continue sending PDO feedback while Operational.
Write to 0x4401:00 (U8) |
Action | Normal 0x4402:00 feedback |
|---|---|---|
0x00 |
Disable | 0x00 |
0x01 |
Profile Position (PP) | 0x01 |
0x02 |
Profile Velocity (PV) | 0x02 |
0x03 |
Torque | 0x03 |
0x04 |
MIT | 0x04 |
0xFF |
Clear error | Disabled 0x00 on success |
Write the target before the mode command and wait for fresh feedback confirming the mode. Modes can change while enabled. 0x4401 is change-of-value triggered: to retry error clearing, write 0x00 before another 0xFF. The GUI and driver handle this rearming sequence.
Units and encoding
All motion commands and feedback use output-shaft units. Do not apply the gear ratio again.
| Quantity | Wire encoding and unit |
|---|---|
| PP target / position feedback | Signed I32 Q8.24, Rev (revolutions) |
| PV target / velocity readback | REAL32, Rev/s |
| Torque target / feedback | I16, permille (‰) of peak torque |
| Maximum torque | U16, 0–1000 ‰ |
| Peak torque | REAL32, N·m |
| Uncompressed MIT position / velocity / feedforward torque | REAL32, Rev / Rev/s / N·m |
| Temperature | I16, 0.1 °C per unit |
| TPDO1 timestamp | U16, µs, wraps every 65536 µs |
Multibyte values are little-endian. Q8.24 converts as Rev = raw_i32 / 2^24, with a range of [-128, 128 - 2^-24] Rev and a step of about 5.96 × 10^-8 Rev. The driver rejects PP targets outside that range. Use PV for continuous rotation and accumulate wrapped position on the host. Gaps, disconnects or reinitialization can invalidate continuity; this is not a persistent absolute multi-turn encoder.
GUI PP / PV inputs use Rev / Rev/s. The MIT card uses rad, rad/s, N·m, N·m/rad and N·m·s/rad, converting them to protocol values. Direct Rust callers must perform this conversion themselves; see MIT units.
Common objects
This is the object subset used by the current GUI and driver. R and W indicate the operations described here, without asserting unverified defaults or other access capabilities.
Communication and position preset
| Address | Type | Used here | Meaning |
|---|---|---|---|
0x1018:01..04 |
U32 | R | Vendor, product, firmware revision, serial |
0x1016:01 |
U32 | R/W | Consumer heartbeat: (host Node-ID << 16) \| timeout_ms |
0x1017:00 |
U16 | R | Device heartbeat period, ms |
0x2001:00 |
U8 | R | Highest communication-settings subindex; 4 for this variant |
0x2001:01 |
U8 | R/W | Stored Node-ID; may differ from the active ID before restart |
0x2001:02 |
U32 | R/W | Nominal bitrate, bit/s |
0x2001:03 |
U32 | R/W | Data bitrate, bit/s |
0x2001:04 |
U8 | R/W | PDO BRS, 0 or 1 |
0x1010:04 |
U32 | R/W | Save these settings with 0x65766173 (little-endian ASCII save) |
0x1010:02 |
U32 | W | Explicit PDO communication persistence with save; ordinary initialization does not save |
0x3001:01 |
REAL32 | W | Position preset, -0.5 to 0.5 Rev |
0x3001:02 |
U32 | W | Commit and save the preset with 0x73657270 (little-endian ASCII pres) |
Communication changes require an identified, online node before initialization, with NMT Pre-Operational or Stopped. The driver writes and reads back 0x2001:01..04, saves only after they match, and then requires a manual power cycle. Do not use another device's 0x2100/0x2101 configuration scheme for this motor.
The position preset is a separate transaction: confirm Disabled, write the value and pres, then remain Disabled. It changes the reference assigned to the current physical position; it does not command a move.
Motion and feedback
| Address | Type | Used here | Meaning |
|---|---|---|---|
0x4401:00 |
U8 | W | Mode command |
0x4402:00 |
U8 | R | Mode / error state |
0x453F:00 |
U16 | R | Detailed error |
0x4564:00 |
I32 Q8.24 | R | Output position |
0x456C:00 |
REAL32 | R | Output velocity, Rev/s |
0x4577:00 |
I16 | R | Torque feedback, ‰ |
0x457A:00 |
I32 Q8.24 | W | PP target position |
0x45FF:00 |
REAL32 | W | PV target velocity, Rev/s |
0x4571:00 |
I16 | W | Torque target, -1000 to 1000 ‰ |
0x4572:00 |
U16 | R/W | Maximum torque, 0–1000 ‰ |
0x4576:00 |
REAL32 | R | Peak torque, N·m; use the device's value |
0x4581:00 |
REAL32 | R/W | Profile velocity, Rev/s, positive |
0x4583:00 / 0x4584:00 |
REAL32 | R/W | Profile acceleration / deceleration, Rev/s², positive |
0x4102:01..03 |
REAL32 | W | MIT target position, velocity, feedforward torque |
0x4102:04..05 |
U16 | W | MIT raw Kp / Kd |
0x4102:06 |
U16 | W | Limit on each Kp / Kd term's resulting torque, 0–1000 ‰ |
0x4102:07 |
REAL32 | R | MIT Kp / Kd scale factor |
0x4103 |
RECORD | R/W | Compressed MIT parameters; see shared PDOs |
0x4104:01..02 |
I16 | R | Driver / motor temperature, 0.1 °C |
0x4713:00 |
U16 | R | TPDO timestamp, µs |
0x4001:01..07 |
U32 | R | Factory calibration data; GUI reads the torque factor |
Errors and recovery
Error displays in 0x4402 are 0xA1 overcurrent, 0xA2 overvoltage, 0xA3 undervoltage, 0xA4 heartbeat error, 0xA5 driver overtemperature, 0xA6 motor overtemperature and 0xAF other error. Read 0x453F for details:
| Detailed code | Meaning |
|---|---|
0x0000 |
No error |
0x2310 |
Phase overcurrent |
0x3210 / 0x3220 |
Bus overvoltage / undervoltage |
0x4210 / 0x7124 |
Driver / motor overtemperature |
0x7121 |
Motor stall |
0x7340 |
Encoder error |
0x8130 |
Heartbeat error |
0x8140 |
Bus recovery error |
Resolve the supply, temperature, load or heartbeat issue before clearing the error. Successful clearing leaves the motor Disabled and does not restore its previous mode. Default host heartbeat is every 50 ms and initialization sets a 250 ms consumer timeout. Closing the host or switching tools affects heartbeat; check state and reinitialize as needed before motion.
Some tested older firmware lacks 0x4102. The presence of 0x4103 does not imply uncompressed MIT SDO support. On 0x06020000 ObjectDoesNotExist, record identity and firmware revision and contact the firmware provider. The current GUI does not automatically fall back to a different MIT protocol.