Kurs Intel Edison – #11 – Bluetooth, komunikacja z telefonem

Kurs Intel Edison – #11 – Bluetooth, komunikacja z telefonem

Na zakończenie kursu został nam jeszcze jeden interfejs komunikacyjny - Bluetooth. Technologię tę spotykamy coraz częściej w życiu codziennym.

Po krótkim wstępie omawiającym możliwości tego standardu przejdziemy do komunikacji telefonu z modułem Intel Edison. Dzięki temu każde kolejne urządzenie będzie mogło być zdalnie sterowane.

Standard Bluetooth - zarys historyczny

Bluetooth jest interfejsem radiowym pracującym w ogólnodostępnym paśmie 2.4 GHz. Ta sama częstotliwość jest wykorzystywana przez WiFi, więc oba interfejsy mogą się niestety zakłócać. Interfejs jest dostępny już dość długo, pierwsze specyfikacje pojawiły się pod koniec lat 90.

Bluetooth, podobnie jak wiele innych technologii znacznie ewoluował. Początkowo miał być głównie bezprzewodowym połączeniem dla zestawów słuchawkowych, z czasem dodawane były nowe możliwości i zastosowania.

bluetooth

Wersje 1.X

Pierwsza wersja (1.0), pozwalała na komunikację z prędkością 21kb/s i zawierała wiele niedociągnięć. Została szybko zastąpiona wersją 1.1, a następnie 1.2. Wersja 1.2 pozwalała osiągnąć prędkość transmisji na poziomie 384kb/s (w praktyce nawet dwa razy więcej).

Wersja 2.0

Kolejna wersja pojawiła się w roku 2004 - była oznaczona numerem 2.0 i dawała możliwość transmisji z prędkością ok. 2Mbit/s. Piszę o tym dla ciekawostki, ponieważ nadal popularne są moduły HC-06, które bazują właśnie na tej wersji standardu.

Wersje 3.X

W międzyczasie coraz większą popularność zyskiwała komunikacja poprzez WiFi, projektanci Bluetooth próbowali walczyć tworząc standard 3.0.

Niestety wszystkie te próby skończyły się zwycięstwem konkurencyjnego standardu - jeśli zależy nam na dużej szybkości, WiFi jest ewidentnie lepszym wyborem.

Wersja 4.0

Jednak Bluetooth nie przegrał całkiem. Możliwe, że w przyszłości odegra jeszcze ważną rolę. Pojawił się nowy standard - Bluetooth 4.0, który ewidentnie idzie w innym kierunku niż WiFi.

Zamiast walczyć o kolejne megabity i szybkość wersja 4.0 działa wolniej od poprzedniej. Wersja Bluetooth 4.0 LE, czyli w skrócie BLE (Bluetooth Low Energy), zapewnia transmisję z prędkością do 1Mb/s, ale umożliwia pracę przy bardzo niskim poborze prądu oraz komunikację na dość znaczną odległość - do 100m.

Intel Edison pozwala na obsługę Bluetooth-a w wersji 4.0 z możliwością pracy w trybie niskiego poboru mocy, czyli BLE. Dzięki temu idealnie nadaje się do wykorzystania w urządzeniach przenośnych, albo komunikujących się z czujnikami zasilanymi z baterii.


Zapewne ktoś z działu marketingu zauważył, że skrót BLE nie brzmi zbyt zachęcająco. Ostatnio więc Bluetooth Low-Energy jest określany jako Bluetooth Smart. Jest to jednak dokładnie ta sama technologia.

Koniec teorii, pora na praktykę!

Zestaw elementów do kursu

 999+ pozytywnych opinii  Gwarancja pomocy  Wysyłka w 24h

Elementy konieczne do wykonania ćwiczeń zebrane zostały w gotowe zestawy, które można nabyć w Botlandzie. W kuferku znajdziecie ponad 180 elementów w tym moduł Intel Edison!

Zamów w Botland.com.pl »

Bluetooth na Intel Edison - pierwsze kroki

Część teoretyczna za nami, teraz możemy wreszcie przejść do części praktycznej. Na początek musimy uruchomić Bluetootha. Dlaczego uruchomić? Po prostu domyślnie jest wyłączony. O ile WiFi działa od razu, bluetootha musimy sami włączyć.

Logujemy się do konsoli systemu na płytce i wydajemy polecenie:

rfkill pozwala na wyłączenie (oraz włączenie) transmisji radiowej. Właśnie za jego pomocą można ustawić płytkę w tryb samolotowy, czyli zabronić jej jakiejkolwiek komunikacji radiowej.

Powyższe polecenie wyświetli aktualne ustawienia połączeń radiowych. Bluetooth jest zablokowany programowo (Soft blocked). Sprzętowo nie mamy go jak zablokować, ale np. wiele laptopów posiada przełącznik lub kombinację klawiszy, które blokują komunikację sprzętowo.

Aby go odblokować musimy wydać polecenie:

Teraz możemy upewnić się że wszystko działa sprawdzając jeszcze raz dostępne połączenia. Wszystkie powinny być już odblokowane:

Bluetooth_01

Widok dostępnych interfejsów radiowych.

Parowanie urządzeń

W dalszej części kursu wykorzystamy telefon z Androidem jako przykład komunikacji przez Bluetooth. Zamiast telefonu można oczywiście wykorzystać tablet albo komputer. Przy odrobinie wysiłku można byłoby wykorzystać inne systemy niż Android, np. Windows Mobile, czy iOS.

Do sterowania połączeniem można wykorzystać różne polecenia, my wykorzystamy bluetoothctl, który uruchamiamy z linii poleceń:

Po jego wywołaniu znak zachęty zmieni się na niebieski napis [bluetooth] i będziemy mogli wydawać polecenia związane z tym interfejsem.

Żeby zobaczyć aktualną konfigurację naszej płytki możemy wydać polecenie show:

Bluetooth_02

Podgląd aktualnej konfiguracji płytki.

Jak widzimy domyślnie całkiem sporo profili jest dostępnych - niestety w ramach kursu nie opiszemy wszystkich możliwości Bluetootha. Są one naprawdę interesujące, a Edison daje wręcz idealną możliwość na ich poznawanie. W dużym skrócie - widzimy dostępne Audio Sink i Audio Source, czyli źródło oraz cel strumienia danych audio. Za ich pomocą łatwo moglibyśmy zbudować własny odtwarzacz mp3 albo robota wysyłającego komunikaty głosowe.


Aby rozpocząć parowanie powinniśmy najpierw włączyć widoczność naszego urządzenia, np. telefonu. Musimy w tym celu wejść w jego ustawienia oraz opcje bluetootha, a następnie wybrać odpowiednią opcję - zależną od wersji oraz zainstalowanego systemu.

Gdy już nasze urządzenie jest widoczne, rozpoczynamy jego wyszukiwanie:

Wyszukiwanie może chwilę zająć, jednak po pewnym czasie powinniśmy zobaczyć adres oraz nazwę naszego urządzenia. Adres ma postać 6 zapisanych heksadecymalnie liczb oddzielonych znakiem dwukropka. Nazwę sami możemy zmieniać w ustawieniach telefonu. Poniżej widzimy urządzenie o adresie D4:6E:5C:54:B1:53 i nazwie HUAWEI G510-0100.

Bluetooth_03

Znalezione urządzenia.

Gdy urządzenie zostanie wykryte, możemy przystąpić do parowania. Służy do tego polecenie:

Jak łatwo się domyślić, zamiast <adres> wpisujemy adres naszego urządzenia. Podczas parowania na ekranie telefonu pojawi się prośba o zgodę na połączenie - oczywiście powinniśmy ją potwierdzić. Ostatnim krokiem jest ustawienie połączenia jako zaufanego. Dzięki temu nie będziemy więcej pytani o zgodę na komunikację:

Wynik operacji:

Bluetooth_04

Zaufane połączenie przez Bluetooth.

Możemy jeszcze sprawdzić, co nasz telefon oferuje innym urządzeniom, piszemy:

Powinniśmy zobaczyć listę dostępnych profili oraz szczegółowe informacje o samym urządzeniu. Na razie kończymy pracę z bluetoothctl, dlatego wydajemy polecenie:

Intel Edison - profil SPP

Najłatwiej będzie przetestować połączenie Bluetooth wykorzystując profil SPP, czyli Serial Port Profile. Jest to dość prosty profil, pozwalający na emulację portu szeregowego za pomocą łącza bezprzewodowego.

Żeby nie tworzyć kolejnego kursu o jej obsłudze, po prostu wykorzystamy gotowy skrypt napisany w Pythonie: SPP-pipe-out.py. Musimy pobrać go na naszą płytkę:

Rozpakować:

Uruchomić:

Znak & na końcu polecenia sprawi, że program będzie działał w tle, a my będziemy mogli dalej korzystać z konsoli.


Po uruchomienu skrypt tworzy specjalny plik o nazwie: /tmp/ble_pipe_out. Specjalność tego pliku polega na tym, że nie jest on zwykłym plikiem przechowywanym na dysku lub w pamięci Flash. Jest to kolejka FIFO (First In First Out), czyli specjalny pseudo-plik tworzony w systemie Linux, który służy do komunikacji między dwom procesami.

Uruchomiony przez nas skrypt będzie odbierał dane z interfejsu Bluetooth oraz wstawiał do utworzonej kolejki. Naszym zadaniem będzie je odczytywać oraz przetwarzać. Na początek sprawdzimy, czy wszystko działa. Piszemy po prostu:

Polecenie cat wyświetla zawartość pliku. Jako parametr podaliśmy naszą kolejkę, więc będzie wyświetlało dane odebrane przez bluetooth.

Aplikacja na telefon

Umiemy odbierać dane, albo przynajmniej tak nam się wydaje. Jednak jak możemy je wysłać? Na początek wykorzystamy gotowy program dostępny do pobrania z Google Play Bluetooth spp pro.

Po uruchomieniu wciskamy Scan i wyszukujemy moduł Edison. Gdyby nie udało się go odszukać, wracamy na chwilę do konsoli Edisona i uruchamiamy ponownie bluetoothctl, a w nim piszemy:

Teraz powinniśmy znaleźć moduł. Wybieramy go z listy, a następnie przyciskamy connect.

Skoro mamy połączenie możemy coś wysłać. Naciskamy przycisk CMD line mode (na dole ekranu, może wymagać przewinięcia zawartości), a następnie wprowadzamy testowe komunikaty - powinny pojawiać się w konsoli Edisona. Jak widzimy nasze pierwsze połączenie przez Bluetooth jest gotowe i przetestowane!

Własna aplikacja na telefon

Udało nam się uruchomić komunikację. Ale co to za przyjemność wykorzystywać gotowe programy. Możemy łatwo napisać własny. Na Forbocie publikowany był już kurs AppInventora.

Pierwsza aplikacja wysyła pojedyncze znaki. Gdy naciskamy przycisk na ekranie, przez Bluetootha zostaje wysłana literka A. Programowanie odbywa się w pełni graficznie, a dokładny opis wszystkich operacji znajduje się w kursie AppInventora. Poniżej widzimy gotowe ekrany z aplikacją:

AndoidApp_01

Widok prostej aplikacji.

AndoidApp_02

Wygenerowany kod programu.

Po uruchomieniu naszej aplikacji w telefonie, wybieramy połączenie z modułem Edison, a następnie testujemy. Przy odrobinie szczęścia wszystko zadziała bez problemu - zobaczymy na ekranie komunikaty, czyli odebrane literki A.


Programy wygenerowane w AppInventorze można przekształcić na pakiety Androida. Można je wgrywać i uruchamiać jak zwykłe aplikacje. Utworzyliśmy więc pełnoprawną aplikację na telefon.

Zdalne sterowanie modułem Intel Edison

Kurs AppInventora kończył się aplikacją do sterowania własnym robotem. W ramach niniejszego kursu nie zbudujemy robota, ale spróbujemy napisać aplikację, która będzie reagowała na polecenia wysyłane z telefonu.

Typowy robot, jak w przykładach z kursu jest sterowany za pomocą dwóch sygnałów PWM. Edison posiada wyjścia PWM, wykorzystamy je więc do sterowania diodami LED - będą one symulowały działanie silników. Wyobraźmy sobie że im jaśniej świeci dioda, tym szybciej kręciłby się silnik robota. Oczywiście w oparciu o moduł Edison można zbudować prawdziwego robota, ale wymaga to nieco więcej elementów.

Najpierw podłączamy diody zgodnie z rysunkiem:

part9 - leds_bb

Schemat podłączenia układu diod do modułu Intel Edison.

Teraz musimy napisać program sterujący modułem. Piszemy go jak w poprzednich częściach - za pomocą Arduino IDE. Różnica będzie taka, że wykorzystamy bibliotekę C do odczytu z kolejki FIFO odbierającej dane z łącza Bluetooth.

Mamy więc środowisko dla Arduino, ale piszemy zwykły linuxowy program, który wykorzystuje odwołania systemowe do systemu plików. Jest to ciekawy przykład podobieństw (biblioteki sterowania) oraz różnic (pełny system Linux) między Arduino, a Edisonem.

Program zaczniemy od wybrania pinów, do których podłączymy diody. Jak widać na rysunku, wybraliśmy piny 3 oraz 5 (ponieważ na nich dostępny jest PWM). W programie deklarujemy stałe, żeby nie zmieniać zbyt wiele w kodzie jeśli postanowimy inaczej podłączyć elementy:

Początek programu, to ustawienie linii sterujących jako wyjść, kod więc wygląda typowo:

Obsługa błędów połączenia

Teraz musimy zająć się czymś, co większość osób programujących amatorsko całkiem ignoruje - czyli obsługę błędów. Niestety połączenie przez Bluetootha nie zawsze działa jak byśmy tego oczekiwali.

Zamiast zastanawiać się co poszło źle i kiedy wreszcie zadziała, lepiej w programie wykrywać i sygnalizować błędy. Napiszemy więc prostą procedurę, która w razie błędu będzie migała diodami, dając nam znać że coś poszło źle. Kod funkcji migającej diodami:

Dotychczas program wyglądał jak właściwie każdy inny napisany dla Arduino. Jednak w pętli głównej czeka nas niespodzianka, teraz zaczniemy pisać wykorzystując system plików, czyli bibliotekę języka C. Nasze zadanie jest w sumie bardzo proste - chcemy otworzyć plik o nazwie /tmp/ble_pipe_out, a następnie odczytać z niego jeden bajt.

Piszemy więc:

Funkcja fopen spróbuje otworzyć odpowiedni plik (a w naszym przypadku kolejkę FIFO). Niestety takiego pliku może nie być (jeśli nie uruchomiśmy wcześniej skryptu) - wtedy musimy coś zrobić, wywołamy więc funkcję obsługi błędów:

Do odczytu bajtu wykorzystamy funkcję fread, znowu z biblioteki standardowej języka C. Podobnie jak w przypadku otwierania pliku, tutaj też może zdarzyć się błąd. Piszemy więc:

Po odczytaniu danych możemy naszą kolejkę zamknąć, wykorzystamy do tego funkcję fclose:

W tym momencie zmienna value zawiera odebrany bajt. Żeby nie komplikować przykładu, nie będzimy obsługiwać sterowania prędkością silników, wykorzystamy tylko kod, który w oryginalnym kursie odpowiadał za skręty robota:

Napisaliśmy już właściwie cały program, po zebraniu kodu wygląda on następująco:

Zanim uruchomimy program upewnijmy się, że włączyliśmy skrypt SPP-pipe-out.py.

Teraz możemy uruchomić nasz przykład na Edisonie i przejść do ostatniego etapu.

Aplikacja sterująca na Android-a

Podobnie jak w kursie AppInventora, chcemy napisać aplikację, która będzie odczytywała położenie telefonu i wysyłała odpowiednie dane. Poniżej widzimy ekrany nieco uproszczonej wersji aplikacji:

AndoidApp_03

Widok okna aplikacji w AppInventorze.

AndoidApp_04

Wygenerowany kod programu.

Po ich przerysowaniu i uruchomieniu na telefonie możemy połączyć się z zaprogramowanym wcześniej modułem Edison. Obracając telefon będziemy sterować jasnością świecenia diod.

Podsumowanie

W tej części zobaczyliśmy jak można wykorzystać Bluetooth do komunikacji z modułem Edison. Możliwości jakie daje ten interfejs są ogromne. To, co omówiliśmy to raptem krótkie wprowadzenie. Moduł Edison dzięki pełnemu systemowi operacyjnemu na pokładzie daje ogromne możliwości w zakresie komunikacji radiowej - warto próbować samodzielnie poznać więcej jego możliwości!

Nawigacja kursu

Autor kursu: Piotr (Elvis) Bugalski
Redakcja: Damian (Treker) Szymański

Załączniki

RemoteController.apk (zip, 1 MB)

Gotowa aplikacja do instalacji na telefonie z systemem Android.

bluetooth, Edison, Intel, kurs, kursEdison

Trwa ładowanie komentarzy...