Tworzenie aplikacji Android – #3 – Komunikacja Bluetooth

Tworzenie aplikacji Android – #3 – Komunikacja Bluetooth

Tym razem zajmiemy się konfiguracją naszego modułu radiowego bluetooth BTM-222 oraz jego komunikacją z mikrokontrolerem.

W kolejnym kroku przejdziemy do App Inventora. Utworzymy aplikację, która nawiąże połączenie i wyśle bezprzewodowo pojedynczy bajt do naszego mikrokontrolera.

« Poprzedni artykuł z seriiNastępny artykuł z serii »

Dlaczego BTM-222? Na rynku dostępne są dziesiątki modułów rożnego rodzaju. Kupując swój moduł kierowałem się przede wszystkim ceną, zresztą jest on bardzo popularny w naszym kraju. Jeśli posiadasz inny moduł, odsyłam do cz. 1 kursu, gdzie opisałem jaki powinien współpracować. Jego konfiguracja powinna być podobna do BTM-222, jednak po dokładniejsze szczegóły odsyłam do dokumentacji technicznej konkretnego modułu.

Jak już mówiłem mam moduł z BTM-222, oraz stabilizatorem i układem konwertującym stany logiczne. Dzięki czemu bez problemu działa w standardzie napięciowym TTL 5V.

Chyba nikogo nie zdziwię, że do tej pracy zaprzęgnę AVR’ka konkretnie ATmegę32, która działa już od dłuższego czasu w moim robocie Silver Shafcie. Robot choć nie jest pogromcą czarnej linii doskonale nadaje się do tego typu testów. Podłączenie modułu BT (Bluetooth) ogranicza się do podłączenia dwóch linii sygnałowych TX i RX i wspólnego zasilania, a przynajmniej masy. Nie będę w tym kursie omawiał programowania mikrokontrolerów. Artykułów o obsłudze UART w różnych językach jest wiele, a temat był poruszany wielokrotnie na Forbocie, na przykład:

Konfiguracja BTM222

Zacznijmy jednak od konfiguracji naszego modułu Bluetooth. Zrobimy to za pomocą tajemniczych komend AT. W tym celu musimy podłączyć płytkę przewodowo do komputera. Możemy to zrobić za pomocą konwertera poziomów i podłączyć pod port COM (tak jak w moim przypadku). Możemy też użyć konwertera USB-UART np. na popularnym scalaku FT232. Temat był jednak poruszany tyle razy, że myślę, że dalsze omawianie tej kwestii możemy pominąć.

Podłączamy oczywiście zamieniając (krosując) linie Rx i Tx z PC oraz Bluetooth’a. Nie chcę się w tej kwestii zbytnio rozpisywać. Niemniej przyjmijmy, że nasz BTM dopiero, co wyszedł z fabryki i posiada ustawienia fabryczne.

Uruchamiamy dowolny terminal. Niema znaczenia czy jest to Hyper Terminal, br@y, czy Putty. Ten ostatni został opisany w kursie „Terminalowa aplikacja serwisowa do robota.”, którego autorem jest użytkownik sosnus.

Aby sprawdzić czy moduł jest dobrze podłączony, a komunikacja odbywa się prawidłowo wysyłamy z terminala „AT” (bez cudzysłowu), w odpowiedzi powinniśmy dostać „ok” Oraz przed samym „ok” to co wpisaliśmy czyli „AT”. Te wracające komunikaty, oraz echo mogę wprowadzać nam zamieszanie, dlatego proponuję je wyłączyć.

Wysyłając „ATE0” wyłączamy echo, natomiast „ATQ1” odpowiedzi ze strony modułu. Możemy oczywiście wrócić te opcja poleceniami „ATE1” oraz „ATQ0”. Każde z poleceń AT zatwierdzamy enterem (CR).

Według potrzeb możemy również zmienić prędkość transmisji. Robimy to poleceniem „ATLx” gdzie x to symbol/numer prędkości. Tu możemy wesprzeć się dokumentacją techniczną (jednak należy do niej podchodzić z lekkim dystansem, bo o ile zmiana prędkości jest opisana poprawnie, to inne polecenia AT, a tym bardziej opis samego modułu pozostawiają sporo do życzenia). Jak widać mamy do dyspozycji całe spektrum możliwości:

Dostępne prędkości transmisji.

Dostępne prędkości transmisji.

Ostatnim poleceniem AT, które jest według mnie istotne to zmiana nazwy widocznej w otoczeniu. Domyślnie ustawioną nazwą jest „Serial Adaptor”. Zmianę nazwy dokonujemy poleceniem „ATN=xxx” gdzie xxx to nasza wymyślona nazwa. Od tego czasu, pod taka nazwą powinien kryć się identyfikator naszego modułu. Mój moduł nazywa się „3BOT Silver Shaft” od nazwy teamu i robota, jednak nie jest to w tej chwili istotne.

Parowanie modułu oraz test połączania

W celu sparowania naszego telefonu z modułem bluetooth przechodzimy do ustawień. Ustaloną nazwę modułu odszukujemy na liście, a następnie praujemy używając domyślnego klucza „1234”.

Myślę, że filmik dobrze ukażę tę czynność:

Mówiąc o echu nie miałem na myśli tego o czym wyżej. Echo wbudowane w BTM222 działa jedynie przy podłączeniu kablowym. Efekt echo na terminalu podłączanym do telefonu możemy uzyskać np. zwierając RX i TX modułu BTM. Pomarańczowa dioda sygnalizuje transmisję telefon -> BTM, a BTM -> telefon nie. Jeśli wszystko działa, możemy przejść do App Inventora.

App Inventor - aplikacja z obsługą Bluetooth

Przechodzimy do App Inventora, tworzymy nowy projekt, uruchamiamy edytor blokowy,łączymy się z urządzeniem i zabieramy do pracy. Z naszym modułem BTM możemy połączyć się na kilka sposobów. Zarówno po nazwie widocznej w otoczeniu, adresie mac, czy z listy sparowanych urządzeń. To ostatnie wydaje się najbardziej „User friendly”, a nie jest bardzo skomplikowane, dlatego nim się zajmiemy.

Otwieramy edytor ekranów. Z części component zaznaczmy nasz ekran „Screen1” i w „Properties” ustawmy parametry. Możemy zmienić kolejno wyrównanie elementów, tło, animację zamknięcia, ikonę, która będzie wyświetlała się w menu aplikacji, animację otwarcia, orientację ekranu, możliwość przewijania ekranu, tytuł ekranu oraz wersję.

Proponuję ustawić wszystko według własnych preferencji. Ja zmieniłem tytuł ekranu na „Bluetooth SPP test”, oraz orientację na „user”. Podstawowe typy orientacji typu pion/poziom nie wymagają raczej objaśniania. Czym natomiast różni się „Sensor” od „user”? Na pierwszy rzut oka oba działają identycznie. Z małym wyjątkiem. Otóż przy wyłączeniu funkcji autorotacji w telefonie aplikacja z ustawioną orientacją na „user” nie będzie reagowała na zmianę położenia, natomiast z ustawioną na „sensor” będzie.

Podstawowe ustawienia.

Podstawowe ustawienia.

Jeśli ustawiliśmy właściwości ekranu, dodajemy dwa komponenty (Button i ListPicker) z listy komponentów z kategorii „basic”.

Nowe komponenty.

Nowe komponenty.

Zaznaczamy wstawiony element „ListPicker” i nadajemy mu w części Properties nazwę „Połącz”. Proponuję też ustawienie szerokości „Width” na „Fill parent” Dzięki czemu przycisk rozciągnie się na szerokość całego ekranu. W przypadku tego elementu mamy sporą mnogość funkcji konfiguracyjnych. Myślę, że niema sensu omawiać każdej z nich. Będę to robił tylko wtedy, gdy konkretniej będziemy używali. Jak zwykle zachęcam do zabawy, testowania, oraz poznawania tych ustawień.

Przejdźmy do ustawień naszego przycisku. Proponuję zmianę nazwy na „Wyślij A” oraz zmianę wielkości czcionki (FontSize) na 25. Wstawmy teraz z menu „Palette”, z kategorii „Other stuff”, „BluetoothClient”.

Klient Bluetooth.

Klient Bluetooth.

Po wszystkich tych czynnościach ekran powinien pokazywać wizualnie gotową kalifikacje testową:

Ekran aplikacji.

Ekran aplikacji.

Teraz mam świetną wiadomość! W edytorze ekranów zrobiliśmy już wszystko, co potrzeba, aby zrobić test podłączenia. Przejdźmy więc do edytora blokowego.

Algorytm

Przyszedł czas na stworzenie blokowego algorytmu działania naszego programu. Pierwszym zdarzeniem, które musimy opisać to „BeforePicking” (niebieska strzałka) należące do „ListPicker”, który jest w karcie „My Blocks”. Zdarzenie wykonuje się w chwili naciśnięcia przycisku list pickera, zanim wyświetli się lista.

W tym momencie możemy ją wypełnić. Wypełniamy oczywiście listą sparowanych urządzeń Bluetooth. Aby to zrobić wybieramy akcję tego samego elementu o nazwie „ListPicker1.Elements” (zielona strzałka). Wypełniamy ją zawartością listy sparowanych urządzeń, więc wybieramy z „BluetoothClient1”, „BluetoothClient1.AddressesAndNames” (czerwona strzałka). Łączymy zgodnie z obrazkiem:

Pierwsza część programu.

Pierwsza część programu.

Myślę, że póki co wszystko jest jasne. Możemy teraz włączyć moduł bluetooth w naszym telefonie i kliknąć w „Połącz” Powinna pojawić się lista urządzeń.

Lista urządzeń w otoczeniu.

Lista urządzeń w otoczeniu.

Zaznaczam, że bez uruchomienia Bluetooth w telefonie, nie ujrzymy najprawdopodobniej nic. Tym jak poinformować użytkownika o konieczności włączenia bluetooth, zajmiemy się w następnej części. Gdy mamy już listę naszych urządzeń możemy przekonać się, że wybranie dowolnego z listy nie daje żadnych rezultatów. To dlatego, że jedyne co „oprogramowaliśmy” to zapełnienie listy konkretnymi danymi.

android_3_009

Kolejna część programu.

Teraz pora na wykonanie akcji połączenia. Postępujemy zgodnie z instrukcją wyżej. Myślę, że niema potrzeby objaśniania po kolei wszystkiego.

Jedynym elementem, który warto dokładniej opisać jest najmniejszy bloczek. Pozwala on użyć bezpośredniego polecenia. W tym przypadku połączenia bluetooth. Element „ListPicker1.Selection” Przekazuje wartość wybranego elementu z listy.

Teraz mam kolejną dobrą wiadomość. Od teraz aplikacja powinna łączyć się naszym modułem bluetooth! Dla przeprowadzenia testu proponuję jednak jeszcze opisane akcji przycisku.

Wybieramy blok „Button1.Click”, w którym akcje będą wykonywały się po kliknięciu buttona. Dodajmy bloczek odpowiedzialny za wysyłanie Bluetooth (w formie tekstu), jako źródło niech posłuży bloczek „text”, który możemy znaleźć w „buil-In -> text” uzupełniamy jego zawartość przykładową literą „A”.

Bloczek z tekstem "A".

Bloczek z tekstem "A".

Jeśli chcielibyśmy, aby każdy kolejny znak wyświetlał się w nowej linijce, musimy wysłać znak „enter”. Niestety nie jest to możliwe do zrobienia w analogiczny sposób. Musimy poradzić sobie trochę inaczej.

Pomyślmy, jaki kod ASCII ma przejście do nowej linii? Jest to to oczywiście 013. Tak więc musimy wysłać znak o kodzie 013. Jak tego dokonać? Należy wysłać liczbę w postaci 1 bajta. Teraz staje się wszystko jasne!! Taki bloczek mamy dostępny na liście BluetoothClient. Jako źródło cyfry dodajemy „numer” dostępny w „Build-In -> math”. Cały program powinien wyglądać mniej więcej tak:

Cały program.

Cały program.

Teraz dość oczywista sprawa, niemniej jednak bardzo istotna. Otóż po wykonaniu w pewnym sensie przerwania (np. kliknięcie przycisku) wykonują się operacje umieszczone wewnątrz niego.

Wykonują się po kolei – od góry, do dołu. Tak więc analizując operacje wykonane po naciśnięciu przycisku, możemy dojść do wniosku, że najpierw zostanie wysłany znak „A” następnie znak o kodzie 013, czyli przejście do następnej linijki terminala.

Test aplikacji

Przeprowadźmy test naszej aplikacji w praktyce.

Zdaję sobie sprawę, że w filmach było trochę błędów. Przyznaje, że nagranie filmu, nie jest najłatwiejszą częścią tworzenia takiego kursu. Pomijając konieczność nagrywania dźwięku osobnym mikrofonem i czasochłonną obróbkę audio w celu uzyskania przyzwoitego efektu.

W poprzedniej części obiecałem przedstawić start/stop dla LF’a. Niestety z przyczyn technicznych nie mogłem tego dokonać. Niemniej mam nadzieję, że uda mi się naprawić to co popsułem i na dniach uzupełnić materiał o stosowne informację i filmik.

Mam nadzieję, że artykuł się spodobał, zachęcam, do komentowania, oceniania i konstruktywnej krytyki. W kolejnej (czwartej) części kursu planuję opisać użycie akcelerometru, wysyłanie ciągów znaków, operacje matematyczne, warunki oraz obsługę okienek informacyjnych/ostrzegawczych. Oraz kilka myków, które ułatwią nam pracę.

AKTUALIZACJA (14.10.2013)

Obiecywałem start/stop dla LF’a więc i jest. Do naszego programu dodajmy jeszcze jeden przycisk. Nadajmy parametr „Text” tego, który już wstawiliśmy wcześniej jako „Start” a tego nowo dodanego „Stop”. Nasz ekran telefonu powinien wyglądać mniej więcej tak:

Prosty kontroler LineFollowera.

Prosty kontroler LineFollowera.

Jako, że naszemu mikro kontrolerowi łatwiej odczytać wartość odebranego bajtu, niż analizować jago znak/ znaki. Przyjmijmy, że komunikacja będzie wyglądała 1Bajt = 1 Polecenie.

Czyli mamy do dyspozycji 256 różnych poleceń (0-255). Jako, że dla Start/Stop wystarczą nam dwie, możemy wybrać tak naprawdę dowolne. Kierując się zupełną dowolności ustalmy 10 dla startu, oraz 11 dla stopu.

Idąc tym tropem możemy dojść do wniosku, że do poprawnego działania wystarczy, że nas program wyśle w jednym bajcie liczbę 10 po naciśnięciu start, oraz 11 po kliknięciu stop. Dodawania znaku przejścia do nowej linii (013) mija się tu z celem, dlatego wysyłamy tylko bajt z poleceniem.

Jeśli przeczytałeś kurs od początku, powinieneś potrafić zrobić stosowny algorytm w edytorze blokowym. Powinien on wyglądać następująco:

Gotowy program.

Gotowy program.

Możemy oczywiście przetestować nasz program w terminalu PC analogiczne do poprzednich prób. Należy jednak pamiętać o przełączeniu trybu widoku z ASCII na Dec, co pozwoli nam na analizę wartości liczbowych przysyłanych bajtów, a nie ich interpretację ASCII. Myślę, że możemy to jednak pominąć, gdyż kod jest analogiczny do poprzedniego - musi działać.

Implementacją kodu w robocie nie będziemy się zajmować, szczególnie, że zależy ona od konkretnego mikrokontrolera, języka itp. Jedyne co musimy zrobić to odczytywać jeden bajt z bufora uart i jeśli jest on równy 10 uruchamiamy mostek / tryb line followera, 11 wyłączamy robota. Działanie całości zaprezentuje filmik:

Mam nadzieję, że tym razem udało mi się ustalić odpowiednio wysoki poziom głośności.

« Poprzedni artykuł z seriiNastępny artykuł z serii »

android, AT, bluetooth, BTM-222, kursAndroid

Trwa ładowanie komentarzy...