středa 23. března 2016

GPRS s Arduino a problémy s O2 CZ

Tak jsem dospěl k bastlení GSM modulu k Arduinu (konkrétně SIM800L). Vše probíhalo krásně až na problémy se SIM kartou O2 CZ s tarifem Machine.

Píšu tuhle notičku jen pro ty, co se dostanou do stejného začarovaného kruhu, kdy všechno funguje, jen veškeré GPRS requesty skončí timoutem (Týká se to i zjišťování GSM lokace).

AT+HTTPACTION=0

vrátí sice OK, ale výsledkem je buď +HTTPACTION 601 Network error a nebo timeout.

Pro GSM lokalizaci:

AT+CIPGSMLOC=1,1

Pak error 603 nebo 601 dle nálady.

Řešení:


  1. O2 CZ nemá jen jeden APN, má jich několik a pro machine tarify je údajně určen APN Telemetry1 (nicméně, ten také nefunguje, viz řešení 2)
  2. Pokud ani Telemetry1 nefunguje, pak se musíte obrátit na podporu O2 a ti milostivě zařídí, že vaše sim může komunikovat s APN "internet", kde už vše běhá jak má.

Ostatní APN:  Internet, Oneport, Cma, Telemetry, Telemetry 1

Ukázkové komunikace:

Špatné APN:
  • ---> AT+CIPSHUT
  • <--- SHUT OK
  • ---> AT+CGATT=1
  • <--- OK
  • ---> AT+SAPBR=3,1,"CONTYPE","GPRS"
  • <--- OK
  • ---> AT+SAPBR=3,1,"APN","Cokoliv"
  • <--- OK
  • ---> AT+CSTT="Cokoliv"
  • <--- OK
  • ---> AT+SAPBR=1,1
  • <--- OK
  • ---> AT+CIICR
  • <--- OK
  • ---> AT+CIPGSMLOC=1,1
  • <--- +CIPGSMLOC: 601
Dobré, ale nefunkční APN:
  • ...-začátek je stejný ....
  • ---> AT+SAPBR=3,1,"APN","Telemetry1"
  • <--- OK
  • ---> AT+CSTT="Telemetry1"
  • <--- OK
  • ---> AT+SAPBR=1,1
  • <--- OK
  • ---> AT+CIICR
  • <--- OK
  • ---> AT+CIPGSMLOC=1,1
  • <--- Time out
Funkční APN:
  • ...-začátek je stejný ....
  • ---> AT+SAPBR=3,1,"APN","internet"
  • <--- OK
  • ---> AT+CSTT="internet"
  • <--- OK
  • ---> AT+SAPBR=1,1
  • <--- OK
  • ---> AT+CIICR
  • <--- OK
  • ---> AT+CIPGSMLOC=1,1
  • <--- +CIPGSMLOC: 0,14.4XXXX,50.0XXXXX,2016/03/23,13:14:48

úterý 26. ledna 2016

Why is serial output of my Arduino garbled?

Ugly Arduino output

I spent few hours to solve garbled serial output produced by my Arduino (Uno, Nano, doesn't matter). All of a sudden the serial output looked ugly:


I tried to revert last lines I added to the code. Sometimes it helped, sometimes little bit and there was no one single row which was causing it... However, the solution was very easy. As I was adding code to just testing sketch I didn't care about best programming practices and I wasted whole my RAM memory .... 
Problem is, that pretty all serial communications libraries are using dynamic buffers, which could be pretty demanding. In my case, when I compiled and started the code, just 57 bytes left in the memory. When the communication channel was busy the Arduino simply ran out of memory.

So what I learned? 

Every time you can use F() to store string in program memory, even for just test projects. Other memory saving techniques can be found on google.. :)

use following function to check amount of available memory:

int freeRam() {
  extern int __heap_start,*__brkval;
  int v;
  return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int) __brkval);
}