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.
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.
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.
Pozwalał on na komunikację z prędkością 24Mb/s,
a udoskonalona wersja 3.1 nawet 40Mb/s.
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.
Standard ten staje się coraz popularniejszy w zastosowaniach zarezerwowanych dotychczas dla ZigBee, jak np. zdalne czujniki, przełączniki (inteligenty dom), czy nawet piloty do telewizorów.
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ę!
Gotowe zestawy do kursów Forbota
Komplet elementów 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!
Masz już zestaw? Zarejestruj go wykorzystując dołączony do niego kod. Szczegóły »
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 list
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:
rfkill unblock bluetooth
Teraz możemy upewnić się że wszystko działa sprawdzając jeszcze raz dostępne połączenia. Wszystkie powinny być już odblokowane:
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ń:
bluetoothctl
Po jego wywołaniu znak zachęty zmieni się na niebieski napis [bluetooth] i będziemy mogli wydawać polecenia związane z tym interfejsem.
Oczywiście najważniejsze z poleceń to help,
które wyświetli pomoc i listę dostępnych poleceń.
Żeby zobaczyć aktualną konfigurację naszej płytki możemy wydać polecenie show:
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:
scan on
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.
Znalezione urządzenia.
Gdy urządzenie zostanie wykryte, możemy przystąpić do parowania. Służy do tego polecenie:
pair <adres>
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ę:
trust <adres>
Wynik operacji:
Zaufane połączenie przez Bluetooth.
Możemy jeszcze sprawdzić, co nasz telefon oferuje innym urządzeniom, piszemy:
info <adres>
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:
exit
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.
Linux do obsługi bluetootha wykorzystuje bibliotekę Bluez,
która jest zaskakująco trudna w użyciu i słabo udokumentowana.
Ż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ę:
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.
Jeden zapisuje dane do takiego pliku, a drugi program te dane może odczytywać.
Natomiast fizycznie dane nie są zapisywane na dysku.
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:
cat /tmp/ble_pipe_out
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:
discoverable on
Teraz powinniśmy znaleźć moduł. Wybieramy go z listy, a następnie przyciskamy connect.
Wyszukanie urządzenia.
Połączenie.
Dostępne opcje.
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.
Postępując zgodnie z tym kursem możemy łatwo wyklikać własną aplikację.
Wykorzystamy ją do sterowania naszym modułem.
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ą:
Widok prostej aplikacji.
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:
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.
Intel Edison pracuje w oparciu o system Linux, więc Arduino IDE oprócz biblioteki charakterystycznej dla Arduino daje dostęp do biblioteki języka C oraz systemu plików Linuxa.
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:
#define PIN_LED1 3
#define PIN_LED2 5
Początek programu, to ustawienie linii sterujących jako wyjść, kod więc wygląda typowo:
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:
void error()
{
int state = 0;
while (1) {
digitalWrite(PIN_LED1, state);
digitalWrite(PIN_LED2, state);
delay(100);
state ^= 1;
}
}
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:
FILE* f = fopen("/tmp/ble_pipe_out", "rb");
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:
if (!f)
error();
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:
if (fread(&value, 1, 1, f) != 1)
error();
Po odczytaniu danych możemy naszą kolejkę zamknąć, wykorzystamy do tego funkcję fclose:
fclose(f);
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:
analogWrite(PIN_LED1, value / 10);
analogWrite(PIN_LED2, (255 - value) / 10);
Napisaliśmy już właściwie cały program, po zebraniu kodu wygląda on następująco:
#define PIN_LED1 3
#define PIN_LED2 5
void setup() {
pinMode(PIN_LED1, OUTPUT);
pinMode(PIN_LED2, OUTPUT);
}
void error()
{
int state = 0;
while (1) {
digitalWrite(PIN_LED1, state);
digitalWrite(PIN_LED2, state);
delay(100);
state ^= 1;
}
}
void loop() {
uint8_t value;
FILE* f = fopen("/tmp/ble_pipe_out", "rb");
if (!f)
error();
if (fread(&value, 1, 1, f) != 1)
error();
fclose(f);
analogWrite(PIN_LED1, value / 10);
analogWrite(PIN_LED2, (255 - value) / 10);
}
Zanim uruchomimy program upewnijmy się, że włączyliśmy skrypt SPP-pipe-out.py.
Pamiętajmy też, żeby nie uruchomić polecenia cat /tmp/ble_pipe_out,
a jeśli je uruchomiliśmy to je przerwać. Inaczej cat będzie nam podjadał dane.
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:
Widok okna aplikacji w AppInventorze.
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.
Osoby, które nie chcą samemu przerysowywać aplikacji
w załączniku do artykułu znajdą gotowy program - od razu do instalacji.
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!
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY na bazie Arduino i Raspberry Pi.
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY z Arduino i RPi.
Trwa ładowanie komentarzy...