Rys historyczny PC/104 Mikro-pecet do zastosowań wbudowanych, Single module PC, UMPC Systemy Wbudowane Raspberry Pi (wersja 2019) mgr inż. Marek Wilkus http://home.agh.edu.pl/~mwilkus Wydział Inżynierii Metali i Informatyki Przemysłowej AGH Kraków 1 2 Raspberry Pi Raspberry Pi - systemy Praktycznie pełny komputer z procesorem ARM na jednej płytce, Model 3B: Procesor BCM2837, GNU/Linux: Debian Arch OpenELEC Fedora 1.2GHz, 4 rdzenie, 1GB RAM współdzielony z GPU, 4 porty USB, ethernet, HDMI, Composite, sound out, Dysk: Karta microsd, GPIO: 26 pinów (w tym SPI) I2C na dodatkowych pinach 2 pin-y do rozbudowy EEPROMu 3.3V, GND Android PI RISC OS FreeBSD FreeRTOS +Emulacja 3 4 Raspberry Pi - zastosowania Uruchamianie i system Sterowanie, sieci, "Internet of things", Mikroserwery i bramy sieciowe, firewalle (pihole) Miniaturowe komputery, Interfejsy (RTOS!), Przetwarzanie obrazu (szybki interfejs kamer cyfrowych) Ale NIE: Instalacje "High-assurance" (bezwartościowe open source, mnóstwo nieznanego i nieaudytowanego kodu), Instalacje wysokiej trwałości (nieprzystosowany do trudnych warunków) 5 Mikrokod ładuje boot code do L2 i uruchamia CPU CPU wykonuje boot code uruchamiając kontroler pamięci, ładuje do RAMu loader, Loader ładuje start.elf Start.elf uruchamia obsługę nośników danych, ładuje kernel z SD oraz umieszcza EEPROMy urządzeń w pamięci, Kernel uruchamia sterowniki korzystając z informacji w EEPROMach urządzeń, Startuje system operacyjny. Instalacja na czystej karcie SD: wget http://downloads.raspberrypi.org/raspbian_latest unzip 2017-09-07-raspbian-stretch.zip sudo fdisk l # zapamiętujemy nazwę karty sd sudo dd if=2017-09-07-raspbian-stretch.img of=/dev/sdx 6
Konfiguracja: Raspbian Możliwości pracy Po pierwszym uruchomieniu "świeżego" systemu Rpi: sudo raspi-config Bezpośrednie podłączenie USB (klawiatura, wskaźnik), HDMI/Composite Połączenie przez SSH Połączenie przez VNC X forwarding Praca zdalna, rozwiązania linuksowe I wiele innych 7 8 Struktura katalogów /boot # pliki rozruchowe systemu, jądro, initrd /bin # pliki wykonywalne dostępne dla wszystkich użytkowników Struktura katalogów c.d. /sys # wirtualny system plików umożliwiający konfigurację urządzeń /sys/class/gpio /sbin # pliki wykonywalne do zarządzania systemem /root /etc # pliki konfiguracyjne /tmp /home # katalogi domowe użytkowników systemu /run # dane od uruchomienia systemu, np. zalogowani użytkownicy /usr # doinstalowane aplikacje użytkowników, dokumentacja, /home/pi # w tym katalogu (i podrzędnych) tworzymy projekty # katalog domowy super użytkownika (root a) # tymczasowe podręczne pliki (często giną po restarcie systemu) /lib # biblioteki systemowe dla /bin i /sbin /lib64 # wersje dla 64 bitowego systemu /opt # opcjonalne oprogramowanie # biblioteki, pliki nagłówkowe /dev # pliki reprezentujące urządzenia /srv # dane udostępniane przez system /media # automatycznie montowane nośniki np. cd, pendrive y /lost+found # odzyskane pliki /mnt # miejsce montowania pomocniczych systemów plików /var/log dzienniki systemowe /var/lock "blokady" dla uruchomionych aplikacji" można je usunąć z prawami roota (np. gdy dojdzie do nieprawidłowego zamknięcia systemu). 9 10 Rpi widok z góry GPIO - podstawy Rpi działa z napięciem 3.3V, GPIO NIE SĄ 5V-TOLERANT. TYLKO 3.3V! Stan wysoki: ok. 3.3V, niski ok. 0V. Maksymalny prąd: ok. 15mA, CAŁKOWITY PRĄD ze wszystkich GPIO: 50mA Możliwe użycie układów 74HC, ale: Zasilane są z 5V, więc TYLKO Rpi układ, a nie układ Rpi. Sterowanie pinów TTL 5V z 3.3V nie jest zgodne ze standardem (w większości przypadków działa). 11 12
GPIO: Podstawy GPIO: Do pinu GPIO można się odnieść na kilka sposobów: Przez numer na schemacie Raspberry Pi (jak w opisie pinów) Przez numer pinu chipsetu Broadcom, Biblioteka WiringPi własny tryb adresowania Przez numer pinu na złączu PWM występuje na dwóch pinach:gpio13 (33 w złączu) i GPIO18 (12). 13 14 GPIO: Podstawy GPIO - Programowanie Nie ma ADC. Jest I2C, SPI, UART, EEPROM szeregowy. Włączanie/wyłączanie interfejsów: przez raspi-config: Najprostsza metoda, choć powolna i ograniczona: sysfs: /sys/... Umożliwia kontrolę z poziomu powłoki systemu (programy w Bashu czy Perlu). Ustawienia przez zapisywanie wartości do plików. Pliki, których potrzebujemy są w /sys/class/gpio/gpioxx/ A jeżeli ich nie ma, należy je dla każdego GPIO założyć poleceniem (z roota) np. dla GPIO13: echo 13 >>/sys/class/gpio/export 15 16 15 GPIO Programowanie sysfs Ustalenie wejście/wyjście: echo "in" > /sys/class/gpio/gpio15/direction echo "out" > /sys/class/gpio/gpio15/direction Wartość wyjścia (1/0 czyli wysoki/niski): echo "1" > /sys/class/gpio/gpio15/value Biblioteka PiGPIO Dodatkowa biblioteka umożliwiająca szybsze programowanie GPIO z poziomu C/C++. Dodany program narzędziowy pigs umożliwiający ustawianie pinów. Inicjalizacja programu pigs: konieczne uruchomienie programu pigpiod: (sudo pigpiod). Użycie: echo "0" > /sys/class/gpio/gpio15/value pigs + Metoda wspierana przez większość Linuksów dostępna z kernela. + Nie trzeba dodawać bibliotek - Do wielu płytek nie obsługuje szczególnych właściwości pinów - Brak możliwości załączenia rezystorów podciągających (Arduinowe INPUT_PULLUP) 17 Np. r read w write m mode mg get mode pud pull u/d Nr pinu Opcj. żądany stan (0/1) lub tryb (r/w) pigs m 23 w pin 23 jako WYJŚCIE (do zapisu write) pigs w 23 1 - zapis do pinu 23 stanu 1. 18
PiGPIO program w Bash u PiGPIO program w C++ #include <pigpio.h> #include <iostream> #!/bin/bash pigs m 23 w int main() { if( gpioinitialise() < 0 ) { std::cout << "PiGPIO initialisation failed!" << std::endl; return 1; else { gpiosetmode( 23, PI_OUTPUT ); for( int i = 0; i < 10; ++i ) { gpiowrite( 23, 1 ); time_sleep( 1 ); gpiowrite( 23, 0 ); time_sleep( 1 ); gpioterminate(); return 0; # ustawianie trybu wyjscia while true; do pigs w 23 1 # ustawianie stanu wysokiego dla diody sleep 1 # uspienie programu na 1 sekunde pigs w 23 0 # ustawianie stanu niskiego dla diody sleep 1 # uspienie programu na 1 sekunde 19 Budowanie : g++ -lpigpio -lpthread -lrt -o test test.cpp PiGPIO "PWM" programowy Pomoc z RPi #include <pigpio.h> #include <iostream> https://www.raspberrypi.org/documentation/ Dokumentacja Rpi od producenta int main() { if( gpioinitialise() < 0 ) { std::cout << "PiGPIO initialisation failed!" << std::endl; return 1; else { gpiosetmode( 23, PI_OUTPUT ); for( int i = 0; i < 1000; ++i ) { gpiowrite( 23, 1 ); time_sleep( 0.001 ); gpiowrite( 23, 0 ); time_sleep( 0.001 ); gpioterminate(); return 0; Budowanie : g++ -lpigpio -lpthread -lrt -o test test.cpp 20 http://abyz.me.uk/rpi/pigpio/ Dokumentacja PiGPIO http://abyz.me.uk/rpi/pigpio/pigs.html - dla PIGS http://abyz.me.uk/rpi/pigpio/cif.html - dla C http://wiringpi.com/ Biblioteka WiringPi 21 22 Laboratorium niezbędne elementy W czym programować? Konsola: GNU Nano / Vim / Emacs, GCC X y: Qt Creator rozbudowane IDE, pomocne struktury w bibliotece Qt Geany + GCC prosty edytor programistyczny z niezbędnymi dodatkami (budowanie, menedżer plików itp..) Raspberry Pi z kartą 8GB Klawiatura, mysz, przewód HDMI Zasilacz: 5V min. 2-2.5A, wtyk Micro USB Płytka prototypowa Konwerter GPIO na "DIP" do płytki Przewody, LEDy, urządzenia... 23 24
Laboratorium Powtórka z bash-a... Niezbędne polecenia: #!/bin/bash pigs m 13 w UŻYTKOWNICY: while true; do pi / pi root / root a=`expr a + 1` b=0 while [ b -lt a ]; do pigs w 13 1 pigs w 13 0 b=`expr b + 1` ZAMYKANIE: sudo shutdown -h now Skróty Ctrl-Alt-Fx przełączanie na kolejne konsole (gdy zawiesimy sobie X y). sleep 2 25...i przycisk (na linii 21) #!/bin/bash pigs m 13 w pigs m 21 r pigs pud 21 u # LED do pinu 13 26 Jeszcze raz, tylko w C++ # LED do pinu 13 # Przycisk do pinu 21 # Przycisk pull-up while true; do a=`expr a + 1` b=0 while [ b -lt a ]; do pigs w 13 1 pigs w 13 0 b=`expr b + 1` if [ `pigs r 21` -eq 0 ]; then a=0 b=0 fi sleep 2 27 i wejście 28 PWM O ile prawdziwy PWM nie jest dostępny na wszystkich pinach, mamy wystarczającą moc na użycie innych peryferiów do generowania PWM. Dzięki temu praktycznie na każdym pinie możemy uzyskać całkiem wystarczający i pewny sygnał PWM. Użycie via pigs: pigs p PIN WARTOSC PIN pin, WARTOSC współczynnik wypełnienia w postaci 0..255 29 30
PWM C/C++: 31