Odpowiedz 
 
Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Tracker APRS do samochodu
SQ2PPJ Offline
Nowicjusz
*

Liczba postów: 19
Dołączył: 17-07-2014
Post: #1
Tracker APRS do samochodu
Witam,

Jakiś czas temu zainteresowałem się APRS-em. Z racji tego, że pracuje głównie w pasmach VHF/UHF i bardzo często w samochodzie postanowiłem zrobić sobie Tracker APRS-u właśnie do samochodu. Oczywiście zaczęło się od APRSdroida zainstalowanego na smartfonie, a później tablecie podłączonym do radiotelefonu TYT TH-UVF9D.
Działało Wink ale 5W nawet z zewnętrzną anteną miało "dziury" w śledzeniu pojazdu na aprs.fi.

Postanowiłem zmienić TYT-a - na Motorolę MaxTrac300 25W na wyjściu. Wstępny projekt polegał na zrobieniu układu sterującego ptt w momencie pojawienia się sygnału w APRSdroidzie, ponieważ nie ma on takiej funkcjonalności. Doszedłem jednak do wniosku, że jak już mam coś "lutować" to może zrezygnować z telefonu i zrobić to od początku do końca. Może kogoś zainteresują moje dotychczasowe prace:

Z racji tego, że nie jestem jakimś wytrawnym elektronikiem mój wybór na czas przygotowywania prototypu padł na ARDUINO. Docelowo projekt ma zostać przeniesiony na płytkę własnego projektu z ATMEGą 328 taką jak w ARDUINO.

Lista sprzętu:
ARDUINO UNO - mózg systemu
Moduł GPS FGPMMOPA6C - pozycjonowanie GPS
LCD 2x16 I2C - wyświetlacz LCD wysterwany po I2C

Dodatkowo ogromnym ułatwieniem była biblioteka QAPRS stworzona przez kolegę SQ5RWU wysyłająca dane APRS już w enkapsulacji ax.25. Najprostszy układ do wysyłania danych w formacie APRS przedstawia schemat poniżej. Oczywiście zamiast głośnika podłączamy wejście audio radiotelefonu, a zamiast diody LED - tranzystor sterujący PTT.

İmage
Który w połączeniu z przykładowym kodem z biblioteki:
Kod:
/*
    Copyright (C) 2013 Lukasz Nidecki SQ5RWU
    
    This file is part of ArduinoQAPRS.

    ArduinoQAPRS is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    ArduinoQAPRS is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with ArduinoQAPRS; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    Ten plik jest częścią ArduinoQAPRS.

    ArduinoQAPRS jest wolnym oprogramowaniem; możesz go rozprowadzać dalej
    i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU,
    wydanej przez Fundację Wolnego Oprogramowania - według wersji 2 tej
    Licencji lub (według twojego wyboru) którejś z późniejszych wersji.

    Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on
    użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej
    gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH
    ZASTOSOWAŃ. W celu uzyskania bliższych informacji sięgnij do
    Powszechnej Licencji Publicznej GNU.

    Z pewnością wraz z niniejszym programem otrzymałeś też egzemplarz
    Powszechnej Licencji Publicznej GNU (GNU General Public License);
    jeśli nie - napisz do Free Software Foundation, Inc., 59 Temple
    Place, Fifth Floor, Boston, MA  02110-1301  USA

*/
/**
* @file
* @brief Plik testowy Arduino
*/


#include <Arduino.h>
#include "ArduinoQAPRS.h"

char * packet_buffer  = "                                                                    \n ";
char from_addr[] = "SQ5RWU";
char dest_addr[] = "APZQAP";
char relays[] = "WIDE2 1";

void setup(){
    // inicjalizacja
    // pin 3 to sensePin [wejscie] - 1 oznacza brak mozliwosci nadawania
    // pin 2 to txPin [wyjscie] - stan wyski w momencie rozpoczecia nadawania
    QAPRS.init(3,2);
}

void loop() {
        // nadanie paketu typu komentarz
        packet_buffer = ":TEST TEST TEST de SQ5RWU";
        QAPRS.send(from_addr, '0', dest_addr, '0', relays, packet_buffer);
        // nadanie pakietu z pozycja i symbolem wahadlowca
        packet_buffer = "!5215.68N/02057.48ES#";
        QAPRS.send(from_addr, '0', dest_addr, '0', relays, packet_buffer);
        // nadanie danych pogodowych bez pozycji
        packet_buffer = "_07071805c025s009g008t030r000p000P000h00b10218";
        QAPRS.send(from_addr, '0', dest_addr, '0', relays, packet_buffer);
        delay(5000);
}

Daje możliwość wysłania ramki APRS.

Na chwilę obecną podłączyłem moje ARDUINO z GPS-em i modułem LCD. Efekt widoczny na zdjęciu poniżej:
İmage

Moduł GPS podłączony "na szybko", bez baterii podtrzymania, na zrobionej "na szybko" płytce i okrutnie "obsmarkane" lutownicą transformatorową (wiem, że nie ma się czym chwalić, ale docelowo postaram się, żeby wyglądało lepiej):
İmage

W tej chwili moduł GPS jest przenoszony na docelową płytkę:
İmage
Moduł GPS jest realizowany na zewnętrznej płytce, aby można było go umieścić w miejscu, gdzie bez problemu będzie się "fix-ował".

Przede mną jeszcze kawałek drogi, ale myślę, że powinno się udać. W miarę postępu prac postaram się uzupełniać wątek.
17-07-2014 11:42
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9MDD Offline
Rysiek
****

Liczba postów: 380
Dołączył: 01-02-2009
Post: #2
RE: Tracker APRS do samochodu
Super sprawa będę kibicował twojemu projektowi. Myślisz o jakiejś komunikacji z PC? Wiesz jakaś konfiguracja trakera z dedykowanej aplikacji? Tak by "enduser" nie musiał się w kodzie grzebać. Bardzo chętnie w tym pomogę Wink

...przede wszystkim nie zakłócać...
20-07-2014 22:05
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ2PPJ Offline
Nowicjusz
*

Liczba postów: 19
Dołączył: 17-07-2014
Post: #3
RE: Tracker APRS do samochodu
Prace nad projektem trwają - z racji bardzo ograniczonego czasu progres będzie powolny:

GPS został już przeniesiony na nową płytkę i trochę mniej "obsmarkany" Wink

İmageİmageİmage

"Pinologia":
GND
TX
RX
LED
VCC

Zastanawiam się jeszcze nad zmianą gold pinów na kątowe, aby przy połączeniu bez przewodów płytkę można wpiąć bezpośrednio w płytkę główną.

Cytat:Super sprawa będę kibicował twojemu projektowi. Myślisz o jakiejś komunikacji z PC? Wiesz jakaś konfiguracja trakera z dedykowanej aplikacji? Tak by "enduser" nie musiał się w kodzie grzebać. Bardzo chętnie w tym pomogę Wink

Witaj,
Dzięki za kibicowanie i oferowaną pomoc - przyda się bo czasu do pracy nad projektem BARDZO mało - może mnie to trochę zmotywuje Wink

Jeśli chodzi o software do komunikacji to na razie skończyło się na myśleniu.

Nie za bardzo wiem - jak można z programu ustawić zmienną tak, aby po odcięciu i ponownym podaniu zasilania dane nie uległy "zapomnieniu". Wydaje mi się, że sensownym rozwiązaniem była by - karta SD.
Wkładamy do PC - wpisujemy odpowiednie parametry, przekładamy do APRS-u i jest OK.

Drugi wariant jaki rozpatrywałem to komunikacja po BT. Mam moduł BT do arduino dokładni taki:
İmage
I zastanawiałem się nad stworzeniem aplikacji na ANDROIDA za pomocą MIT APP INVENTOR 2 tak, aby z telefonu lub tabletu można było po BT "zaprogramować" konfigurację na karcie SD. Pozwoliło by to na wygodną pracę w warunkach moblinych, a dla osób, które nie używają urządzeń "ANDROIDOWYCH" pozostawał by sposób z komputerem i przekładaniem karty SD.

Niemniej, te rozważania się na razie drugoplanowe - na chwilę obecną chciałbym przenieść projekt z płytki prototypowej na laminat i uruchomić w wersji "nieprogrmowalnej".
21-07-2014 10:55
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9MDD Offline
Rysiek
****

Liczba postów: 380
Dołączył: 01-02-2009
Post: #4
RE: Tracker APRS do samochodu
Komunikacja po BT i zmiana ustawień super sprawa Wink
Co do samego zapisu ustawień w pamięci to masz do dyspozycji 1024bajty pamięci EEPROM a to jak na potrzeby trakera masa miejsca. W wątku o programowaniu procesorów wsadziłem pliki APRS Platform, tam wszystkie ustawienia trzymam w eepromie. Podejrzyj sobie jak to jest robione...

...przede wszystkim nie zakłócać...
21-07-2014 18:22
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ2PPJ Offline
Nowicjusz
*

Liczba postów: 19
Dołączył: 17-07-2014
Post: #5
RE: Tracker APRS do samochodu
No dobra, przyznam że mnie zmotywowałeś i programowanie po BT będę implementował na obecnym etapie prototypowym. Na razie powstanie aplikacja na ANDROIDA (bo to mam już na 90% opracowane na potrzeby innego projektu) - później pomyślę też nad aplikacją na PC. Po zagłębieniu się w dokumentację modułu BT HC-05 dokopałem się, że pin 32 (LED2) to pin wysterowujący diodę w przypadku sparowania urządzenia. Więc planuje wykorzystać stan wysoki pinu 32 aby za pomocą funkcji attachInterrupt() wymusić na urządzeniu przejście w "tryb programowania" i zapisanie danych do EEPROM-u. Na wyjściu z trybu programowania planuje resetować ARDUINO, żeby w void SETUP zaczytywał nowe dane z EEPROM-u.
22-07-2014 8:55
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9MDD Offline
Rysiek
****

Liczba postów: 380
Dołączył: 01-02-2009
Post: #6
RE: Tracker APRS do samochodu
Możesz tak ale nie musisz.
Ten procek ma 16MHz zegar więc i tak większość czasu to się nudzi czekając na zajęcie. Spokojnie możesz napisać procedury zmieniające dane w eeprom podczas jego normalnej pracy. Jest to o tyle wygodne że możesz też sterować trakerem w locie prosto z portu rs/bluetooth, podglądać sobie na tym porcie co robi traker itd...

...przede wszystkim nie zakłócać...
22-07-2014 12:32
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ2PPJ Offline
Nowicjusz
*

Liczba postów: 19
Dołączył: 17-07-2014
Post: #7
RE: Tracker APRS do samochodu
Mam pewien problem z odczytem danych z GPS-u. Jeśli dane z GPS-u odczytam bezpośrednio na Serial to dostaje czytelny przekaz NMEA:
Kod ARDUINO:
Kod:
#include <SoftwareSerial.h>
#include<string.h>
#include <Wire.h>

SoftwareSerial nss(3, 4);

void setup()
{
Serial.begin(115200);
nss.begin(9600);

}
void loop()
{
  if (nss.available()) Serial.write(nss.read());
    
}

W odpowiedzi na serial monitorze dostaje dane w postaci:

Cytat:$GPGSA,A,3,24,26,28,12,15,18,22,,,,,.22,N,0.41,K,A​*34
$GPGGA,070017.000,5428.5821,N,01822.3515,E,1,7,0.9​9,162.6,M,34.0,M,,*50
$GPGSA,A,3,24,26,28,12,15,18,22,,,,,$GPGGA,070019.​000,5428.5822,N,01822.3513,E,1,7,0.99,162.6,M,34.0​,M,,*5B
$GPGSA,A,3,24,26,28,12,15,18,22,,,,,,1.33,0.99,0.8​9*04
$GPRMC,070019.000,A,5428.5822,N,01822.3513,E,0.26,​118.04,290714,,,A*6B
$GPVTG,118.04,T,,M,0.26,N,0.48,K,A*39
$GPGGA,070020.000,5428.5822,N,01822.3512,E,1,7,0.9​9,162.6,M,34.0,M,,*50
$GPGSA,A,3,24,26,28,12,15,18,22,,,,,,1.33,0.99,0.8​9*04

Jeśli natomiast próbuje odczytać te dane do zmiennej, tak aby je potem obrobić, to niestety dane są mocno "pocięte".

Kod:
#include <SoftwareSerial.h>
#include<string.h>
#include <Wire.h>

SoftwareSerial gps(3, 4);

void setup()
{
Serial.begin(115200);
gps.begin(9600);

}
void loop()
{
  Serial.flush();
  char sign;
  String gps_string = " ";
          if( gps.available()) sign = gps.read();
           if (sign == '$')
          {
            if (gps.available()) sign = gps.read();
            while (sign != 13)
           {
           gps_string = gps_string + char(sign);  
           if (gps.available()) sign = gps.read();
           //delay(10);
           }
          
         }
           if (gps_string != " ") Serial.println(gps_string);
}

I wyglądają mniej więcej tak:

Cytat: GPGGA,072234.000,5428.5814,N,01822.3484,E,1,8,0.91​,159.7,M,34.0,M,,*50
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA​AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$GPGGA​,072236.000,5428.5815,N,01822.3485,E,1,8,0.91,159.​7,M,34.0,M,,*52
33333333333333333333333333333333333333333333333333​33333333333333333333333333333333333333333333333333​33333333333333333333333333333333333333333333333333​33333333333333333333333333333$GPGGA,072237.000,542​8.5815,N,01822.3486,E,1,8,0.91,159.7,M,34.0,M,,*
GPGGA,072238.000,5428.5816,N,01822.3486,E,1,8,0.92​,159.7,M,34.0,M,,*5F
16,N,01822.3486,E,1,8,0.91,159.7,M,34.0,M,A112.,01​G1
GPGGA,072240.000,5428.5816,N,01822.3486,E,1,8,0.91​,159.7,M,34.0,M,,*53
GPGSA,A,3,26,,1,,1.9*2G,,45,4,4,1,5*G41,,25,,,,2
G31100,112$P,54586,286,2229,
GPGGA,072241.000,5428.5815,N,01822.3487,E,1,8,0.91​,159.7,M,34.0,M,,*50

Czy jest jakiś sposób na zsynchronizowanie odczytu danych z portu szeregowego ?
29-07-2014 9:24
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP9MRN Offline
MAc
*****

Liczba postów: 817
Dołączył: 29-08-2009
Post: #8
RE: Tracker APRS do samochodu
1. Ja czytam do tablicy a nie do stringa - tyle, że moje dane są krótsze
2. Czy twoja biblioteka software serial to jest ten "newsoftserial" ?


Ja tak czytam serial - catread() jest wywoływany przez:
"if (Serial.available() > 0){
catread();
}"
które jest w main loop

a samo czytanie wygląda tak:

void catread(){
incoming = Serial.read(); delay(3);
if (incoming == 254) {
incoming=Serial.read(); delay(3);
if (incoming == 254){
//display.print(incoming); display.display();
delay(3);

buffget[0] = 0;
CTi=0;
do{
incoming=Serial.read();
delay(3);
buffget[CTi]=incoming;
//display.print (buffget[CTi]); display.print(" ");
CTi++;
} while(incoming!=253); //dopóki nie przyjdzie FD
delay (5);
}
}
//**********o co chodzi loggerowi?***************
switch (CTi){
case 4:
CATpoll_in();
break;
case 5:
//CATselsctVFO A/B();
break;
case 6:
CATsetmode();
break;
case 9:
CATsetfreq();
break;
}
//Serial.print("cti-=");
//Serial.println(CTi,HEX);
} //Koniec CAT

Może to cię naprowadzi na coś co pomoże

MAc
mrn

PS. CTi jest do sprawdzenia długości rozkazu, sprawdzanie jego zawartości jest dalej

PS2 czemu używasz softseriala a nie hardwarowo?
(Ten post był ostatnio modyfikowany: 29-07-2014 17:50 przez SP9MRN.)
29-07-2014 17:50
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ2PPJ Offline
Nowicjusz
*

Liczba postów: 19
Dołączył: 17-07-2014
Post: #9
RE: Tracker APRS do samochodu
Po małych przeróbkach kod wygląda tak:
Kod:
#include <SoftwareSerial.h>
#include<string.h>
#include <Wire.h>

SoftwareSerial gps(3, 4);

void setup()
{
Serial.begin(115200);
gps.begin(9600);
}
void loop()
{
String gps_data = "";
String gps_gpgga = "";

while (gps.available())
{
  gps_data = gps_data + char(gps.read());  
}
if (gps_data != "")
{
  int pos_b = gps_data.indexOf('$GPGGA');
  int pos_e = gps_data.indexOf('*');
  gps_gpgga = gps_data.substring(pos_b-5,pos_e);
  Serial.println(gps_gpgga);
}
}

A dane wyjściowe -tak:
Cytat:$GPGGA,081849.000,5428.5809,N,01822.3485,E,1,8,0.9​5,165.6,M,34.0,M,,
$GPGGA,081850.000,5428.5807,N,01822.3490,E,1,8,0.9​6,165.5,M,34.0,M,,
$GPGGA,081851.000,5428.5809,N,01822.3490,E,1,8,0.9​6,165.4,M,34.0,M,,
$GPGGA,081852.000,5428.5810,N,01822.3491,E,1,8,0.9​6,165.3,M,34.0,M,,
$GPGGA,081853.000,5428.5810,N,01822.3493,E,1,8,0.9​5,165.3,M,34.0,M,,
$GPGGA,081854.000,5428.5808,N,01822.3496,E,1,8,0.9​5,165.2,M,34.0,M,,
$GPGGA,081855.000,5428.5806,N,01822.3498,E,1,8,0.9​6,165.1,M,34.0,M,,
$GPGGA,081856.000,5428.5806,N,01822.3495,E,1,8,0.9​5,165.1,M,34.0,M,,
$GPGGA,081857.000,5428.5804,N,01822.3496,E,1,8,0.9​5,165.1,M,34.0,M,,
$GPGGA,081858.000,5428.5803,N,01822.3497,E,1,8,0.9​5,165.0,M,34.0,M,,

Odczyt z GPS-u uznaje tymczasowo za zamknięty, choć nie jestem z niego w 100% zadowolony - zdecydowałem się korzystać z łańcucha GPGGA, ponieważ z GPRMC nadal mam problemy. Pętla while zastosowana w programie "wrzuca" do string-a tylko taki fragment danych:
Cytat:$GPGGA,083936.000,5428.5816,N,01822.3504,E,1,7,1.0​4,164.7,M,34.0,M,,*50
$GPGSA,A,34,1,,3,.
,.056,2E430,AP34,,.3
Mimo, że pełne dane wyglądają tak:
Cytat:$GPGGA,070017.000,5428.5821,N,01822.3515,E,1,7,0.9​​9,162.6,M,34.0,M,,*50
$GPGSA,A,3,24,26,28,12,15,18,22,,,,,$GPGGA,070019.​​000,5428.5822,N,01822.3513,E,1,7,0.99,162.6,M,34.​0​,M,,*5B
$GPGSA,A,3,24,26,28,12,15,18,22,,,,,,1.33,0.99,0.8​​9*04
$GPRMC,070019.000,A,5428.5822,N,01822.3513,E,0.26,​​118.04,290714,,,A*6B
$GPVTG,118.04,T,,M,0.26,N,0.48,K,A*39

Niemniej dane z łańcucha GPGGA są dla mnie, na tę chwilę, wystarczające dla osiągnięcia zamierzonego celu, więc dalsze testy spycham na razie na dalszy plan.

Dodałem obróbkę danych i w tej chwili wygląda to tak:
Kod:
#include <SoftwareSerial.h>
#include<string.h>
#include <Wire.h>

SoftwareSerial gps(3, 4);

void setup()
{
Serial.begin(115200);
gps.begin(9600);
}

void loop()
{
String gps_data, gps_gpgga;
int coma1,coma2,coma3,coma4,coma5,coma6,coma7;
while (gps.available())
  {
    gps_data = gps_data + char(gps.read());  
   }

if (gps_data != "")
{
  int pos_b = gps_data.indexOf('$GPGGA');
  int pos_e = gps_data.indexOf('*');
  gps_gpgga = gps_data.substring(pos_b-5,pos_e);
  coma1 = gps_gpgga.indexOf(',');
  coma2 = gps_gpgga.indexOf(',',coma1+1);
  coma3 = gps_gpgga.indexOf(',',coma2+1);
  coma4 = gps_gpgga.indexOf(',',coma3+1);
  coma5 = gps_gpgga.indexOf(',',coma4+1);
  coma6 = gps_gpgga.indexOf(',',coma5+1);
  coma7 = gps_gpgga.indexOf(',',coma6+1);
  int fix = gps_gpgga.substring(coma6+1,coma6+2).toInt();
  if (fix=1)
   {
    int hh = gps_gpgga.substring(coma1+1,coma1+3).toInt();
    int mm = gps_gpgga.substring(coma1+3,coma1+5).toInt();
    int ss = gps_gpgga.substring(coma1+5,coma1+7).toInt();
    Serial.print("Time: ");Serial.print(hh,DEC);Serial.print(":");Serial.print(mm,DEC);Serial.print(":");Serial.println(ss,DEC);
    String lat =  gps_gpgga.substring(coma2+1,coma3) + gps_gpgga.substring(coma3+1,coma3+2);
    Serial.print("Latitude: ");Serial.println(lat);
    String lon =  gps_gpgga.substring(coma4+1,coma5) + gps_gpgga.substring(coma5+1,coma5+2);
    Serial.print("Longitude: ");Serial.println(lon);
   }
  else
   {
    Serial.print("Waiting for GPS fix");
   }
  }
}

I na serial monitor wysyłane są dane w postaci:
Cytat:Time: 9:51:48
Latitude: 5428.5841N
Longitude: 01822.3546E
Time: 9:51:49
Latitude: 5428.5841N
Longitude: 01822.3556E
Time: 9:51:50
Latitude: 5428.5837N
Longitude: 01822.3577E
Time: 9:51:51
Latitude: 5428.5832N
Longitude: 01822.3594E
(Ten post był ostatnio modyfikowany: 30-07-2014 11:52 przez SQ2PPJ.)
30-07-2014 10:43
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP9MRN Offline
MAc
*****

Liczba postów: 817
Dołączył: 29-08-2009
Post: #10
RE: Tracker APRS do samochodu
ładnie zrobione ;-)
MAc
mrn
30-07-2014 12:00
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości