Zainstalowałem.
Linki:
Windows, C#, XAML, .NET, Web, aplikacje mobilne, IoT
Wesół dzień. Ukazał się nowy mobilny build, odsłona IoT została wydana na kolejną platformę oraz zyskała znacznie bardziej wydajne sterowniki. A to nie wszystko, podobno dziś ma ukazać się także nowy desktopowy build.
Jeśli chodzi o Windows 10 Mobile, to zainstalowałem najnowszą odsłonę, wszystko poszło szybko i bezproblemów. System wydaje się pracować stabilniej (np. kamera), rozwiązano w nich trochę bugów, ma zużywać w mniejszym stopniu baterię (zobaczymy).
Linki:
Jak już wspominałem PWM może być przydatny nie tylko do sterowania serwem, ale również jasnością świecenia diody LED czy jej kolorem (dioda RGB). Niedawno bawiłem się w klubie, gdzie diody na ścianie płynnie zmieniały kolory. Zróbmy więc sobie namiastkę takiej klubowej atmosfery za pomocą układu, który przedstawiałem w odc.2.
Aplikacja podobnie jak ostatnim razem wykorzystuje PWM z BusProviders. Puszczam sobie częstotliwość 1kHz i na ekranie za pomocą trzech suwaków dla pinów red, green i blue reguluję procent impulsu w stanie wysokim (wartość 0 - 255 dzielone przez 255). Tym razem dałem wszystkie oporniki 220 omów, by mniej eksploatować diodę (zasadniczo różnica w świeceniu nie okazała się znacząca). Kilka przykładowych stanów diody, które utrwaliłem:
Całość pokazuje krótkie nagranie:
Przed zbudowaniem przykładu odpalałem m.in projekt Many Colors with Variable RGB LED. Pozwala on niezależnie regulować częstotliwość na każdym pinie, nie wykorzystuje przy tym klas PWM, pojawiających się wraz z ostatnimi buildami Windows IoT. Nie zauważyłem jednak by pomagał wygodniej sterować barwą.
Jak zwykle mamy trochę nowości w temacie Windows 10.
Jeśli chodzi o wersję Mobile, to udało mi się wgrać na telefon ostatni build 10572. O ile reflashowanie do WP 8.1 oraz upgrade do 10572 poszły całkiem szybko i bez problemów, o tyle po instalacji, nawet po kilku normalnych restartach systemu, wychwyciłem kilka niedoróbek. Aplikacja kamery najpierw sypnęła mi błędem przy próbie zrobienia pierwszego zdjęcia, potem w ogóle telefon wszedł w stan zawieszenia z dziwną zawartością ekranu, najpierw z szarymi kropkami, potem zieloną (musiałem skorzystać z resetu za pomocą bocznych przycisków). Czasami po zrobieniu zdjęcia na chwilę jego podgląd był pokazywany do góry nogami. W dodatku niewszystkie ikony były widoczne na liście aplikacji. Obyty z buildami preview uciekłem się, podobnie jak już niejeden raz, do zresetowania telefonu (reinstalacja aktualnego systemu do ustawień fabrycznych), co rozwiązało te problemy (no, może czasami na chwilę odwróci się podgląd po zrobieniu zdjęcia). Przy okazji domyślny układ kafelków zaczął przypominać ten z “10”-tki, a nie z WP 8.1 –:) W nowym systemie (przesiadłem się z 10536.04, nie instalowałem 10549) moją uwagę zwróciła ciemna skórka zaaplikowana domyślnie w kalendarzu i programie pocztowym oraz aplikacja Skype Video (jak jej podamy numer telefonu to osoby znajace nasz numer zobaczą nas automatycznie na Skype, numer oczywiście nie jest publikowany) czy integracja wiadomości tekstowych (po polsku SMS-ów) z wiadomościami ze Skype.
W przypadku wersji desktopowej udało mi sprawdzić nieoficjalny build 10568, który skusił mnie nowymi, znacznie bardziej wizualnymi, notyfikacjami dla Skype. Należy też podkreślić, że od 10565 mamy integrację Cortany na desktopie z telefonem. Jeśli nie odebraliśmy połączenia w telefonie, dowiemy się o tym pracując na desktopie (w moim przypadku bardzo przydatna funkcja -;)). Mało tego z poziomu Cortany na desktopie możemy wysłać wiadomość tekstową do osoby z naszych kontaktów w telefonie, co też uczyniłem. Wystarczy powiedzieć “Send text message to xxx”, wpisać tekst (i wybrać kontakt, jeśli nie został rozpoznany lub powiedzieliśmy tylko “Send text message”) i po chwili zabrzęczy nam notyfikacja w telefonie, że wysłaliśmy wiadomość. W telefonie jest wszystko zapisane tak, jakbyśmy zrobili to za pomocą niego.
Linki:
Przyszła pora na PWM. Skrótowo rzecz ujmując jest to wysyłanie przebiegów prostokątnych na pinie/nach o stałym okresie, zróżnicowanych pod względem wypełnienia (stosunek czasu stanu wysokiego do niskiego). To zróżnicowanie wypełnienia pozwala nam sterować np. kątem obrotu serwa lub jasnością świecenia diody LED (ludzkie oko nie wychwyci mrugania, małe wypełnienie przebiegu - świeci ciemniej, duże - świeci jaśniej) czy też jej kolorem (w przypadku diody RGB). Trzeba może jeszcze tylko krótko wyjaśnić, co to jest serwo. Otóż jest to silnik wzbogacony o ograniczniki oraz odpowiednią elektronikę, które pozwalają mu się ustawiać w ustalonych pozycjach. Dziś właśnie udało mi się z poziomu Windows 10 IoT Core nieco pokręcić popularnym (np. w modelarstwie) servem Tower Pro SG90.
Przyjrzyjmy się sprzętowi. Aby nie obciążać zbytnio poborem prądu Raspberry Pi czy też po prostu nie ryzykować jego uszkodzenia, używam niezależnego modułu zasilającego MB102 dającego na wyjściu + 5V, tutaj wyprowadzonego na dolną szynę płytki stykowej. Moduł ten podłączyłem do zasilacza uniwersalnego 3-12V z… dawnych czasów liceum. Przypomniałem sobie teraz o nim, nie pamiętam do czego go dokładnie używałem i czemu onegdaj okleiłem go taśmą, grunt że zadziałał na potrzeby tego eksperymentu ;) Serwo ma kabelek czerwony (+5V), czarny (masa) i pomarańczowy (sterowanie). Czerwony i czarny podłączamy do szyny zasilanej przez moduł zasilący, pomarańczowy zaś do pinu Raspberry Pi (u mnie 24), na którym będziemy generować PWM. Do szyny z masą podłączamy też masę z Raspberry Pi.
Co z oprogramowaniem? W przypadku Windows 10 IoT Core wersja stabilna 10240 nie oferuje PWM, ale mamy dostęp także do wersji Preview, obecnie 10556, na której działają opublikowane na github źródła do BusProviders. Dodatkowo w najnowszym SDK do Windows 10, w Windows IoT Extension mamy takie właśnie klasy, przy czym SDK ma wersję 10563 i taka aplikacja nie wgra się na urządzenie z 10556. Poprzestałem więc na razie na źródłach w github, które nieco przerobiłem sobie. Działam na częstotliwości 50Hz, podaję czasy wypełnienia: 0,5 ms (lewo), 1,5 ms (pozycja neutralna – środek), 2,5 ms (prawo). Te czasy w różnych materiałach są nieco różne, np. inne nieco w dokumentacji SG90, natomiast w artykule o Raspberry i PWM w “Młodym techniku” z 8/2015 autor podaje dla tego modelu ustalone w praktyce nieco inne wartości. Serwo toczy się w miarę w jedną bądź drugą stronę, nie skacze nagle o 180 stopni, na początek może wystarczy -:)
Tak naprawdę to tylko początek dość ciekawej tematyki. Softwarowy PWM z Raspberry Pi nie jest do końca stabilny, może być zakłócony przez inne procesy wykonujące się na systemie operacyjnym. Nie mamy gwarantowanej prezycji co do przebiegu sygnału, co w przypadku serwa może być istotne. Fani Linuksa mają dostęp także do oprogramowania, które jest w stanie wykorzystać układ ze sprzętowym PWM z samego Raspberry Pi. Oczywiście można też użyć zewnętrzny układ np. PCA9685 (płytki bazujące na nim mają nawet 16 niezależnych kanałów z PWM) . Windows 10 również zapewnia jego obsługę.
Co nowego w szeroko rozumianej “10”-tce? Nowy build desktopowy zainstalowałem, nowe SDK też, z nowym buildem Mobile chwilkę się wstrzymam może do weekendu (trochę zniechęca mnie konieczność powrotu do Windows Phone 8.1 oraz fakt, że najlepiej wyłączyć w nim Cortanę, ponieważ może znacznie zużywać baterie). Widzę, że pojawia się możliwość zdalnej diagnostyki telefonu przez portal na stronie Web. Wizualnie przypomina mi portal… przez jaki zarządzam mikrokomputerem Raspberry Pi 2. Nowe SDK ma kilka ciekawostek (np. w IoT generator PWM). Zauważmy też, że dostajemy znacznie nowszy obraz Windows Mobile w emulatorze niż na fizycznym urządzeniu jako Insider. Wspomnę też o przemilczanym dość medialnie fakcie - od końca września dla Insiderów jest też Windows 10 IoT Core Preview build 10531 (m.in z obsługą PWM).
Linki
Wyświetlacz alfanumeryczny często spotykamy w różnych urządzeniach, choćby w automatach z napojami czy z kawą. Dziś na warsztat wziąłem sobie tego rodzaju wyświetlacz, który może pokazać dwa wiersze po 16 znaków. Zgodny jest z popularnym układem sterującym HD44780.
Praktyczne informacje o takim wyświetlaczu znajdziemy choćby tutaj. Oczywiście wypada rzucić też okiem na pełną dokumentację HD44780. W przeciwieństwie do poprzednich elementów jest dłuższa i nie czyta się jej może najlepiej. Nie musimy jednak sami programować od zera komunikacji z wyświetlaczem tłumacząc litery na odpowiednie bajty i stany portów GPIO Raspberry Pi . Na stronie projektu https://microsoft.hackster.io/en-US/rvoltr/basic-lcd-16x2 znajdziemy kod biblioteki oraz schemat połączeń. Tutaj mała praktyczna uwaga. Na schemacie brakuje połączenia pinu R/W z masą. Nie wiem jak zadziałało to autorowi, ale u mnie wyświetlacz po prostu nie reagował na polecenia (pokazywał też na starcie jeden rząd kwadracików, a nie dwa), a aplikacja nie wyrzuciła żadnego wyjątku! Po podłączeniu wspomnianego pinu wyświetlacz zaczął reagować, jak powinien. Może autor miał nieco inny wyświetlacz niż mój (do mojego w polskim szkoleniu z Arduino jest podłączany R/W). W stosunku do przykładowej aplikacji musiałem ustawić liczbę kolumn i wierszy wyświetlacza na 16 i 2, skorzystałem z tych samych pinów RPI2.
Na koniec chciałbym jeszcze wspomnieć o poście Windows 10, IoT Core–Getting that 2 Row LCD Panel Working! Ten blog kojarzę jeszcze z czasów jak pojawiały się na nim tematy związane z Silverlight. Mike Taulty napisał alternatywną bibliotekę do tej na hackster.io. Jego aplikacja też mi działa (musiałem tylko ustawić inne numery pinów i oczywiście mieć podłączony R/W do masy).
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).
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 , 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ł:
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ć !
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