wtorek, 15 lipca 2014

Komendy AT, wysyłanie SMS PDU MODE - rozkminiamy po trochu


Cześć i czołem!

"Zestaw" do testów
Rozszerzenie mikrokontrolera o moduł GSM lub coś co będzie za niego służyć daje nam spore pole do popisu. Od alarmów z domu przed zalaniem/przegrzaniem pieca, przez sterowanie oświetleniem, aż po otwieranie bramy automatycznej skądkolwiek zasięg GSM pozwoli. Do uzyskania tych efektów mamy dwie drogi - albo zakupić moduł GSM, albo wykorzystać stary aczkolwiek działający telefon. Pierwsza nie zawsze tania, druga kusząca, o ile walają się nam stare komórki po domu. Obie można sterować na pomocą komend AT.

Czym są komendy AT? Są to takie zaklęcia, dzięki którym możemy "przejąć" kontrolę nad telefonem. Wypowiadamy je za pośrednictwem portu UART'u, a ich efektem może być jakaś akcja, lub odpowiedź na pytanie. Przeglądając internet możemy natrafić na spore "księgi zaklęć", ja postaram się przytoczyć przydatne, przetestowane na Ericssonie T20, który jest moim królikiem doświadczalnym przy tematyce GSM.


Sprawa jest o tyle fajna, że tym "czarodziejem" nie musi być człowiek, a np. mikrokontroler, czy komputer. Podpinamy piny Rx i Tx (jak to jest w UART) do telefonu i śmiga. Najlepszym polem do pierwszych testów jest terminal działający z portem COM komputera, kto jeszcze nie zna, polecam gorąco program PuTTY.

Stronka pobierania PuTTY:
http://goo.gl/OHa6HH

Lista przydatnych zaklęć AT, (rozszerzę ją jeśli znajdę jakieś ciekawe):
ATD <numer-telefonu>; najzwyklejsze wykręcenie numeru i dzwonienie, baza do najprostszego alarmu, należy pamiętać o średniku na końcu np: ATD 123456789;
ATH odłożenie słuchawki
AT+CBC zwraca nam stan baterii
AT+CSQ zwraca nam jakość sygnału
AT+CKPD="<klawisz>" emulacja klawiatury, można za jej pomocą "ręcznie" sterować telefon
Dla Ericssona T20:
S - zielona słuchawka YES
E - czerwona słuchawka NO
< , > - klawisz w lewo i w prawo
C - wiadomo, c klawisz od kasowania
Od 0 do 9, * oraz # - normalne klawisze do wystukiwania numeru telefonu
AT+CMGF=? dostępne tryby wysyłania smsów, jeśli zwróci nam +CMGF: (0) to mamy tylko PDU, jeśli +CMGF: (0, 1) wygrałeś, masz prostszy TEXT MODE. Niestety większość starych telefonów posiada tylko PDU, więc jeśli chcemy wysyłać sms'y są dwie opcje. Albo dorwać taki co nadaje TEXT MODE, albo rozkminić PDU MODE.


Przy TEXT MODE nadawanie sms'ów jest banalane:
AT+CMGS="+48123123123" wciskamy enter lub przesyłamy znak ASCII 13
>Tekst wiadomości wciskamy CTRL+Z lub przesyłamy znak ASCII 26

 Zainteresowanych odsyłam do dokumentacji w google, gdyż chcę się skupić na aspekcie wysyłania SMS'ów w trybie PDU.

Przy PDU mode sprawa wygląda tak:
AT+CMGS=<długość komunikatu>
jw. ENTER/ASCII 13
> <zakodowany komunikat>
jw. CTRL+Z/ASCII 26

Przykład:
AT+CMGS=25
> 0011000B918466515076F80000AA0CD437485D9ED341D3E6D405 

Takie czary. Pod całym komunikatem jest schowane wszystko. Numer centrum SMS, numer odbiorcy, czas ważności sms'a, jak i sama treść sms'a. Myślę sobie wtf, kto to zrobił, a komu to potrzebne? Znalazłem translator który tłumaczy z trybu tekstowego na PDU i odwrotnie.

PDU <-> TEXT translator:
http://twit88.com/home/utility/sms-pdu-encode-decode

Pierwsze wnioski: Nie potrzeba podawać numeru centrum SMS. Komenda która podaje translator AT+CMGW= służy do zapisania wiadomości w telefonie, potem trzeba wysłać komendą AT+CMSS=1. Jeśli chcemy od razu wysłać potrzeba użyć AT+CMGS=<długość komunikatu> i pozostałe elementu jak podałem wyżej.

Teraz aby wysłać wiadomość mamy dwie opcje:
Albo generujemy sobie parę "gotowców" - przygotowanych komunikatów i podpinamy je pod jakąś reakcje w programie, co też jest jakimś rozwiązaniem, albo tworzymy funkcję do której podamy numer odbiorcy oraz treść sms'a a ona sobie go już przetłumaczy na swój język. Własny translator okaże się przydatny gdy zechcemy przesyłać jakąś zmienną, temperaturę, godzinę, cokolwiek.


Funkcja nadawania SMS
Poszperałem, pokombinowałem, ze 100 kompilacji programu później udało się mi osiągnąć pierwszy cel - funkcja wysyłania SMS w trybie PDU. Bazowałem na artykule ze strony http://goo.gl/gGJhTs tylko że tam argumenty były rozbite, wymagało to paru przeróbek.
Ja jako że się grzebać przy tych argumentach nie będę, jedyną wartością jaką będę zmieniać to numer i treść sms'a, postanowiłem maksymalnie ją uprościć i doprowadzić do postaci używalnej przy zwykłym uC AVR.
Jeszcze jedna poprawka polegała na dodaniu zera przed liczbę mniejszą od 16 (równą 0x0F lub mniej), bez tego po prostu komunikat nie działał.

Przyznam szczerze że procederu tłumaczenia samej treści sms'a średnio ogarniam, komu to potrzebne i w jakim celu ktoś to stworzył. Niemniej działa, funkcja wygląda mniej więcej tak (screen obok).

Do funkcji sendsms przekazujemy treść sms'a i numer, oba parametry w postaci łańcucha znaków. Co do numeru trzeba zrobić jeden gwizd, oznaczyłem to w źródłach:

Mamy numer: 48123456789
Dodajemy F na końcu: 48123456789F
Zamieniamy cyfry w kolejnych parach miejscami:  8421436587F9

Wszystko co trzeba opisałem w prostym testowym programie, jak coś to pytać :)

Testowy program:
http://goo.gl/r5oCKp

Następny cel do osiągnięcia - odczyt sms'ów w trybie PDU, tak więc stay tuned for more :)

Spodobało się? 
Zostaw komentarz, daj lajka, powiedz babci. Zrób cokolwiek. Umieram z braku feedback'u.
https://www.facebook.com/avr4fun <- Odwiedź fanpage
https://www.youtube.com/user/Marcin19941 <- Sprawdź co podziewa się na moim kanale youtube, wrzucam tam czasem zajawki projektów :)

Peace!

czwartek, 10 lipca 2014

Moduł kompasu HMC5883L - podstawy



GY-273 cena ok. 3$
 Cześć i czołem!

Przeglądając Aliexpress natrafiłem na wiele różnych modułów, o które możemy wzbogacić swoje projekty. Od żyroskopów, przez czujniki ultradźwiękowe aż po magnetometry. Jest tego. Zdecydowałem się na rozkminienie magnetometru HMC5883L znanego też pod nazwą GY-273, urządzenia do pomiaru pola magnetycznego ziemi. Komunikacja bez zbędnych dodatków, za pomocą I2C, czy jak kto woli TWI. Podłączone, musi działać.




Ma dwie podstawowe wady:
- duża wrażliwość na przechył, najdrobniejszy powoduje przekłamania rzędu 10 stopni
- nieproporcjonalność wyświetlanego wyniku, w rzeczywistym zakresie 0-180 pokazuje 0-240, oraz rzeczywiste 180-360 pokazuje jako 240-360. Da się to poprawić, zapraszając odrobinę matematyki do naszego programu, co też uczyniłem.

LCD kompatybilny z Nokia 3310/5510

Moduł zwraca wartości trzech wektorów, x,y,z - do kompasu potrzebne są x i y. Nie zagłębiałem się w dalszą teorie, w sumie na lekcjach geografii aż tak głębokich rozkmin nie było.
Po wykonaniu paru obliczeń, arcus tangensów i wypowiedzeniu zaklęcia zwraca nam się wartość kąta odchylenia od kierunku północy. Posiłkując się wiedzą i bibliotekami z googla zacząłem działać.




Tak się prezentuje prototyp

Miałem wizję zrobić mały prototyp, który mógłby pokazywać wstępnie wartość cyfrową, a później jakąś graficzną. W połączeniu z małym ekranikiem kompatybilnym ze lcd od Nokii 3310/5510, powstało małe urządzenie. I wyświetlacz i magnetometr nie tolerują napięcia 5V, zalecane jest 3V. Zamontowałem na prototypową płytkę baterię 3V CR2025 wraz z podstawką, co sprawiło że urządzenie stało się mobilne. Mikrokontroler Atmega8A który użyłem może pracować w zakresach napięć 2.7-5.5V, więc i on także nadaje się do tego projektu. Wyświetlacz pracuje przez programowe SPI, tak aby nie gryzł się z ISP procka podczas programowania. Dlaczego miałby się gryźć? Odsyłam tu do poradnika mistrza Yody Kardasia: https://www.youtube.com/watch?v=CX9r0GwkFU0

Rozwój jego niestety stanął na braku pamięci w procku, nie wiem czy da się coś zmniejszyć, ale rachuj nie rachuj, operacje na liczbach zmiennoprzecinkowych zabierają sporo pamięci. Może przy okazji następnego zamówienia elektroniki, wezmę Atmegę168, która ma 2x więcej pamięci od klasycznej megi8. Na tą chwilę pozostanie taki zalążek projektu.

Proces obliczania kąta można znaleźć w linku który podałem powyżej, nie chcę robić copy-paste, a pragnę się skupić na tym co sam opracowałem.

Jak poradzić sobie nie nieproporcjonalnością wyniku? W C++ odnajdziemy gotową funkcję map(), jako że pracuję w czystym C pokusiłem się o własne obliczenie.

Schemat (bez złącza KANDA ISP)

 Dla wartością kąta mniejszej od 240°:
kąt poprawiony = 179 * (kąt / 240);

Dla wartości kąta większej od 240° (tutaj posiedziałem nieco zanim rozkminiłem):
kąt poprawiony = (((kąt-240)/120)* 180)+180;
 



Co do kompasu, zapewne skończę za tym zabawę, niemniej co do wyświetlacza graficznego Nokia 3310/5510 nie powiedziałem ostatniego słowa. Mały, prosty w implementacji, niedrogi, jak na mój gust ma potencjał, który postaram się w nim obudzić.

Dla zainteresowanych wrzucam źródła programu, w miarę ogarnięte, jako że wszystkie są otwarte i ogólnodostępne nie powinni mnie za to udostępnianie zamknąć. Jeśli dorwę bogatszego w pamięć proca zgodnego pinowo z Atmega8, będę je rozwijał dalej. Tymczasem mam na głowie jeszcze co najmniej 3 (większe niż ten) projekty, które postaram się jeszcze w lipcu opisiać :)
Źródła -> http://goo.gl/VczIdt
Schemat -> http://goo.gl/a6WkPt

Jeszcze na koniec dorzucę reklamę, jeśli nie lajkujesz fanpage'a tego bloga, zapraszam do polubienia:
https://www.facebook.com/avr4fun
3 lajki do stu, jeśli będą chętni i będzie stówka, zorganizuje konkurs w którym będą do wygrania moduły nRF24l01 i przetworniki cyfrowo-analogowe TDA1543. Jaki to będzie konkurs, jeszcze nie wiem, jednakże mam zbyt dużą tendencje do chomikowania elektroniki. I to by było na tyle, do następnego!

Pozdrawiam

wtorek, 8 lipca 2014

Powiew świeżości


Cześć i czołem!

Czasem tak jest, że w życiu i nie tylko, potrzeba wprowadzić jakieś zmiany. Brak feedback'u jest głównym powodem tych zmian. Tymczasem jak nasz naród, jak to nasz naród, przychodzi po cebule i nie zostawia żadnego śladu po sobie. Żadnego. Średnio zagląda tu 15 unikalnych użytkowników dziennie. Może coś robię nie tak, stąd ta próba zmian.


 Co zrobię?

Na początku, usuwam wszystkie płatne linki, na których i tak nic nie zarobiłem. Poprzednie zostały wyłączone z zarabiania, następne będą skracane przez http://goo.gl/ dla mojej wiadomości ile osób to pobiera. A pobiera trochę, chyba to co tworzę nie jest totalnym crapem, skoro nikt się nie skarży?
Od tej pory zmienię mój blog ze zbioru projektów na dziennik konstruktora. Wcześniej był nim fanpage na facebook'u, niemniej teraz będą pojawiać się tam zajawki tekstów z bloga. Będę starał się, by były wciąż na poziomie. Więcej schematów, więcej opisów, aby ktoś z moich tworów czegoś się nauczył. Takie są plany.
Wyszedłem z cienia, bawię się obecnie stylami i kolorystyką, co sądzicie o obecnej? Trochę pogrzebałem w wyglądzie, można przerobić dosłownie wszystko, niemniej będę dążyć by było czytelnie i przyjemnie dla ok.

To jest w sumie tyle co chciałem napisać w sprawie zmian, do następnego posta :)

Peace!