Higiena pracy z Qt W miarę możliwości tworzymy projekt z szablonu "Qt Console Application", Jeżeli nie kompiluje: Systemy Wbudowane Otworzyć plik projektu w edytorze Qt Creatora, Dodać: Raspberry Pi komunikacja szeregowa (wersja 2019) LIBS += -lpigpio mgr inż. Marek Wilkus http://home.agh.edu.pl/~mwilkus Wydział Inżynierii Metali i Informatyki Przemysłowej AGH Kraków 1 Zapisać plik Skompilować ponownie. 2 Qt Creator i uruchamianie Komunikacja szeregowa Aby uruchomić nasz eksperymentalny program z uprawnieniami roota (pigpio tego wymaga), najłatwiej "trzymać" sobie okienko terminala z katalogiem, do którego budowany jest plik binarny (katalog wyżej od katalogu projektu, i podkatalog build-.debug/release) Gdy chcemy uruchomić korzystamy z terminala sudo./testowyprojekt Po skończeniu testu kończymy program za pomocą klawiszy Ctrl-C. 3 Przykłady Bity wysyłane są "jeden po drugim" na jednej linii, Skąd wiadomo, który to kolejny bit? Stała czasowa (stała prędkość) (np. RS232), Linia zegara, Linia "latch". + + + + z Mała ilość zajmowanych linii, Możliwość pracy w magistrali, Protokoły umożliwiające np. ustalenie szybkości, Możliwe rozszerzenia "Clock skew" przy dużych prędkościach, Czasami wymagają kosztownego czasowo multipleksowania, Wysokie prędkości wysokie częstotliwości. I wszystkie związane 4 nimi kłopoty Shift register - 74HC595 Programowanie rejestru przesuwnego RS232 I2C SPI CAN, USB, SATA... Piny wejścia: SH_CP Linia zegara, DS Linia danych, ST_CP "zatrzaśnięcie" wartości wprowadzonej na wyjściu. Dodatkowo: /OE (output enable), /MR (reset na 00000000). Wyjścia: 8 wyjść cyfrowych - 0/1, wyłączanych linią /OE, Q7 - wyjście "przeładowania" do podłączania kolejnego rejestru. 5 6
Działanie 74HC595 Podłączenie 74HC595 3.3V Wyjścia DATA (GPIO) LOW Zegar Dane ST_CP 1. ST_CP (latch) LOW 2. Zegar dwa razy LOW (przy danych na HIGH) Wprowadzam 11 3. Dane LOW, zegar 4 razy, Wprowadzam 0000 4. Dane HIGH, zegar 2 razy, Wprowadzam 11 5. ST_CP (latch) HIGH wyprowadzenie danych na wyjścia WYNIK: 11000011 LATCH (GPIO) CLOCK (GPIO) HIGH GND - wyjścia rejestru 7 8 Implementacja C++/Qt A może więcej pinów? 8 16 9 Magistrala I2C 10 24... Przykład: Żyroskop/akcelerometr Często stosowana do komunikacji między urządzeniami, Rpi ma wbudowany interfejs I2C Założenia: Kiedy jedno urządzenie komunikuje się, reszta czeka. Tylko konkretne urządzenia odbierają, Manipulacja danymi przez dostęp do rejestrów oferowanych przez urządzenie. SCL - Clock SDA - data Urządzenie 1: Żyroskop/akcelerometr Urządzenie 2: Termometr/barometr 11 12
Wiele urządzeń I2C na Rpi: Dlaczego urządzenia nie wchodzą sobie w drogę? Zróżnicowana mapa rejestrów Możliwość "wybrania" urządzenia po adresie (ustawionym na etapie tworzenia urządzeń), Niektóre urządzenia umożliwiają zmianę adresu a w najgorszym razie... Linia ENABLE, I2C jest wykorzystywana m.in.: Podłączanie czujników Programowanie układów Pamięci ustawień Magistrale sterujące I wiele innych 13 14 14 Pełna procedura: 1) sudo nano /etc/modules Odkomentować lub dodać: su d a sp or i -co Warstwa fizyczna g nf Linie stale podciągnięte do zasilania. MASTER urządzenie nadające zegar, rozpoczynające komunikację. SLAVE urządzenie odpowiadające urządzeniu MASTER. Zmiana stanu linii danych odbywa się tylko gdy CLK jest w stanie niskim (poza rozpoczęciem i zakończeniem). i2c-bcm2708 i2c-dev 2) sudo nano /etc/modprobe.d/raspi-blacklist.conf Zakomentować lub usunąć: #blacklist spi-bcm2708 #blacklist i2c-bcm2708 3) Zainstalować narzędzia: sudo apt-get install i2c-tools 4) Sprawdzić dostępne magistrale sudo i2cdetect -l 5) Pobrać adres urządzenia dla jednej z magistrali: sudo i2cdetect -y 1 15 Warstwa fizyczna 16 Format danych Wyjścia nie mogą dać stanu "1", tylko Hi-Z typu "otwarty kolektor" nawet w razie konfliktu nie dojdzie do uszkodzenia. Read Jeżeli w razie nadania "1" na wyjściu jest jednak "0" inne urządzenie nadaje "0" KONFLIKT zaprzestanie nadawania. Niestandardowo może pracować kilka przełączających się urządzeń Master. Write I2C w Rpi znajduje się wraz z innymi pinami GPIO: 17 18
Komunikacja z urządzeniem Komunikacja burst read Pobieranie kilku bajtów z rejestrów: (SDA) (SCL) Opcjonalne (SDA) (SCL) Opcjonalne Pobieranie pojedynczego bajtu z rejestru Np. rejestr dwubajtowy Informacje na magistrali: 1. 2. 3. 4. Wyślij do Adres bajt Numer rejestru + 0 // (opracja 1) Odczytaj odebrany bajt // bajt1 // (opracja 2) Wyślij do Adres bajt Numer rejestru + 1 // (opracja 1) Odczytaj odebrany bajt // bajt2 // (opracja 2) 5. Złóż bajt1 i bajt2 wynik = (bajt1 << 8) bajt2 lub wynik = (bajt2 << 8) bajt1 1. 2. 3. 4. 5. 6. 7. Start bit (master->slave) 7 bit adres (slave address) (master->slave) R/W bit 0 write mode (master->slave) ACK bit (slave->master) Write 8 bits (Register number) (master->slave) ACK (slave->master) // Stop bit (master->slave) 8. 9. 10. 11. 12. 13. 14. Start bit (master->slave) 7 bit adres (slave address) (master->slave) R/W bit 1 read mode (master->slave) ACK bit (slave->master) Read 8 bits (Register value) (slave->master) ACK bit (master->slave) Stop bit (master-> slave) 19 I2c tools 20 Linuksowe API do I2C i2cset zapisuje wartości do urządzenia I2C i2cset -y W X Y Z W numer magistrali (1) X adres urządzenia Y adres rejestru Z bajt do zapisania i2cget pozyskanie bajtu z urządzenia I2C i2cget -y W X Y W numer magistrali (1) X adres urządzenia Y adres rejestru 21 Programowanie przez urządzenie 22 Rejestry 23 24
Odczyt "burst" i zapis Wymagania projektowe I2C nie jest źródłem zasilania. "Otwarty koniec" magistrali (np. złącze serwisowe) powinien zapewniać dostęp tylko do tych urządzeń, których serwisowania dotyczy (np. pamięć EEPROM)....a pozostawianie tam całej magistrali systemu to proszenie się o kłopoty. Ograniczeniem dla I2C jest długość magistrali i pojemność linii. Szczególnie niskie prędkości (<100kbit/s) są warunkowo dopuszczalne, jednak nie wszystkie urządzenia działają w takim przypadku prawidłowo. W systemach Linux wymagane jest załadowanie modułu jądra. 25 1-Wire 26 1-Wire Interfejs szeregowy dla urządzeń wykorzystujący masę i jeden przewód danych, Mniejsze urządzenia mogą być zasilane z linii danych, Z reguły tylko 1 urządzenie na danym pinie, Przykłady: Czujnik temperatury DS18B20, czujniki, transceivery, niewielkie pamięci. Linia podciągnięta do Vcc, Komunikacja oparta o czasy impulsów: Master daje L na 480µs inicjalizacja, urządzenia resetują się i odpowiadają nadając L na 60µs gdy linia jest wolna. Master wysyła "1" impulsem L 1-15µs, "0" impulsem L 60µs. Odbieranie danych: Master inicjuje wysłanie każdego bitu krótkim impulsem L (>15µs). Jeżeli Slave nada L na 60µs odebrano 0, else 1. 27 1-Wire Z reguły Reset 8-bitowe polecenie odbiór wyników. 28 1-Wire w RPi Domyślnie GPIO 4 Wsparcie systemu Sprawdzenie urządzeń: ls /sys/bus/w1/devices/ Podkatalogi tego katalogu odpowiadają urządzeniom 1Wire na magistrali. Najprostszy odczyt rejestrów z urządzenia: cat /sys/bus/w1/devices/28-000003f5a14e/w1_slave 29...spowoduje odczyt rejestrów i zwrócenie ich w formie szesnastkowej (hex). 30
Własny protokół komunikacyjny Komunikacja Rpi czujniki oparte o mikrokontrolery (np. Arduino, Espressif), Komunikacja szeregowa: Mało przewodów, Możliwość "puszczenia" po innym rodzaju przewodu lub wręcz bezprzewodowo (BT można sprowadzić do "portu szeregowego bez kabla"), Łatwość implementacji. Komunikacja równoległa:...z innymi urządzeniami by umożliwić wymianę informacji....z istniejącym systemem sieciowym by usprawnić przetwarzanie danych...z komputerem by używać urządzenia. Musimy opracować: Więcej przewodów (patrz np. podłączenie LCD), Większa szybkość transmisji (szczególnie gdy urządzenie wykorzystuje np.. 8-bitowy port wysłanie przez przypisanie wartości do rejestru), Implementacja bardziej wymagająca. Interfejs Protokół komunikacyjny 31 32 Protokoły komunikacyjne Interfejs komunikacyjny Niezbędne jest użycie istniejącego lub utworzenie nowego języka komunikacji urządzeń protokołu Jeżeli urządzenie ma udawać inne, np. klawiatura dobrze udokumentowane protokoły już istnieją...ale jeżeli tworzymy całkowicie nowe urządzenie, istniejące standardy, choć mocno naginane, mogą okazać się niewystarczające. np. Port szeregowy oferowany przez Arduino USB i emulacja USB przez AVR Sieć przy użyciu układu NIC Wi-fi (np.. układ ESP8266) Magistrale szeregowe oferowane przez AVR Własne interfejsy szeregowe i równoległe 33 Opracowywanie protokołu 34 RS232 ASCII czy binarny? ASCII łatwy w debugowaniu, możliwe ręczne testy, ale małe możliwości transmisji. Binarny możliwość przesłania dużej ilości danych, większa szybkość (brak złożonego dekodowania), ale trudniejszy w weryfikacji i przeprowadzaniu testów. Ściśle zależne od tego, jaką funkcję ma wykonywać urządzenie. Inny protokół będzie opracowany dla kontrolerów sterowanych przez komputer, a inny dla sterowników IoT. O ile to możliwe należy użyć istniejących interfejsów (np.. USB, Bluetooth, RS232), a protokoły powinny być udokumentowane! Jeżeli wykonujemy proste zadania stosunkowo rzadko (np. sterowanie przekaźnikami, sprawdzanie czujnika) możemy użyć protokołu w ASCII. 35 36
Co powinno być w protokole? Minimum Przykład Identyfikacja - komunikat, który powoduje odesłanie przez urządzenia informacji o sobie. Umożliwia wybranie urządzenia i uzyskanie informacji o jego wersji, możliwościach, funkcji. Reset - komunikat, który powoduje natychmiastowe przywrócenie wejść/wyjść do stanu pierwotnego, wywołującego najmniej możliwych negatywnych konsekwencji. Wykonywane na starcie urządzenia oraz w przypadku problemów z programem klienckim. Sterownik klawiatury akordowej: Interfejs: USB, emulacja klawiatury USB, Protokół klawiatury USB, Użycie protokołu: Niestandardowe naciśnięcie przycisku wywołuje emulację wciśnięcia jednej kombinacji klawiszy, zwolnienie innego. 37 38 Przykład c.d. Komunikacja z własną aplikacją #include "UsbKeyboard.h" Użycie istniejącego protokołu całkowicie załatwia nam kwestię identyfikacji (urządzenie zgłosi się jako klawiatura USB) i resetu. Istnieje gotowa biblioteka do low-speed USB: V-USB. Wystarczy oprogramować naciskanie i zwalnianie klawiszy w kodzie dla AVR. Przykład: Sterowanie płytką przekaźników przez komputer. Arduino będzie spełniać role interfejsów podłączanych do RPi. void setup() { TIMSK0 &=!(1<TOIE0); //atmega328 cli(); // Clear interrupts UsbDeviceDisconnect(); //make pc re-discover delayms(250); usbdeviceconnect(); sei(); // Set interrupts again pinmode(key_1, INPUT_PULLUP); void loop() { UsbKeyboard.update(); Więc: Interfejs: RS232 (lub I2C) do RPi. Protokół: ASCII. Polecenia: (...) if (digitalread(key_1) == LOW) { UsbKeyboard.sendKeyStroke(CODE1_DOWN, MODIFIER); delay(100); Identyfikacja konkretnego modułu Reset Ustaw Odczytaj stan (...) 39 40 Przykład: c.d. Kod Arduino wersja dla jednego modułu #define... Np. tak: void setup() { Serial.begin(9600); pinmode(relay1,output);... pinmode(relay5,output); reset(); PC->AVR Funkcja Użycie / Odpowiedź I IDENTIFY Łańcuch tekstu zawierający INTERFACE x (x ID modułu) R[ID] RESET Wszystkie przekaźniki wyłączone. AVR odpowiada O jak OK. S[ID]xx.0, S[ID]xx.1 SET Ustawia przekaźnik xx w stan 0 lub 1. AVR odpowiada O jak OK. G[ID].xx. GET Pobiera informację o stanie przekaźnika. AVR odpowiada 0 lub 1. void reset() { digitalwrite(relay1,low);... digitalwrite(relay5,low); byte getstate(byte relay) { if (relay==1) return digitalread(relay1);... if (relay==5) return digitalread(relay5); return 255; //error condition 41 void setstate(byte relay, byte state) { if (relay==1) digitalwrite(relay1,state);... if (relay==5) digitalwrite(relay5,state); void loop() { if (Serial.available()) { char k=serial.read(); delay(10); switch (k) { case 'I': { Serial.print("RELAY INTERFACE v. 1.0"); break; case 'R': { reset(); Serial.print("O"); break; case 'G': { byte which=serial.read()-'0'; Serial.print(getState(which)); break; case 'S': { byte which=serial.read()-'0'; byte what=serial.read(); //dot what=serial.read()-'0'; setstate(which,what); Serial.print("O"); break; 42
Aplikacja Łączność modemy szeregowe Dla Arduino istnieje wiele urządzeń dołączanych do portu szeregowego. Urządzenia te zachowują się jak modemy. Obsługa np. Bluetooth Wi-fi (ESP8266) GSM (SIM800) GPS (SIM900 i późne SIM800) I wiele innych 43 Sterowanie odbywa się poleceniami modemowymi (Hayesa) i ich rozszerzeniami. 44