Mindstorms NXT blikáme LED

Ježíšek přinesl staršímu synovi LEGO Mindstorms NXT 2, a tak, po prvním seznámení se stavebnicí a jejími možnostmi v „základní“ sestavě, kdy se po pokoji válely barevné kuličky a robot střílel po všem možném, jsem se začal poohlížet, co všechno zajímavého by se ještě dalo s „Inteligentní LEGO NXT kostkou“, zkráceně cihlou (brick), dělat a co k ní připojit. Velkou výhodou je, že firma LEGO poskytuje k „cihle“ kompletní schéma zapojení, a také, že zdaleka nejsem jediný, kdo se o něco podobného snaží.

Pro začátek jsem volil konstrukci něčeho jednoduchého, co prostě fungovat musí, je podporováno grafickým vývojovým prostředím, dodávaným se stavebnicí, a co by mělo sloužit jako odrazový můstek pro další, složitější a užitečnější konstrukce. Nakonec jsem se rozhodl pro konstrukci s I2C IO port expanderem PCF8574. Vzhledem k tomu, že kit s tímto integrovaným obvodem nabízí také firma Mindsensors, je jasné, že s trochou snahy se úspěch musí dostavit.

Samotná NXT cihla obsahuje 4 konektory pro připojení senzorů a 3 konektory pro připojení servopohonů. Drobný zádrhel je v tom, že všechny konektory jsou sice typu RJ12 (telefonní kostička se šesti kontakty), ale s excentricky umístěným zámkem. Konektory tohoto provedení se sice dají koupit, ale pro první pokusy mi přišlo zbytečné dovážet několik kousků z opačného konce světa. U firmy Eduxe (české zastoupení LEGO Education) jsem si proto objednal náhradní sadu kabelů a na jednom konci nahradil původní konektor klasickým RJ12, který je v našich obchodech bežně k dostání, včetně protikusu. V lepších obchodech vám konektor dokonce nalisují na kabel, takže odpadne i nutnost mít speciální krimpovací kleště.

Zapojení konektoru pro připojení senzorů je na obrázku č.1:

Myslím, že zapojení konektorů a vůbec celá koncepce NXT je navržena velmi dobře (ostatně zapojení analogových senzorů v předchozí verzi RCX bylo často odkazováno jako referenční návrh), pro domácí kutily ale přesto má jisté záludnosti. V našem případě je to fakt, že signály rozhraní I2C jsou sdíleny společně se signály rozhraní RS485. Vzhledem k přítomnosti dalších ochranných prvků jsou I2C budiče schopny spolehlivě fungovat jen se zdvihacími (pull-up)  rezistory o odporu minimálně 82 kohmů. V našem konkrétním případě to stačí mít na paměti a počítat s tím, ale u hotových I2C modulů s integrovanými pull‑up rezistory to může být na závadu. Někdy příště si ale ukážeme, že i tento problém se dá jednoduchým způsobem vyřešit.

Modul rozhraní

Samotné elektrické zapojení je velmi jednoduché a vychází z katalogové dokumentace obvodu PCF8574. Vzhledem k jednoduchosti a předpokládanému použití modulku jsou všechny adresové vstupy uzemněny, takže IO je přístupný na své výchozí adrese. Pro snažší případné ladění nebo pokusy s jiným zařízením, umožňujícím připojení obvodů s rozhraním I2C jsou komunikační signály SDA, SCL a napájecí napětí vyvedeny také na pinovou lištu. Kompletní schéma zapojení je na obr. č.2.

Na obrázku č.3 je znázorněn motiv desky plošných spojů a osazovací plánek pro případné zájemce o stavbu.

Po osazení destičky důrazně doporučuji otestovat, zda není zkratováno napájení nebo signály SDA a SCL. Není přeci nezbytně nutné zkoušet odolnost interních ochran NXT cihly hned při prvním zapojení.

Programové vybavení

Pokud chceme destičku ovládat přímo z grafického vývojového prostředí, někdy zvaného NXT-G, musíme si obstarat vhodný ovládací prvek – blok.

Zde se ukazuje asi největší slabina celého grafického vývojového prostředí – nemožnost snadného návrhu vlastních bloků. Existuje sice bezplatně dostupný modul pro LabView (profesionální vizualizační systém pro řízení procesů od fy. National Instruments) na kterém je NXT-G postaveno, ale samotné prostředí LabView je zpoplatněno a ani cena licence, určené pro vzdělávací účely, není nijak malá. Situaci ale trochu zjednodušuje dostupnost některých bloků pod licencí GNU GPL.

Jelikož při návrhu bylo s tímto omezením počítáno, je pro náš modulek možno použít blok pro grafické prostředí, který nabízí firma Mindsensors pro svůj modul „Sensor building kit for NXT with PCF8574 IC“. Kompletní stavebnici tohoto modulu si může případný zájemce u ní také zakoupit za cenu 19,75 USD.

Blok, potřebný (PCF8574-NX.zip) pro naši aplikaci si můžeme zdarma stáhnout z adresy mindsensors.com a nainstalovat dle instrukcí. Samotný popis grafického prostředí a postup instalace je ale nad rámec tohoto článku a případný zájemce si jistě nalezne vše potřebné sám.

Na obrázku číslo 4 je ukázkový „program“. Nejprve jsou zhasnuty všechny LED diody a po prodlevě 500ms je ve smyčce zapisován výstup z generátoru náhodných čísel do výstupního registru PCF8574, jehož stav je signalizován osmi svítivími diodami. Pro lepší čitelnost je do smyčky vložena prodleva 100ms. Je třeba zdůraznit, že dioda svítí, je-li výstup ve stavu low (logická nula). Pro správnou funkci je zapotřebí správně nastavit NXT port, kterému je modulek připojen (v našem případě 1) a jeho I2C adresu (v našem případě 0x70, resp. 112 dekadicky).

Jako alternativu k tomuto programu je možné stáhnout a nainstalovat bloky pro obecnou I2C komunikaci IICwrite, popř. IICread a modulek ovládat pomocí nich. Na adresu modulu (0x70 hex; 112 dec) stačí zapsat požadovaný stav LED diod. Připomínám, že negovaný. Ukázkový „program“ střídavě rozsvěcí a zhasíná LED s prodlevou 200ms. Opět je třeba si dát pozor na správně zadaný port NXT a I2C adresu.

Uvedené bloky je možné stáhnout buď z již zmiňované stránky www.mindsensors.com nebo z jiného zdroje, například nxtasy.org/repository/nxt-g-blocks/.

A pokud by se vám zdálo, stejně jako mě, grafické vývojové prostředí na některé aplikace trochu těžkopádné, tak vás mohu uklidnit sdělením, že existují i další vývojová prostředí.

Na druhou stranu jsem neobjevil lepší nástroj než NXT-G na to, jak prvňáčkovi, který sotva čte a píše, ukázat co znamená programování a jak takový program pro jednoduchého robota vlastně vypadá.

Na závěr si neodpustím ještě jednu ukázku – je vývojový nástroj NXC (Not eXactly C). Jak název možná napoví je to programovací jazyk, velmi blízký jazyku C, určený přímo pro Mindstorms NXT. Jeho i letmý  popis by byl vysoce nad rámec tohoto článku a tak případného zájemce zatím odkazuji na webowé stránky projektu bricxcc.sourceforge.net/nbc/.

Není vyloučeno, že se k tomuto prostředí vrátím v některém příštím článku a tak jen malá ukázka kódu. Tou je program „běžící světlo“ pro náš popisovaný modul.

#include „NXCDefs.h“
#define ADDR 0x70
byte data=1;
byte cmd[]={ADDR,255};
byte nbytes;

task main()
{
      SetSensorLowspeed(S1);
      LowspeedWrite(S1, 0, cmd);
      while(LowspeedStatus(S1, nbytes)>0);
      Wait(500);
      while(true)
                 {
                   cmd[1] = data ^ 255;
                   LowspeedWrite(S1, 0, cmd);
                   while(LowspeedStatus(S1, nbytes)>0);
                   Wait(100);
                   data = data << 1;
                   if (data==0) {data=1;}
                 }
}