Servo WaveShare ST3215
servo pro robotiku
Ke konci roku 2022 jsem konečně objevil pohon "snů" pro malé roboty - digitální servo WaveShare ST3215. Digitální robotická serva samořejmě existují již dávno, ale buď jsou cenově mimo běžné možnosti, nebo mají jiný nedostatek, např. nemají měření polohy v celém rozsahu otáčení (obvykle jen 0 - 270°). Servo ST3215 splňuje téměř všechny požadavky na ideální pohon pro malé roboty.
Technický popis
Jedním ze stěženích problémů při stavbě vlastního robota je výběr vhodného pohonu.
Je jedno jestli se jedná o robota mobilního, kde využijeme pohony pro vlastní pohyb,
nebo o robotické rameno, kde pohony zajišťují pohyb kloubů.
Vždy potřebujeme pohon, který má vhodnou rychlost, požadovanou sílu, možnost řízení rychlosti a polohy a v neposlední řadě i rozumnou cenu.
Vždy potřebujeme pohon, který má vhodnou rychlost, požadovanou sílu, možnost řízení rychlosti a polohy a v neposlední řadě i rozumnou cenu.
Parametry serva
- velikost standardního serva
- napájení 6 – 12,6V
- krouticí moment 3 Nm (30kg.cm)
- komunikace – sériová linka TTL
- magnetický snímač otáčení 360° ! (rozlišení 4096 poloh, tj. < 0,1°)
- režim servo polohové / servo rychlostní - motor
Dobré vlastnosti
- zpětná vazba pozice, rychlost, teplota, ...
- kvalitní převodovka (kovová kola, malé vůle)
- super cena ~650,- Kč (za to nelze pořídit slušný motor s převodovkou, enkodér, H-můstek a procesor pro řízení)
Horší vlastnosti
- není dokumentace – pouze příklady zdrojových kódů (update: výrobce už má na wiki popis komunikačního protokolu)
- nižší rychlost (oproti standardním servům) (update: už existuje rychlejší varianta serva ST3215 HS - cca 2,5x rychlejší)
- obousměrná (jednodrátová) sériová linka v úrovních 3V
Připojení serva k mikrokontroleru
Pro komunikaci se servy je použita 1-drátová sériová sběrnice v úrovních 3V,
umožňující teoreticky připojit 253 serv.
Proto jen nutné u mikrokontrolerů, které tento typ sběrnice hardwarově nepodporují
doplnit potřebný obvod. Obvykle se pro komunikaci využije uart mikrokontroleru
a "spojí se" signály TX a RX.
Pro prvotní hraní jsem použil desku Servo Driver od výrobce serv. Je založena
na mikrokontroleru ESP32 a obsahuje budič 1-drátové sběrnice s automatickým
přepínámí směru.
Budič s automatický přepínáním směru (originálního zapojení)
Budič s automatický přepínáním směru
zjednodušená varianta originálního zapojení (bylo by vhodné přidat zpoždění přepnutí směru pro rychlejší přechod linky do H)
Budiče s „ručním“ přepínáním směru
v tomto zapojení je přepínání směru - vysílání/příjem řízeno zvláštním výstupem
mikrokontroleru (používá originál Dynamixel)
Wired AND (drátový AND)
realizace diodou, která zajistí aktivní výstup pouze pro logickou "0", v logické "1" je výstup odpojen
a požadovanou úroveň zajišťuje pull-up rezistor
"nevýhoda" - na RXD echo vysílaných dat
pokud využijeme v mikrokontroleru výstup TXD v režimu otevřeného kolektoru, tak můžeme ušetřit
diodu
Mechanicky je připojování serv na sběrnici realizováno pomocí konektorů SPOX (molex) 2,5 mm – 3 pin.
Konfigurace serva
U digitálních serv lze nastavovat řadu parametrů - režim práce, rychlost, maximální moment, teplotu, ...
Stejně tak lze mnoho údajů ze serva číst - poloha, aktuální rychlost, krouticí moment, napětí, proud, ...
Bohužel výrobce dokumentaci s popisem registrů serva nemá k dispozici (tedy zatím jsem neobjevil).
Ale dostal jsem tip, že toto servo vypadá jako klon serv firmy FeeTech. Takže jsem zapátral
na jejich stránkách a našel jejich software pro konfiguraci serv (odkaz ve zdrojích).
Zkusil jsem se připojit tímto softwarem k servu a opravdu servo komunikovalo.
Vypadá to, že i struktura registrů je stejná (všechny parametry, které jsem zatím
zkusil nastavit fungovaly). (update: už existuje i konfigurační software od WaveShare)
Konfigurační software FeeTech |
Pro práci s tímto sw je potřeba připojení sériovou linkou s PC. To lze snadno realizovat
jednoduchým prográmkem s využitím výše uvedené desky Servo Driver. Program
pouze přeposílá data ze sériové linky z PC (USB) na sériovou linku, která je převáděna
na 1-drátovou sběrnice a naopak.
#include <Arduino.h>
#define S_RXD 18
#define S_TXD 19
void setup() {
Serial.begin(115200);
Serial1.begin(1000000, SERIAL_8N1, S_RXD, S_TXD);
delay(1000);
}
void loop() {
if (Serial.available()) {
int a = Serial.read();
Serial1.write(a);
}
if (Serial1.available()) {
int a = Serial1.read();
Serial.write(a);
}
}
#define S_RXD 18
#define S_TXD 19
void setup() {
Serial.begin(115200);
Serial1.begin(1000000, SERIAL_8N1, S_RXD, S_TXD);
delay(1000);
}
void loop() {
if (Serial.available()) {
int a = Serial.read();
Serial1.write(a);
}
if (Serial1.available()) {
int a = Serial1.read();
Serial.write(a);
}
}
SW řešení - jak si se servy povídat
Serva používají komunikační protokol vycházející z protokolu Dynamixel 1.0,
liší se pouze ve funkci BulkRead (čtení z více serv současně).
Pro použití serv ve vlastních projektech je potřeba softwarová obsluha komunikace po
sběrnici (viz. popis komunikačního protokolu) a mapa registrů v paměti serva.
Lze využít knihovnu, která je součástí ukázkového demo projektu.
Já osobně používám vlastní knihovnu (originální mi přijde zbytečně složitá), protože
využívám jednodušší variantu zapojení 1-drátové sběrnice wired and (a tedy
je potřeba řešit echo při vysílání).