VAŽNO! Ovdje pročitajte kako se registrirati na forum. Bez registracije, nećete biti u mogućnosti pisati na forumu.

A9G i Mega2560

Zapeli ste s projektom? Ovdje je pravo mjesto za postaviti pitanje. Imajte na umu da ekipa e-radionice neće uvijek i/ili redovno odgovarati na pitanja postavljena u ovom podforumu.
Odgovorite
Avatar
dekip#8739
Ozbiljni hardveraš
Ozbiljni hardveraš
Postovi: 88
Pridružen/a: pon srp 30, 2018 10:04 pm
Lokacija: Beograd
Kontakt:

A9G i Mega2560

Post Postao/la dekip#8739 » ned pro 27, 2020 12:19 pm

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.
Avatar
dekip#8739
Ozbiljni hardveraš
Ozbiljni hardveraš
Postovi: 88
Pridružen/a: pon srp 30, 2018 10:04 pm
Lokacija: Beograd
Kontakt:

Re: A9G i Mega2560

Post Postao/la dekip#8739 » ned pro 27, 2020 5:47 pm

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
Avatar
david.zovko#1777
e-radionica.com team
e-radionica.com team
Postovi: 436
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Osijek, Croatia
Kontakt:

Re: A9G i Mega2560

Post Postao/la david.zovko#1777 » pon pro 28, 2020 10:13 pm

Hvala što si postavio i odgovor! :text-thankyouyellow:
Avatar
dekip#8739
Ozbiljni hardveraš
Ozbiljni hardveraš
Postovi: 88
Pridružen/a: pon srp 30, 2018 10:04 pm
Lokacija: Beograd
Kontakt:

Re: A9G i Mega2560

Post Postao/la dekip#8739 » sri pro 30, 2020 6:28 pm

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.
Avatar
david.zovko#1777
e-radionica.com team
e-radionica.com team
Postovi: 436
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Osijek, Croatia
Kontakt:

Re: A9G i Mega2560

Post Postao/la david.zovko#1777 » čet pro 31, 2020 1:40 pm

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 :)
domagoj#3133
Supporter
Supporter
Postovi: 318
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Zagreb

Re: A9G i Mega2560

Post Postao/la domagoj#3133 » čet pro 31, 2020 2:31 pm

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
Avatar
dekip#8739
Ozbiljni hardveraš
Ozbiljni hardveraš
Postovi: 88
Pridružen/a: pon srp 30, 2018 10:04 pm
Lokacija: Beograd
Kontakt:

Re: A9G i Mega2560

Post Postao/la dekip#8739 » pet sij 01, 2021 12:04 pm

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.
Avatar
dekip#8739
Ozbiljni hardveraš
Ozbiljni hardveraš
Postovi: 88
Pridružen/a: pon srp 30, 2018 10:04 pm
Lokacija: Beograd
Kontakt:

Re: A9G i Mega2560

Post Postao/la dekip#8739 » pet sij 01, 2021 12:13 pm

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
domagoj#3133
Supporter
Supporter
Postovi: 318
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Zagreb

Re: A9G i Mega2560

Post Postao/la domagoj#3133 » pet sij 01, 2021 12:52 pm

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
Avatar
dekip#8739
Ozbiljni hardveraš
Ozbiljni hardveraš
Postovi: 88
Pridružen/a: pon srp 30, 2018 10:04 pm
Lokacija: Beograd
Kontakt:

Re: A9G i Mega2560

Post Postao/la dekip#8739 » pet sij 01, 2021 7:06 pm

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.
Avatar
dekip#8739
Ozbiljni hardveraš
Ozbiljni hardveraš
Postovi: 88
Pridružen/a: pon srp 30, 2018 10:04 pm
Lokacija: Beograd
Kontakt:

Re: A9G i Mega2560

Post Postao/la dekip#8739 » ned sij 03, 2021 6:46 pm

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);
   }
 }
Odgovorite