Projekt 12″

Luděk H↻ 2. 2. 2019

Modulární systém ovládání víceosých posuvů

114Ovládání krokových motorů
Luděk H

Na tři osy - tři motory - bude jedno Raspberry Pi 3B+ a tři drivery M752

114Při experimentování s mikroskopovým objektivem jsem do pokusů tak zabředl, až jsem se rozhodl pro další projekt, který jsem pracovně nazval 3D Mikro. Tento článek se věnuje SW/HW části, která je použitelná také u projektů 3D Makro nebo Digitalizační stolice. Uplatnit by se měla také u budoucího projektu technické ULF kamery nebo případných jiných projektů.

Pro ovládání krokových motorů jsem si zvolil univerzálnější modulární systém, kdy na začátku je jednodeskový počítač Raspberry Pi ovládající jeden konkrétní motor a na konci je počítač (v mém případě PC) s programem, který dle potřeby říká, kdo má co dělat. Tedy posílá příkazy na jednotlivé moduly systému. Modulární, protože může fungovat dle potřeby s jedním modulem nebo s libovolně vysokým počtem modulů. Tedy ať jde o případ, kdy jeden modul znamená jednu osu volnosti pohybu, pouze jednoosý posuv/rotace (například posuv pro skládané makro/mikro), až po en-osý systém složený z více modulů (uplatnění například pro stack and stitch).

Taková byla původní představa, ale později jsem došel k názoru, že toho jeden modul může zvládnout víc. Především pokud je libovolná skupina pohonu víceosého systému umístěna fyzicky v malé vzdálenosti od sebe. Příkladem je připravovaný tříosý systém počítačem řízeného posuvu pro projekt 3D Mikro, kde jsou tři krokové motory v malé vzdálenosti od sebe a množství vykonávaných kroků za jednotku času je tak malé, že by bylo úplně zbytečné neupravit původní myšlenku tak, aby libovolný modul systému nesdílel některou část pro více os. Zároveň s tímto rozšířením bude ponechána logika původní myšlenky.

Potřebné úkony tedy plynou z požadavku na jeden jednodeskový počítač Raspberry Pi, čemuž se budu věnovat v tomto článku. Tento počítač může řídit jednu či více os. Tento jednodeskový počítač tedy může být jeden v jednom modulu víceosého řízení nebo jich může být téměř libovolný počet, dle celkového počtu os a dle jejich reálného umístění v prostoru. Pokud je nachystán jeden, stačí kopii microSD karty vložit do jiného, provést několik přenastavení kvůli jedinečné identifikaci další osy (nebo skupiny os) a během chvíle může být vše hotovo.

Hardware - příprava jednodeskového Raspberry Pi 3B+

Raspberry Pi propojuji s drivery M752, kterým z GPIO pinů posílám signály DIR a STEP. To je logická úroveň pro směr otáčení motoru (0 pro jeden směr nebo 1 pro opačný směr otáčení) a impulz pro provedení kroku. Je zde háček v podobě rozdílné úrovně logiky. Výstupní napětí GPIO pinů u Rapberry Pi je 3.3V pro vysokou logickou úroveň (pro logickou jedničku), ale drivery požadují 5V logiku. Proto je ještě potřeba přidat konvertory logické úrovně. Pro tento účel jsem si našel levné "několika korunové" malinké řešení od firmy SparkFun s příznačným názvem SparkFun logic level converter, který jsem sehnal jen ve starším provedení, ale pro toto užití vyhovujícím.

Pro každou osu použiji jeden konvertor logické úrovně. Konvertory potřebují připojit zem (GND), napájení 5V a 3.3V, to využiji z GPIO konektoru, pin 1 (3.3V), pin 2 (5V) a na zem (GND) mohu využít kterýkoli z pinů 6, 14, 20, atd. Dle schématu Schéma Raspberry Pi 3B+ zapojení konektoru J8 nebo viz. stránka Raspberry Pi GPIO

Pro signály STEP, DIR jsem si zvolil piny 15 (GPIO22), 18 (GPIO24) - osa X, 29 (GPIO5), 32 (GPIO12) - osa Y a 37 (GPIO26), 40 (GPIO21) - osa Z. Drivery potřebují kromě logického signálu i zem (GND), tu zapojím z kabelu přívádějícího napájení k Raspberry Pi.

Software - příprava jednodeskového Raspberry Pi 3B+

Využívám systém Raspbian uložený na microSD kartě. Nejnovější obraz systému Raspbian uložím na kartu pomocí programu Rufus. Pro zálohování karty pod systémem W10 se mi pak osvědčil program dotNet Disk Imager.

Po prvním připojení k síti přes ethernetový kabel v prvé řadě provedu aktualizaci systému:

sudo apt-get update
sudo apt-get upgrade

popř. pokud je systém starší, tak i:

sudo apt-get distr-upgrade

Je vhodné aktivovat i synchronizaci času z internetu, předejde se tím několika problémům:

sudo apt install ntp
sudo systemctl enable ntp
sudo timedatectl set-ntp 1

Následujícím krokem je pro mě ulehčení práce na Raspberry Pi přes vzdálenou plochu pomocí VNC, abych nemusel k Raspberry Pi nic připojovat kromě napájení. Aktivace VNC je jednoduchá přes konfiguraci v menu: Raspberry Pi Configuration. K mé domácí wifi síti se mohou připojit jen zařízení ze seznamu povolených MAC adres, což doporučuji používat. Jen je na to třeba myslet a MAC adresu wlan0 doposud nepřipojovaného Raspberry Pi přidat do povolených MAC adres v nastavení routeru.

Dále provádím nastavení pomocí:

sudo nano /etc/network/interfaces

doplněním následujících řádků na konec souboru interfaces:

auto wlan0
iface wlan0 inet dhcp
  wpa-scan-ssid 1
  wpa-ap-scan 1
  wpa-ssid *ssid*
  wpa-psk *pw*

kde *ssid* je název wifi sítě a *pw* je heslo do této sítě.

Po tomto nastavení je tedy již možné používat VNC viewer v PC a připojovat se k Raspberry Pi přes wifi bez nutnosti mít k Raspberry Pi připojeno cokoli jiného než napájení.

Protože budu provádět krokování motory přes změnu stavu portů GPIO, je třeba stáhnout si knihovnu čipu ovládajícího GPIO piny. V Raspberry Pi 3B+ je tímto čipem Broadcom BCM 2837, ale je možné využít i dostupnou knihovnu pro starší typ čipu knihovna pro BCM 2835. Stažení knihovny i postup instalace knihovny je možné najít na stejné adrese.

Dále budu krokování ovládat (vyvolávat) přes HTTP REST příkazy posílané na Raspberry Pi. Pro tuto možnost jsem si našel jednoduchý Framework Ulfius.

Vše je tedy směřováno na výsledné programy kompilované z jazyka C. Ulfius poběží jako služba/služby naslouchající na zvolených portech. Jakmile dojde k zaslání REST příkazu například ke krokování, služba v tu chvíli spustí příslušný krokovací program a předá mu potřebné parametry. Program dle nich provede požadované krokování.

Krokovací program (jazyk C, soubor steps.c a hlavičky axis1.h, axis2.h a axis3.h)

Zdrojové kódy programu pro krokování

Pro lepší kontrolu bude tento program kromě argumentů zpracovávat také dva signály SIGTERM a SIGUSR1.

SIGTERM ukončí krokování bez dokončení požadovaného (zadaného) počtu kroků, ale ukončení bude provedeno korektně. Korektní ukončení znamená, že se do existujícího pomocného textového souboru započte aktuálně nakrokovaný počet kroků (přičte/odečte se doposud odkrokovaný počet kroků od stavu v souboru dříve zapsaném). Signál tak poslouží v případě požadavku k (nouzovému) zastavení krokování z jakéhokoli neočekávaného důvodu. Důvody mohou být například omylem zadaný nesmyslný počet kroků nebo spuštění krokování špatným směrem.

Uživatelský signál SIGUSR1 poslouží pro vrácení aktuální relativní pozice v průběhu krokování. V případě nevyvolání požadavku na vrácení aktuální pozice (relativního počtu kroků), bude pozice v podobě počtu kroků zapsána do pomocného souboru až po dokončení provádění požadovaného počtu kroků. V případě zaslání signálu SIGUSR1 dojde k okamžitému vytvoření dočasného souboru, do kterého se zapíše výpočet z pozice uložené v pomocném souboru spolu s aktuálně provedeným počtem kroků, a to bez přerušení krokování.

Program bude provádět krokování dle předaných argumentů. První argument - počet kroků, které má program vykonat (celé číslo). Druhý argument - směr krokování, vpřed = 0, dozadu = 1. Třetí argument - (plná) rychlost krokování, počet kroků za vteřinu. Čtvrtý argument - zrychlení/zpomalení ve dvou možných intervalech 0 až 20 (včetně) a nebo nad 20. 0 = plná rychlost po celou dobu krokování, tedy od prvního do posledního kroku. 1 = jedno procento kroků bude sloužit ke zrychlení a jedno procento ke zpomalení, číslo větší jak 20, tedy např. 21 = jednadvacet kroků bude využito ke zrychlování a dalších jednadvacet kroků ke zpomalování, atd. Pokud bude celkový počet kroků, které má program vykonat, menší než počet kroků požadovaných v součtu ke zrychlení a zpomalení, dojde k rozpůlení celkového počtu kroků a pouze tento nižší počet kroků bude využit ke zrychlení a následně ke zpomalení.

Volání programu tedy bude vypadat například následovně:

sudo steps1 1000 1 500 0

První osa provede tisíc (1000) kroků dozadu (1) rychlostí pět stovek (500) kroků za vteřinu bez (0) zrychlování/zpomalování (krokováno bude okamžitě plnou rychlostí od začátku do konce). Krokování bude v tomto příkladu tedy trvat dvě vteřiny.

Zrychlování a zpomalování bude opisovat křivku S. Využita bude funkce f(x) = x^3 pro změnu rychlosti zrychlování/zpomalování. x = 0 ... nulové zrychlování - na začátku a po dosažení plné rychlosti, x = 1 - maximální zrychlování v polovině počtu kroků určených pro zrychlování/zpomalování, x = -1 - maximální zpomalování v polovině počtu kroků určených pro zrychlování/zpomalování. Zrychlovat se bude z počáteční rychlosti deset kroků za vteřinu a zpomalovat do stejné konečné rychlosti. Pokud bude požadovaná maximální rychlost menší a rovna deseti krokům za vteřinu, nastavená hodnota zrychlování/zpomalování bude automaticky vynulována, tedy od začátku do konce se provede krokování pouze plnou rychlostí, protože v tak nízkých krokovacích rychlostech postrádá zrychlování/zpomalování na významu.

Program pro jednu osu sestavuji příkazem:

sudo gcc -O2 -march=native steps.c -o /usr/local/bin/steps1 -l bcm2835 -lm -D SELAXIS=\"axis1.h\"

Pro snadnější používání (pro spouštění odkudkoli, což bude využito pro následně připravenou službu) je sestavení provedeno přímo do adresáře, který je ve výčtu cest proměnné $PATH. Abych si ještě víc zjednodušil sestavení při případných příštích úpravách, připravil jsem si soubor Makefile, kdy pak stačí zadat z aktuálního adresáře se zdrojovým kódem tento příkaz:

sudo make

Tím dojde k provedení příkazů ze souboru Makefile, který sestaví všechny tři následně používané krokovací programy v cílové složce.

Jednotlivé osy čísluji, tedy nemají označení X, Y a Z, ale čísla 1, 2 a 3. Fyzická poloha driverů bude také v tomto pořadí, aby se snadno orientovalo v zapojení, používání nebo hledání případných problémů.

Program webové služby (jazyk C, soubor simple_example.c a hlavičky axis1.h, axis2.h a axis3.h)

Upravený příkladový program pro framework Ulfius

Pro zpracování REST příkazů budou využity služby na portech 1210, 1211, 1212. Již dříve jsem používal pro osu Z port 1212 (první osa pro makro), a protože je to v novém projektu osa poslední, tak byla volba čísel portů pro předcházející osy čistě logická. Vytvořený program vychází přímo z příkladu nacházejícího se v adresáři framework Ulfius - example_programs - simple_example, protože vyhovuje účelu a pěkně demonstruje co potřebuji.

Návod k instalaci viz. https://github.com/babelouest/ulfius/blob/master/INSTALL.md

Aktuálně tedy například:

sudo apt install -y libmicrohttpd-dev libjansson-dev libcurl4-gnutls-dev libgnutls28-dev libgcrypt20-dev libsystemd-dev
wget https://github.com/babelouest/ulfius/releases/download/v2.5.2/ulfius-dev-full_2.5.2_raspbian_stretch_armv6l.tar.gz
tar xf ulfius-dev-full_2.5.2_raspbian_stretch_armv6l.tar.gz
sudo dpkg -i liborcania-dev_1.2.9_raspbian_stretch_armv6l.deb
sudo dpkg -i libyder-dev_1.4.4_raspbian_stretch_armv6l.deb
sudo dpkg -i libulfius-dev_2.5.2_raspbian_stretch_armv6l.deb

Názvy souborů se budou časem lišit, dle aktuální verze. Pro stažení zdrojových (a hlavně příkladových souborů) pak poslouží příkaz:

git clone https://github.com/babelouest/ulfius.git

Nyní se již v aktuálním (vybraném, v mém případě /home/pi) adresáři nachází složka ulfius, ve které je vše potřebné. Upravovaný kód pro mou potřebu se tedy nachází v adresáři /home/pi/ulfius/example_programs/simple_example. Opět jsem pro zjednodušení provedl úpravu i souboru Makefile, který stejně jako v případě krokovacích programů vytvoří v cílové složce /usr/local/bin tři spustitelné programy pro jednotlivé služby, pro každou osu jeden program očekávající příkazy na jednom portu.

Připravený program simple_example.c umožní přijmout a interpretovat několik povelů: /forward, /backward, /pos, /zero, /stop a /shutdown.

Příklad použití:

http://10.0.1.19:1210/forward/1000/500/5

Kdy IP adresa 10.0.1.19 je adresa na kterou se Raspberry Pi na wifi připojilo. Port 1210 říká, že jde o první osu (tedy osu X), /forward spustí krokování vpřed (dojde k přičítání provedených kroků), 1000 - tolik provede kroků, 500 - takovou rychlost, 5 - procento kroků akcelerace/decelerace (pět procent počtu kroků poslouží nejprve k akceleraci a nakonec k deceleraci).

Příkaz /pos vrátí relativní pozici. Pokud neběží krokování, je pozice přečtena z pomocného souboru. Pokud aktuálně běží krokování, je zaslán signál SIGUSR1 a vrácena relativní pozice z dočasného souboru.

Příkaz /zero vynuluje relativní pozici - přepíše obsah pomocného souboru relativní pozice novým obsahem, číslem nula.

Příkaz /stop v případě spuštěného krokovacího programu zašle tomuto programu signál SIGTERM.

Příkaz /shutdown provede stejně jako příkaz /stop zastavení krokování zasláním signálu SIGTERM, pokud je krokování prováděno, a následně požádá o vypnutí systému. Vypnutí je odloženo o minutu. Pro korektní ukončení práce s Raspberry Pi a pro následné vypnutí napájení je dobré počkat například přibližně minutu a půl od vyslání signálu k vypnutí.

Touto sadou příkazů tak bude možné ovládat na výsledném stroji vše potřebné vzdáleně, bez nutnosti připojit se k Raspberry Pi ať už přímo nebo přes VNC. Připojení přes VNC i přesto nechávám dostupné, např. pro aktualizaci systému nebo pro případ vyskytnutí se jiných problémů. Pro běžný provoz, kdy pokud se něco stane, poslední funkční stav obnovím pomocí záložní kopie obrazu paměťové karty. Samozřejmě by bylo možné upravit další nastavení systému Raspbian (vypnutí VNC serveru, nespouštění grafického rozhraní, atp.), kdy po těchto úpravách by byl provoz šetrnější k hardware prostředkům Raspberry Pi.

Instalace služeb (soubory httprest1.service, httprest2.service a httprest3.service)

Skripty služeb pro HTTP REST

Aby běžela HTTP služba na pozadí a vždy automaticky po spuštění Raspberry Pi, tedy bez potřeby manuálního spouštění, je třeba použít soubory služeb (httprest1.service, ..) a nakopírovat je do adresáře /usr/lib/systemd/system/. Ze složky se soubory služeb tedy pomocí příkazů:

sudo cp httprest1.service /usr/lib/systemd/system/httprest1.service
sudo cp httprest2.service /usr/lib/systemd/system/httprest2.service
sudo cp httprest3.service /usr/lib/systemd/system/httprest3.service

A nyní již stačí jen služby povolit a spustit:

sudo systemctl enable httprest1.service
sudo systemctl start httprest1.service

sudo systemctl enable httprest2.service
sudo systemctl start httprest2.service

sudo systemctl enable httprest3.service
sudo systemctl start httprest3.service

V této chvíli je již vše v rámci jednoho modulu hotovo a při každém dalším spuštění jednodeskového počítače Raspberry Pi je možné posílat příkazy na zvolené porty. Pro zásadní ušetření času stráveného výše popsanou prací, je dobré v tomto stavu z korektně vypnutého Rapberry Pi vytáhnout microSD kartu a uložit si její obraz jako zálohu. Vzhledem k (ne)kvalitě microSD karet může časem dojít například k poškození karty. Pokud k tomu dojde, tak při existenci zálohy stačí jen vzít jakoukoli novou kartu, nahrát na ni zazálohovaný obraz a vše opět funguje jako před poruchou.

Připravené či upravené programy v ZIP archivech dávám k dispozici ke stažení pod licencí GPL.

Části pro projekt 3D Mikro

Zdrojové soubory pro Raspbery Pi 3B+

zip   •   Steps.zip

Zdrojové kódy programu pro krokování

Program pro krokování v jazyce C psaný pro Rapberry Pi 3B+

zip   •   Httprest.zip

Upravený příkladový program pro framework Ulfius

Program pro kontrolu krokování dle předaných příkazů přes HTTP REST.

zip   •   Services.zip

Skripty služeb pro HTTP REST

Soubory slouží sestaveným programům z frameworku Ulfius, aby automaticky běžely jako služby po spuštění Raspberry Pi 3B+.

Související odkazy

SparkFun logic level converter

https://www.sparkfun.com/products/retired/11978

Konvertor logické úrovně značky SparkFun.

Schéma Raspberry Pi 3B+

https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_3bplus_1p0_reduced.pdf

Schéma zapojení jednodeskového počítače Raspberry Pi 3B+

Raspberry Pi GPIO

https://www.raspberrypi.org/documentation/usage/gpio/README.md

Zapojení pinů GPIO rozhraní u Raspberry Pi jednodeskových počítačů.

Rufus

https://rufus.ie

Program pro zápis obrazu systému na paměťová média.

knihovna pro BCM 2835

http://www.airspayce.com/mikem/bcm2835

Knihovna v jazyce C pro Broadcom BCM 2835 používaný v Raspberry Pi. Je možné použít i pro novější BCM 2837.

Framework Ulfius

https://github.com/babelouest/ulfius

Framework slouží k napsání HTTP REST služby v jazyce C.

Raspbian

http://raspbian.org

Operační systém pro jednodeskové počítače Raspberry Pi.

Zařazení pod klíčové výrazy

Fototechnika: 20X Mitutoyo Plan Apo Infinity Corrected Long WD Canon EOS 5D Mark IV Elinchrom ELC Pro HD 1000 Raynox DCR-150

Kategorie: Dokument Makro (při zvětšení nad 10:1 po 1:1) Mikro (při zvětšení nad 30:1 po 10:1) Technika Z blízka (při zvětšení nad 1:1 po 1:10) Zátiší Zlepšovák

Projekt: 3D Makro 3D Mikro CNC Digitalizační stolice

Záznamové médium: 24x36 mm digi (FF)