Czech English

7. Sériová komunikace

aneb přenášíme informace

Zatím jediný prostředek, kterým nám dává náš počítač informaci o tom, že něco dělá je LED. Pokud budeme potřebovat zjistit i něco jiného než jen, že program běží, mohli bychom např. blikat LEDkou morseovku. Rozumnějším řešením je zobrazení na displeji (ale to si necháme na nějaký další díl). Další možnost je připojení k PC, a to je tématem této lekce.


Co je to UART

Průběh signálu na sériové lince
Průběh signálu na sériové lince
Nejdříve jen velmi stručně o tom, co je to UART a k čemu může být dobrý. Zkratka UART by se dala přeložit jako univerzální asynchronní přijímač/vysílač. Je to kousek hardwaru, který pomocí dvou pinů (většinou označovaných jako RX a TX) odesílá a přijímá data. Jelikož se jedná o asynchronní způsob komunikace, obsahuje přijímač i vysílač vlastní generátor hodinového signálu, kterým se UART řídí. A jelikož je UART univerzální, je také možné rychlost těchto hodin řídit (není stanovena), stejně jako velikost jednoho bajtu, počet stop bitů, paritní bit, atd. Často můžeme také slyšet zkratku USART. Jedná se v podstatě o to samé, pouze s tím rozdílem, že je USART obsahuje i synchronní režim.

Zapojení

Pro testování potřebujeme led a talčítko připojené k arduinu tak, jak jsme je používali v lekci 3. Led bude připojena na pin 2 a tlačítko na pin 5.
Schéma připojení led a tlačítka
Schéma připojení led a tlačítka
Zapojení realizované na kontaktním poli
Zapojení realizované na kontaktním poli

Programování

Programování na straně Arduina je s využitím připravených funkcí pro ovládání seriové linky velmi snadné.
Ve funkci setup funkcí Serial.begin nastavíme komunikační rychlost seriové linky. Standardní rychlosti jsou 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 bd (bitů za sekundu).
Pro odeslání dat z Arduina do PC použijeme funkci Serial.print, kterou můžeme odesílat jednotlivé znaky, texty nebo čísla. Funkce Serial.println se chová stejně, jen navíc odešle znak přechodu na nový řádek.
Pro zjištění zda jsou přijata nějaká data z PC slouží funkce Serial.available a pro vlastní přečtení přijatých dat funkce Serial.read.
V první programu budeme opakovaně posílat do PC nějaký text.
void setup()
{
  Serial.begin(9600);   // nastaveni komunikacni rychlosti 9600bd
}

void loop()
{
  Serial.println("Hello world!"); // odeslani textu po seriove lince s odradkovanim
  delay(1000);                    // cekani 1s
}
Spuštění Serial Monitoru
Spuštění Serial Monitoru
Program přeložíme a nahrajeme do Arduina. Abychom zjistili jeho funkčnost, musíme na straně PC spustit nějaký program schopný přijímat data po seriové lince a zobrazovat je. K tomu můžeme využít Serial Monitor, který je součástí vývojového prostředí.
Po jeho spuštění je nutné nastavit správnou komunikační rychlost, tedy stejnou jakou jsme použili v programu pro Arduino. Nyní bychom už měli vidět, jak se každou sekundu zobrazí nový řádek s textem poslaným z Arduina.
Serial Monitor
Serial Monitor

Druhý program posílá informaci o stisknutí tlačítka připojeného k Arduinu na pinu 5.
#define  TLACITKO 5

void setup()
{
  pinMode(TLACITKO, INPUT_PULLUP);  // nastaveni pinu 5 jako vstup s pull-upem
  Serial.begin(9600);               // nastaveni komunikacni rychlosti 9600bd
}

void loop()
{
  if(digitalRead(TLACITKO) == 0)             // je-li tlacitko stisknuto
  {
    Serial.println("Tlacitko stisknuto!");   // odeslani textu po seriove lince s odradkovanim
  }
  else
  {
    Serial.println("Tlacitko nestisknuto!"); // odeslani jineho textu s odradkovanim  
  }
  delay(100);                     // cekani 100ms
}

V dalším programu budeme podle znaku zaslaného z PC rozsvěcet a zhasínat LED připojenou na pin 2.
#define  LED 2

byte    a;              // promenna pro nacteni znaku

void setup()
{
  pinMode(LED, OUTPUT); // nastaveni pinu 2 jako vystup
  Serial.begin(9600);   // nastaveni komunikacni rychlosti 9600bd
}

void loop()
{
  if(Serial.available())     // je-li prijat znak
  {
    a = Serial.read();     // nacteni znaku prijateho po seriove lince
  }
  else                     // neni-li znak prijat 
  {
    a = 0;                 // nuluj promennou     
  }

  if(a == 'a')                // je-li prijat znak 'a'
  {
    digitalWrite(LED, HIGH);  // zapnout led
  }
  
  if(a == 'n')                // je-li prijat znak 'n'
  {
    digitalWrite(LED, LOW);   // vypnout led
  } 
}

Úkoly na samostatnou práci

1. Upravte předchozí program tak, aby po přijetí znaku "a" led začala blikat s periodou 1s a po přijetí znaku "n" zhasla.
2. Upravte program tak, aby bylo možné ovládat blikání led jak po sériové lince (jako v předchozím případě), tak tlačítkem. Stisknutí tlačítka změní stav led (bliká - nebliká).

Zdroje