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 |
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 |
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
}
{
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 |
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 |
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
}
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
}
}
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á).