Kilka miesięcy temu narodził się w mojej głowie pomysł aby zrobić urządzenie lokalizujące które mogę włożyć do auta czy podłączyć do psa (szelek psa) :D
Głównymi założeniami było aby :
-zrobić to samemu
-w miarę tanio
-urządzenie wysyłało sms’em współrzędne gps już w linku do map gógla
-było dość małe tak żeby psa nie obciążyć i żeby weszło spokojnie do auta
-wytrzymywało na baterii około 2-3 dni
Wszystko zacząłem od zakupienia modułu GSM, po przeglądnięciu internetów zdecydowałem się na płytkę opartą o SIM900, lecz czytając Elektronikę Praktyczną trafiłem na artykuł o wykorzystaniu takiej samej płytki ale z SIM900A.
Jedna literka a tak dużo zmienia…
SIM900A to ten sam czip ale przystosowany do rynku Aziatyckiego…
Niestety nie działa on z naszymi kartami sim. Ale po wgraniu firmware od SIM900 wszystko śmiga.
Ale dlaczego kupić SIM900A zamiast SIM900 i męczyć się ? ?
Cena modułu z SIM900A na ebay’u to około 11USD a SIM900 to około 19USD więc sami wybierzcie czy lepiej poświęcić chwilę i zaoszczędzić 8 dolarów :)
Męczyłem się okropnie z tym firmware i po wgraniu tego od SIM900 u mnie dalej nic nie działało. Dzięki uczynnym internautom dowiedziałem się żeby wgrać firmware od SIM900B. I już wszystko działa pięknie !
Jak wgrać firmware ?
Będziemy potrzebować :
-konwerter USB-UART ja używam tego (konwerter usb-uart ft232)
-program do wgrania firmware (link)
-firmware od SIM900B (link)
Należy połączyć konwerter z modułem gsm, jest to banalnie proste
RX –> TX
TX –> RX
VCC –> PWR
GND –> GND
Poniżej załączam opis pinów modułu
1.Konwerter podłączamy do portu usb w komputerze
2.W menadżerze urządzeń sprawdzamy jaki port com jest przyporządkowany do konwertera
3.Włączamy program Simcom – sim900 Customer flash loader V1.01
4.Klikamy “Browse…” i wybieramy nasz firmware dokładnie plik z rozszerzeniem “.cla”
5.Ustalamy nasz port com i prędkość wybieramy na 9600 po czym klikamy START
6.Ja wgrywałem to na starym komputerze i trwało to około 15 minut
GOTOWE ! Firmware wgrane, teraz moduł będzie działał z europejskimi kartami sim !
Teraz kilka wskazówek do modułu gsm:
-jeśli dioda D6 miga szybko to moduł nie zalogował się do sieci, zalecam używać kart bez pinu lub usunąć go.
-jeśli dioda miga w odstępach 3 sekundowych to moduł jest zalogowany do sieci !
OK, teraz możemy już przejść do sedna !
Co będzie nam potrzebne do zrobienia Lokalizatora GPS GSM ? Wszystko do zakupienia w sklepie botland.com.pl !
– moduł gsm komunikujący się komendami AT np (link)
– moduł gps ja użyłem UBLOX NEO-6M (link)
– arduino ja użyłem uno (link)
– jakieś zasilanie 5V min 1A ja zasilam power bankiem (link)
– przyda się jeszcze jakaś stykówka ja użyłem (link)
Połączenie jest banalnie proste, zarówno moduł gsm jak i gps działają na 5V, dlatego ich zasilanie podłączamy do 5V a masy do GND. Resztę pinów łączę tak :
-TX gsm do pinu 0 arduino
-RX gsm do pinu 1 arduino
-TX gps do pinu 3 arduino
-RX gps do pinu 4 arduino
Tak jak pisałem połączenie jest banalnie proste.
Uwaga ! Arduino UNO używa pinów 0 i 1 do wgrywania programu przed usb do atmegi, jeśli połączysz tak jak ja piny gsm’a do 0 i 1 to odłącz je w momencie wgrywania programu do arduino !
Potrzebujemy jeszcze bibliotekę tinyGPS++ (link)
Moduł gps sygnalizuje gotowość miganiem niebieską diodą (u mnie nie działa w bloku trzeba wyjść na balkon/dwór/pole :P)
Jeśli mamy już podłączone wszystko elegancko to teraz kod !
Uprzedzam że kod nie jest całkowicie mój. Jest to przerobiony na moje potrzeby kod z Elektroniki Praktyczniej 06/2016. Część starego kodu jest za-komentowana jeśli chcielibyście użyć :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 |
#include <SoftwareSerial.h> #include <TinyGPS++.h> TinyGPSPlus gps; SoftwareSerial ss(3, 4); //---zmienne - komunikacja----------------------------- String gsmBuffer; int gsmComplete; int command_delay; int gsm_step; int pos; int end_pos; String command; int param; //---zmienne - siec------------------------------------ int sygnal; //---zmienne- sms-------------------------------------- String string_param; String string_number; String string_sms; //---setup--------------------------------------------- void setup() { //konfigurowanie interfejsu szeregowego ss.begin(9600); //do komunikacji z modułem GPS Serial.begin(9600); //do komunikacji z modułem GSM //początkowe wartości zmiennych sygnal = 0; gsmComplete = 11; //czas dla wystartowania modułu GSM command_delay = -600; delay(1000); } //---main---------------------------------------------- void loop() { while (ss.available() > 0) // jezeli cos przychodzi na ss port to czyta i odkoduje { gps.encode(ss.read()); } //odliczanie czasu do następnej komendy if (command_delay <= 300) command_delay++; //czas miną - następna komenda if (command_delay > 300) { command_delay = 0; gsmBuffer = ""; //wybór komendy dla modułu GSM switch (gsm_step) { case 0: { //wyłącza echo Serial.print("ATE0\r"); } break; case 1: { //zezwala na logowanie do sieci GSM Serial.print("AT+CREG=1\r"); } break; case 2: { //sprawdza stan zalogowania do sieci GSM Serial.print("AT+CREG?\r"); } break; case 3: { //kasuje wszystkie smsy Serial.print("AT+CMGDA=\"DEL ALL\"\r"); } break; case 4: { //określa tekstowy tryb odczytu SMS Serial.print("AT+CMGF=1\r"); } break; case 5: { //sprawdza siłę sygnału sieci GSM Serial.println("AT+CSCS=\"GSM\""); } break; case 6: { //odczytuje SMS z pozycji 1 Serial.print("AT+CMGR=1\r"); } break; case 7: { //odpisuje sms na numer który przysłał wiadomość while(!gps.location.isValid())// dopoki dane z gps'a nie sa dostepne wykonuje fukcje czytam { czytam(); } if(gps.location.isValid()){ Serial.println("AT+CMGS=\"NUMER_TELEFONU\""); delay(1000); Serial.print("https://www.google.pl/maps/place/"); Serial.print(gps.location.lat(), 6); Serial.print("N+"); Serial.print(gps.location.lng(), 6); Serial.print("E"); Serial.write(0x1A); } } break; case 8: { //kasuje wszystkie sms Serial.print("AT+CMGDA=\"DEL ALL\"\r"); } break; } } //odpieranie z UART gsmReceive(); //czeka na odebranie pakietu danych //pakiet konczy sie przerwą w odbieraniu danych if (gsmComplete <= 10) gsmComplete++; if (gsmComplete == 10) { //wybiera akcję w zalezności od komendy switch (gsm_step) { case 0: { //ATE0 OkGet(); if (command == "OK") gsm_step++; command_delay = 200; } break; case 1: { //AT+CREG=1\r" OkGet(); gsm_step=3; command_delay = 200; } break; case 2: { //AT+CREG? CommandGet(); ParamGet(2); if (param == 1) { gsm_step++; } } break; case 3: { //AT+CMGDA="DEL ALL" OkGet(); gsm_step++; command_delay = 200; } break; case 4: { //AT+CMGF=1 OkGet(); gsm_step++; command_delay = 200; } break; case 5: { //AT+CSQ OkGet(); Serial.println("AT+CMGS=\"NUMER_TELEFONU\""); delay(300); Serial.print("GSM DZIALA"); Serial.write(0x1A); gsm_step++; command_delay = 200; } break; case 6: { //AT+CMGR=1 CommandGet(); //jeśli odczytano SMS if (command == "CMGR") { //nastepny etap - kasowanie SMS gsm_step = 8; //jeśli SMS zawiera treść if (StringSmsGet() > 0) { //określa numer nadawcy StringParamGet(2); string_number = string_param; //jesli polecenie załaczenia if (string_sms == "gdzie jestes") { //nastepny etap - wysyłanie potw. gsm_step = 7; } //jesli polecenie wyłączenia //if (string_sms == "Out off") { //Serial.print("Out off"); // autorefresh = 0; //nastepny etap - wysyłanie potw. // gsm_step = 7; // } } //jesli nie ma SMS } else { OkGet(); //wróć do sprawdzania nowego SMS'a gsm_step = 6; } } break; case 7: { //"AT+CMGS= CommandGet(); if (command == "CMGS") gsm_step++; } break; case 8: { //AT+CMGD=1 OkGet(); gsm_step = 6; } break; } //na koniec wyczyść bufor odebranych danych gsmBuffer = ""; } //przerwa pętli głównej delay(20); } //odbieranie danych z GSM void gsmReceive() { while (Serial.available()) { //jeśli coś odebrane char inData = (char)Serial.read(); //odbierz dane gsmBuffer += inData; //i umieść w buforze gsmComplete = 0; //pakiet w trakcie command_delay = 0; //zaczekaj z komendą } } //uzyskuje nazwę komendy z odebranego pakietu int CommandGet(void) { command = "---"; pos = gsmBuffer.indexOf("+"); if (pos > 0) { pos = pos + 1; end_pos = gsmBuffer.indexOf(":", pos); command = gsmBuffer.substring(pos, end_pos); } } //uzyskuje potwierdzeie OK z odebranego pakietu int OkGet(void) { command = "---"; pos = gsmBuffer.indexOf("\n"); if (pos > 0) { pos = pos + 1; end_pos = gsmBuffer.indexOf("\r", pos); command = gsmBuffer.substring(pos, end_pos); } } //uzyskuje wartość określonego parametru z pakietu int ParamGet(int index) { param = 0; pos = gsmBuffer.indexOf(":"); if (pos > 0) { pos = pos + 2; if (index > 1) { pos = gsmBuffer.indexOf(",", pos); pos = pos + 1; } if (index > 2) { pos = gsmBuffer.indexOf(",", pos); pos = pos + 1; } param = (gsmBuffer.charAt(pos) - '0'); pos = pos + 1; if ((gsmBuffer.charAt(pos) >= '0') && (gsmBuffer.charAt(pos) <= '9')) { param *= 10; param += (gsmBuffer.charAt(pos) - '0'); } } } //uzyskuje parametr typu String z pakietu int StringParamGet(int index) { string_param = "---"; pos = gsmBuffer.indexOf(":"); if (pos > 0) { pos = pos + 2; //skip :_ if (index > 1) { pos = gsmBuffer.indexOf(",", pos); pos = pos + 1; //skip , } if (index > 2) { pos = gsmBuffer.indexOf(",", pos); pos = pos + 1; //skip , } pos = pos + 1; //skip " end_pos = gsmBuffer.indexOf(34, pos); //find second " string_param = gsmBuffer.substring(pos, end_pos); } } //uzyskuje tresc SMSa z pakietu int StringSmsGet(void) { pos = gsmBuffer.indexOf(":"); if (pos > 0) { pos = gsmBuffer.indexOf("\n", pos); pos = pos + 1; end_pos = gsmBuffer.indexOf("\r", pos); string_sms = gsmBuffer.substring(pos, end_pos); return 1; } else { string_sms = ""; return -1; } } void czytam() // pobiera dane z gps { while (Serial.available() > 0) { gps.encode(Serial.read());} } |
Uwaga w miejsce NUMER_TELEFONU, wpiszcie swój numer wraz z przedrostkiem +48 :) Wgrywamy do Arduino i połączmy piny od modułu GSM.
Jak działa program (w skrócie):
1.Po włączeniu konfiguruje połączenie gsm kodowanie itd
2.Jeśli jest już zalogowany to wysyła na wpisany numer “GSM DZIALA”
3.Jeśli moduł otrzyma sms’a “gdzie jestes” odsyła link do góglmapsa z zaznaczonymi współrzędnymi.
Zdjęcie z działania poniżej :
Jak widać przydałoby się przenieść to na płytkę drukowaną i zamknąć w jakiejś małej obudowie, uda się to na pewno ze zniżką do botlandu ! Wiadomo studencki budżet :) Może jest tu ktoś kto za małe pieniądze mógłby wydrukować obudowę do tej maszynki ? :)
Jeśli wam się podoba to proszę o oceny !
W razie pytań piszcie w komentarzach :)
Pozdrawiam Krzysztof Trybuła .
No to w takim razie:
PS. w Elektronice Praktyczniej podaja kody do Arduino? :)
Krapi: Dzięki za rady, uzupełniłem już linki i informacje o których piszesz
Tak czasem robią projekty z Arduino, a pełne kody można znaleźć u nich na stronie w materiałach dodatkowych do projektu :)
Ktrybula: Ścisłowiec z reguły nie ma problemów z logiką :)
Bardzo ciekawy projekt :) Ile wyniósł koszt takiego lokalizatora?
Pablo: około 180zł ale koszty można zminimalizować kupując arduino nano i zamiast kupnego powerbanka zrobić własnego z ogniw z odzysku :)
Podoba mi się :)
Super urządzenie, chyba będę musiał zrobić coś podobnego
Jeśli chodzi o wydrukowanie obudowy – napisz na wefhy007@gmail.com na pewno się dogadamy.
Albo jakaś cena typu student dla studenta, albo coś w stylu wymiany za PCB do projektu ;)
wefhy: Dzięki bardzo, jak będę miał zrobioną płytkę i zasilanie finalne to na pewno napiszę !
Z ciekawości, jakie widzisz zalety tego rozwiązania w porównaniu do użycia jakiegoś starego telefonu z androidem ? Bo:
1) Telefon wychodzi taniej i ma już GPS, GSM i baterię.
2) Android jest łatwiejszy w programowaniu (szczególnie biorąc pod uwagę dostępność różnych źródeł wiedzy)
3) Nie wiem, ale chyba Twoje rozwiązanie ma rozmiary większe od telefonu.
Tak naprawdę jedynym plusem Twojego rozwiązania może być stabilność, której urządzenia na Androidzie mogą nie mieć (potrafi się często zawiesić bez powodu).
Krzysiek:
Witaj,
Fajny projekt.
Miałeś założenie żeby wszystko wytrzymało 2-3 dni, udało się. Nie napisałeś.
A jest możliwość podłączenia to bezpośrednio pod akumulator, jak myślicie czy szybko rozładuje.
Piotr: Dzięki ! Aktualnie jest na arduino uno, więc jest bardziej prądożerne a i zasilanie będzie lepsze więc nie sprawdzam na razie czy wytrzyma 2-3 dni. Jest taki pomysł żeby wrzucić to do bagażnika obok koła zapasowego podpiąć pod aku ale na zasadzie że działa z aku i ładuje własne baterie gdy jest zapłon włączony a jak nie to bierze ze swoich zasobów prąd.
Bardzo przydatny artykuł :) Wiem już, co robiłem źle..
Rozumiem, że chciałeś to sam zrobić, ale …
1) Pierwrszy lepszy telefon z androidem + Android Device Manager (stronka googla) umożliwia Ci uzyskanie informacji o położeniu telefonu (żadnego programowania, etc). A podpinając telefon do dowolnego programu dla cyklistów/biegaczy/etc -> zdalnie masz dostęp do trasy. co więcej telefon jest mniejszy i bardziej odporny na warunki środowiskowe
2) Za 20-25$ widziałem lokalizatory samochodów. Prawie identyko to co ty zrobiłeś, ale parę razy mniejsze …
@Quosek: Mając takie podejście można większość urządzeń na arduino wywalić i kupić za mniejsze pieniądze już gotowe rozwiązania z ebaya ;) Chodzi też o DIY :)
Ktrybula: Gość ma rację, ale gdyby twoje rozwiązanie wzbogacić np o komunikację z ECU to już by to inaczej wyglądało. A to tylko moduł BT potrzebny…
Kilkanaście h mi zajeło takiemu noobowi jak ja przerobienie kodu na m590 i stare NEO-6M, ale warto było. Sam bym tego nie napisał. Dzieki za pomoc! :)
@M.: Mi m590 nie chciało się łączyć z siecią nawet dlatego przerzuciłem się na sim900, sam przerobiłem tylko kod z pisma Elektronika Praktyczna, którego lekturę polecam !
Miałem identyczny problem z m590 z allegro za 25zł. Był podłączony do arduino i kompletnie nie łapał zasięgu. Wyrok – zbyt mały prąd na USB. Dałem mu zasilacz 7V 2A i poszedł jak burza.
Fajny pomysł, chętnie bym to zlokalizował gdzieś w rowerze, jednak nie ma za bardzo miejsca gdzie to skryć ;D
patryk (WariatRowerzysta): Rama jest za wąska żeby w niej to umieścić, można zabudować w jakiejś obudowie pod siodełkiem ewentualnie ;)
https://www.youtube.com/watch?v=x4-apRupUOE
Polecam tracker TK102B, kosztuje około 60 zł u chińczyków. Do tego w zestawie 2 baterie.
I jeszcze taka uwaga, zamiast do Googla dałbym link do UMP, czyli ump.waw.pl
Wybrałem Googl’a bo korzystam prawie codziennie z tej aplikacji. Nie miałem z nią problemów, czemu uważasz że lepiej użyć ump ?
A mnie zastanawia dlaczego użyłeś Shielda zamiast jakiegoś o wiele tańszego po prostu GSMa? Pierwszy przykład z brzegu: http://allegro.pl/modul-gsm-sim-sim800l-arduino-gprs-simcom-antena-i6474973234.html za 60zł.
Jeśli dobrze pamiętam sim800l do komunikacji używa 2,7V, a na tej płytce jest logika na 5V. Zresztą można ją kupić u chińskich kolegów za 12 $ :)
Jaki był łączny koszt złożenia całego lokalizatora?
Realnie to :
-arduino zastąpiłem atmegą328p z oscylatorem i filtrowaniem powiedzmy 2$
-moduł gsm 12$
-moduł gps 10$
-ogniwa 18650×3 dobrej jakości 45zł
-moduł ładowania i przetwornica step-up 8zł
-płytka uniwersalna + drobnica elektroniczna + elementy montażowe 7zł
-obudowa w 3d – czeka na realizację :D
około 160zł, z obudową mam nadzieję zmieścić się w 200
Projekt chyba tylko dla samej zabawy z elektroniką, bo można bez trudu kupić tańsze i mniejsze lokalizatory albo – jak już ktoś zasugerował – wykorzystać starego smartfona z androidem.
Mnie osobiście cieszy jeśli zrobię coś sam :) Dla satysfakcji i doszkalania się.
wytępicie DIY ludzie proszę was
Mam tak samo. Często wolę sam nawet jak jest drożej, większe czy brzydkie 🙄. Ale jest satysfakcja. Jeśli ktoś woli gotowce to po co tu zaglądać ?
jakiej wersji ide używasz
Zanim zdecydowałam się na konkretny lokalizator gps do swojej firmy, najpierw spędziłam masę godzin w internecie na znalezieniu opinii na ich temat. W taki sposób zdecydowałam, że najlepiej będzie wybrać te firmy Transmobil. Po spróbowaniu sama polecam go innym przedsiębiorcom.
Fajna rzecz tylko brakuje mi w tym przekaźnika sterowanego SMS-em odcinającego zapłon.
cześć, może jeszcze ktoś przeczyta. Odpaliłem wszytko, firmware wgrany, ale cały czas dioda D6 miga szybko, nie łączy się z siecią, macie jakiś pomysł?