Comment interfacer le servo UART ? (LX-224HV)
J'essaie d'interfacer un RaspberryPi (2B) GPIO-UART avec ce servo série (Hiwonder LX-224HV), dans un premier temps avant de basculer le Raspberry par un MCU ARM (STM32F407ZE sur circuit personnalisé).
Le servo est censé suivre un protocole simple, cependant, je ne peux gérer aucune réponse du servo (ni mouvement, ni réponse UART).
La documentation que j'ai trouvée sur le servo est limitée (notez qu'il s'agit d'un autre modèle de servo, mais selon le fournisseur, leur contrôleur est compatible avec les deux, par conséquent, je suppose une certaine compatibilité) :
https://www.dropbox.com/sh/b3v81sb9nwir16q/AADXOwhdw7KLq5t5UM8ND3kwa/LX-15D%20Bus%20Servo?dl=0&subfolder_nav_tracking=1
Signaux de test :
À des fins de test, j'envoie le message suivant via la ligne de commande :
#Some ports initialization here
echo "0" > /sys/class/gpio/gpio24/value # disable rx
echo "1" > /sys/class/gpio/gpio23/value # enable dx
echo -n -e "\x55\x55\xfe\x04\x0e\x01\xee" > /dev/ttyAMA0; sleep 0.001;
echo "0" > /sys/class/gpio/gpio23/value # enable dx
echo "1" > /sys/class/gpio/gpio24/value # disable rx
Le message est composé de :
- 0x55 0x55 : balise de début de transmission.
- 0xFE : ID du servo cible, 254 signifie diffusion
- 0x04 : longueur du bloc, y compris cette longueur jusqu'à la somme de contrôle de fin
- 0x0E : 14 est Read_ID, demandant au servo son ID.
- 0x01 : identifiant par défaut (non utilisé ?)
- 0xEE : Somme de contrôle ~(254+4+14+1) = ~(17) = 238
Le circuit est configuré comme suit :
simuler ce circuit - Schéma créé à l'aide de CircuitLab
Remarque, j'ai ajouté une résistance pour éviter de brûler un composant en cas de raccourci, cela permet également de voir les variations du signal si le servo essaie d'envoyer des données.
La connexion au servo se fait comme suit :
- 0-5V pour signaler, haute impédance la plupart du temps.
- 12V au VDD
- 0V à la GND
La planche à pain ressemble à ceci :
Le signal de résultat :
Le signal résultant à la broche de signal du servomoteur est le suivant :
Il n'y a pas de signal significatif après cela, ce que j'interprète comme le servo ne répondant pas pour une raison quelconque.
La question:
Y a-t-il un élément manquant évident dans cette approche ? ou finalement, comment s'interfacer avec ce servo ?
I found many others servos with similar interface, so I believe this could help further users..
Réponses
After some time researching the topic together @tlfong01 and me(@adrian_maire), we managed to get the servo working through the Raspberry Pi (from now: RPI) without the need of the driver board.
For this purpose, several problems has been solved:
- Converting voltage level from 3.3V (RPI) to 5V (servo bus)
- Implementing the different UART messages for the RPI
- Converting full-duplex UART to half-duplex UART
Converting voltage level from 3.3V to 5V
Even if this could be a sub-optimal solution, considering that the 74HC126D allows level conversion, two of them has been used to manage both problems: enabling and disabling of Tx/Rx and level conversion at the same time.
simuler ce circuit - Schéma créé à l'aide de CircuitLab
Implémentation des différents messages UART pour le RPI
Un projet a été créé (GPL3) pour que chacun d'entre vous puisse l'utiliser.
https://github.com/Escain/HiwonderRPI
(Le code est malheureusement trop volumineux pour être inclus ici.)
Conversion UART full-duplex en UART semi-duplex
Pour la conversion d'UART full-duplex en half-duplex, le relais servo sur l'activation et la désactivation de la ligne TX (transmission) et RX (réception) full-duplex :
- Lorsque RPI transmet, il active TX et désactive RX
- Lorsque RPI ne transmet pas, il désactive TX et active RX afin que le servo puisse répondre.
Le servo commence à répondre à la demande UART environ 0,1 ms après la réception, ce qui est inférieur au temps de programmation du système d'exploitation de tout système d'exploitation moderne, y compris Raspian. En conséquence, la première tentative de piloter en-TX et en-RX par logiciel a été totalement infructueuse.
Pour résoudre ce problème, le en-TX est implémenté par le matériel, via un temporisateur monostate 555 de redéclenchement d'environ 0,1 ms. Le en-RX n'est que la négation de en-TX.
simuler ce circuit
Connecter tous ensemble :
- Tx est connecté au RPI GPIO 14
- Rx est connecté au RPI GPIO 15
- les enTx des deux circuits sont connectés ensemble
- Servo S est connecté au signal du servo
- Gnd et VCC (3.3V, 5V et 9V) sont connectés aux circuits et au servo. (Ce servo est HV et prend donc en charge jusqu'à 12V, mais d'autres servos Hiwonver ne peuvent PAS gérer 12V, soyez prudent).
Question
Comment Rpi4B peut-il parler au servo BUS UART duplex LX-224HV?
Répondre
Partie B - Conception de circuit série simplex Rpi4B UART vers LX-224HV V0.1
Next step is to let Rpi to send commands to LX-224 and see if is replies back anything. The OP reports nothing comes back. So I will repeat his commands and see if I have better luck.
The Op is sending the following commands. I think I better read the servo command manual to make sure the commands are OK and will not fry the servo.
0x55 0x55: transmission start tag.
0xFE: Id of the target servo, 254 means broadcast
0x04: Length of the block, including this length to ending checksum
0x0E: 14 is Read_ID, asking the servo for it ID.
0x01: default Id (not used?)
0xEE: Checksum ~(254+4+14+1) = ~(17) = 238
Part A - LX224HX Troubleshooting Using BusLink V2.4
I am using the HiWonder Bus Linker V2.4 to display the send receive signals when the LX-224 UART/Bus servo is set to motor mode and move continuously at about 700 rpm.
References
(1) LewanSoul Bus Servo Communication Protocol
/ to continue, ...
Appendices
Appendix A - The OP's test setup
Appendix B - HiWonder LX-224 BusServoController setup
Appendix C - HiWonder LX-224 BusLink V2.4 Setup
Annexe D - Décaleur de niveau TSX0104 pour la mise en œuvre du contrôle bidirectionnel servo UART/BUS LX224 Simplex
/ continuer, ...
Réponse pas encore complète. Restez à l'écoute, ...