Kontrolér krokového motorku nejen pro stavebnici Merkur

[eng]

   Před Vánoci jsem byl požádán o výrobu přípravku s motorkem pro stavebnici Merkur. Výrobce sice nabízí i nějaké elektronické komponenty, ale nic to neumí, dost to stojí, a je to tak na úrovni před padesáti lety. Tak jsem zabral šponu a v rekordním čase spíchl následující kontrolér pro krokový motorek. Doba trochu pokročila, takže jsem se rozhodl do toho integrovat Bluetooth modul a napsat aplikaci pro Android pro vzdálené ovládání. Nepředpokládám, že by tato konstrukce jako celek byla mnoha lidem užitečná, ale může posloužit jako příklad, jak se to (ne)má dělat a také jako zdroj ke kanibalizaci částí SW.

Kontrolér krokového motorku. Kontrolér krokového motorku.


1. Hardware

   Řadič je postaven na 8-bit mikrokontroleru AVR taktovaném na 20 MHz. Konkrétně jsem použil ATmega328PB, ale vešlo by se to hravě i do ATmega168PB. Jako krokový motor jsem použil NEMA 17 17HS4023 s bipolárním vinutím. Neměl jsem po ruce vhodný řadič krokových motorů a většina řadičů ani nejede pod nějakých 5 V, takže jsem použil co bylo po ruce a po ruce byl pytel budičů GaN-fetů 1EDN7512B. Jedná se o polomůstek s FETy s celkem malým odporem kanálů v malém pouzdře SOT23 a nic moc nestojí. Jediná nevýhoda je, že mají obvod pro detekci podpětí (UVLO) nastavený na cca 4,2 V. To je zásadní funkce pro použití jako budič MOSFETů (drží MOSFET bezpečně vypnutý), ale v této aplikaci jedna stana můstku padne do UVLO dříve než druhá a tím poteče celkem velký neřiditelný proud. Nedestruktivní, ale vybije to baterie. Proto MCU detekuje podpětí a deaktivuje oba budiče předem. Ke komunikaci přes Bluetooth je použit levný modul JDY33-TTL. Pro dosažení minimálního klidového odběru je výkonový stupeň, BT modul a dělič pro měření napětí spínán výkonovým P-MOSFETem. Zamýšlené napájení je ze 4xAA NiMh akumulátorů, takže je třeba omezit napětí MCU na 5 V. K tomu je použit LDO regulátor TI TPS709B50 s velmi malým klidovým proudem. Celkový odběr v uspaném režimu je cca 2 µA. Ovládání je pomocí čtyř tlačítek START, STOP, VLEVO a VPRAVO a jedním enkodérem pro nastavení rychlosti a směru otáčení.

Schéma zapojení.
obr. 1 - Schéma zapojení.

   Konstrukce je navržena do plastové krabičky MASZCZYK KM-276I/G. Je to trochu větší než bych chtěl, ale baterie jsou dost rozměrné. V nějaké příští verzi by se to dalo předělat na Li-ion, ale to by chtělo pořešit battery management a na to nebyl čas.

Zdrojáky k deskám v Eaglu jsou k dispozici na GitHubu.

Oszení TOP. Oszení BOTTOM.
obr. 2 - Deska plošných spojů.


2. Firmware

   Firmware jsem napsal v prostředí Microchip Studio v AVRGCC. Budiče motoru nemají zpětnou vazbu proudu, takže je proud řízen amplitudou sinus a cosinus signálů generovaných PWM výstupy AVR podle otáček motoru. Modulační frekvence je 78,125 kHz. Amplituda pro použitý motor je nastavena empiricky na proud cca 200 až 250 mA naprázdno. Maximální použitelné otáčky pro napětí 5 V jsou cca 270 ot/min. Pak se motor dostává do rezonance. Komunikace přes BT je řešena příjmem dat do kruhového bufferu v přerušení a následné zpracování povelů je řešeno v hlavní smyčce programu spolu se vším ostatním co není časově kritické. Povely jsou řešeny ve stylu SCPI syntaxe. Příkazy musí být zakončeny znakem LF (0x0A). Odpovědi jsou rovněž zakončeny LF. Příkazy lze řetězit středníky až do délky 127 znaků.

Příkaz Popis
*IDN?Vrátí identifikační řetězec.
*OPC?Po dokončení předchozích operací vrátí "1".
SYST:ERR?Vrátí poslední chybu.
SYST:VMON?Vrátí napětí baterie [V].
SYST:TEMP?Vrátí teplotu AVR [°C].
SYST:EESAVEUloží aktuální nastavení do EEPROM.
SLEEPUspí zařízení.
SLEEP:TIMEOUT <timeout>Nastaví timeout pro uspání [s].
SLEEP:TIMEOUT?Vrátí timeout pro uspání [s].
SPEED <speed>Nastaví rychlost motoru [ot/min]. Znaménko udává směr. Spustí motor.
SPEED?Vrátí aktuální rychlost motoru [ot/min]. Znaménko udává směr.
SPEED:SET?Vrátí poslední nastavenou rychlost motoru [ot/min]. Znaménko udává směr.
SPEED:LIMIT <speed>Nastaví limit rychlosti motoru [ot/min].
SPEED:LIMIT?Vrátí limit rychlosti motoru [ot/min].
MOT:ACC <acc>Nastaví akcelerační konstantu [ot/min/s].
MOT:ACC?Vrátí akcelerační konstantu [ot/min/s].
STARTSpustí motor poslední nastavenou rychlostí a směrem.
STOPZastaví motor.
DIR <direction>Nastaví směr otáčení CW nebo CCW. Zároveň spustí motor pokud byl zastaven.
tab. 1 - Seznam SCPI příkazů.

   Ruční ovládání je řešeno pomocí tlačítek a enkodéru. START probudí kontrolér. Další stisk spustí motor. STOP zastaví motor. Podržení STOP vypne zařízení (přechod do režimu spánku). Stisk LEFT nebo RIGHT spustí motor daným směrem. Enkodér nastavuje rychlost a směr motoru. Vybitá baterie je indikována červeně blikající LED a zařízení se vypne. V normálním stavu svítí LED zeleně. Při příjmu přes BT bliká LED zeleně.

Firmware je k dispozici na GitHubu.

Fusebity pro AVR jsou následující:
  Extended byte: CFD=0, BODLEVEL[2..0]=101
  High byte: BOOTRST=1, BOOTSZ[1..0]=00, EESAVE=0, WDTON=1, SPIEN=0, DWEN=0, RSTDISBL=1
  Low byte: CKSEL[3..0]=1111, SUT[1..0]=11, CKOUT=1, CKDIV8=1

3. Aplikace pro Android

   Zařízení lze ovládat přes terminál SCPI příkazy, ale není to zrovna praktické. Takže jsem se pokusil realizovat svou první aplikaci pro Android. Po krátkém průzkumu jsem zvolil Android studio a populární jazyk Kotlin. Kotlin se ukázal být dobrá volba. Proti např. C++ je nesrovnatelně jednodušší a pohodlnější. Původně jsem chtěl pro BT komunikaci použít jednu z dostupných knihoven, ale nějak se mi nepovedlo vyřešit kolize použitých knihoven. Tak jsem to zkusil naprogramovat pomocí základních Androidích knihoven a bylo to až překvapivě snadné: Získat seznam spárovaných zařízení, jedno vybrat, otevřít socket a vstupně/výstupní streamy. Toť vše. Největší zádrhel bylo udílení oprávnění pro BT komunikaci, které se liší pro různě verze Androidu. Problém byl také ošetřit situace, kdy BT zařízení zmizí, ale i to se snad nějak povedlo ošetřit. Aplikaci jsem testoval ve vezích Android 11 až 14. U verzí 11 a nižších může být problém s udělením oprávnění pro BT. Možná to bude chtít párkrát restartovat nebo udělit ručně.

Zdrojáky jsou k dispozici GitHubu.

Aplikace pro Android.
obr. 3 - Ovládací aplikace pro Android.
4. Licence

   Všechny části jsou distribuované pod licencí MIT.

(c) 2025, Stanislav Mašláň - Všechna práva vyhrazena.

Last update: 14.1.2025 Up