Robot Control Board

Úvod

Při návrhu vlastní řídicí jednotky pro mobilní roboty jsem vycházel ze svých zkušeností s platformou Arduino. Ta i úplným začátečníkům umožní proniknout do problematiky mikropočítačů a výrazně zjednodušuje tvorbu vlastních programovatelných zařízení. A lze ji samozřejmě využít i při stavbě robota, což jsem v praxi otestoval na Ardubotovi. Nicméně samotné Arduino slouží pouze jako mozek a neobejdeme se bez dalších součástek, které musíme připojit pomocí konektorů a kablíků. To není zrovna moc praktické a paluba robota se brzy promění v nepřehlednou spleť vodičů. Takže se přímo nabízí možnost navrhnout si vlastní desku s elektronikou, která bude obsahovat všechny základní prvky nutné pro řízení robota a přitom půjde programovat stejně snadno jako Arduino. Robot Control Board (dále jen RCB) přesně tyto požadavky splňuje.

V následujícím článku bych RCB rád představil a zároveň poskytl alespoň základní návod k obsluze pro ty, kteří by měli zájem si ji vyrobit. Mnohými záležitostmi jsem se již dříve zabýval v článcích na svých stránkách a v časopise Robot Revue. Nicméně, nechtěl jsem neustále odkazovat na starší texty a mým cílem bylo zpracovat ucelený dokument, který snad pomůže hlavně všem, kteří zatím nemají tolik zkušeností a potřebují se opřít o nějaký zdroj informací. V žádném případě nemám ale v úmyslu psát podrobnou příručku, ve které půjde najít všechno. Spíše chci zmínit nejdůležitější informace a vše další lze nalézt na web stránkách Arduina.

Předem se omlouvám za pravděpodobně nepřesnou terminologii. V angličtině se totiž používá slovo „sketch“ k označení programu pro Arduino a stále jsem se nebyl schopen rozhodnout, zda ho v češtině nahradit slovem program nebo použít počeštěný skeč. Řešení tohoto problému raději nechám jazykovědcům a v tomto článku se bude vyskytovat skeč. Čtenář mi snad odpustí, když ho někde ze zvyku zaměním za program.

Hardware

Srdcem je mikropočítač ATmega328 s Arduino bootloaderem*, díky němu se RCB po připojení k PC chová úplně stejně jako Arduino a lze ji stejným způsobem programovat v jazyce Wiring, využívat veškeré knihovny atd. Obsluhu motorů zajišťuje obvod L293D , případně jeho výkonnější ekvivalent SN754410. Podsvícený LCD displej zase umožní okamžité zobrazení dat ze senzorů nebo jakýchkoliv sdělení, což výrazně usnadňuje kontrolu běhu programu a hledání případných chyb. RCB dále obsahuje lowdrop stabilizátor napětí L4940V05, tři indikační LED a konektory pro připojení komunikačních modulů USB a bluetooth.

*Bootloader je malý program, který musí být uložen do paměti ATmegy, aby fungovala jako Arduino. Po restartu procesoru bootloader kontroluje, zda přichází na pin Rx z PC nějaký náš nový skeč a pokud ano, uloží jej za sebe do paměti a spustí. Pokud tomu tak není, spustí poslední uložený skeč. Díky tomuto principu lze ATmegu programovat bez speciálního programátoru.

K řídicí jednotce lze připojit samozřejmě další zařízení – senzory, serva, bzučáky a podobně. K tomu slouží 7 volných pinů ATmegy, lze je všechny využít jako vstupy i výstupy, 6 z nich je vybaveno A/D převodníky. Tyto piny jsou přístupné pomocí konektorů, které odpovídají standardnímu servokabelu. Ten znají především modeláři, uspořádání vodičů je následující – signál/napájení 5V/GND. Jinými slovy lze externí zařízení, ať už senzor nebo třeba servo pomocí těchto konektorů nejen připojit k mikropočítači, ale rovnou i napájet.

Po nahrání bootloaderu se v podstatě z obyčejné ATmegy stává Arduino. Ve schématu jsem tedy pro přehlednost použil k označení pinů ATmegy názvy jednotlivých vstupů/výstupů Arduina. Například D2 je digitální pin č. 2, který lze použít jako vstup i výstup. Fyzicky ale odpovídá 4. vývodu pouzdra ATmegy. A0 pak analogový pin s číslem 0, můžeme jej použít jako analogový vstup nebo digitální výstup, odpovídá 23. vývodu pouzdra atd.

Výroba

Hned při prvním pohledu na schéma a rozvržení plošného spoje (motiv, potisk strany součástek) je zřejmé, že jednoduchost přímo vybízí k domácí výrobě. Deska plošných je pouze jednostranná, součástek není mnoho a všechny jsou ve standardní velikosti, takže pájení zvládne s trochou šikovnosti každý kutil. Podsvícení displeje můžeme a nemusíme zapojit, protože k tomu slouží drátové propojky. Bohužel jsem se setkal s tím, že některé displeje měly právě u podsvícení přehozenou polaritu. Proto je třeba vždy zkontrolovat datasheet, informace na zadní straně displeje a teprve podle toho propojky zapájet. V rozích desky jsou volná místa pro vyvrtání montážních otvorů.

Napájení

RCB umožňuje napájet odděleně elektroniku, která vyžaduje 5 V (přes stabilizátor L4940V05), a pohon robota. Motory odebírají napětí ze svorkovnice 4 a elektronika ze svorkovnice 1. Oddělené napájení má výhodu v tom, že při velkém poklesu napětí (vybití baterií, zablokování motorů) nedojde ke kolapsu řídicí elektroniky, například restartu ATmegy. U malého robota ale tuto možnost nevyužijeme, protože by musel vést dvě sady akumulátorů nebo baterií. Na svorkovnice 1 i 4 tedy přivedeme jednotné napájení. Doporučuji 5ti nebo 6ti článek. Lze použít i vyšší napětí, omezující jsou pak maximální dovolené hodnoty pro L293D (SN754410) a stabilizátor L4940V05 – viz datasheety. Okolo patice pro L293D zůstává dostatek volného místa pro umístění chladiče, ale při nízkých proudových odběrech ho lze vynechat. Maximální proud, který může dodávat L293D jednomu motoru je 0,6 A respektive 1 A u výkonnější alternativy SN754410. Nemělo by se zapomínat ani na odrušení motorů pomocí keramických kondenzátorů. Jeden kondenzátor napájíme mezi vývody motoru, další dva pak vždy mezi vývod a plášť.

Připojení k PC

Abychom mohli RCB připojit k počítači, potřebujeme USB-UART převodník. Arduino ho už obsahuje a je vybaveno přímo USB konektorem. Nicméně u malého mobilního robota nepředpokládáme, že by byl k PC stále připojen. Takže pokud převodník použijeme jen pro programování, přišlo mi zbytečné, aby ho robot vozil s sebou. Navíc převodník je univerzální a můžeme ho používat i jinde. Proto jsem zvolil následující řešení – využil jsem hotového modulu převodníku FTDI Basic Breakout - 5V, který lze zakoupit u firmy PV Electronic. Stačí ho připojit plochým kabelem s konektorem. Díky tomuto převodníku a bootloaderu se deska chová po připojení k počítači přesně jako Arduino. Dále musíme stáhnout ze stránek www.arduino.cc vývojové prostředí, označované jako IDE (Integrated Development Environment). Stačí ho pouze rozbalit a hned půjde spustit, adresář navíc obsahuje ovladače, které budeme za chvíli potřebovat. Připojíme RCB přes převodník k počítači a zapneme napájení, PC po chvíli objeví nový hardware a zahájí jeho instalaci. Potřebné ovladače nejspíš nenalezne, a proto mu nabídneme adresář drivers/FTDI USB Drivers. Pokud byla instalace úspěšná, jsme hotovi. Převodníku byl přiřazen USB Serial Port, který najdeme ve správci zařízení, na mém notebooku je to COM8.

Ve vývojovém prostředí stačí nastavit číslo COM portu a typ Arduina na Duemilanove. Obojí najdeme v nástrojích (Tools -> Serial Port, Tools -> Board) . Dále snad IDE není nutné zdlouhavě popisovat. Na horním panelu jsou umístěna nejdůležitější tlačítka – Verify, Upload, New, Open, Save a úplně vpravo Serial monitor. Pod nimi je pracovní prostor pro psaní skeče a úplně dole okno se zprávami, kde se zobrazí například syntaktické chyby a podobně. Vše by mělo fungovat hned napoprvé a bez problému, zkrátka lze s RCB pracovat úplně stejně jako s Arduinem. Rozdíl najdeme pouze u napájení, vzhledem k určení řídicí jednotky pro mobilní roboty, ji není možné napájet z USB portu. I při programování necháme tedy připojené akumulátory nebo baterie. Oproti Arduinu postrádá deska také ISP konektor a nelze ji naprogramovat pomocí programátoru. Podrobný návod jak začít s Arduinem - Getting Started with Arduino.

Arduino IDE - Integrated Development Environment

Základ programování a první pokusy

Mnohé asi potěší to, že případná znalost C/C++ bude velkou výhodou - jazyk Wiring pro Arduino z něj totiž vychází. A stačí umět opravdu jen naprosté základy - podmínky, cykly, datové typy atd. a programování vám půjde brzy od ruky. Nicméně ani úplným začátečníkům by zvládnutí nemělo činit velký problém. Výrazně pomůže spousta dostupných vzorových programů a hlavně kompletní vysvětlení jazyka v sekci Learning a Reference.

Kdo s Arduinem už někdy pracoval, zná základní strukturu programu neboli skeče, který se skládá z funkcí setup a loop. Setup proběhne vždy pouze jednou po zapnutí a hodí se k provedení nastavení nutných pro další běh programu. Loop pak běží stále dokola až do vypnutí. Mezi naprosto základní příkazy patří digitalWrite(pin, stav); do prvního parametru, tedy místo slova „pin“ napíšeme číslo pinu a do druhého místo slova „stav“ logickou úroveň low nebo high:

      digitalWrite(13, HIGH);
      digitalWrite(13, LOW);
      

A co se stane? Na příslušném pinu, například 13, naměříme napětí 5 V v případě logické úrovně high a naopak 0 V v případě low. Takto můžeme například rozsvítit a zhasnout LED diodu. Dále budeme rozhodně potřebovat, aby mikropočítač prostě jen chvíli počkal, toho dosáhneme pomocí delay(čas); – za čas dosadíme požadovanou délkou pauzy v milisekundách:

      delay(1000);
      

Každý příkaz je nutné ukončit středníkem a jednotlivé bloky příkazů uzavřít do složených závorek {}. Náš první skeč bude vypadat následovně:

      void setup() 
      {                
      pinMode(13, OUTPUT);      // nastaví pin 13 jako výstup   
      }

      void loop()               
      {
      digitalWrite(13, HIGH);   // zapnutí LED
      delay(500);               // čekání 500 milisekund
      digitalWrite(13, LOW);    // vypnutí LED
      delay(500);               // čekání 500 milisekund
      }
      

Po kliknutí na tlačítko Upload bude nahrán do ATmegy, během tohoto procesu se rozblikají LED označené RX a TX na FTDI převodníku. Ihned po ukončení uploadu se skeč spustí - pinu 13 náleží žlutá LED dioda, která by měla blikat v půl sekundových intervalech. Pro úplnost doplním, že ve funkci setup jsme pin 13 nastavili jako výstup pomocí pinMode().

LCD displej

Je připojen k pinům D7, D8, D9, D10, D11, D12. Ty pochopitelně NELZE použít k jiným účelům. Displej disponuje dvěma řádky a na každém z nich zvládne zobrazit 16 znaků. Vzorový skeč demonstruje použití základních příkazů. Nejde o nic složitého a vše by mělo být zřejmé z komentářů. Pozastavil bych se ale u nastavení kursoru pomocí lcd.setCursor(0, 1), první argument reprezentuje číslo znaku a je třeba pamatovat na to, že číslování začíná nulou. Proto prvnímu znaku odpovídá 0, druhému 1, třetímu 2 atd. V druhém argumentu nastavíme řádek displeje, číslování funguje stejně jako u znaků. Vysvětlení by zasloužila také funkce millis() i když nemá s LCD nic společného, ale použil jsem ji pouze pro „naplnění“ proměnné x hodnotami. Může se hodit někdy v budoucnu, protože vrací počet milisekund, které uběhly od spuštění aktuálního skeče, takže po vydělení tisícem dostaneme počet sekund. Z osobní zkušenosti si dovolím tvrdit, že pro běžnou práci s displejem to naprosto stačí, podobnosti a další možnosti pak naleznete na stránkách Arduina.

      // Vzorový skeč - použití LCD
      // import knihovny 
      #include <LiquidCrystal.h>

      // nastavení pinů, ke kterým je displej připojen
      LiquidCrystal lcd(11, 12, 10, 9, 8, 7);

      // deklarace proměnné
      int x;

      void setup()
      {
      // inicializace displeje
      // nastavení počtu znaků a řádků
      lcd.begin(16,2);
      }

      void loop()
      {
      // uložení hodnoty do proměnné  
      x = millis() / 1000; 
      // zobrazení zprávy  
      lcd.print("TEST DISPLEJE:");
      // nastavení kurzoru na první znak
      // druhého řádku
      lcd.setCursor(0, 1);
      // zobrazení hodnoty proměnné x
      lcd.print(x);
      delay(1000);
      // vymazání displeje
      lcd.clear();
      }
      

Motory

Jako další krok následuje zprovoznění motorů, nejprve si ale řekneme pár základních informací o tom, jak vlastně obvod L293D (SN754410) pracuje. Piny označené jako 1,2 EN a 3,4 EN jsou trvale připojeny na 5 V přes rezistory, tím povolíme ovládání motorů pomocí vstupů 1A, 2A, 3A a 4A. Levému motoru náleží 1A a 2A, což odpovídá pinům ATmegy D6 a D5. Pravému pak 3A a 4A – ATmega D4 a D3. Z toho vyplývá, že při programování piny D3, D4, D5 a D6 slouží výhradně k ovládání motorů. Jak na to nejlépe objasní tabulka, nicméně směr otáčení může být na konkrétním robotu opačný, záleží totiž, jak jsme zapojili motory. Pokud k tomu dojde, stačí motor přepólovat.

Ovládání motorů

K řízení motoru použijeme dva příkazy, například digitalWrite(5, HIGH); digitalWrite(6, LOW) a podobně. Toto řešení ale po chvíli nejspíš označíme za velmi neohrabané, protože motor můžeme pouze zapnout na plný výkon anebo vypnout. Daleko lepší bude plynulé ovládání pomocí PWM (Pulse Width Modulation). Co to znamená v praxi? Stav pinu pořád můžeme nastavit pouze na úroveň low nebo high (vypnuto/zapnuto) a nic mezi tím. Ale lze generovat pravidelný puls. Poměr délky pulsu (výstup ve stavu high) a doby, kdy je výstup vypnutý (low) pak určuje výkon motorů. V angličtině se tento poměr nazývá duty cycle. Naprosto stejně se dá tato metoda použít k regulaci jasu LED diody. ATmega zvládne osmibitové PWM, takže výkon motoru můžeme nastavit v 256 úrovních, tedy od 0 (vypnuto) do 255 (plný výkon). Použití je skutečně jednoduché, stačí jediný příkaz analogWrite(pin, pwm) V prvním parametru nastavíme pin, na kterém chceme puls generovat a ve druhém požadovanou úroveň výkonu. ATmega disponuje celkem 6 piny, na kterých lze PWM použít - D3, D5, D6, D9, D10 a D11.

Pamatovat si, ke kterým pinům jsme připojili který motor a potřebné kombinace příkazů pro zpátečku, zastavení a podobně, není zrovna praktické. Proto pro jednotlivé úkony u každého motoru naprogramujeme jednoduché funkce a zvolíme vhodné názvy. Díky tomu bude i výsledný kód velmi přehledný. Ve vzorovém skeči nabízím kompletní řešení k ovládnutí dvoumotorového robota, ať už pásového nebo kolového. Řízení je pak skutečně hračka, stačí využívat funkcí, například R_MOTOR_FWD(100) - right motor forward (pravý motor vpřed), v parametru nastavíme rychlost, dále R_MOTOR_STOP() - pravý motor zastavit, R_MOTOR_REV(50) - right motor reverse (zpětný chod). Analogicky pak obsluhujeme i levý motor. Názvy funkcí jde samozřejmě podle libosti změnit.

      // Vzorový skeč
      // Plynulé ovládání motorů

      // přiřazení pinů 
      #define R_MOTOR_A 3 // pwm
      #define R_MOTOR_B 4 // bez pwm
      #define L_MOTOR_A 5 // pwm
      #define L_MOTOR_B 6 // pwm

      // Pravý motor:
      // vpřed
      void R_MOTOR_FWD(int pwm) 
      {
      analogWrite(R_MOTOR_A, pwm); 
      digitalWrite(R_MOTOR_B, LOW);
      }

      // stop
      void R_MOTOR_STOP()
      {
      digitalWrite(R_MOTOR_A, LOW); 
      digitalWrite(R_MOTOR_B, LOW);
      }

      // vzad
      void R_MOTOR_REV(int pwm) 
      {
      pwm = 255 - pwm;
      analogWrite(R_MOTOR_A, pwm); 
      digitalWrite(R_MOTOR_B, HIGH);  
      }

      // Levý motor:
      // vpřed
      void L_MOTOR_FWD(int pwm)
      {
      analogWrite(L_MOTOR_A, pwm); 
      digitalWrite(L_MOTOR_B, LOW);
      }

      // stop
      void L_MOTOR_STOP()
      {
      digitalWrite(L_MOTOR_A, LOW); 
      digitalWrite(L_MOTOR_B, LOW);
      }

      // vzad
      void L_MOTOR_REV(int pwm) 
      {
      digitalWrite(L_MOTOR_A, LOW); 
      analogWrite(L_MOTOR_B, pwm);
      }

      void setup()
      {
      // definujeme piny jako výstupy  
      pinMode(L_MOTOR_A,OUTPUT);
      pinMode(L_MOTOR_B,OUTPUT);
      pinMode(R_MOTOR_A,OUTPUT);
      pinMode(R_MOTOR_B,OUTPUT);

      R_MOTOR_STOP();
      L_MOTOR_STOP();
      delay(2000);
      }

      void loop()
      {
      // voláme funkce, v parametru nastavíme
      // rychlost motorů v rozmení 0 až 255
      R_MOTOR_FWD(240);
      L_MOTOR_FWD(240);
      delay(1000);
      R_MOTOR_REV(150);
      L_MOTOR_REV(150);
      delay(1000);
      R_MOTOR_STOP();
      L_MOTOR_STOP();
      delay(1000);
      }
      

Ultrazvukový senzor SRF05

Zatím by ale náš robot jezdil poslepu a proto ho musíme vybavit i nějakým senzorem. Já jsem zvolil ultrazvukový dálkoměr – SRF05, pomocí kterého budeme detekovat překážky. Využijeme principu, který vynalezla sama příroda, a člověk ho mohl například od netopýrů úspěšně okopírovat. Rozsah dálkoměru je 1 cm až 4 metry.

Na senzoru najdeme celkem 10 pinů / pájecích plošek. Pět z nich nás vůbec nebude zajímat, protože slouží během výroby k naprogramování interního mikropočítače. Dále dva napájecí (5V, zem) a pak piny označované jako trigger input, echo output a mode. Obrázek s uspořádáním pinů jsem převzal z dokumentace dostupné na internetu.

K připojení dálkoměru bychom potřebovali celkem 4 vodiče a zabral by nám 2 piny ATmegy. Pro jeden senzor bychom to mohli považovat za zbytečný luxus, a proto využijeme druhého módu. Ten aktivujeme připojením pinu mode na zem. Umožní nám trigger input a echo output skloubit do jednoho, takže jeden pin ATmegy použijeme ke spuštění měření a pak jako vstup pro impulz, ze kterého vypočteme vzdálenost.

Obsluhu senzoru bude zajišťovat samostatná funkce US_senzor, která rovnou zajistí i přepočet vzdálenosti na centimetry. Deklarujeme ji klíčovým slovem int. To znamená, že datový typ návratové hodnoty je integer, ten slouží k uložení celých čísel od -32768 do 32767. Jednoduše řečeno, funkce US_senzor nám vrátí celočíselný výsledek měření v centimetrech, který pak můžeme uložit do proměnné, zobrazit na displeji a podobně.

      // Vzorový skeč - ultrazvukový senzor SRF05
      // číslo pinu, ke kterému 
      // je senzor připojen
      #define SRF05 2 

      int US_senzor()
      {
      // zahájení měření
      // pin je třeba nastavit jako výstup
      pinMode(SRF05, OUTPUT);
      digitalWrite(SRF05, HIGH);
      delayMicroseconds(10);
      digitalWrite(SRF05, LOW);

      // pin musíme změnit na vstup
      // zjištění délky pulzu a přepočet na cm
      pinMode(SRF05, INPUT);
      int vzdalenost = pulseIn(SRF05, HIGH) / 58;

      // návratovou hodnotou je vzdálenost v cm
      return vzdalenost;
      }
      

A/D převodníky

Spousta senzorů nám ale na rozdíl od toho ultrazvukového bude předávat naměřené hodnoty v podobně různě velkého napětí na výstupu. Analogově digitální převodník (ATmega 328 jich má celkem 6) umí napětí od 0 do 5 V změřit a převést na hodnotu v rozsahu 0 až 1023, se kterou pak můžeme dále pracovat. Místo „pin“ dosadíme číslo požadovaného převodníku – 0 až 5.

      x = analogRead(pin); // přiřazení hodnoty do proměnné
      lcd.print(analogRead(pin)); // zobrazení na LCD
      

Pro vyzkoušení práce s převodníky se výborně hodí potenciometr, který pak můžeme využít jako ovládací prvek a podobně. Stačí jezdec potenciometru připojit na analogový vstup, jeden krajní vývod na 5 V a druhý na zem. Pokud použijeme potenciometr lineární, bude se hodnota analogRead() měnit přesně v souladu s otáčením jeho osou. Dalším příkladem senzoru s analogovým výstupem je infračervený dálkoměr Sharp GP2Y0A41 s rozsahem 4 až 30 cm. Předpokládejme, že máme protikus konektoru s volnými vodiči - dva jsou napájecí, tedy 5 V a zem, třetí signální, obvykle žluté barvy, připojíme na analogový vstup RCB. Naměřené hodnoty bohužel nejsou přímo úměrné vzdálenosti, ale odpovídají grafu, který jsem vytvořil na základě experimentů se starším modelem čidla. Nicméně jejich charakteristiky by se neměly výrazně lišit.

Tlačítka a spínače

Jako úplně nejjednodušší vstupní zařízení můžeme s trochou nadsázky označit i obyčejné tlačítko nebo vypínač, které na vstup ATmegy přivede bud 5 V a bude detekován stav HIGH nebo naopak 0V – LOW. Využití se nabízí v podstatě dvojí. Zaprvé tlačítko můžeme stisknout sami a spustit tak libovolnou skupinu příkazů ručně nebo použijeme například mikrospínač s dlouhou páčkou, která zajistí stisknutí, když náš robot třeba nabourá do překážky. Čtení digitálního vstupu a uložení jeho hodnoty do proměnné provedeme příkazem:

      x  = digitalRead(pin);
      

Místo „pin“ napíšeme číslo vstupu. Pochopitelně lze hodnotu zobrazit na LCD, použít ji při konstrukci podmínek a tak podobně. Dotykový nárazník vyrobený z mikrospínače s páčkou, kterou navíc můžeme dle libosti vytvarovat, je vhodným doplněním ultrazvukových nebo infračervených senzorů. Zejména pokud si jich z finančních důvodů nemůžeme dovolit větší počet kusů, spínače jsou totiž na rozdíl od drahých čidel desetikorunová položka. Aby to ale nebylo zase tak jednoduché, musíme vstup s tlačítkem připojit přes rezistor na zem. Díky tomu při rozepnutém tlačítku naměříme skutečně požadovanou logickou úroveň low. Vstupy jsou totiž velmi citlivé a reagují s radostí na všechno – statickou elektřinu, rušení od motorů a podobně.

Modelářská serva

Použití modelářských serv je velmi výhodné, pokud chceme, aby se část robota (například plošina s nějakým senzorem, manipulační rameno a podobně) pohybovala v omezeném rozsahu a zároveň potřebujeme poměrně přesně definovat její polohu. Pohyb serv bývá omezen na necelých 180°, jednotlivé typy a různí výrobci se v tomto mohou lišit. Poloha osy odpovídá šířce řídicího pulzu, který se opakuje každých 20 ms. Většina serv reaguje na pulzy od 0,5 ms do 2,5 ms. Na trhu je dostupná celá škála velikostí serv od miniaturních až po velká s vysokým krouticím momentem pro náročné aplikace.

K napájení potřebují 5 V, obvykle zvládnou pracovat i při napětí nižším, větší serva naopak snesou (některá dokonce vyžadují) napájecí napětí 6 V a více. Systém konektorů je jednotný, vždy na něm najdeme dva vodiče napájecí ( červená + a černá nebo hnědá barva zem) a jeden signální oranžové nebo žluté barvy.

Pro Arduino existuje šikovná knihovna servo.h, pomocí které můžeme serva ovládat, aniž bychom se zabývali tím, jak široký pulz potřebujeme k dosažení požadovaného pohybu. Polohu serva zadáváme jednoduše ve stupních. Rozsah vstupních hodnot je 0 až 180°, neutrálu odpovídá 90°. Nicméně tyto hodnoty jsou obvykle nad mechanické možnosti běžných modelářských serv. V případě, že zadáte polohu například 180° nebo 0°, servo dojede pravděpodobně na doraz a pak motor stále poběží ve snaze dosáhnout požadované výchylky. Pokud servo včas neodpojíte nebo nenastavíte polohu v jeho mechanickém rozsahu, může dojít k poškození.

Jak pracovat se servy vysvětluje vzorový skeč. Klíčovým příkazem je write(úhel), do jehož parametru pak napíšeme požadovaný úhel podle výše uvedených zásad. Možná není úplně zřejmé, že objekt Servo při vytváření můžeme pojmenovat libovolně, například tedy Servo plosina a podobně. Změna názvu se ale musí vždy projevit i při použití write(), takže celý příkaz by vypadal třeba takto: plosina.write(90).

      // Vzorový skeč - servo
      // použití knihovny
      #include <Servo.h>

      // pojmenování pinu, ke kterému
      // je servo připojeno
      #define SERVO_pin 19

      // vytvoření objektu pro ovládání serva
      Servo servo;

      void setup()
      {
      // inicializace serva
      servo.attach(SERVO_pin);
      }

      void loop()
      {
      // nastavení polohy serva ve stupních
      servo.write(45);
      delay(1000);
      servo.write(90);
      delay(1000);
      servo.write(135);
      delay(1000);
      servo.write(90);
      delay(1000);
      } 

Bluetooth modul

Stejně tak jako Arduino může i RCB komunikovat s PC nebo notebookem pomocí sériové linky přes již výše zmíněný USB převodník. Přímo v IDE k tomu slouží Serial monitor, ve kterém nastavíme číslo portu, baudrate a můžeme přijímat a odesílat data. Podrobnosti lze najít zde . Zajímavější řešení je ale použití technologie Bluetooth. K tomu slouží moduly, které při správném zapojení a nastavení zajistí, že dvě zařízení spolu komunikují sériovou linkou, aniž by mezi nimi vedl kabel. Stačí tedy RCB takovým modulem vybavit a můžeme ji bezdrátově připojit k notebooku.

Otestoval jsem modul connectBlue OBS 410i, který na český trh dodává firma Spezial electronic. Pro připojení stačí pět pinů označených jako VSS (zem), VCC_3V3 (napájení 3 až 6 V), BLUE (indikační LED), UART-TxD (datový výstup), UART-RxD (datový vstup). Na spodní straně modulu najdeme kontakty, ke kterým lze rovnou připájet vodiče. Komu se to nebude zdát příliš elegantní, může využít board-to-board konektor, ten zapájet na vlastní desku plošných spojů a pak bluetooth modul přišroubovat. Výsledek vypadá daleko lépe a modul zůstane netknutý, nicméně je to trochu pracnější. Rád bych upozornil, že kontakty pro přímé pájení vodičů (v datasheetu označeno J6) a board-to-board konektor (J2 nebo J3) se na spodní straně modulu nachází jinde a také čísla pinů jednotlivých funkcí jsou jiné. Například UART-TxD je pin 16 v kontaktech J2, ale pin 11 v kontaktech J6. Takže podle způsobu připojení je třeba v datasheetu dohledat čísla pinů! Proto jsem také ve schématu ponechal modul bez číslování.

Jakmile zapneme napájení, měli bychom modul objevit v bluetooth manageru svého notebooku nebo PC po vyhledání zařízení v dosahu. Jeho označení je v továrním nastavení „Bluetooth Device“. Pak musíme projít připojovací proceduru, bude detekován typ spojení jako SPP – Serial Port Profile a následně ať už ručně nebo automaticky modulu přiřazen COM port. Na mém notebooku je to například COM40, COM41 atd.

Dále je třeba nastavit samotný modul pomocí konfiguračního programu od výrobce. Nejdůležitější jsou parametry sériové komunikace – požadovaný baudrate, 8 datových bitů, 1 stop bit, bez parity a kontroly toku dat. Pak také není na škodu si modul nějak rozumně pojmenovat (místo původního „Bluetooth Device“) a případně zabezpečit pin kódem. Dostupná je i široká škála dalších nastavení, do kterých nedoporučuji bez dostatečných znalostí moc zasahovat. Potřebné nastavení lze také připsat k objednávce, domů vám pak dorazí modul rovnou připravený k použití.

Výřez z konfiguračního  programu Serial Port Adapter Toolbox – nastavení sériové komunikace

Komunikaci můžeme hned otestovat pomocí Serial monitoru a vzorového skeče, který jsem připravil. V Arduino IDE nastavíme COM port, ke kterému je přiřazen Bluetooth modul, nastavíme baudrate 115200 a odeslaný text by se měl zobrazit na displeji RCB a navíc dorazit zpět. Pro úplnost dodám, že baudrate lze změnit dle potřeby, ale musí být nastaven všude stejný - v RCB, bluetooth modulu i Serial monitoru. Pochopitelně tento test komunikace funguje i s USB převodníkem, stačí pouze změnit port.

      // Vzorový skeč
      // sériová komunikace přes bluetooth modul

      #include <LiquidCrystal.h>
      LiquidCrystal lcd(11, 12, 10, 9, 8, 7);

      void setup()
      {
      lcd.begin(16,2);
      lcd.print("Test Komunikace");
      // Start komunikace
      Serial.begin(115200); 
      delay(1000);
      }

      String prijato;

      void loop()
      {
      // pokud přichází nějaká data přes BT,
      // je zahájeno jejich ukládání
        prijato = "";  
        if (Serial.available()) 
          {
          lcd.clear();
          lcd.print("Prijato:");
          lcd.setCursor(0,1);
          delay(100);
          while (Serial.available() > 0) 
            {
            // každý přijatý znak je přidán k řetězci prijato  
            prijato = prijato + char(Serial.read());
            }
          // zobrazení řetězce na LCD a odeslání zpět přes BT
          lcd.print(prijato);
          prijato = "Prijato: " + prijato;
          Serial.println(prijato);
          }
      }

Spínač SW2 na RCB slouží ke spojení respektive odpojení komunikačních pinů UART-RxD a UART-TxD s ATmegou, důvodem je fakt, že pokud byl bluetooth modul trvale připojen, nereagovala ATmega na spojení s PC přes USB převodník. Jednoduše řečeno, pokud chceme nahrát nový program pomocí převodníku, musíme modul odpojit spínačem - obě páčky přesunout dolů. Zatím se mi bohužel nepodařilo programování realizovat přes bluetooth.

Roboti

S řídicí jednotkou už úspěšně fungují dva roboti. První vznikl na improvizovaném podvozku ze stavebnice LEGO a měl původně sloužit pouze k otestování funkčnosti RCB. Nicméně výsledek trochu předčil očekávání, takže k opětovnému rozebrání už nedošlo. Naopak dočkal se ultrazvukového dálkoměru umístěnému na servu, takže s ním lze otáčet v rozsahu necelých 180°. Dále jsem ho vybavil nárazníky, které jsem v článku rovněž zmínil, a nakonec také jednoduchým senzorem pro sledování čáry vlastní konstrukce.

Základem druhého robota je pásový podvozek vybavený třemi IR senzory Sharp, které jsou vůči sobě pootočeny přibližně o 45° a pokrývají tedy velkou část prostoru před robotem. Díky tomu si robot může rychle vybrat, kterým směrem má více volného prostoru, aniž by musel senzorem otáčet.

Ukázkou již postavených robotů bych svůj článek rád ukončil. Doufám, že se mi alespoň v někom podařilo vzbudit zájem o robotiku a v případě dotazů mě, prosím, kontaktujte.

Použité datasheety

Shrnutí technických parametrů

  • Napájení motorů: doporučeno 6 až 9 V – 5 až 6 tužkových akumulátorů nebo baterií
  • Napájení stabilizátoru pro logické obvody: doporučeno 6 až 9 V – 5 až 6 tužkových akumulátorů nebo baterií
  • Proudové zatížení stabilizátoru: max. 1,5 A
  • Proudový odběr jednoho motoru: max. 0,6 A (L293D), max. 1 A (SN754410)
  • Počet vstupů/výstupů pro připojení periférií: 7, z toho 6 vybaveno analogově digitálními převodníky
  • Taktovací frekvence procesoru: 16 MHz
  • Volná paměť po nahrání bootloaderu: 30 kB
  • Rozlišení LCD: 2x16 znaků
  • Připojitelné komunikační moduly: USB<->UART převodník, Bluetooth modul OBS 410i nebo podobný kompatibilní

Ke stažení: Seznam součástek ve formátu xlsx, motiv DPS, potisk DPS, schéma

- Stránka vytvořena 28. řijna 2012 -