poniedziałek, 5 października 2015

Raspberry Pi 2 & Windows 10 IoT Core - odc.4: I2C (BMP180)

Tym razem postanowiłem skorzystać z I2C, by zmierzyć temperaturę i ciśnienie atmosferyczne w pokoju. Posłużył mi do tego dość popularny czujnik BMP180 produkcji Bosch (moduł SparkFun). Jak widać na zdjęciach wszystko się udało i nic nie wybuchło.

Ale po kolei. Co to jest I2C?  To kolejny standard komunikacji szeregowej między urządzeniami. Kto nie zetknął się z nim na studiach, może rzucić okiem na odpowiednią część wykładu  http://www.ien.pw.edu.pl/EAZ/_pdf/wykl_cz1.pdf.  Przed eksperymentami koniecznie należy zapoznać się z dokumentacją czujnika BMP180. Dowiemy się z niej, do jakich rejestrów zapisywać polecenia odczytu temperatury i ciśnienia (cztery poziomy precyzji), a z jakich odczytywać wyniki pomiarów oraz parametry kalibracji (są potrzebne do dość złożonych wzorów konwertujących surowe wartości z bezpośredniego odczytu na postać zrozumiałą dla ludzi). Zwróćmy uwagę na podane czasy w ms, po których możemy odczytać wynik pomiaru (różne dla poszczególnych precyzji ciśnienia). Mamy tam też opisaną komunikację po I2C, jakby ktoś nie zapoznał się z tym standardem z innych źródeł. Jeszcze jedna dygresja o BMP180. Standardowo dostarczany jest z otworami, w które trzeba wlutować goldpiny, by móc wpiąć go do płytki. Jeśli jednak eksperymentujemy, to możemy pójść na skróty i posłużyć się kabelkami z haczykami, co też uczyniłem.

Jak połączyć BMP180 z “maliną”?  Robimy to w prosty sposób przy użyciu czterech przewodów:  masa, zasilanie +3.3V, szyna z danymi I2C (SDA), szyna z zegarem I2C (SCL). Nie mamy raczej jak pomylić pinów GPIO w Raspberry Pi (tylko jedno SDA i SCL).  Dla porządku polecam jednak zapoznać się ze schematem np. z projektu BMP180 Windows IoT Project.

Co z oprogramowaniem?  Polecam źródła BMP180 Windows IoT Project, a także lekturę posta I/O I²C with Windows 10 IoT, Raspberry Pi 2 and the temperature sensor BMP180. W moim przypadku to wypadkowa wspomnianych rozwiązań (używam wysokiej precyzji pomiaru ciśnienia, ale nie tej hiper najwyższej) dodatkowo wzbogacona o wyliczanie wysokości n.p.m na podstawie ciśnienia. Odpowiedni wzór można znaleźć np. na stronie Raspberry Pi barometr czujnik ciśnienia BMP 180 czy w skryptach biblioteki Adafruit_Python_BMP.  Wyliczona wysokość pasuje w miarę do miejsca, w którym się znajduję (co jakiś czas można zaobserwować drobne wachania w zakresie kilku metrów).

WP_20151006_00_23_48_Pro

WP_20151006_00_22_21_Pro

WP_20151006_00_21_57_Pro

sobota, 3 października 2015

Raspberry Pi 2 & Windows 10 IoT Core - odc.3: SPI (MCP3008 + potencjometr)

He, he,  można powiedzieć, że aby oswoić bardziej “malinę”, organizuję sobie “laborki z elektroniki cyfrowej” we własnym domu. Jest to jakieś nawiązanie do kilku semestrów studenckich czasów, tyle że przy udziale Raspberry Pi 2 i Windows 10 IoT. Tym razem padło na szeregową komunikację SPI na przykładzie mierzenia oporu za pomocą przetwornika analogowo-cyfrowego. 

Co to jest SPI?  Skoro zaczęliśmy w duchu studenckim, odsyłam do wykładu http://www.ien.pw.edu.pl/EAZ/_pdf/wykl_cz1.pdf Winking smile, w którym dość wyczerpująco został opisany ten rodzaj komunikacji (i nie tylko). Używanie SPI na przykładzie przetwornika A/C MCP3002 zostało bardzo dobrze pokazane w webcaście 13 Raspberry PI 2 i SPI – czyli jak podłączać różne sensory do RPI używając szyny SPI. Ja jednak mam w ręku układ MCP3008, nie MCP3002. Przeczytałem sobie do niego dokumentację. To także przetwornik 10-bitowy, ale z 8 kanałami (zamiast 2). Ma też więcej nóżek i do komunikacji używa 3 bajtów zamiast 2. Praktyczne przykłady podłączenia MCP3008 do “maliny” znajdziemy choćby na stronie Raspberry Pi YL-69 + MCP3008 czyli analogowy odczyt z czujnika wilgotności gleby czy Raspberry Pi Odczyt informacji z potencjometr obrotowy 10 k Ohm liniowy 1/8 W i układ MCP3008.  Na podstawie zdobytej wiedzy zbudowałem sobie układ wykorzystujący jeden kanał:

03_mcp3008_trimpot_spi_bb

Kanał zero z MCP3008 podpięty jest do potencjometru 10k, który połączony jest z szyną +3.3V.  V dd  i V ref  także są do niej podpięte. Masy cyfrowa i analogowa układu podpiete są do szyny z masą. Połączenia do SPI między przetwornikiem a maliną przedstawiają się następująco:  CLK – SPI0 SCLK, D out – SPI0 MISO, D in – SPI0 MOSI, CS – SPI0 CS0.  Aplikację ze wspomnianego wyżej webcastu zmodyfikowałem sobie, tak by obsługiwała jeden kanał  i układ MCP3008.  Do przetwornika wysyłam tablicę bajtów:  0x01, 0x80, 0x00. W metodzie convertToInt zamiast pierwszego i drugiego bajtu przetwarzam w taki sam sposób drugi i trzeci. Wszystko ładnie od razu zaczęło nawet działać !

WP_20151004_01_28_40_Pro

WP_20151004_01_21_33_Pro

P.S  Na stronie What’s next for Windows 10 IoT Core pojawiły się nowe wieści nt. Windows 10 IoT. Oprócz zapowiedzi udoskonaleń w kolejnej wersji warto wiedzieć, że wraz z Adafruit został przygotowany zestaw z podzespołami kompatybilnymi z tym systemem.

c.d.n

środa, 23 września 2015

Raspberry Pi 2 & Windows 10 IoT Core - odc.2: trzy kolory cz.1 (dioda LED RGB)

Po przekartkowaniu różnych książek o Raspberry Pi i buszowaniu w necie nabieram pojęcia, co można łączyć i jak. Z jednej strony mamy mnóstwo elementów i pomysłów, z drugiej strony okazują się zwykle tymi samymi elementami i pomysłami, choć oczywiście można budować także bardziej złożone konstrukcje (czasami lepiej wtedy skorzystać z innych dodatkowych płytek, można też współpracować z urządzeniami zbudowanymi na Arduino). Linux niestety jest tu mocno zakorzeniony i ma sporo bibliotek, nieraz na poziomie systemowym. Nie wszystko - przynajmniej obecnie  - zrobimy w Windows 10 IoT lub czasami trzeba będzie skorzystać z jakiegoś przykładu zamiast z systemowego API. Szczegółowymi uwagami podzielę się przy konkretnych zagadnieniach.

Dziś wypróbowałem program Fritzing do rysowania płytek i schematów, wszyscy chyba z niego korzystają. Opcja automatycznego układania połączeń nie wydaje się działać najlepiej (zrezygnowałem póki co z jej stosowania). W dodatku dioda RGB ze wspólną katodą miała inaczej podpisane etykiety G i B niż tooltipy przy pinach!  Tym niemniej w końcu udało się narysować to, co chwilę później sobie połączyłem.

Do zabawy wykorzystałem w dużej mierze przykład rgb-led-sample, przy czym moja dioda ma w innej kolejności anodę zieloną i niebieską. Najdłuższa nóżka to katoda, którą łączymy z masą (kabelek czarny), pin R łączymy z GPIO 5, G z GPIO 6, a B z GPIO 13 (kolory kabelków zgodnie z kolorami diody).

02_rgb_led_bb

02_rgb_led_schem

Wszystko odpaliło nawet za pierwszym razem. Podobnie jak w poprzednim przykładzie po włączeniu Raspberry Pi dioda słabo się tli (zielonawo-czerwonawo). Po wgraniu na mikrokomputer aplikacji, która ustawia stan pinów, dioda zaczyna świecić jasno na czerwono, potem na niebiesko, jeszcze później na zielono i tak w kółko. Użyłem tutaj lekko zmodyfikowanego przykładu Microsoft z timerem (zamienione numery pinów GPIO dla G i B diody RGB, maksymalny okres z 1s wydłużyłem do 4s by lepiej się temu przyjrzeć).

WP_20150924_02_10_49_Pro

WP_20150924_02_04_42_Pro

WP_20150924_02_04_46_Pro

WP_20150924_02_04_37_Pro

Przełączanie pomiędzy kolorem czerwonym, niebieskim i zielonym nie wyczerpuje możliwości diody RGB.  Pozwala ona również na mieszanie tych trzech składowych, by ustawić dowolny kolor świecenia. Ale o tym może innym razem.

c.d.n

piątek, 18 września 2015

Raspberry Pi 2 & Windows 10 IoT Core - odc.1: pierwsze “urządzenie” (dioda LED)

Tradycyjnie wszystko zaczyna się od diody LED, nie mogłem sobie tego odmówić. Typowy przykład z podłączaniem czerwonej LED do GPIO 5 przez rezystor 220-omowy (ogranicza prąd, co zabezpiecza diodę przed skróceniem żywotności). Zauważyłem, że zanim uniwersalna aplikacja wgra się na mikrokomputer i zostanie ustawiony przez nią stan pinu (dostęp do GPIO zapewnia IoT Extension SDK), dioda troszkę się tli (jakby stan nieokreślony?). Jak aplikacja ustawi stan wysoki dioda świeci się dość jasno, przy niskim gaśnie zupełnie. Przy starcie aplikacja włącza diodę, potem możemy ją wyłączać/włączać za pomocą przycisku na ekranie i podpiętej myszki. Podpinanie kolorowych kabelków może kojarzyć się z rozbrajaniem bomby, nie wolno się pomylić, bo przy nieprawidłowym podłączeniu (skutkującego np. podaniem zbyt wysokiego napięcia czy zwarciem) możemy uszkodzić mikrokomputer. Poza tym na czas wszelkich manipulacji przy GPIO obowiązkowo wyłączamy zasilanie w Raspberry Pi (do działającej “maliny” można natomiast podłączać urządzenia USB).

WP_20150918_02_22_28_Pro

WP_20150918_02_20_48_Pro

WP_20150918_02_23_07_Pro

c.d.n

czwartek, 17 września 2015

Raspberry Pi 2 & Windows 10 IoT Core - odc. zero

Chciałbym rozpocząć cykl tematyczny poświecony Windows 10 IoT Core na Raspberry Pi 2.  Na razie podłączyłem wszystko i wgrałem pierwszą uniwersalną app-kę dla testu przez Visual Studio. Sprawdziłem też trochę portal do zarządzania urządzeniem z poziomu przeglądarki, komunikację przez SSH (Putty), mysz i klawiaturę.

WP_20150917_08_35_41_Pro

c.d.n

wtorek, 15 września 2015

Windows 10 Mobile build 10536.1004 (Insiders), Windows 10 10537 (leak) i nie tylko

Aby cieszyć się najnowszym mobilnym buildem trzeba zainstalować z poziomu ostatniej wersji “10” trzy aktualizacje (10514, 10536.1000, 10536.1004), w tym ostatnia trwa zauważalnie dłużej niż inne (jeśli wrócimy do WP 8.1 do od razu zostanie wgrana najnowsza wersja “10”-tki). Z buildem 10536 w ogóle jest trochę zamieszania. A to długo się rodził, był ogłaszany, że już będzie, po czym po wykrywaniu kolejnych bugów był odwoływany. A to trafił przez pomyłkę do części Insiderów mimo odwołania publikacji. A to może wprowadzić na manowce pokazując się w aktualizacjach systemu, mimo że dany telefon z Windows Phone go może nie wspierać. Jak już wgramy pamiętajmy, że jednym z bugów jest niemożność przełączania się ze Slow Ring na Fast w aktualizacjach (pracują nad tym, obecnie jedynym obejściem jest reflash do WP 8.1). Niemiłą niespodziankę będą też mieli użytkownicy Lumii 1020 z uwagi na brak możliwości skorzystania z pełnych możliwości aparatu, a aplikacja Lumia Camera je obsługująca nie jest jeszcze dostępna (jeśli na tym komuś zależy to też może wrócić sobie do WP 8.1 zanim aplikacja trafi do Store).

Od siebie dodam, że update do 10536.1004 zajął mi na telefonie kilka godzin. Najpierw dwie pierwsze aktualizacje za jednym razem, potem ostatnia. Nie zauważyłem, by coś trwało zauważalnie dłużej, bo wszystko trwało kilka godzin. Żadnych problemów, wszystko się udało, system działa (jedyne, co zauważyłem, to czasami po zmianie koloru wiodącego w ustawieniach aplikacje wewnątrz siebie mogą pozostać przy innym kolorze; przestała mi też działać app-ka z Androida podobnie jak po poprzednim updacie, na razie nie udało mi się uruchomić jej ponownej instalacji, ale nie wliczam tego w podstawowe działanie systemu).

Linki