Autor: Dondu
Artykuł jest częścią cyklu: Bluetooth + mikrokontroler
Parametry te ustawia się z wykorzystaniem tzw. komend AT (ang. AT commands). Komendy te to określone ciągi znaków ASCII, które przesyła się do modułu HC-05 za pomocą interfejsu UART, z wykorzystaniem linii RxD oraz TxD modułu.
Zestaw komend przedstawię w kolejnym artykule, w niniejszym bowiem zajmiemy się przede wszystkim poznaniem zasad jakie obowiązują podczas wysyłania komend do modułu oraz odbierania odpowiedzi z modułu.
Przygotujmy sprzęt ...
W tym celu posłużymy się komputerem wyposażonym w port szeregowy COM (lub adapter COM-USB) i podłączymy do niego moduł HC-05 pamiętając o tym, by skrzyżować sygnały TxD oraz RxD:
oraz o dostosowaniu poziomów logicznych do sygnałów w module HC-05 czyli 3,3V, jeżeli nie masz odpowiedniego adaptera, który zawiera w sobie taki konwerter poziomów.
Możesz do tego użyć np. takiego dwukierunkowego konwertera napięć( ang. Bi-Directional Logic Level Converter):
Dwukierunkowy konwerter poziomów. |
o którym pisałem w artykule: HC-05 (Bluetooth) - Informacje podstawowe
Przyda nam się także dokumentacja rodziny HC-0x: HC-Serial-Bluetooth-Products.pdf (kopia)
Wejście w tryb komend AT
Aby moduł HC-05 mógł odbierać komendy AT i reagować na nie, należy go do tego zmusić. Są na to dwa sposoby:
Sposób 1 (AT Mode 1)
W dokumentacji znajdziemy informację, że dla modułu HC-05 sposób pierwszy polega na:
... czyli w trakcie pracy modułu przy włączonym wcześniej zasilaniu należy wymusić na pinie nr 34 (PIO11) stan wysoki.
W tym sposobie parametry transmisji UART są takie same jak aktualnie ustawione. Jeżeli więc jest to moduł fabrycznie nowy będą to:
- 9600bps,
- 8-bit,
- 1 bit stopu,
- brak parzystości
Sposób 2
Drugi sposób przedstawia się następująco:
... czyli
- przed włączeniem zasilania modułu lub jednocześnie z włączeniem zasilania należy wymusić na pinie nr 34 (PIO11) stan wysoki (np. podpinając go do pinu zasilającego moduł HC-05),
- po włączeniu zasilania moduł gotowy jest do przyjmowania komend AT według podanych niżej parametrów transmisji UART:
- 38400bps,
- 8-bit,
- 1 bit stopu,
- brak parzystości
Zauważ, że tryb ten z góry ma ustawione stałe parametry i zawsze będą to takie, a nie inne parametry niezależnie co wcześniej ustawiłeś komendami AT.
Dlatego tryb ten powinieneś wybrać w szczególności wtedy, gdy chcesz skomunikować się z modułem, którego ustawień parametrów transmisji UART nie znasz.
Dlatego tryb ten powinieneś wybrać w szczególności wtedy, gdy chcesz skomunikować się z modułem, którego ustawień parametrów transmisji UART nie znasz.
Dlaczego nie wszystkie komendy AT działają?
Możesz się spotkać z sytuacją, że część komend AT działa poprawnie, a część jest ignorowanych przez moduł. Jest to związane bezpośrednio z funkcjonalnością modułu, która została specjalnie tak przygotowana:
Innymi słowy, aby wszystkie komendy AT działały poprawnie, będąc w trybie komend AT należy utrzymywać pin nr 34 (PIO11) w stanie wysokim niezależnie, którym sposobem włączyłeś tryb AT. W przeciwnym wypadku niektóre komendy nie będą działały, co pokażę w dalszej części artykułu.
Kilka podstawowych komend AT
W niniejszym artykule zaprezentuję i przetestujemy jedynie kilka prostych komend. Pozostałe omówię w kolejnych artykułach.
Najważniejszą na tym etapie informacją jest, iż:
czyli:
Wszystkie komendy AT powinny być wysłane dużymi znakami ponieważ oprogramowanie modułu tylko takowe interpretuje. W tym przypadku są jednak wyjątki i niektóre wersje oprogramowania modułów, poprawnie interpretują także małe litery. Bezpiecznie jednak jest używać dużych.
Druga część powyższego fragmentu dokumentacji mówi, że:
Wszystkie komendy AT powinny być wysłane z terminatorem (czyli sufiksem) w postaci znaków "powrotu karetki" i "nowej linii", czyli dwóch bajtów \r\n (odpowiednio 0d 0a szesnastkowo).
AT
Komenda wysłana | Odpowiedź z modułu | Parametry |
---|---|---|
AT | OK | brak |
Komenda AT służy jedynie do sprawdzenia, czy komunikacja z modułem HC-05 jest prawidłowa oraz czy moduł na pewno jest w trybie przyjmowania komend AT.
AT+RESET
Komenda wysłana | Odpowiedź z modułu | Parametry |
---|---|---|
AT+RESET | OK | brak |
Komanda AT+RESET powoduje wyjście z trybu komend AT.
AT+VERSION
Komenda wysłana | Odpowiedź z modułu | Parametry |
---|---|---|
AT+VERSION? | +VERSION:<Param> OK |
<Param> : Wersja oprogramowania modułu |
Komenda AT+VERSION? żąda od modułu podania zainstalowanej w nim wersji oprogramowania.
AT+NAME
Komenda wysłana | Odpowiedź z modułu | Parametry |
---|---|---|
AT+NAME=<Param> | OK | <Param> : Nazwa modułu (domyślnie np.: HC-05) |
AT+NAME? | +NAME:<Param> OK lub w przypadku błędu: FAIL | <Param> : Nazwa modułu (domyślnie np.: HC-05) |
Komenda AT+NAME służy zarówno do odczytania aktualnej nazwy modułu, jak i ustawienia nowej.
Testujemy komendy AT
Jeżeli mamy już:
- podłączony do komputera moduł HC-05,
- włączony tryb AT sposobem nr 2 (opisanym wyżej),
- włączony i ustawiony terminal Realterm,
Możemy więc przystąpić do wydawania komend AT. Do testów wykorzystamy przedstawione wyżej trzy proste komendy AT oraz jedną nieco bardziej skomplikowaną, którą odczytamy aktualną nazwę modułu oraz ustawimy nową.
Do wejścia w tryb komend AT w niniejszym artykule wykorzystałem opisany wyżej Sposób 2 po to, by nie było wątpliwości jakie parametry transmisji mają być ustawione, by móc wydawać komendy poprzez UART:
Musisz wiedzieć, że na potrzeby tego artykułu:
Po wejściu w tryb AT zwolniłem pin nr 34 (PIO11), czyli odłączyłem od niego stan wysoki (zwolniłem przycisk, który mam na tym pinie podłączony, a który zwiera do Vcc modułu, gdy jest przyciśnięty).
Zrobiłem to po to, by pokazać, że w takiej sytuacji niektóre komendy AT będą ignorowane, o czym pisałem wcześniej.
Zrobiłem to po to, by pokazać, że w takiej sytuacji niektóre komendy AT będą ignorowane, o czym pisałem wcześniej.
Wysyłamy pierwszą niepoprawną komendę AT:
Dlaczego niepoprawną? Ponieważ nie dodaliśmy terminatora \r\n, który oznacza dla modułu, że to jest koniec komendy. Stąd też moduł otrzymał jedynie dwa znaki będące literami A oraz T i oczekuje dalszych, a w szczególności znaków terminatora \r\n.
Gdy w następnej kolejności wyślemy poprawną komendę AT z terminatorem \r\n:
otrzymujemy błąd ponieważ w tych dwóch krokach wysłaliśmy w sumie taką komendę:
ATAT\r\n
a ona jest oczywiście nieprawidłowa.
Jeżeli ponownie wyślemy poprawną komendę, będzie już wszystko OK:
moduł odpowiada nam zgodnie z tabelką komendy AT
Komenda wysłana | Odpowiedź z modułu | Parametry |
---|---|---|
AT | OK | brak |
czyli wysłaniem dwóch liter: OK
Ponieważ jednak kłopotliwe jest ciągłe dodawanie terminatora \r\n, możemy wykorzystać możliwości terminala Realterm i ustawić ich automatyczne dodawanie zawsze po kliknięciu przycisku Send:
Dla pierwszego pola za pomocą którego wpisywałem komendy AT znaczniki terminatora oznaczyłem strzałkami czerwonymi. CR to \r , a LF to \n. Znaczniki drugiego pola oznaczyłem strzałkami zielonymi. Zauważ, że w polu komendy wpisałem już tylko komendę AT (bez terminatora). To bardzo wygodne rozwiązanie.
Zauważyć należy, że moduł odpowiada komunikatem, który także jest zakończony znakami terminatora \r\n. Dlatego w oknie terminala są one widoczne.
Aby nie było widać znaków specjalnych w trakcie realizowania komunikacji możesz w terminalu ustawić tryb Ansi:
... ufff ... przebrnęliśmy przez istotne informacje i wyjątki, więc ...
... zaczynamy jeszcze raz
Klikając przycisk Clear (po prawej) i mając już poprawnie ustawiony terminal pod każdym kątem, wysyłamy komendę AT:
i zgodnie z tabelą komendy AT otrzymaliśmy odpowiedź w formie dwóch znaków: OK
Wyślijmy więc kolejną z komend, którą będzie AT+VERSION , a ponieważ ma to być pytanie skierowane do modułu stąd na końcu dodamy znak zapytania:
W odpowiedzi otrzymaliśmy ciąg znaków z fragmentem komendy i wersją oprogramowania modułu oraz ponownie OK. Jest to zgodne z tabelą komendy AT+VERSION przedstawionej w niniejszym artykule, a którą ponownie załączę, by nieco wyjaśnić:
Komenda wysłana | Odpowiedź z modułu | Parametry |
---|---|---|
AT+VERSION? | +VERSION:<Param> OK | <Param> : Wersja oprogramowania modułu |
Z ekranu terminala odczytujemy co z otrzymanego ciągu znaków +VERSION:2.0-20100601 jest naszym parametrem <Param> Jest nim ciąg znaków 2.0-20100601 który oznacza wersję programu zainstalowanego w module.
Teraz wykonajmy kolejną komendę tym razem spróbujemy odczytać nazwę modułu komendą: AT+NAME?
... i niestety rozczarowanie - moduł kompletnie zignorował zapytanie o nazwę (pomimo kilkukrotnych prób). Jeśli uważnie czytałeś artykuł to zapewne domyślasz się, że jest to związane z faktem, iż po wejściu w tryb AT odłączyłem stan wysoki z pinu nr 34 (PIO11).
Podłączmy więc ponownie (będąc cały czas w trybie AT) pin nr 34 (PIO11) do stanu wysokiego i spróbujmy wysłać ponownie komendę: AT+NAME?
Tym razem moduł zrewanżował się poprawną informacją o nazwie modułu, która jest parametrem zgodnie z tabelą tej komendy:
Komenda wysłana | Odpowiedź z modułu | Parametry |
---|---|---|
AT+NAME? | +NAME:<Param> OK lub w przypadku błędu: FAIL | <Param> : Nazwa modułu (domyślnie np.: HC-05) |
Naszym parametrem <Param> jest więc ciąg znaków aktualnie ustawionej nazwy modułu: HC-05
Spróbujmy teraz ustawić nową nazwę modułu tą samą komendą według zasady podanej w tabeli tej komendy:
Komenda wysłana | Odpowiedź z modułu | Parametry |
---|---|---|
AT+NAME=<Param> | OK | <Param> : Nazwa modułu (domyślnie np.: HC-05) |
Załóżmy, że chcemy go nazwać: Dondu-HC05
Zgodnie z tabelą nowa nazwa będzie parametrem <Param> , stąd komenda AT powinna wyglądać następująco:
... i z ulgą stwierdzamy, że moduł odpowiedział OK co oznacza, że nazwa została zmieniona.
Z ciekawości zobaczmy, co się stanie jeżeli spróbujemy ustawić w nazwie jakiś niedozwolony znak ASCII, np. wykrzyknik:
i stwierdzam, że moduł odpowiedział komunikatem błędu: ERROR:(0)
Ponieważ wcześniej poprawnie ustawiliśmy już nową nazwę sprawdźmy, czy przy powyższym błędzie ustawiona nazwa nie została nadpisana w jakiś sposób. Wysyłamy więc ponownie żądanie podania aktualnie ustawionej nazwy komendą: AT+NAME? pamiętając, że dla tej komendy pin nr 34 (PIO11) musi być podłączony do stanu wysokiego (o czym pisałem wcześniej):
i stwierdzamy, że wszystko jest OK - nowa nazwa jest ustawiona.
Mamy już ustawioną nową nazwę modułu sprawdźmy więc, czy moduł zostanie wykryty przez komputer za pomocą bluetooth:
Nie został wykryty ponieważ ciągle jesteśmy w trybie wydawania komend AT, powinniśmy więc zakończyć tryb wysłaniem komendy AT+RESET:
a otrzymany w odpowiedzi OK oraz zmiana częstotliwości mrugania diody LED modułu:
utwierdzają nas, że poprawnie zostały zapisane przez nas dokonane zmiany (zmiana nazwy urządzenia) i dokonaliśmy zamknięcia trybu komend AT.
Sprawdźmy więc ponownie, czy teraz moduł będzie już wykrywany i pod jaką nazwą:
Jak widać poprawnie ustawiliśmy nową nazwę nabierając jednocześnie doświadczenia w wydawaniu modułowi komend AT :-)
W przypadku systemu Windows możesz się spotkać z sytuacją, że moduł nadal jest wykrywany pod starą nazwą.
W takiej sytuacji by się upewnić, że zmiana nazwy nastąpiła prawidłowo wykorzystaj swój telefon i sprawdź jak on wykrywa moduł.
W takiej sytuacji by się upewnić, że zmiana nazwy nastąpiła prawidłowo wykorzystaj swój telefon i sprawdź jak on wykrywa moduł.
Podsumowanie
Jak widać operowanie komendami AT z poziomu terminala Realterm zainstalowanego na komputerze nie jest trudne. Więcej się napracujemy, gdy będziemy robić to za pomocą mikrokontrolera podłączonego do modułu.
Zasada jest taka sama dla wszystkich urządzeń wykorzystujących komendy AT, choć oczywiście komendy mogą być różne.
Zapamiętaj, że moduły mogą różnie się zachowywać z powodu różnych wersji oprogramowania. Przedstawione w niniejszym artykule zachowanie modułu jest zgodne z wersją programu 2.0-20100601. Jeżeli posiadasz inną wersję działanie Twojego modułu może się różnić od przedstawionego wyżej.
W kolejnym odcinku przedstawię zestawienie wszystkich komend AT modułu HC-05 i innych z tej rodziny, a w następnych zajmiemy się ciekawymi możliwościami HC-05 i związanymi z nimi komendami AT .
Krókie pytanie...
OdpowiedzUsuńW jaki sposób ustawić stan wysoki na pinie 34 posiadając taki moduł jaki pokazujesz na obrazkach? :) Czy odpowiedzialny za to jest pin EN?
Z tego co znalazłem w czeluściach internetu to do wprowadzenia w tryb AT służy przycisk. Trzeba go kliknąć, a on zwiera 3.3V z regulatora do pinu 34
UsuńTAK , TO DZIAŁA . PODŁĄCZASZ ZESTAW Z PRZYTRZYMANYM PRZYCISKIEM I PRZECHODZI W TRYB AT
UsuńA czy istnieje sposób na wydanie komendy AT przez BT ?
OdpowiedzUsuńznaczy chodzi mi o komendy At w celu przeprogramowania modułu przez BT
OdpowiedzUsuńNie ma takiej możliwości. Być może jakaś wersja oprogramowania pozwala na takie rozwiązanie, ale nie spotkałem się z takimi modułami HC-05.
UsuńMam problem, gdy chcę wysłać komendę AT za pomocą Send ASCII. Kiedy klikam "Send ASCII" pojawia się dymek z komunikatem: "Chars sent aren't displayed when half-duplx is set" i nic się nie dzieje.
OdpowiedzUsuńCzy jest to związane z ustawieniami RealTerm'a?
Jak wygląda komenda, którą chcesz wysłać?
UsuńNajpierw próbowałem komendę: AT (miałem zaznaczone w EOL +CR i +LF). Później próbowałem, z odznaczonymi opcjami w EOL, komendą: AT\r\n
UsuńŻadna z komend nie przyniosła efektu. Zaznaczę (bo może jest to istotne), że moduł bluetooth jest podłączony przez płytkę stykową do Arduino Leonardo.
Mam problem z komendami, co bym nie wysłał to moduł odsyła to samo, np. wysyłam komendę AT i zamiast odpowiedzi ok, dostaję AT. O co tu chodzi?
OdpowiedzUsuńCzy poprawnie wprowadziłeś moduł w tryb przyjmowania komend AT?
UsuńMasz rację nie było trybu AT, ale z nim mam teraz wielki problem bo wchodzę w ten tryb a nie mogę się połączyć przez RealTerm. Opiszę po kolei co robię i proszę o wskazanie błędu.
OdpowiedzUsuńModuł mam na płytce stykowej z Atmegą 32, wyprowadzenia TX i RX mam podłączone do procka, na rozłączonym zasilania naciskam przycisk i podłączam zasilanie, dioda zaczyna migać jak ta w artykule więc puszczam przycisk i próbuję się podłączyć przez RealTerm z prędkością 38400 i po chwili wyrzuca mi błąd "Przekroczono limit czasu semafora". Próbowałem też na prędkości 9600, łączyłem na krzyż TX z RX i też nic z tego.
Zresetuj komputer i daj znać, czy pomogło.
UsuńResetowałem i nic nie pomogło
UsuńHmm, parę razy zdarzyło mi się taki komunikat (na Win XP) przy transmisji szeregowej uzyskiwać (niezależnie, czy była to transmisja przez Bluetooth, czy kablowa), ale nie pamiętam co było przyczyną. Odinstaluj Realterm i zainstaluj jeszcze raz i daj znać.
UsuńJeśli możesz, to spróbuj także na innym komputerze.
Próbowałem i niestety nic z tego, zainstalowałem też Flash Magic, ale też nie udało się połączyć. Inny komputer będę miał dopiero w sobotę, więc wtedy to sprawdzę. A sposób w jaki to robie jest prawidłowy? Nie powinno być nic podłączone pod pin EN?
UsuńPróbowałem na dwóch innych komputerach i za każdym razem ten sam problem. Czego to może być wina? Źle jest coś podłączone czy o co tu chodzi? Mam 3 moduły HC-05 więc raczej mało prawdopodobne aby wszystkie 3 były uszkodzone i przez to nie działały...
UsuńI ciągle ten sam komunikat, że przekroczono limit czasu semafora? To może być problem z systemem - zapewne masz Windows. Poszukaj w sieci informacji o tym komunikacie.
UsuńTak. Z tego co wyczytałem może być problem ze Smartem, nie wiem czy to się mnie dotyczy... Testowałem dysk na swoim laptopie i nie ma błędów. Co jeszcze mogę zrobić z tym problemem?
UsuńNiestety nie wiem jak Ci pomóc. Zapytaj może na forum Elektroda.pl w dziale mikrokontrolerów. Może ktoś miał podobny problem.
Usuńok, mimo wszystko dzięki
UsuńMam ten sam problem. Czy udało Ci się go rozwiązać?
UsuńMożesz napisać po co zastosowałeś rezystory R1 i R2 w konwerterze napięć?
OdpowiedzUsuńCoś musi wymuszać stan wysoki...
UsuńNie mogę wysyłać komend AT do modułu, włączam tryb komend AT dioda zapala się i gaśnie co 2 sekundy, wysyłam komendy z terminala, ale w odpowiedzi nic nie dostaję.
OdpowiedzUsuńKtórym sposobem wchodzisz w tryb komend AT?
UsuńHallo,
OdpowiedzUsuńMogłem zablokować albo uszkodzić moduł HC-06 bawiąc się komendą AT+BAUDx?
Przestał mi odpowiadać na komendę AT, ale sparować z telefonem jeszcze mogę...
Witam mam pytanie czy możliwa jest zmiana adreu modułu HC-05
OdpowiedzUsuńWitam, ciekawi mnie czy można do wyżej napisanego poradnika wykorzystać samo usb? Tzn odpowiednio przez konwertery napięć podłączyć D- i D+ do modułu HC i w ten sposób wydawać komendy AT?
OdpowiedzUsuń