Lekce 5 - Raspberry Pi - Jednoduchý semafor
V předchozí lekci, Raspberry Pi - Blikání diody, jsme si vytvořili jednoduchý obvod s diodou.
Dnešní Raspberry Pi tutoriál bude o Python kódu a vytvoříme si pomocí předem připravených součástek jednoduchý semafor.
Ovládání diody pomocí Pythonu
Zapneme si naše Raspberry Pi a přejdeme v něm do předinstalované aplikace Thonny Python IDE, ve které budeme psát náš kód:
Aplikace nám automaticky vytvoří prázdný blok kódu. Napíšeme do něj
program, který zapne GPIO port s číslem 14
, sekundu počká a
zas daný GPIO port vypne. Před tím vypíšeme i hlášku "Hello world",
abychom lépe poznali, že program již běží a dioda třeba neblikala.
Kód vložíme následující:
import RPi.GPIO as GPIO import time GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(14, GPIO.OUT) print "hello world" GPIO.output(14, GPIO.HIGH) time.sleep(1) GPIO.output(14, GPIO.LOW)
Pěkně si kód rozebereme řádek po řádku.
Na prvních dvou řádcích naimportujeme knihovny, které budeme potřebovat
(GPIO
knihovnu a knihovnu time.GPIO
). Knihovny
potřebujeme vždy, když ovládáme Raspberry Pi porty GPIO. A knihovna
time
nám přidává mezi vším ostatním funkci
sleep()
, která se často hodí při podobných projektech,
protože pozastaví na chvíli chod celého programu. Dále nám tato knihovna
dává všechny informace co se týkají času.
Třetí řádek nám pouze odstraní otravná varování.
Řádek čtvrtý nastavuje velmi důležitou část, o které jsme mluvili v
předchozí lekci a to, zda budeme používat čísla GPIO portů nebo nikoli.
My budeme používat čísla GPIO portů, proto nastavíme mód
BCM
.
Na pátém řádku si nastavíme náš GPIO port na režim/channel
OUT
(jako OUTPUT, tedy výstup). Tato část je důležitá,
protože na channelu OUT
můžeme ovládat GPIO port právě
pomocí hodnot HIGH
(zapnuto) a LOW
(vypnuto), což
také děláme na 7. a 9. řádku. Na šestém řádku jednoduše vypíšeme
pomocí příkazu print
známou hlášku všem programátorům.
Uložení a spuštění prvního programu
Po zapsání kódu si tlačítkem Save program uložíme pod názvem
blik
. Soubor automaticky dostane koncovku .py
. Náš
program se nedá spustit pomocí aplikace Thonny, protože aplikace nemá
dostatečná práva. Máme tak dvě možnosti, buď spustit Thonny jako root
(příkazem sudo
) nebo spustit program rovnou v terminálu.
Ukážeme si obě metody.
Spuštění pomocí Thonny
Vypneme Thonny Python a do terminálu zadáme:
sudo thonny
Tímto příkazem spustíme aplikaci se všemi právy roota, což pro
ovládání GPIO portů přesně potřebujeme (příkaz si nejprve vyžádá
vaše root
heslo).
Spuštění pomocí terminálu
Pokud jsme program neukládali do speciální složky, stačí zadat pouze do terminálu toto:
sudo python blik.py
Jinak musíme přejít do složky, kde máme program uložený, pomocí příkazu:
cd /názevsložky/
A až poté spustíme předchozí příkaz:
Program nám tedy vypsal do terminálu hlášku "hello world" a dioda blikla.
Semafor
Zkusíme si naprogramovat něco těžšího a to semafor. K tomuto projektu
budeme potřebovat věci popsané výše (tedy další 2 diody a rezistory).
Diody zapojíme podobně jako tu jednu předchozí, jen na jiné GPIO piny.
Všechny katody mohou být zapojeny do jednoho GND
, pokud nemáte
nepájivé pole, bude pohodlnější je zapojit do "různých" GND
(viz opět obrázky verze s drátky a polem). Dále pak každou anodu musíme
zapojit do vlastního GPIO portu, abychom tak mohli specifickou diodu ovládat.
Obě řešení vidíte zde:
Naše zapojení tvoří malý obvod, který však můžeme ovládat pomocí Pythonu.
Program semafor
Vrátíme se k programování. Otevřeme si Thonny rovnou pomocí terminálu
s pomocí příkazu sudo
. Vytvoříme si nový program s názvem
semafor
tlačítkem New a napíšeme do něj tento kód:
import RPi.GPIO as GPIO import time GPIO.setwarnings(False) while(True): GPIO.setmode(GPIO.BCM) GPIO.setup(14,GPIO.OUT) GPIO.setup(18,GPIO.OUT) GPIO.setup(15,GPIO.OUT) GPIO.output(18,GPIO.HIGH) time.sleep(3) GPIO.output(15,GPIO.HIGH) time.sleep(2) GPIO.output(15,GPIO.LOW) GPIO.output(18,GPIO.LOW) GPIO.output(14,GPIO.HIGH) time.sleep(3) GPIO.output(14,GPIO.LOW) GPIO.cleanup() time.sleep(5)
Začátek kódu obsahuje věci, které už známe, takže jen v rychlosti. Vložíme totožné knihovny, jako při prvním programu a rovnou GPIO knihovnu použijeme na odstranění otravných varování.
Dále tu máme cyklus while
s podmínkou True
. To
je takový malý programátorský "podvod" a tento cyklus znamená neustále se
opakující smyčku, což se nám hodí. Náš kód uvnitř while
poběží stále dokola a dokola. Aby program poznal, že zbytek kódu patří
do smyčky while
, musíme zbytek kódu psát odsazený (nejlépe
pomocí Tab).
Jako první, co musíme udělat v naší smyčce, je nastavit
mode
. A to pokaždé, protože na konci kódu voláme
GPIO.cleanup()
. To nám uvolní GPIO porty a požaduje tak pro
jejich opětovné použití opět nastavit mode
. Díky tomu jsme
také na konec programu umístili 5s dlouhou pauzu, která je určena na
ukončení programu, když jsou zrovna všechny diody vypnuty a tím pádem
porty volné.
Dále v kódu není nic nového, pouze přidáváme nové diody. Tím pádem vždy měníme první údaj a to číslo GPIO portu.
Vysvětlení kódu
Máme zapojeny tři diody, v mém případě červenou, bílou (žlutá barva semaforu), modrou (zelená barva semaforu) stejně, jako jsou tři světla na semaforu. V kódu postupně diody rozsvítíme. První rozsvítíme červenou a uspíme program na 3 sekundy. Pak rozsvítíme bílou a uspíme program na dvě sekundy. Poté ale nenastane jak byste čekali rozsvícení diody třetí, nastane zhasínání. Na semaforu totiž vždy první zhasne červené a žluté světlo, než se rozsvítí to zelené:
Proto i my první zhasneme světlo červené a bílé, ale ještě k tomu rozsvítíme světlo modré a program pozastavíme na 3 sekundy.
Pro ukázku jak má finální produkt vypadat se můžete podívat na video:
V příští lekci, Raspberry Pi - Magnetický senzor (otevřené/zavřené dveře), si ukážeme, jak zaznamenat otevřené/zavřené dveře.