
Raspberry Pi
Płytka montażowa
Dioda LED 5 mm
Rezystor 330 Ω
Przewody połączeniowe
Rysunek 1.1
Układ GPIO Raspberry Pi
Piny GPIO (General Purpose Input/Output – we/wy ogólnego przeznaczenia) pozwalają nam podłączać sprzęt elektroniczny, taki jak diody LED i czujniki, do naszego Pi. Mogą być one używane zarówno do czytania, jak i przesyłania informacji, co umożliwia komunikację naszego Pi ze światem rzeczywistym.
Płyta Raspberry Pi 3 Model B ma podwójny rząd 40 pinów GPIO, pokazany na rysunku 1.1. Ten układ jest taki sam dla Pi 2 Model B i Pi 1 Model B+, lecz nieco inny dla Pi 1 Model A i B, które mają tylko pierwszych 26 pinów. Jeśli korzystacie z innej płyty niż Raspberry Pi 3 Model B, sprawdźcie układ pinów w „Przewodniku po pinach Raspberry Pi GPIO” na stronie 272.

Jest kilka sposobów wskazania pinu GPIO: przez jego nazwę (znaną jako numeracja GPIO lub numeracja Broadcom) lub przez odpowiedni numer pinu (znany jako numeracja fizyczna).
Na przykład GPIO 25 odpowiada pinowi 22. W całej tej książce odwołujemy się do pinów GPIO przez ich nazwy. Piny GPIO mogą być ustawione na HIGH, co daje na wyjściu 3,3 V i włącza element, lub LOW, co daje na wyjściu 0 V i wyłącza element.
FUNKCJANAZWANUMERNUMERNAZWAFUNKCJA ZasilanieDC3.3V125VZasilanieDC SDA1,I2CGPIO2345VZasilanieDC SCL1,I2CGPIO356GND GPIO_GCLKGPIO478GPIO14TXD0 GND910GPIO15RXD0 GPIO_GEN0GPIO171112GPIO18GPIO_GEN1 GPIO_GEN2GPIO271314GND GPIO_GEN3GPIO221516GPIO23GPIO_GEN4
SPI_MOSIGPIO101920GND
SPI_MISOGPIO92122GPIO25GPIO_GEN6 SPI_CLKGPIO112324GPIO8SPI_CE0_N GND2526GPIO7SPI_CE1_N
GPIO52930GND
GPIO63132GPIO12
GPIO133334GND
GPIO193536GPIO16
GPIO263738GPIO20
GND3940GPIO21
Piny oznaczone szarym tłem, 27 i 28, to piny DNC, czyli piny, których nie łączymy (ang. do not connect). Raspberry Pi ma także osiem pinów GND (ground) – oznaczone w tabeli czarnym tłem – do łączenia obwodów z masą. Są też cztery piny zasilania, dwa 5 V i dwa 3,3 V –oznaczone odpowiednio czerwonym i pomarańczowym tłem – do zapewnienia zasilania. Kilka pinów ma specjalne funkcje; na przykład piny oznaczone na żółto są używane w komunikacji szeregowego interfejsu urządzeń peryferyjnych (serial peripheral interface – SPI), a piny oznaczone na zielono są stosowane w komunikacji między obwodami scalonymi (inter-integrated circuit, I2C). Te protokoły komunikacji poznamy odpowiednio w projektach 3 i 7.
OSTRZEŻENIE
Piny GPIO są przeznaczone do pracy przy napięciu 3,3 V, jeśli więc je podłączymy do wyższych napięć, nieodwracalnie zniszczymy swój Raspberry Pi.
Diody LED mają różnorodne kształty i kolory, a niektóre mogą nawet łączyć kolory, aby utworzyć niemal każdy kolor. W tym projekcie będziemy używać prostych czerwonych diod LED 5 mm.
LED (light-emitting diode) jest – jak wskazuje jej nazwa – diodą, która emituje światło. Diody są podzespołami elektronicznymi, które mają biegunowość, co oznacza, że pozwalają na przepływ prądu tylko w jednym kierunku, od plusa do minusa. LED-y, tak jak wszystkie diody, mają złącze dodatnie znane jako anoda oraz złącze ujemne znane jako katoda. Dwie nóżki lub wyprowadzenia w diodach LED mają różne długości, aby
Zanim przejdziemy wprost do tworzenia gry, musimy wiedzieć, jak sterować matrycą LED i czytać wejście z joysticka. Popatrzmy na kilka przykładów, których użyjemy później w skrypcie Pong.
Matryca Sense HAT LED ma 8 kolumn i 8 rzędów, zawierających w sumie 64 diody LED RGB. Możemy wyświetlić tekst i tworzyć obrazy na matrycy, sterując każdą diodą LED oddzielnie. Można również ustawić kolor każdej diody LED.
Kod z listingu 8.1 wyświetla przewijający się tekst "Hello World!” na niebiesko w matrycy punktowej.
from sense_hat import SenseHat
#z emulatora
#from sense_emu import SenseHat sense = SenseHat()
Najpierw importujemy klasę SenseHat . W przypadku korzystania z emulatora trzeba usunąć lub zakomentować ten wiersz i odkomentować kod w wierszu
Funkcja przyjmuje komunikat do wyświetlenia –łańcuch tekstowy – jako pierwszy parametr, a następnie przyjmuje kilka opcji jako dalsze parametry:
• Używamy r g b , aby określić kolor RGB tekstu, zastępując r, g, b liczbami całkowitymi między 0 a (tak jak to zrobiliśmy w projekcie 5).
• Używamy scroll_speed = x, gdzie x jest liczbą zmiennoprzecinkową, aby sterować szybkością, z jaką tekst przesuwa się po wyświetlaczu. Domyślna szybkość przesuwania jest ustawiona na przerwę o długości 0,1 sekundy po każdym przesunięciu o jeden piksel w lewo.
• Używamy r g b , aby ustawić kolor tła, zastępując r, g, b za pomocą wartości całkowitych jak w przypadku
Listing 8.1
Tekst wyświetlany na matrycy LED HAT
Uwaga! W bibliotece sense_hat stosuje się brytyjską pisownię „colour”, trzeba zatem z niej korzystać w swoim kodzie.
Rysunek 8.4
Układ współrzędnych Sense HAT
Aby sterować poszczególnymi diodami LED, odwołujemy się do każdej diody LED, którą chcemy zaświecić, według jej położenia w matrycy. Do tego celu Sense HAT wykorzystuje układ współrzędnych (x, y).
Na przykład diody LED na rysunku 8.4 mają współrzędne podane obok schematu.
NIEBIESKI:(0,1)
ZIELONY:(7,6)
RÓŻOWY:(2,5)
Listing 8.2
Użycie funkcji set_pixel(), aby zapalić określone diody LED
Aby diody LED z rysunku 8.4 zaświeciły się odpowiednimi kolorami, użyjemy kodu z listingu 8.2.
from sense_hat import SenseHat
#from sense_emu import SenseHat sense = SenseHat()
#ustaw niebieski piksel
#ustaw zielony piksel
Funkcja x y r g b) zapala określoną diodę LED, w której x jest współrzędną x; y jest współrzędną y; a r, g i b ustawiają kolor.
Zamiast sterować poszczególnymi diodami LED, można użyć funkcji , aby szybciej wyświetlić obraz. Zamiast wprowadzać współrzędne, wstawiamy listę wszystkich 64 diod LED,
Rysunek 11.3
Diagram obwodu detektora dymu i gazu

1. Łączymy GND z niebieską szyną płytki montażowej, a 3,3 V z czerwoną szyną.
2. Umieszczamy chip MCP3008 na środku płytki montażowej, tak aby jego nóżki były po obu stronach środkowego podziału, jak pokazano na rysunku 11.3 i łączymy go przewodami według poniższej tabeli.
MCP3008 POŁĄCZYĆ Z 1 MQ-2 Pin AO 9 GND 10
GPIO 8 11
GPIO 10 12
GPIO 9 13
GPIO 11 14 GND 15
3,3 V 16 3,3 V
Pamiętajmy, że gdy półkole na MCP3008 jest na górze, pin 1 jest górnym pinem po lewej stronie; pełny układ pinów MCP3008 można znaleźć w punkcie „Przetworniki analogowo-cyfrowe” na stronie 57.
3. Umieszczamy czujnik gazu i dymu MQ-2 na płytce montażowej i łączymy przewodami według wskazówek.
GND GND
DO Bez połączenia
AO Pin 1 MCP3008
4. Wstawiamy LED w płytkę montażową. Łączymy dodatnie wyprowadzenie z pinu 17 GPIO przez rezystor 330 Ω i łączymy ujemne wyprowadzenie z szyną GND.
5. Wstawiamy przycisk na środku płytki montażowej z dwoma wyprowadzeniami po obu stronach centralnego podziału. Łączymy dolne prawe wyprowadzenie z szyną zasilania GND i dolne lewe wyprowadzenie z GPIO 2, upewniając się, że oba połączone wyprowadzenia są po tej samej stronie podziału.
6. Wstawiamy brzęczyk w płytkę montażową i łączymy czarny przewód z GND, a czerwony z GPIO 27.
Po połączeniu obwodu przewodami czas na przesłanie kodu.
Otwieramy Python 3 (IDLE) i przechodzimy do File New File, aby utworzyć nowy skrypt. Kopiujemy kod z listingu 11.1 do edytora Pythona i zapisujemy skrypt jako smoke_detector.py w folderze Czujniki. (Pamiętajmy, że wszystkie skrypty można pobrać na stronie https:// smartkids.pwn.pl/ksiazka/20-prostych-projektow-raspberry-pi/):
#import potrzebnych bibliotek from import from time import sleep
Listing 11.1
Skrypt detektora dymu i gazu
led.off() else:
led.on()
while True: if
True
True and buzzer.beep() else: buzzer.off()
Najpierw importujemy klasy , , and z biblioteki gpiozero i funkcję sleep z biblioteki time ; następnie tworzymy obiekty , które odnoszą się do przycisku LED, MCP3008 (czujnik gazu MQ-2) i brzęczyka . Następnie tworzymy zmienną stan_ , która wskazuje, czy czujnik dymu jest uzbrojony ; czujnik jest uzbrojony, gdy ta zmienna jest True, a nieuzbrojony, gdy False. Trzeba ustawić wartość , tak aby brzęczyk wydawał dźwięki tylko wtedy, gdy poziomy gazów są powyżej tego progu . Za chwilę zajmiemy się określaniem wartości tego progu.
Funkcja uzbraja i rozbraja czujnik, przełączając wartość zmiennej na przeciwną, niezależnie od tego, czy przy wywołaniu funkcji aktualną wartością jest True czy False. W wierszu ustawiamy funkcję, która ma być wywoływana, gdy przycisk zostanie naciśnięty, aby można było ręcznie uzbroić i rozbroić czujnik. Możemy także tak ustawić diodę LED, aby ją włączać, gdy czujnik będzie uzbrojony. W ten sposób można wizualnie rozpoznać jego stan.
Ostatnim blokiem kodu jest pętla while , która wciąż sprawdza, czy czujnik jest uzbrojony i czy poziomy gazów są powyżej progu. Jeśli czujnik jest uzbrojony i poziomy gazów są powyżej progu, brzęczyk wydaje dźwięki za pośrednictwem funkcji buzzer.beep(). Ostatnia funkcja buzzer.off() zatrzymuje brzęczyk.
Aby dokładnie ustawić bezpieczny poziom gazu, najpierw trzeba skalibrować czujnik z otoczeniem. To oznacza, że musimy pomierzyć
Rysunek 20.8
Aplikacja Node-RED do zdalnego sterowania robotem
Po kliknięciu przycisku Stop żaden z warunków ustawionych w kodzie nie jest spełniony, a funkcja wysyła wartości inicjalizowane na początku . Na zewnątrz węzła funkcji, po kliknięciu przycisku Poweroff, węzeł exec wykonuje polecenie poweroff, aby wyłączyć Pi. Pamiętajmy, że jako właściwość polecenia podaliśmy /usr/bin/sudo/poweroff –patrz tabela 20.1.
Gdy wszystko jest już gotowe, klikamy przycisk Deploy w górnym prawym rogu, aby zapisać zmiany i uruchomić schemat.
Gdy aplikacja Node-RED jest już gotowa, przechodzimy do http://<Pi adres IP>:1880/ui (zastępując <Pi adres IP> naszym własnym), aby zobaczyć pulpit naszej aplikacji. Powinien on wyglądać jak na rysunku 20.8.
Testujemy kontrolki, aby zobaczyć, czy koła poruszają się we właściwym kierunku. Nie można zapomnieć o włożeniu czterech baterii AA do uchwytu, aby zasilać silniki. Jeśli jeden lub dwa silniki obracają się w złym kierunku, to zamieniamy przewody czarne i czerwone na MotoZero dla zacisku silnika lub zmieniamy komunikaty ładunków, aby pasowały do wymaganych kierunków.

Gdy aplikacja jest już gotowa, klikamy przycisk Poweroff, aby zamknąć Pi. Następnie czekamy kilka sekund, aby się zamknęła.
Zmieniamy źródło zasilania Pi z gniazdka ściennego na power bank. Czekamy kilka minut, aby Pi włączyło się i automatycznie uruchomiło Node-RED. Na smartfonie lub innym urządzeniu w tej samej sieci co nasz Pi otwieramy nową kartę przeglądarki i przechodzimy do http://<Pi adresIP>:1880/ui. Następnie klikamy przyciski, aby zdalnie sterować swoim robotem.
Gratulacje – mamy teraz sterowanego robota Wi-Fi!
W naszym robocie można jeszcze wiele ulepszyć. Oto kilka pomysłów dotyczących, zarówno sprzętu, jak i oprogramowania.
Aby te projekty zaczęły działać, trzeba trochę poeksperymentować przy użyciu Node-RED:
• Użycie podwozia robota z czterema kołami i sterowanie czterema silnikami zamiast dwóch.
• Dodanie diod LED i brzęczyków do robota, aby stał się bardziej interaktywny.
• Dodawanie czujników, takich jak czujnik ultradźwiękowy, aby robot sam mógł uniknąć przeszkód.