poniedziałek, 3 września 2018

BLYNK zdalnie programuje funkcje portów mikroprocesora - piny A/C


Czy ktokolwiek zastanawia się nad tym jakie procesy zachodzą w naszym ulubionym aucie gdy naciskamy starter? albo jakie układy elektroniczne są uaktywniane gdy naciskamy klawisz pilota by obejrzeć turniej z udziałem Roniego O’Sullivana? Po cholerę nam ta wiedza. Po prostu ma działać!
Genialnością twórców Arduino i faktyczną przyczyną niezwykłej popularności tej platformy jest dostrzeżenie tej prostej prawdy, że nie trzeba znać się na budowie silnika z turbodoładowaniem by być niezłym kierowcą.
Twórcy BLYNKa poszli jeszcze dalej - prawie niczego nie musisz wiedzieć o mikroprocesorach, ich programowaniu, Internecie i tworzeniu aplikacji w Androidzie by zbudować, uruchomić i sterować mikroprocesorem z ekranu swojego telefonu. I w 10 minut zbudować w istocie bardzo złożony system kontrolujący np. podlewaniem kwiatów w ogrodzie gdy ty z żoną wypoczywasz na plaży w Acapulco. A już mistrzostwem świata był pomysł na zdalną konfigurację portów mikroprocesora wprost z aplikacji w telefonie. Dziś właśnie o tym zadziwiającym pomyśle słów kilka.
Pierwszym zdziwieniem z kontakcie z Arduino było to jak prosto wygląda program migania LEDem.
Sławny blink  za pomocą kilku prostych poleceń pozwalał w  kilkanaście sekund ożywić nasz mikroporcesor.



Moje zdziwienie w kontakcie z BLYNKiem było jeszcze większe - nie trzeba było wpisać żadnych poleceń by aplikacją w telefonie mrugać LEDem w Arduino UNO.



Co więcej -  bez zmiany czegokolwiek w programie mikroprocesora mogłem dowolnie zarządzać wszystkimi portami, zmienić ich funkcje np. z cyfrowych na analogowe, z wejściowych na wyjściowe, uruchomić PWM itd. Wraz z dodaniem widgetu EVENTOR mogę nawet uruchomić całkiem złożony program z zależnościami pomiędzy pinami, wartościami i widgetami.
Cała tajemnica prostoty użytkowania systemu ARDUINO a także BLYNKa tkwi w bibliotekach. Na pierwszy rzut oka program blink nie zawiera żadnej biblioteki - ale tak naprawdę kompilator sam pobiera bibliotekę arduino.h  i w miarę potrzeb dziesiątki innych. Dzięki temu autorzy tych systemów ukryli w sprytny sposób całą złożoność konfiguracji współczesnych mikrokontrolerów udostępniając tylko takie funkcje, których ich zdaniem będą przydatne dla przeciętnego użytkownika.  Ograniczyli nas ! - oczywiście. Tak jak producent samochodu z automatem udostępnia nam jedynie kierownicę, pedał gazu, hamulca no i kilka dodatkowych przełączników. W przeciwnym razie deska rozdzielcza w samochodzie powinna wyglądać co najmniej jak ta w samolocie. Tylko po co?
Co dostaliśmy w zamian? - CZAS. Czas, który możemy poświęcić nie na naukę to JAK TO ZROBIĆ ale CO ZROBIĆ. W dobie Internetu wiedza wyraźnie straciła na wartości natomiast cenna stała się umiejętność jej praktycznego wykorzystania. To nie jest dobra wiadomość dla inżynierów, którzy w dzisiejszych czasach zamiast społecznym guru stają się jeszcze jednym elementem korporacyjnych zasobów takich jak czas, pieniądz czy magazyn.
W przeciwieństwie do konstruktorów samochodu Arduino w żaden sposób nie ograniczyło nam dostępu do pierwotnych konfiguracji i programowania mikroprocesora. Miłośnicy grzebania w rejestrach czy pisania w asemblerze wciąż mogą z tego korzystać w ramach ARDUINO IDE. Podobnie jest z BLYNKiem, który jest twórczym rozwinięciem systemu ARDUINO. Arduino komendą pinmode konfiguruje wiele parametrów procesora, które w efekcie ustawiają dany pin w konkretną funkcję wy/we. BLYNK poszedł dalej - to konkretny widget w telefonie dynamicznie dopasowuje funkcje wybranego portu tak by uzyskać zakładaną przez projektantów i użytkownika funkcjonalność. Ale jeśli mamy takie życzenie możemy pominąć wszystkie te udogodnienia i sami programować działanie pinów procesora używając w tym celu tzw. pinów wirtualnych.




Jak to działa? Popatrzmy jak w praktyce funkcjonuje ta niewidoczna dla użytkownika konfiguracja portów mikroprocesora za pomocą widgetów.
Królikiem doświadczalnym będzie Arduino UNO (ATmega328). A konkretnie pin D6 (port PD6 procesora ATmega) z funkcjami cyfrowego wejścia/wyjścia i wyjścia PWM oraz pin A0 (PC0) mogący robić za wyjście cyfrowe lub wejście analogowe.
Do obu portów dołączę prosty układ pozwalający na sprawdzenie działania we/wyj cyfrowego, PWM i pomiaru napięcia analogowego.

Test portu D6 - zmiana funkcji poprzez zmianę widgetu



Test portu A0 - zmiana funkcji poprzez zmianę widgetu



Podstawowe widgety ustawiające funkcje portów procesora to:
  • BUTTON - ustawia port jako wyjście cyfrowe
  • SLIDER - ustawia port jako wyjście PWM
  • VALUE DISPLAY - ustawia port jako wejście cyfrowe
  • VALUE DISPLAY - ustawia port jako wejście analogowe
Ale widgetów jest znacznie więcej i możemy je podzielić ze względu na typ portu jakie wymuszają w mikroprocesorze. Dodatkowo każdy widget wymieniony w tabeli ma możliwość ustawienia portu wirtualnego.



Jakie wnioski z powyżej tabeli?. Najbardziej popularny w mikroprocesorze typ wejścia - cyfrowe  (0/1) - można ustawić praktycznie tylko jednym widgetem. Natomiast funkcję PWM i pomiar napięcia analogowego potrafi wymusić kilka widgetów.  Oczywiście zmieniając nastawę PWM z 0 na 1024 uzyskamy defacto dwa poziomy napięć 0/1 jak na wyjściu cyfrowym. Podobnie z wejściem analogowym - jeśli potraktujemy 0 napięcia jako 0 cyfrowe a 1024 jako 1 to możemy przyjąć że wejście analogowe jest rozbudowaną wersją wejścia cyfrowego - ale tak naprawdę to zupełnie inne konfiguracje portu mikroprocesora.
Jak to się dzieje, że biblioteka BLYNKa na podstawie typu widgetu potrafi odpowiednio zmienićfunkcję portu? tego niestety nie wiem. Dla dociekliwych wskazówką może być macro

#define BLYNK_NO_BUILTIN // Disable built-in analog & digital pin operations

wyłączające możliwość bezpośredniego ustawiania funkcji portu przez aplikację w telefonie (robi się to by zaoszczędzić cenne kB pamięci). W takim przypadku wszystkie sterowania pomiędzy telefonem a mikroprocesorem przekazywane są za pomącą pinów wirtualnych. Rozwiniecie tego makro znajduje się w BlynkApiArduino.h linie 107 do 115 i tu należy szukać odpowiedzi. I w bibliotekach Arduino bo tam zaszyte są wszystkie informacje o poszczególnych modułach i ich portach. Ale to temat na osobną bajkę.
Wysyłanie danych z aplikacji do mikroprocesora poprzez piny rzeczywiste (i wirtualne) następuje każdorazowo po zmianie stanu widgetu (np. naciśnięcie klawisza na ekranie telefonu) i ustawia port w mikroprocesorze aż do kolejnej zmiany. Serwer BLYNK przy transmisji pinów rzeczywistych jest "przezroczysty" i pełni jedynie rolę przekaźnika informacji.
W drugą stronę aplikacja pobiera dane o stanie portu mikroprocesora cyklicznie. Częstotliwość pobierania ustawiana jest w konfiguracji widgetu i może wynosić od 1 sek do 24h Ale uwaga - widget wymusza pobranie nowej wartości stanu portu więc jeśli zamkniemy aplikację w telefonie wszelka łączność pomiędzy urządzeniami ustaje. To logiczne biorąc pod uwagę, że przesył danych potrzebny jest jedynie gdy "patrzymy" na ekran telefonu z uruchomionym BLYNKiem..
Podsumowując - sterowanie funkcjami portów bezpośrednio z aplikacji w telefonie to znakomita funkcja BLYNK szczególnie dla osób stawiających pierwsze kroki w mikroprocesorowej przygodzie. Dość szybko jednak spore ograniczenia tego rodzaju sterowania zmuszają do stosowania pinów virtualnych - dużo bardziej elastycznych i oferujących dużo większe możliwości programistyczne. Ale będę niejednokrotnie wracał do pinów analogowych i cyfrowych w kolejnych postach. A to za sprawą widgetu EVENTOR stwarzającego nowe ciekawe możliwości programowania BLYNKa właśnie z z takim sterowaniem mikroprocesorowych portów.
3

Brak komentarzy:

Prześlij komentarz