Hardware | Pojďme programovat elektroniku | Programování

Pojďme programovat elektroniku: Žádný bastlíř se neobejde bez armády švábů

  • Každý bastlíř se po čase neobjede bez armády švábů
  • Dnes si některé z nich vyzkoušíme
  • Třeba zázračný posuvný registr
Pojďme programovat elektroniku: Žádný bastlíř se neobejde bez armády švábů
Kapitoly článku

Posuvný registr

Další šváb, který nesmí chybět v žádné bastlířské pracovně, je integrovaný obvod posuvného registru (anglicky shift register). Je to velmi praktická součástka v pouzdře DIP16 (takže 8 nožiček po každé straně), která zachrání každého zelenáče, který k Arduinu, ESP8266, ARMu – prostě k jakémukoliv řídícímu čipu – připojuje další a další výstupní součástky, až mu rázem dojdou volné logické vodiče GPIO (General-Purpose Input/Output).

V takovém případě je třeba sáhnout po čipu, který nabízí více I/O. Začátečník by mohl dokoupit třeba obří Arduino Mega, anebo právě posuvný registr, který pořídíte za pár korun a mohli bychom jej s trochou nadsázky přirovnat k jakémusi jednosměrnému USB hubu.

Klepněte pro větší obrázek Klepněte pro větší obrázek
Posuvný registr 74HC595 v pouzdře DIP16

K těm nejlevnějším a nejrozšířenějším posuvným registrům patří osmibitový sériově-vstupní a paralelně-výstupní 74HC595. Uf, co to sakra znamená? Ničeho se nebojte, je to jednoduché jako facka.

V kostce jde o to, že z mikropočítače nahrajeme do tohoto obvodu postupně osm bitů a posuvný registr podle nich nastaví svých osm digitálních výstupních pinů.

Takže kdybych do posuvného registru nahrál třeba posloupnost bitů 0, 0, 0, 0, 1, 1, 1, 1, na prvních čtyřech výstupních pinech bude nastavená logická nula (nízké napětí, LOW), no a na ty zbývající nastaví posuvný registr logickou jedničku (pracovní napětí, HIGH). Kdybych tedy na piny posuvného registru připojil třeba LED světýlka, první čtyři budou zhasnutá a zbývající čtyři budou svítit.

Na závěr teoretické omáčky to nejdůležitější: Z mikropočítače ovládám posuvný registr pomocí tří pinů. Spotřebuji tedy tři, ale získám jich osm!

Klepněte pro větší obrázek Klepněte pro větší obrázek
Aby bylo jasno, o čem tu celou dobu píšu: Vlevo je osm LED diod připojených přímo na 8 GPIO pinů čipu ATmega328P. Vpravo pak stejné LED ovšem připojené pomocí posuvného registru, který na řídícím čipu spotřebuje pouze tři piny. Ušetřil jsem tedy pět GPIO.

Posuvný registr sehraje naprosto klíčovou roli třeba v projektech, ve kterých byste chtěli spínat větší množství LED diod. Více registrů totiž můžete zapojit do série, takže se dvěma získáte 16 výstupů, se třemi 24 výstupů a tak dále. Přitom budete vše i nadále ovládat třemi vodiči.

Jelikož má registr v názvu klíčové slovíčko posuvný, bity opravdu posouvá. Jakmile se tedy naplní a pošlete mu další bit, ta předchozí se posunou do dalšího registru a tak dále, dokud se nenastaví všechny výstupy, které potřebujete.

A teď si to vyzkoušíme přímo v kódu

Zapojil jsem tedy osm LED diod jako na fotografii výše. Níže pak pro přehlednost najdete i grafické schéma a popis pinů na posuvném registru. Ty výstupní jsou označené QAQH. Pak tu máme napájecí piny VCC (+) a GND (-). Do země (-) zapojíme i pin OE a k napětí (+) pin RESET.

No a teď už je třeba připojit jen řídící piny DATA, LATCH a CLK, které jsem propojil na libovolné digitální piny Arduina. Šváb registru má ještě vpravo dole pin SQH, který bych použil, pokud bych měl vícero propojených posuvných registrů. O tom si už ale přečtěte někde jinde. Třeba v tomto hezkém návodu.

Klepněte pro větší obrázekKlepněte pro větší obrázek
Schéma zapojení posuvného registru s osmi LED diodami, které budu spínat v kódu níže

Tak, diody máme zapojené, ale jak se to tedy vlastně celé ovládá? Když budu chtít do registru poslat oněch 8 bitů, nejprve musím nastavit pin LATCH na LOW (logická nula), čímž dám registru najevo, že nastavuji hodnoty.

Dále pomocí časovače CLK postupně (sériově) odešlu jednotlivé bity do registru. Jakmile bude vše hotovo, nastavím pin LATCH na HIGH (logickou jedničku), čímž dám registru najevo, že už je vše hotovo. Ihned poté se piny QA až QH konečně nastaví na logické nuly a jedničky podle zadání a LED se patřičně rozzáří.

Většinu této omáčky za nás v Arduinu zvládne vestavěná funkce ShiftOut, která všech osm bitů, tedy jeden bajt, přenese.

Pojďme se podívat na jednoduchý kód, který nám ve smyčce postupně rozsvítí a zase zhasne všem osm LED diod:

#define LATCH_PIN 9 // LATCH pin pripojeny na pin D9 na Arduino Uno
#define CLK_PIN 5 // CLK pin pripojeny na pin D5 na Arduino Uno
#define DATA_PIN 2 // DATA pin pripojeny na pin D2 na Arduino Uno

// Osmibitova promenna, ve ktere je ulezene nastaveni LED
uint8_t svetylka = 0;

// Nastaveni pinu na Arduinu pro vystup
void setup(){
  pinMode(LATCH_PIN, OUTPUT);
  pinMode(CLK_PIN, OUTPUT);  
  pinMode(DATA_PIN, OUTPUT);
}

// Smycka, ktera se bude stale opakovat
void loop(){
  // Cyklus od 0 do 8, ktery postupne rozsviti vsechna svetylka
  for(int i = 0; i < 8; i++){
    // Nastav i-ty bit promenne svetylka na logickou 1 
    bitSet(svetylka, i);
    // Posli proměnnou svetylka do posuvneho registru
    posliDoRegistru(svetylka);
    // Pockej 100 ms
    delay(100);
  }

  // Cyklus od 8 do 0, ktery postupne svetylka vypne
  for(int i = 8; i > 0; i--){
    // Nastav i-ty bit promenne svetylka na logickou 0
    bitClear(svetylka, i);
    posliDoRegistru(svetylka);
    delay(100);
  }
}
 
// Pomocna funkce pro odeslani bajtu do posuvneho registru
void posliDoRegistru(uint8_t bajt){
  // Nastav LATCH pin na logickou 0, aby registr vedel, ze budeme posilat bity
  digitalWrite(LATCH_PIN, LOW);
  // Posli pomoci casovaciho a datoveho pinu bity promenne do registru
  shiftOut(DATA_PIN, CLK_PIN, LSBFIRST, bajt);
  // Nastav LATCH pin na logickou 1, aby registr vedel, ze uz je vse hotovo
  digitalWrite(LATCH_PIN, HIGH);
}

Operace s jednotlivými bity jsme si v našem seriálu už ukázali a tady je můžeme plně využít. Oněch osm LED diod je vlastně takový binární prohlížeč.

Pokud by měla proměnná svetylka dekadickou hodnotu 0, všechny LED diody zhasnou. No a kdyby měla proměnná svetylka dekadickou hodnotu 255, všechny se rozsvítí, protože číslo 255 má ve dvojkové soustavě hodnotu 11111111, což znamená, že posuvný registr všech osm pinů nastaví na logickou 1 a pustí na ně pracovní napětí 5V.


Ovládám osm LED diod pomocí pouhých tří GPIO. To je kouzlo posuvného registru.

Heuréka! S drobným švábem jsme rázem rozšířili počet výstupů i na malém mikropočítači a ke všemu ovládáme nastavení osm digitálních pinů v jednom kroku (zavoláním funkce shiftOut namísto osmi digitalWrite), takže si ušetříme práci.


V poslední kapitole opustíme svět klasických švábů a podíváme se na trojnožky v obalu TO-220. Vyzkoušíme si MOSFET a stabilizátory napětí.

Témata článku: Hardware, Pojďme programovat elektroniku, Programování, C++, Zrak, Stavebnice, Arduino, NEO, Základní arduino, Slovíčko, Delay, Stabilizátor, Posila, Schéma, CLK, Povídání, Horní hranice, Rogers, Řídící čip, Perfektní stabilizace, Oxid křemičitý, Proměnná, Facka, Staré auto, Lekce


Určitě si přečtěte


Aktuální číslo časopisu Computer

Megatest mobilů do 8 000 Kč

Test bezdrátových headsetů

Linux i pro začátečníky

Jak surfovat anonymně