Czech English

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.

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
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);
  }
}

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í).

Projekty se servy ST3215

Použitá literatura a odkazy na internetu