Projekt PiMP – budowa pierwszej bety
Witajcie od poprzedniego wpisu wiele się zmieniło 🙂 Po zakupie pierwszych komponentów z botland i pierwszych próbach podłączenia tego do kupy, jak już w poprzednim wpisie wspomniałem okrutnie się pomyliłem jeśli chodzi o zakup wersji Pico.
Kupiłem Pico Pi H a powinienem kupić Pico Pi W wtedy ustanowienie komunikacji ze światem będzie o wiele prostsze.
Podłączenie
Rozpoczynając zabawę byłem w posiadaniu :
- Raspberry Pi Pico H
- Czujnika BME280
- Wyświetlacza OLED 128x64px opartego na sterowniku SH1106
- Przewodów połączeniowych żeńsko-żeńskich
Korzystając z dostępnych materiałów w Internecie przystąpiłem do pierwszych prób uruchomienia Pi Pico oraz podłączenia czujnika BME280. Jako że używam macOS zainstalowałem oprogramowanie Thonny ( nie będę się rozpisywał o możliwościach tego softu oraz o konfiguracji ponieważ materiałów na ten temat jest zatrzęsienie w Internecie.
Pierwszy nietypowy problem
Może dla użytkowników PC i Windowsa będzie to niezrozumiały problem ale zaraz przy podłączeniu trafiłem na brak odpowiedniego kabla aby Pico Pi podłączyć do mojego Maca. Pico (używajmy od tej pory tej skróconej nazwy to ułatwia i pisanie i rozumienie) posiada microUSB natomiast Mac tylko USB-C. Potrzebowałem przejściówki z USB-C na USB-A i kabla USB-A. na microUSB.
Pierwszy start
Po kilku nieudanych próbach ustanowienia połączenia między komputerem a Pico udało mi się uruchomić pierwszy program w Micropythonie. Klasycznie już było to napisanie na ekranie Hello World.
Po tym spektakularnym sukcesie zdecydowałem się na próbę podłączenia BME i próbę odczytu parametrów meteo. Z racji posiadania minimalnego doświadczenia w pracy z urządzeniami Raspberry oraz różnymi czujnikami bez większego problemu odnalazłem bibliotekę potrzebną do obsługi czujnika i wgrałem ją do Pico.
Więcej informacji o niej znajdziecie na GitHubie jej twórcy (klik)
Aby odczytać informacje które mierzy czujnik trzeba wiedzieć do jakich pinów wg schematu mam podłączony czujnik do Pico, odpytać te piny aby podały informacje (ogólnie brzmi dość prosto nie?)
Podłączenie i pierwszy kod
from machine import Pin, I2C
from time import sleep
import bme280
i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)
while True:
bme = bme280.BME280(i2c=i2c)
print(bme.values)
sleep(10)
Podłączenie za pomocą złączy żeńskich do wlutowanych gold pinów raczej należy do zadań prostych jak się później okazało. Schemat udało się wykombinować z pomocą dokumentacji czujnika. W zasadzie nie ma czego tłumaczyć ponieważ wszystko widoczne jest na schemacie obok. Całość tej pięknej choinki dało taki efekt jak widzicie poniżej:
>>> %Run -c $EDITOR_CONTENT
('23.13C', '981.91hPa', '46.52%')
('23.14C', '981.89hPa', '46.52%')
Na potrzeby późniejszego tworzenia pliku z logiem zmodyfikowałem powyższy kod tak aby przed pomiarem była nazwa mierzonego medium . Zapisałem aktualny stan pracy i rozliczyłem czujnik, aby sprawdzić czy z taka sama gracją i łatwością uda mi się uruchomić wyświetlacz OLED.
No i jak się szybko okazało wyświetlacz tak szybko się nie dał 🙂 Chwile dłużej trzeb było pogłówkować i poszukać aby go uruchomić. W Internecie znalazłem artykuł w którym ktoś próbować przysposobić podobny wyświetlacz do Arduino i po przeczytaniu tego wszystko stało się jasne.
Pierw podłączyłem sam wyświetlacz aby sprawdzić czy działa i czy dodanie za pomocą Thonny biblioteki do jego obsługi jest poprawne ponieważ wcześniej instalowałem inna która wg. opisu winna działać a nie chciała. Finalnie użyłem TEJ biblioteki. Po sprawdzeniu poprawności działania kodu na samym wyświetlaczu postanowiłem podłączyć wszystko razem do kupy i tu kolejny problem napotkałem ponieważ jak się okazało oba urządzenia używają dokładnie tych samych pinów i trzeba podłączyć dwa żeńskie do jednego gold pinu 🙂
from machine import Pin, I2C
from time import sleep
import bme280
from ssd1306 import SSD1306_I2C
i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)
while True:
oled.fill(0)
bme = bme280.BME280(i2c=i2c)
temperature = bme.values[0]
pressure = bme.values[1]
humidity = bme.values[2]
print('Temperatura: ', temperature)
print('Wilgotnosc: ', humidity)
print('Cisnienie: ', pressure)
oled.text("Temp "+temperature, 0, 0)
oled.text("Cis "+pressure, 0, 20)
oled.text("Wilg "+humidity, 0,40)
oled.show()
sleep(10)
Ten kawałek kodu można uznać za pierwszą wersję programu. O numeracji wersji oraz nazwach ewentualnych wersji kluczowych napiszę trochę później ponieważ jeszcze nie do końca wiem jak to rozwiązać.
Drugi nietypowy problem
Po uruchomieniu kodu który widzicie powyżej pojawiła się potrzeba pokazania i na wyświetlaczu jak i w princie w konsoli daty i czasu. Po pierwsze aktualna data i czas dają informację czy urządzenie działa poprawnie i czy pętla pracuje cały czas, po drugie data i czas potrzebna jest do wielu informacji o sumie odczytów:
- pozwoli obliczyć czas od uruchomienia do wyłączenia
- pozwoli na oszacowanie ram czasowych wzrostu czy spadku jakiegoś parametru mierzenia
- pozwoli na oszacowanie czasu działania na danym ogniwie zasilania
I pewnie jeszcze przez dłuższą chwilę mógłbym wymieniać do czego ten czas jest potrzebny, ale niestety jak się okazało czas nie do końca chciał działać. Ale może po kolei.
Jak by to był „normalny” kod w Pythonie to import datetime i później datetime(now) i prawie po temacie, niestety MicroPython taki wspaniały w swojej składni jak się okazuje nie jest 🙂 Straciłem jakieś 1,5 h googlując sobie bo różnych stronach aż dotarłem do tego jak zmusić program to pobrania daty i godziny. I oto przedstawię Wam tę magiczną lecz pustą metodę :
import time
year, month, day, hour, mins, secs, weekday, yearday = time.localtime()
Jest ! działa pojawiła się w konsoli data i godzina cudownie ! To szybko poklepuje kilka lini kodu która ma wstawić date i godzinę do zmiennej, a ze zmiennej z kolei na wyświetlacz i mój problem rozwiązany. Cały kod teraz wygląda w taki sposób:
from machine import Pin, I2C
import time
year, month, day, hour, mins, secs, weekday, yearday = time.localtime()
from time import sleep
import bme280
from ssd1306 import SSD1306_I2C
builtin_led = Pin(25, Pin.OUT)
i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)
while True:
builtin_led.value(1)
oled.fill(0)
bme = bme280.BME280(i2c=i2c)
temperature = bme.values[0]
pressure = bme.values[1]
humidity = bme.values[2]
data = ("{}-{:02d}-{:02d}".format(year, month, day))
godzina = ("{}:{:02d}:{:02d}".format(hour, mins, secs))
print("{}-{:02d}-{:02d}".format(year, month, day))
print("{}:{:02d}:{:02d}".format(hour, mins, secs))
print('Temperatura: ', temperature)
print('Wilgotnosc: ', humidity)
print('Cisnienie: ', pressure)
oled.text(""+data, 25, 0)
oled.text(""+godzina, 30, 10)
oled.text("Temp "+temperature, 15, 20)
oled.text("Cis "+pressure, 15, 30)
oled.text("Wilg "+humidity, 15,40)
oled.show() #wyswietlenie na wyswietlaczu
sleep(10) #przerwa 10 w petli
No i testujemy – voilà wszystko działa jak należy 🙂 A przynajmniej tak mi się wydawało bo wysyłając kod z Thonnego do Pico wszystko działa ale już uruchamiając program bezpośrednio z Pico data ustawia się na 2021-01-01 a godzina na 0:00:01. No i znów problem amatora, chwilę pogłówkowałem ale że nic tam w głowie nie znalazłem postanowiłem zasięgnąć opinii mądrzejszego i zwróciłem się do mojego Pythonowego guru Darka który powiedział mi że Pico nie posiada zegara RTC i mogę sobie podłubać w nosie a i tak bez podłączenia do internetu albo dodania do projektu takiego modułu aktualnej daty i czasu mieć nie będę 🙂 I to taki kolejny błąd amatora który ledwo zna się na elektronice , ale cóż powiadają że człowiek całe życie się uczy.
Trzeci, a w sumie to drugi – bo zapomniałem o nim nietypowy problem amatora
Zastanawialiście się będąc amatorem elektroniki i programowania mikrokontrolerów w jaki sposób umieścić nasz program w urządzeniu tak aby po uruchomieniu zasilania program zaraz zaczął działać ? No ja się zastanawiałem i wydawało mi się że trzeba go umieścić na pamięci urządzenia i już 🙂 Przeczytałem że na Pico jest przycisk trzeba go wcisnąć przy podłączaniu pojawi się podmontowana do kompa pamięć przenośna i już.
Otóż wyjaśniam tym który nie programowali jeszcze i nie mają doświadczenia z innymi mikrokontrolerami takimi jak Atmega czy Arduino. Opisywany proces przytrzymywania przycisku przy podpinaniu urządzenia pozwala na umieszczenie na jego pamięci oprogramowania które wykona flash pamięci 🙂 Aby uruchomić automatycznie nasz program trzeba go za pomocą Thonnego zapisać na pamięci Pico i nazwać main.py wtedy zadziała tak jak tego oczekujemy.
Testowa obudowa
W jakiś sposób trzeba prototyp jakoś transportować do testów itd. Ja wynalazłem do tego celu pudełko po czujniku automatyzacji domowej które gabarytami było najmniejszym jakie udało mi się odnaleźć za pomocą taśmy izolacyjnej oraz taśmy izolacyjnej 😛 usadowiłem elementy w środku w sposób na tyle trwały że działają. Całość prezentuje się na ten czas bardzo ale to bardzo pro :
W tym jakże profesjonalnym opakowaniu mój PiMP wyszedł na swój pierwszy test na zewnątrz. I tu od razu dwa spostrzeżenia:
- Zimny start BME od temperatury pokojowej do faktycznie panującej na zewnątrz przy różnicy w okolicach 20 °C to koło 7 minut. Przy kolejnych testach trzeba sprawdzić czy możliwe jest zmniejszenie tego czasu, a jeśli nie będzie to możliwe to w jaki sposób program ma sprawdzać kiedy odczyty są bardziej realne i zaczynać nagrywanie pomiarów. W przyszłości jak do całego zestawu dojdzie jeszcze GPS to zimny start jeszcze będzie uzależniony od złapania fixa przez GPS.
- Drugie spostrzeżenie dotyczy temperatury i wilgotności oraz przekłamań na które wypływ może być mała odległość od ludzkiego ciała. Szczególnie w warunkach zimowych gdzie łatwo nasz rozgrzany organizm oddaje wilgoć i temperaturę. Trzeba będzie wykonać testy i określić optymalne usadowienie urządzenia podczas odbywania aktywności.
To do na tym etapie
Zdecydowanie potrzebujemy więcej niż tę jedną diodę którą posiada Pico. Potrzebujemy diody RGB której zaprogramujemy odpowiednie zachowania i zapiszemy je w dokumentacji. Dioda pozwoli nam na komunikację urządzenia z użytkownikiem.
A byłbym zapomniał, pewnie Wasze wnikliwe oczy zauważyły w kodzie programu w lini 14 uruchamiam wbudowaną w Pico zieloną diodę co pozwala mi na proste debugowanie: jeśli dioda się pali a na wyświetlaczu niczego nie to coś zepsułem 🙂
Podsumowanie
Pierwszy etap budowy naszego loggera warunków atmosferycznych wraz z danymi GPS mamy prawie ukończony, jeszcze tylko kilka szlifów programu i będziemy mogli przejść do kolejnego etapu.
Jeśli jesteś zainteresowany projektem, zapraszam do śledzenia bloga wraz z rozwojem projektu będę umieszczał tutaj informacje na temat postępów prac.