Stranica: 1/1.

A9G i Mega2560

Postano: ned pro 27, 2020 12:19 pm
Postao/la dekip#8227
Nadam se da nisam jedini koji se pati sa A9G Pudding razvojnom pločom...

Nakon silnih peripetija (A9G datasheet, kao i opis setova AT komandi su na kineskom), sam prilično ovladao ovim modemom. Ideja je da uz pomoć Mega2560 pokupim GPS podatke i smestim ih u variablu. Tu nastaje problem.

Nisam se ranije sretao sa sličnim stvarima pa očigledno od brda ne vidim planinu. Ako koristim klasičan skeč za obrnutu komunikaciju preko serijskih terminala (Serial i Serial1) ja bez problema postavljam modem kako hoću i komandom AT+LOCATION+2 dobijam geografske širinu i dužinu.

Kod: Označite sve

while (Serial.available()) {
    Serial1.write(Serial.read());
  }
  while(Serial1.available()) {
    Serial.write(Serial1.read());
  }
  
Međutim, ako odmah upišem komandu, ne dobijam ništa.

Kod: Označite sve

while (Serial.available()) {
    Serial1.write("AT+LOCATION=2");
  }
  while(Serial1.available()) {
    Serial.write(Serial1.read());
  }
  
Takođe bih trebao da nakon poslate komande, povratnu informaciju pročitanu sa Serial1.read() smestim u neku gpsData ili šta god.

Re: A9G i Mega2560

Postano: ned pro 27, 2020 5:47 pm
Postao/la dekip#8227

Kod: Označite sve

    Serial1.println("AT+LOCATION=2");
    Serial1.flush();
    while(Serial1.available()>0){
    String cstring = Serial1.readString();
    Serial.println(cstring);
Sad dobijam očitavanje kome treba da uklonim OK na kraju.
12.34667,12.345678

OK

Re: A9G i Mega2560

Postano: pon pro 28, 2020 10:13 pm
Postao/la david.zovko#9363
Hvala što si postavio i odgovor! :text-thankyouyellow:

Re: A9G i Mega2560

Postano: sri pro 30, 2020 6:28 pm
Postao/la dekip#8227
Postavio delimičan odgovor. :)

Nikako da odvojim širinu i dužinu od OK. :(
A9G vraća zadate komande (ECHO) ali to se isključi sa ATE0. Međutim, rezultat prate nov red, pa nov red i OK. Nikako da to rešim. Ima TinyGPS biblioteka, ili tako nešto. A9G ima nezavistan serijski interfejs za GPS. Mogao bih to sve da prevežem na Megu i koristim Serial2 recimo. Tada bih mogao čitam GPS na jednom serijalu preko biblioteke, pa da podatke šaljem GET zahtevom nazad na Serial1. Ali nije elegantno. Mada nije isključeno da na kraju ipak to uradim ako ne nađem rešenje.

Re: A9G i Mega2560

Postano: čet pro 31, 2020 1:40 pm
Postao/la david.zovko#9363
Ako sam odbor shvatio, to što si printaš na serial imaš spremljeno u varijabli tipa String naziva cstring. Iz tog stringa trebaš izvaditi višak koji ti je na kraju stringa, a nalazi se nakon znaka "\n". U c-u vjerojatno ima više načina za to riješiti, prvo mi pada napamet je pretvoriti sve u char array, dobiti duljinu array-a s strlen() i onda na silu staviti '\0' char koji označava kraj stringa na mjesto gdje želiš da ti bude kraj tog stringa. Na kraju vratiš sve u String ako trebaš.

Javi jel pomoglo :)

Re: A9G i Mega2560

Postano: čet pro 31, 2020 2:31 pm
Postao/la domagoj#7215
Dekip, pozdrav!
Davidovo rješenje mi je dalo još jednu ideju, ako je u pitanju micanje OK. To bi izgledalo ovako:
cstring=cstring.substring(0,cstring.length()-4);
Od cijelog stringa koji sadrži koordinate, OK, ali i prazan, stvar sam zamislio da izdvojim samo početak stringa gdje su koordinate i to na način da od ukupnog stringa oduzmem 4 zadnja znaka. Dva su od OK, a dva vjerojatno od CR i LF. Možda je i samo LF, pa bi onda treblao pisati -3. Ali to se lako vidi, ako fali zadnja znamenka u koordinatama, onda treba smanjiti broj kod oduzimanja.
Bok, Domagoj

Re: A9G i Mega2560

Postano: pet sij 01, 2021 12:04 pm
Postao/la dekip#8227
Prvo, srećna vam svima Nova godina. Što više novih projekata sa što manje compiling errora. ;)

Vrlo zanimljivu stvar sam otkrio. Naime, dok je išao prethodni skeč, na serijskom terminalu su se prikazivala očitavanja jedna ispod drugog. Međutim ja sam svo vreme kao output dobijao čak DVA!! od jednom. I to sam primetio tek kada sam dodao liniju koju je Domagoj predložio. Tada sam dobio jedno očitavanje BEZ OK a drugo sa OK. Zanimljivo.

Kod: Označite sve

Serial1.println("AT+LOCATION=2");
    Serial1.flush();
    while(Serial1.available()>0){
    String cstring = Serial1.readString();
    //cstring = cstring.substring(0,cstring.length()-4); 
    Serial.println(cstring);
U skeču nemam ništa što generiše taj drugi output. Jer kada stavim ovaj print ovde u komentare, ne dobijam nikakav output. Ispada da ovaj print generiše čak dva outputa. :D

Nisam siguran gde je problem.

Radim paralelno na drugom rešenju. Ako dođem do kakvog rešenja, ostaviću ovde. Možda nekom bude trebalo. Na kraju, uvek mogu da vežem Serial2 na RX/TX GPS-a na ovom modulu.

Re: A9G i Mega2560

Postano: pet sij 01, 2021 12:13 pm
Postao/la dekip#8227
Sa:

cstring = cstring.substring(0,cstring.length()-37);

dobijam
12.345678,12.345678
Nova linija
OK
Nova linija
Nova linija
12.345678,12.345678
Nova linija
12.345678,12.345678
Nova linija
12.345678,12.345678
Nova linija
12.345678,12.345678
Nova linija
12.345678,12.345678
Nova linija
12.345678,12.345678
Obratite pažnju na nove linije

Re: A9G i Mega2560

Postano: pet sij 01, 2021 12:52 pm
Postao/la domagoj#7215
Prije svega i ja također žilim svima sretnu Novu 2021. :violin: :clap:
Ovako na prvu mi izgleda da se serial buffer (od GPS-a) napuni podacima brže nego što ih se čita pa izgleda kao da šalje više linija. Pretpostavljam da se u fazi ispitivanja GPS ne kreće pa ispada da ponavlja koordinate. Kada bi bio u pokretu možda brojevi ne bi bili isti. Jedna stvar mi je također čudna. Obje koordinate su 12.345678, da znamenke idu tako po redu? Još jedna stvar. Ako i daje više koordinata u jednom čitanju, je li taj broj uvijek isti ili se mijenja? U zadnjem postu je prikazano 7 koordinata. Možda GPS ima memorije za 7 zadnjih koordinata, pa kad ih šalje, šalje ii sve. I ne bi li uz koordinate trebalo biti i podatak o vremenu, nadmorska visina? Ti podaci bi možda mogli dati neke odgovore.
Pozdrav, Domagoj

Re: A9G i Mega2560

Postano: pet sij 01, 2021 7:06 pm
Postao/la dekip#8227
Daje on dobre koordinate. :)
Ali su prave. :D
Ove ovde su fejk. ;)

A9G je prilično precizan i s obzirom da je antena na pola metra od prozora, preciznost je ozbiljno dobra. Mene nervira št ono što dobijem ne mogu da upotrebim. I dalje ostaje opcija da preko trećeg serijskom interfejsa preko neke od biblioteka Mega sažvaće podatke i ispljune preko drugog serisjkog interfejsa. Nije elegantno, ali ko te pita.

Re: A9G i Mega2560

Postano: ned sij 03, 2021 6:46 pm
Postao/la dekip#8227
Nije najelegantnije ali...

Pitajte ako vas nešto zanima.

Kod: Označite sve

#include <TinyGPS++.h>
TinyGPSPlus tinyGPS;
#define GPSBaud 9600
#define gpsPort Serial3
int bID = 1;
#define LOG_RATE 10000
unsigned long lastLog = 0;
void setup(){
Serial.begin(115200);
Serial1.begin(9600);
Serial3.begin(GPSBaud);
initGSM();
initGPS();
initGPRS();
connectGSM("ATE0","OK");
}
void loop(){
  connectGPS();
  smartDelay(1000);
}
void initGPS(){
  connectGSM("AT+GPS=1","OK");
}
void initGSM(){
  connectGSM("AT","OK");
  connectGSM("ATE1","OK");
  connectGSM("AT+CPIN?","READY");
}
void initGPRS(){
  connectGSM("AT+CREG=0","OK");
  connectGSM("AT+CREG?","0,1");
  connectGSM("AT+CIPSTATUS?","IP INITIAL");
  connectGSM("AT+CGDCONT=1,\"IP\",\"apn\"","OK");
  connectGSM("AT+CGATT=1","OK");
  connectGSM("AT+CGACT=1,1","OK");
  delay(1000);
}
void sendHTTPGET (){
  double gpsLng = tinyGPS.location.lng();
  long lngGps = gpsLng*1000000;
  double gpsLat = tinyGPS.location.lat();
  long latGps = gpsLat*1000000;
  float spd = tinyGPS.speed.kmph();
  int sat = tinyGPS.satellites.value();
  Serial.println(lngGps);
  Serial1.print("AT+HTTPGET=\"http://www.somesite.com/g.php?i=");
  Serial1.print(bID);
  Serial1.print("&lng=");
  Serial1.print(lngGps);
  Serial1.print("&lat=");
  Serial1.print(latGps);
  Serial1.print("&spd=");
  Serial1.print(spd);
  Serial1.print("&sat=");
  Serial1.print(sat);
  Serial1.print("\"");
  Serial1.println();
}
void connectGPS (){
  if ((lastLog + LOG_RATE) <= millis()){
  if (tinyGPS.location.isUpdated()){
   sendHTTPGET();
  }
  }
 }
static void smartDelay(unsigned long ms){
  unsigned long start = millis();
  do{
    // If data has come in from the GPS module
    while (gpsPort.available())
      tinyGPS.encode(gpsPort.read());
  } while (millis() - start < ms);
}

void connectGSM (String cmd, char *res){
  while(1){
    Serial.println(cmd);
    Serial1.println(cmd);
    delay(500);
    while(Serial1.available()>0){
      if(Serial1.find(res)){
        Serial.println(res);
        delay(1000);
        return;
      }
    }
    delay(1000);
   }
 }