[PRZYKŁAD] Obsługa KAmodLPS25HB za pomocą minikomputera Orange Pi Zero
Aby móc korzystać z interfejsu I2C oraz języka python należy zainstalować poniższe pakiety:
sudo apt-get install python-dev sudo apt-get install i2c-tools
Następnie sprawdzamy czy system widzi porty I2C
ls -ls /dev | grep i2c
Powinny pokazać się wpisy informujące o plikach w folderze /dev reprezentujących porty I2C:
Kolejnym krokiem jest sprawdzenie co jest podłączone do portu I2C numer 1:
sudo i2cdetect -y 1
System widzi jedno urządzenie o adresie 0x5c. Wszystko jest w porządku. Można przejść do instalowania biblioteki odpowiedzialnej za obsługę GPIO w komputerze.
sudo git clone https://github.com/nvl1109/orangepi_PC_gpio_pyH3 cd orangepi_PC_gpio_pyH3 sudo python setup.py install
Jeśli nie widzimy komunikatów o błędach można w tej chwili swobodnie korzystać z biblioteki. Ostatni etapem projektu jest przygotowanie i uruchomienie kodu napisanego w języku python. Oto prosta klasa LPS25, która implementuje najważniejsze funkcje obsługi czujnika:
#!/usr/bin/python # LPS25.py # Klasa do obslugi czujnika LPS25HB # Maciej Ropelewski # mikrokontroler.pl 2017 from pyA20 import i2c import ctypes class LPS25: def init(self): self.writeReg(0x20, 0xB0); def writeReg(self,reg, val): i2c.write([reg,val]) def readReg(self, reg): i2c.write([reg]) return i2c.read(1) def czytajCisnienie(self): pxl = self.readReg(0x28) pl = self.readReg(0x29) ph = self.readReg(0x2a) return (ph[0]<<16 | pl[0]<< 8 | pxl[0])/4096.0 def czytajTemperature(self): tl = (self.readReg(0x2b)[0]) th = (self.readReg(0x2c)[0]) ttemp = (th << 8 | tl) temp=ctypes.c_int16(ttemp) #konwersja danych na int16 return 42.5 +float(temp.value)/480
W funkcji init wysyłamy niezbędną konfigurację czujnika. Funkcje writeReg i readReg pozwalają na wpisanie własnych wartości do rejestrów konfiguracyjnych, lub odczytanie wartości w rejestrze czujnika. Funkcja czytajCisnienie odczytuje wskazania ciśnienia atmosferycznego, a następnie oblicza jego wartość w milibarach. Podobnie działa funkcja czytajTemperature. Tu z kolei wartości wyskalowane są w stopniach Celsjusza. Warto zwrócić uwagę, że czujnik zwraca wartość temperatury jako 16-bitową liczbę typu integer ze znakiem. Aby poprawnie odczytać wartość koniecznie trzeba skonwertować odczytane dane na int16.
Kolejny plik to główny plik przykładu PrzykladLPS25H.py.
#!usr/bin/python3 # PrzykladLPS25H.py # ilustracja dzialania czujnika LPS25HB # Maciej Ropelewski # mikrokontroler.pl 2017 from pyA20 import i2c import time from LPS25 import LPS25 adres_czujnika = 0x5c i2c.init("/dev/i2c-1") i2c.open(adres_czujnika) czujnik = LPS25() czujnik.init() while True: temp = czujnik.czytajTemperature() cisnienie =czujnik.czytajCisnienie() print ('Cisnienie: %.2f mbar || Temperatura: %.2f st. C' % (cisnienie,temp)) time.sleep(3) i2c.close()
W pliku inicjalizowane jest połączenie i2c, wywołana instancja klasy LPS25, a następnie wstępnie konfigurowany jest czujnik. W pętli programu co ok. 3 sekundy odczytywane są wartości ciśnienia i temperatury a następnie obie wypisywane w oknie terminala. Cały kod znajduje się w sekcji „do pobrania”.
Bardzo wygodnym sposobem kopiowania plików przez protokół SSH jest użycie programu WinSCP (Dla systemów Windows). Logujemy się na niego podając to samo IP, login i hasło co dla konsoli SSH. Wybieramy protokół SCP. Po zalogowaniu można w intuicyjny sposób kopiować pliki z jednego urządzenia na drugie (Interfejs jest identyczny jak w programie Total Commander). Po lewej stronie mamy widoczne pliki na naszym komputerze, po prawej – na Orange Pi Zero.
Po zgraniu plików należy wrócić do konsoli i uruchomić program za pomocą następującej komendy:
sudo python PrzykladLPS25H.py
Efekt prawidłowego działania programu przedstawiono na poniższym obrazku:
Program można wyłączyć np. skrótem klawiszowym Ctrl-Z. Przed wyłączeniem komputera z sieci zasilającej należy użyć polecenia:
sudo poweroff
I dopiero po zgaszeniu diody odłączyć zasilanie.