Arduino a posuvný registr

Pokud zatím nevíte, co to Arduino vlastně je, přečtěte si třeba mou recenzi, zakoupit si ho případně můžete na stránkách www.czechduino.cz. A nyní k věci. Podle návodu na stránkách www.arduino.cc jsem na výstup Arduina zapojil integrovaný obvod 74HC595 - posuvný registr. K čemu je to dobré? Posuvný registr má osm výstupních pinů, ale pro jeho ovládání stačí pouze tři. Tím je možné uspořit další piny Arduina pro jiné použití. Celá finta funguje tak, že registru odešleme osm bitů dat, číslo od 0 do 255. Stav jeho výstupů pak odpovídá hodnotě odeslaného čísla ve dvojkové soustavě. Pokud na výstupy připojíme LED diody, rozsvícená reprezentuje 1 a zhasnutá 0.

Naneštěstí při programování Arduina nelze zadat přímo binární číslo, například 10101010, které názorně přímo odpovídá rozsvícené sestavě diod. Programovací jazyk Wiring akceptuje pouze čísla v desítkové nebo šestnáctkové soustavě. Postup pro převod libovolného čísla mezi dvojkovou a desítkovou soustavou najdete například na Wikipedii. Ideální řešení je samozřejmě přidat do programu pro Arduino funkci, která takový převod zajistí. Pak už lze velmi rychle dosáhnout blikajících sestav diod jako na videu níže.

Aktualizace: Až po napsání tohoto článku jsem zjístil, že Wiring zadání čísel ve dvojkové soustavě umožňuje následujícím způsobem B11111111, B10101010 a podobně. To samozřejmě práci s posuvným registrem ještě zjednodušuje. Více o použití a matematických operacích v binární soustavě najdete v Bit Math Tutorial.

Vzorový program

Pomocí tohoto kódu odesílá Arduino stále dokola s pauzou půl sekundy registru čísla 170 a 85. Ačkoliv v desítkovém zápisu to nejsou nijak zajímavé hodnoty, stačí je převést do dvojkové soustavy a hned pochopíte! 170 = 10101010, 85 = 1010101 a když tyto sestavy diod střídavě blikají, vypadá to docela pěkně.

/*urceni pinu pro komunikaci s registrem*/
int latchPin = 8;
int clockPin = 9;
int dataPin = 10;


void setup() 
{
// nastaveni komunikacnich pinu jako vystupu
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}

void loop() 
{
// odeslani cisla 170 do registru
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 170);  
digitalWrite(latchPin, HIGH);
delay(500); // pauza

// odeslani cisla 85 do registru
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 85); 
digitalWrite(latchPin, HIGH);
delay(500); // pauza
}

Toto byla jen malá ukázka použití posuvného registru. Daleko zajímavější bude projekt, na kterém už delší dobu pracuji a chybí v už jen dodělat mu zde vlastní stránku a uveřejnit, bude to LED kostka ze 64 diod řízená Arduinem. V nejbližší době se tady určitě objeví.

- Stránka vytvořena 13. března 2010 -