• Zkušenosti s GSM modemem SIM900. Ovládání GSM modulu s AVR

    Takže, po dlouhé době osvětlení složitosti práce s GSM modul SIM900D oznamuje první pracovní projekt, který kombinuje bezpečnostní systém se schopností dálkové ovládání. Stručně řečeno, zařízení je schopno odeslat informativní SMS v případě narušení čidla, zavolat pro umožnění zvukového ovládání místnosti, hlídat teplotu a odeslat ji SMS na vyžádání a také ovládat část zátěže příkazem zaslaným prostřednictvím SMS .

    Ti, co sledovali toto téma, vědí, že mám GSM modul a k němu řídící modul - dva různé desky, propojené sendvičem (viz deska se SIM900D a řídicí deskou). Na řídící desce je kromě mikrokontroléru ATmega32a výkonový modul vyrobený na převodníku LM2596, napájí obvod konstantní napětí 3,5 voltu. V zásadě postačí jakýkoli jiný zdroj, hlavní je, že dokáže krátkodobě odebírat až 2 ampéry (to je přesně spotřeba GSM modulu v době registrace).

    Pro pohodlí je k ovládací desce připojen displej z telefonu Nokia3310, jehož způsoby práce již byly na této stránce popsány více než jednou. Díky displeji rychle zjistíte stav zařízení a hodnotu senzorů.

    Výsledkem bylo, že výsledné schéma připojení vypadalo takto (lze kliknout):

    Číslování pinů mikrokontroléru ve schématu je uvedeno pro pouzdro DIP, takže pokud opakujete zapojení pomocí mikrokontrolérů v pouzdru TQFP, pozor, číslování pinů je jiné. Mikrokontrolér je taktován z externího quartz na 16 MHz.

    Čára řízení přechod z kolektoru tranzistoru Q2 na pin PortD.4 mikrokontroléru je přidán pro zajištění a je potřebný pro sledování, zda je modul zapnutý. Vzhledem k tomu, že prahová hodnota pro vypnutí pro SIM900 je 3,2 voltu, i při mírném poklesu napětí se modul automaticky vypne, zatímco mikrokontrolér bude pokračovat v práci a spustí program (prahová hodnota resetu pro ATmega32a je 2,7 voltu). V provozuschopném stavu na této lince je nízká úroveň. Pokud mikrokontrolér zjistí, že tato čára je vysoká, funkce se provede. restartovat GSM modul.

    A takhle to momentálně vypadá v práci.

    To vše se po konečném předjetí programu strčí do pouzdra a odpojitelné spoje se pro spolehlivost připájejí.

    Na displeji se zobrazují základní informace o stavu zařízení: jméno operátora, kvalita komunikačního signálu, hodnota teploty ze snímače 18b20, stav výstupu zátěže a snímače vniknutí, dále čas a datum.

    Video ze zapnutí modulu

    Čas a datum jsou převzaty z hodin zabudovaných v GSM modulu. Pro jejich provoz je nutná 3V baterie připojená na pin 15 (VRTC). Diodu D1 se doporučuje nastavit na nízký úbytek napětí, např. Schottkyho. Nastavení hodin a data se provádí ručně, příkazy byly popsány dříve

    Datum je zobrazeno ve stejném formátu jako z modulu, tj. nejprve rok, poté měsíc a datum. Zatím se zde nic nezměnilo.

    O měření teploty se stará senzor DS18B20, který je připojen na pin PortD.3 mikrokontroléru.

    K PortD.6 můžete připojit jakoukoli zátěž a ovládat ji pomocí SMS příkazů. Nyní mám zavěšenou LED - D4 ve schématu. Nic vám ale nebrání pověsit sem relé nebo triak a zvládnout něco vážnějšího.

    Pro bezpečnostní účely je plánováno použití pohybového senzoru HC-SR501, zakoupeného na E-bay. V případě spuštění se na výstupu snímače objeví logická jednotka. Po zachycení vydá mikrokontrolér příkaz k odeslání SMS zprávy Podle telefonní číslo specifikované v programu.

    Výstup snímače je připojen k výstupu PortD.7 mikrokontroléru, ve schématu je snímač podmíněně nahrazen tlačítkem.

    Místo senzoru pohybu můžete umístit jakýkoli jiný prostředek detekce vniknutí - senzory otevření oken a dveří, senzory rozbití skla, fotoelektrické senzory atd., obecně vše, co je fantazie schopna.

    Aby nedocházelo k vícenásobnému odesílání varovných SMS v případě sepnutí senzoru, bylo do programu zavedeno omezení: po první odeslané SMS je vypsán zákaz následného odesílání. Pro opětovné zapnutí zasílání notifikačních zpráv při aktivaci senzoru je nutné odeslat SMS s konkrétním příkazem do modulu. Pokud je zakázáno odesílání SMS, zobrazí se vedle stavu senzoru vykřičník.

    Seznam příkazů

    A zde je seznam příkazů v SMS, které modul zpracovává. Pro pohodlí a jednoduchost jsou příkazy digitální, případně in další verze firmware bude mít smysluplnější názvy příkazů :)

    0 – Odpojení zátěže (na výstupu PortD.6 je nastavena logická 0)

    1 – Zapněte zátěž (logická 1 je nastavena na výstupu PortD.6)

    2 – Po přijetí tohoto příkazu modul zavolá zpět na telefonní číslo uvedené v programu

    3 – Vyžádejte si zůstatek a zašlete jej zpět SMS na zadané číslo. Tady je jeden důležitá nuance- odpovědi na požadavky USSD musí být v latině. Jinak místo smysluplného textu odpověď obdrží zprávu v hexadecimálním kódování. Jak přeložit USSD do latinky, musíte si ověřit u svého operátora. Například na SIM kartě, kterou používám od Smarts, musíte zadat *102*1# (v megafonu *105*0#)

    4 – Požadavek na teplotu. Hodnota teploty nám bude zaslána SMS zprávou.

    5 – Povolit odesílání zpráv při aktivaci senzoru narušení.

    6 – Zákaz posílat notifikační SMS z čidla narušení.

    ? - Tímto příkazem nám modul zašle SMS obsahující obecná informace o zařízení, jako je hodnota z teplotního čidla, zda je zátěž zapnutá, stav na vstupu z čidla narušení a zda je z něj povoleno zasílat notifikační SMS. Například takto může vypadat taková zpráva: teplota +24, zátěž vypnutá, výstup pohybového senzoru 0, zasílání SMS v případě provozu je zakázáno.

    Nyní, jak nakonfigurovat modul pro odesílání SMS na vaše číslo. V archivu s programem najdeme hlavní soubor programu, nazývá se „program“ 🙂 a najdeme v něm konstantu:

    Const Telefonní číslo = "+7908390хххх"

    zde nahradíme své telefonní číslo, zkompilujeme program a získáme hex soubor firmwaru.

    Program je jako vždy napsán v Bascom-AVR, takže je docela snadné pochopit algoritmus pro práci s GSM modulem. Hodně štěstí!

    A na závěr ukázka, jak modul zpracovává příkazy.

    Zvláštní poděkování za účast a pomoc při vývoji, dlouholetému příteli webu Sergeji RD3AVJ!

    UPD: od 31.10.12

    Trochu jsem upravil firmware, nyní pro nastavení čísla, na které se budou zasílat notifikační SMS, není třeba program překompilovat. Na modul stačí poslat SMS se zprávou “První číslo”(bez uvozovek) a do energeticky nezávislé paměti mikrokontroléru se zapíše číslo, ze kterého byl tento příkaz odeslán.

    Lze použít v zařízeních, kde je vyžadována komunikace dlouhé vzdálenosti. Například robota v Moskvě ovládá člověk sedící v Krasnodaru! Nebo farmář zapne vodní čerpadlo na rýžovém poli ze svého domova, které se nachází několik kilometrů od pole! Existuje několik možností pro komunikaci se zařízením:

    Jednoduchá komunikace na základě SMS zpráv:
    Zapnutí/vypnutí zařízení pomocí jednoduchých SMS příkazů. K ovládání zařízení lze použít jakýkoli mobilní telefon.
    Bezpečnostní / požární alarm, který informuje majitele o nouzový doma přes SMS.

    Komunikace na základě hovoru:
    Chytrý alarm proti vloupání/požáru, který přivolá policii nebo hasiče a ohlásí nouzovou situaci pomocí předem nahraných hlasových zpráv.

    Komunikace přes internet (GPRS):
    Uživatel může zařízení ovládat z libovolného PC/tabletu/mobilu připojeného k internetu. Například informační displeje instalované na kolejích jsou ovládány z centrálního dispečinku.
    Internetem ovládaný robot. Takový robot je přístupný z jakéhokoli zařízení připojeného k internetu odkudkoli na světě.
    Přenosná zařízení instalovaná ve vozidlech, která se připojují k internetu pomocí modulu SIM300 GPRS a přidávají aktuální polohu (pomocí GPS (Global Position System, Globální systém Umístění)) na server. Tato data jsou uložena v databázi na serveru spolu s ID vozidla. Chcete-li zobrazit trasu vozu, můžete se připojit k serveru z počítače pomocí po celém světě Web (World Wide Web).

    Výhody použití modulu SIM300

    SIM300 Kit je kompletní nezávislý modul se slotem pro SIM kartu, napájecím zdrojem atd. Tento modul lze snadno připojit k levným mikrokontrolérům AVR/PIC/8051. Komunikace s mikrokontrolérem probíhá přes asynchronní sériový port. Toto je základní typ sériové komunikace podporovaný většinou mikrokontrolérů v hardwaru. Data jsou přenášena bit po bitu a sestavována do bajtů. Na vysoká úroveň vypadá to jako jednoduchý textový proud. Existují celkem dva toky: jeden z mikrokontroléru do SIM300 a druhý ze SIM300 do mikrokontroléru. Příkazy jsou odesílány jako prostý text.

    Pokud jste sériovou komunikaci nikdy nepoužili ani o ní neslyšeli, je dobré pochopit, jak funguje a procvičit si to na jednodušších příkladech.

    Komunikace s modulem SIM300 pomocí AVR UART

    Hardware mikrokontroléru používaný pro sériovou komunikaci se nazývá UART a používáme jej pro komunikaci s modulem SIM300 (lze jej použít i pro komunikaci s jinými zařízeními, jako jsou čtečky RFID, GPS moduly, čtečky otisků prstů atd.). UART je ve světě elektroniky velmi rozšířená komunikační metoda, napsali jsme pro ni čistou a jednoduchou knihovnu, kterou používáme ve všech našich projektech využívajících UART.

    Vzhledem k tomu, že bajt ze SIM300 může do mikrokontroléru dorazit kdykoli, co se stane, když je mikrokontrolér zaneprázdněn něčím jiným? Abychom tento problém vyřešili, provedli jsme ukládání příchozích dat do vyrovnávací paměti na základě přerušení. Vyrovnávací paměť je uvnitř paměť s náhodným přístupem mikrokontrolér. Má funkci, která umožňuje určit počet bajtů ve frontě.

    Níže jsou uvedeny funkce knihovny AVR USART:

    void USARTInit(uint16_t ubrrvalue)

    Inicializace hardwaru AVR USART. Hodnota parametru ubrrvalue je nastavena požadovaná rychlost přenosu dat. Výchozí přenosová rychlost pro SIM300 je 9600 bps. Pro mikrokontrolér AVR pracující na frekvenci 16 MHz ubrrvalue pro tuto rychlost by měla být 103 .

    char UReadData()

    Čtení jednoho znaku z fronty. Pokud ve frontě nic není, pak je odpověď 0.

    void UWriteData (data znaků)

    Zapíše jeden bajt dat na Tx řádek pomocí funkce UWriteString().

    uint8_t UDataAvailable()

    Hlásí množství dat ve frontě FIFO.

    void UWriteString(char*str)

    Zapíše řetězec ve stylu C ukončený nulou do řádku Tx.
    Příklad 1: UWriteString("Ahoj světe!");
    Příklad 2: charname="Avinash!"; UWriteString(jméno);

    void UReadBuffer(void *buff,uint16_t len)

    Zkopíruje obsah vyrovnávací paměti FIFO do paměti určené buff, množství zkopírovaných dat je určeno parametrem len. Pokud do vyrovnávací paměti FIFO přes UART přišlo méně dat, než je nutné (podle parametru len), pak se zbývající prostor zaplní nulami.

    char gsm_buffer;
    UReadBuffer(gsm_buffer,16);

    Výše uvedený příklad přečte 16 bajtů dat (pokud existují) z vyrovnávací paměti FIFO do proměnné gsm_buffer. Všimněte si, že gsm_buffer bylo přiděleno pole 128 bajtů, protože později můžeme potřebovat více než 16 bajtů. Tuto vyrovnávací paměť lze tedy použít ke čtení až o 128 bajtů později.

    Výše uvedená funkce se obvykle používá ve spojení s UDataAvailable().

    while(UDataAvailable()<16)
    {
    //Nedělat nic
    }

    char gsm_buffer;
    UReadBuffer(gsm_buffer,16);

    Fragment kódu zobrazený výše čeká, až se ve vyrovnávací paměti nashromáždí 16 bajtů dat, a poté je načte.

    void UFlushBuffer()

    Zruší čekání na data FIFO vyrovnávací pamětí. Před odesláním nového příkazu do GSM modulu nejprve zrušte čekání na FIFO data bufferem.

    Výše uvedené funkce slouží k odesílání a přijímání textových příkazů z GSM modulu SIM300.

    Sada příkazů AT pro SIM300

    Nyní, když jste obeznámeni se základy knihovny AVR USART a jejím použitím k inicializaci USART, odesílání a přijímání dat, je čas naučit se příkazy modulu SIM300 a jak je odesílat a přijímat odpovědi. SIM300 má několik funkcí: odeslání textové zprávy, uskutečnění hovoru atd. Každá z těchto funkcí se provádí po určitém příkazu a SIM300 má vlastní sadu příkazů.

    Všechny příkazy SIM300 začínají prefixem AT+ a konec Návrat vozíku(zkratka pro návrat vozíku). ASCII kód ​​pro CR je 0x0D (desetinně 13). Všechny příkazy, které odešlete na SIM300, budou vráceny na TX linku SIM300. To znamená, že pokud pošlete příkaz o velikosti 7 bajtů (včetně konečného CR), pak těchto 7 bajtů okamžitě obdržíte do bufferu přes UART. Pokud jste jej neobdrželi, znamená to, že něco není v pořádku!

    První funkce, kterou budeme studovat, bude SIM300Cmd (konst. znak *cmd), dělá to následující:

    • Zapisuje příkazy dané parametrem cmd.
    • Přidá ČR po příkazu.
    • Čeká, až se příkaz vrátí, a pokud dorazí před vypršením časového limitu, odpoví SIM300_OK(konstanta definovaná v sim300.h). Pokud na návrat čekali příliš dlouho, ale žádný nebyl, odpoví SIM300_TIMEOUT.

    Poznámka: Všechny funkce závislé na SIM300 jsou uloženy v souboru sim300.c. Vzorky a konstanty jsou uloženy v sim300.h

    Práce se SIM300Cmd()

    Int8_t SIM300Cmd(const char *cmd) ( UWriteString(cmd); //Odeslat příkaz UWriteData(0x0D); //CR uint8_t len=strlen(cmd); len++; //Přidat 1 pro koncové CR přidané ke všem příkazům uint16_t i= 0; //Počkejte na echo while(i< 10*len) { if(UDataAvailable() < len) { i++; _delay_ms(10); continue; } else { //We got an echo //Now check it UReadBuffer(sim300_buffer,len); //Read serial Data return SIM300_OK; } } return SIM300_TIMEOUT; }

    Po příkazu obvykle následuje odpověď. Formulář odpovědi je:
    LF- Line Feed, jeho ASCII kód ​​je 0x0A (10 v desítkové soustavě)

    Při čekání na odpověď po odeslání příkazu se tedy mohou stát tři věci:

    • Dlouho žádná odezva. Pravděpodobným důvodem může být, že SIM300 není připojena k mikrokontroléru.
    • Odezva přijata, ale ne taková, jakou se očekávalo. Příčinou může být porucha sériové linky, nesprávně nastavená přenosová rychlost nebo mikrokontrolér pracující na nesprávné frekvenci.
    • Byla obdržena správná odpověď.

    Například příkaz Získejte síťovou registraci(Síťová registrace) se provádí následovně: Příkazový řetězec (Příkaz): " AT+CREG?"

    Odezva(Odpovědět): +CREG: , OK

    Vidíte, že správná odpověď je 20 bajtů. Tedy po odeslání příkazu "AT + CREG?" je nutné počkat na přijetí 20 bajtů nebo do uplynutí určité doby. Druhá podmínka je splněna, aby se zabránilo zamrznutí, pokud je SIM300 vadná. To znamená, že místo věčného čekání na odpověď bude vyvolána chyba, pokud SIM300 reaguje příliš dlouho (toto se nazývá časový limit)

    Pokud obdržíme správnou odpověď, analyzujeme proměnnou, abychom získali informace o registraci v síti.

    V závislosti na aktuálním stavu registrace v síti může být hodnota: 0 - Neregistrováno, SIM300 nyní nehledá nového operátora k registraci. 1 - Registrováno v domácí síti. 2 - Neregistrován, nyní SIM300 hledá nového operátora k registraci. 3 - Registrace zamítnuta. 4 - Neznámý. 5 - Registrovaný, roaming.

    Práce se SIM300GetNetStat()

    Int8_t SIM300GetNetStat() ( //Odeslat příkaz SIM300Cmd("AT+CREG?"); //Nyní počkejte na odpověď uint16_t i=0; //správná odpověď je dlouhá 20 bajtů //Takže počkejte, až budeme mít 20 bajtů // ve vyrovnávací paměti. zatímco (i<10) { if(UDataAvailable()<20) { i++; _delay_ms(10); continue; } else { //We got a response that is 20 bytes long //Now check it UReadBuffer(sim300_buffer,20); //Read serial Data if(sim300_buffer=="1") return SIM300_NW_REGISTERED_HOME; else if(sim300_buffer=="2") return SIM300_NW_SEARCHING; else if(sim300_buffer=="5") return SIM300_NW_REGISTED_ROAMING; else return SIM300_NW_ERROR; } } //We waited so long but got no response //So tell caller that we timed out return SIM300_TIMEOUT; }

    Funkce je implementována stejným způsobem: int8_t SIM300IsSIMInserted()

    U jiného typu odezvy neznáme předem přesnou velikost odezvy, jako u výše uvedeného příkazu. Jedná se například o příkaz Get Service Provider Name (Získání jména operátora (poskytovatele)), kde délka jména operátora není předem známa. Může to být MTS, Beeline atd. K vyřešení tohoto problému využíváme toho, že před a za odpovědí je ČR LF. Jednoduše tedy zapíšeme do vyrovnávací paměti všechny znaky, dokud se nepotkáme ČR, což znamená konec odpovědi.

    Pro zjednodušení zpracování takových příkazů jsme vytvořili funkci
    SIM300WaitForResponse (časový limit uint16_t)

    Tato funkce čeká na odpověď od SIM300 (konec odpovědi je indikován CR) a hlásí velikost odpovědi, zatímco samotná odpověď je zkopírována do globální proměnné sim300_buffer.

    Pokud před vypršením časového limitu není přijata žádná odpověď, je odpověď 0. Časový limit v milisekundách lze nastavit parametrem Časový limit. Nepočítá pozdní LF ani poslední OK, zůstávají ve vyrovnávací paměti UART FIFO. Před návratem tedy použijeme příkaz UFlushBuffer() abyste je odstranili ze schránky.

    Práce se SIM300WaitForResponse (časový limit uint16_t)

    Int8_t SIM300WaitForResponse(uint16_t časový limit) ( uint8_t i=0; uint16_t n=0; while(1) ( while (UDataAvailable()==0 && n

    Práce se SIM300GetProviderName (char *name) Funkce dělá následující:

    1. Vymaže vyrovnávací paměť USART, aby se odstranily všechny chyby nebo reakce.
    2. Odešle příkaz "AT + CSPN?" pomocí funkce SIM300Cmd ("AT + CSPN?");
    3. Poté čeká na odpověď pomocí funkce SIM300WaitForResponse().
    4. Pokud dostaneme nenulovou odpověď, analyzuje ji, aby získal jméno operátora.

    Následující funkce jsou implementovány tímto způsobem:

    • uint8_t SIM300GetProviderName(char *name)
    • int8_t SIM300GetIMEI(char *emei)
    • int8_t SIM300GetManufacturer(char *man_id)
    • int8_t SIM300GetModel (znak *model)
    uint8_t SIM300GetProviderName(char *name) ( UFlushBuffer(); //Odeslat příkaz SIM300Cmd("AT+CSPN?"); uint8_t len=SIM300WaitForResponse(1000); if(len==0) return SIM300_TIMEOUT; end char *start,*end char ; start=strchr(sim300_buffer,"""); start++; end=strchr(start,"""); *end="\0"; strcpy(name,start); return strlen(name); )

    SIM300 a ATmega32. Hardware

    K demonstraci komunikace se SIM300 pomocí AVR ATmega32 potřebujeme následující komponenty:
    - ATmega32 s vázáním - reset registr, ISP piny, 16 MHz quartz.
    - +5V zdroj pro napájení ATmega32 a LCD displeje.
    - znakový LCD displej 16x2 pro indikaci výsledků.
    - Modul SIM300.

    Použili jsme ladicí desku Xboard, protože má kabel ATmega32, napájení + 5 V a LCD displej.

    Demo zdrojový kód pro AVR a SIM300

    Zdrojový kód ukázky je napsán v jazyce C a zkompilován pomocí bezplatného kompilátoru AVR-GCC s použitím nejnovější verze . Projekt je rozdělen do následujících modulů:

    • LCD knihovna
      - Soubory lcd.c, lcd.h, myutils.h, custom_char.h
      - Jeho úkolem je ovládat standardní LCD 16x2.
      - Více informací naleznete v odkazu.
    • Knihovna USART
      - Soubory usart.c, usart.h
      - Jejím úkolem je ovládat hardware USART mikrokontroléru AVR. Zahrnuje inicializaci USART, funkce odesílání a přijímání znaků, odesílání a přijímání řetězců.
    • Knihovna SIM300
      - Soubory sim300.c, sim300.h

    Nastavení projektu AS6 krok za krokem

    Vytvořte nový projekt AS6 s názvem „Sim300Demo“.
    Pomocí průzkumníka řešení (stromu projektu) vytvořte v aktuální složce složku s názvem „lib“.
    Ve složce „lib“ vytvořte složky „LCD“, „USART“ a „SIM300“.
    Zkopírujte soubory (pomocí Průzkumníka Windows) lcd.c, lcd.h, myutils.h, custom_char.h do složky lcd.
    Zkopírujte soubory (pomocí Průzkumníka Windows) usart.c, usart.h do složky USART
    Zkopírujte soubory (pomocí Průzkumníka Windows) sim300.c, sim300.h do složky SIM300.
    Přidejte soubory lcd.c, lcd.h, myutils.h, custom_char.h do projektu pomocí průzkumníka řešení (stromu projektu).
    Přidejte do projektu soubory filesusart.c, usart.h pomocí průzkumníka řešení (strom projektu).
    Přidejte soubory sim300.c, sim300.h do projektu pomocí průzkumníka řešení (strom projektu).
    Určete hodnotu F_CPU = 16000000 pomocí AS6.
    Zkopírujte a vložte hlavní soubor Sim300Demo.c do programu.
    Zkompilujte projekt, abyste získali hex soubor.
    Flashujte svůj Xboard pomocí USB programátoru.
    Pokud používáte nový mikrokontrolér ATmega32, nastavte LOW FUSE na 0xFF a VYSOKÁ POJISTKA zapnuta 0xC9.

    Co umí demo program?

    Inicializuje LCD a modul SIM300.
    Ověřuje, že je modul SIM300 připojen k USART a správně reaguje.
    Zobrazuje IMEI modulu SIM300.
    Zobrazí ID výrobce
    Kontroluje přítomnost SIM karty.
    Vyhledá síť GSM a naváže spojení. K tomu musíte mít aktivní SIM kartu.
    Zobrazuje název operátora, například MTS nebo Megafon.

    Možné problémy

    Žádný obraz na LCD

    Ujistěte se, že váš projekt AVR Studio je nastaven na 16MHz hodiny (16000000Hz)
    Nastavte kontrast potenciometrem.
    Několikrát stiskněte tlačítko reset.
    Zařízení několikrát zapněte/vypněte.
    Připojte LCD pouze tak, jak je znázorněno na obrázku.

    Během inicializace SIM300 se objeví chyba „No Response“.

    Zkontrolujte integritu linek Rx, Tx a GND mezi SIM300 a Xboard.
    Ujistěte se, že mikrokontrolér běží na 16 MHz.
    Nainstalujte pojistky přesně tak, jak je popsáno výše.

    Chyby kompilátoru

    Mnoho lidí používá již napsané a zkompilované programy. Nemají žádné zkušenosti a nejsou obeznámeni se základy programování a kompilace. Skvělým začátkem bude seznámení se s kompilátory a jejich fungováním na různých platformách (PC / MAC / Linux). Vestavěné systémy nejsou vhodné pro učení základů. Jsou určeny pro ty, kteří tyto dovednosti mají a jednoduše je používají.
    Ujistěte se, že jsou do projektu přidány všechny soubory knihovny LCD.
    Ujistěte se, že je nainstalován AVR-GCC. (distribuce pro Windows se nazývá WinAVR)
    Ujistěte se, že je AVR GCC specifikováno v projektu AVR Studio.

    Obecné rady pro začátečníky

    Používejte hotové ladicí desky a programátory.
    Snažte se studovat na základě článků a učebnic.

    Seznam rádiových prvků

    Označení Typ Označení Množství PoznámkaProdejnaMůj poznámkový blok
    U1 MK AVR 8bit

    ATmega32

    1 Do poznámkového bloku
    U2 Lineární regulátor

    LM7805

    1 Do poznámkového bloku
    D1 usměrňovací dioda

    1N4007

    1 Do poznámkového bloku
    D2 Světelná dioda 1 Do poznámkového bloku
    C1, C2 Kondenzátor22 pF2 Do poznámkového bloku
    C3, C4, C6 Kondenzátor0,1uF3

    Níže popsané zkušenosti s používáním SIM900 se budou hodit spíše těm, kteří již s modulem zvládli trochu pracovat. Pro ty čtenáře, kteří právě začínají studovat tento mikroobvod a plánují jej používat k výměně dat přes internet, jsme připravili sérii lekcí na toto téma. Tady .

    SIM900 je tedy GSM modul od SIM COM, ovládaný AT příkazy, schopný posílat SMS, volat, organizovat přímé CSD spojení a vyměňovat si informace přes GPRS.

    V mých rukou byla SIM900 GPRS shield debug board objednaná z Číny - kompatibilní s platformou Arduino.

    Deska obsahuje samotný čip SIM900, konektory pro mikrofon a sluchátka, vypínač napájení (z externího konektoru nebo z Arduina), anténu, několik LED diod pro indikaci provozních režimů, konektor baterie (pokud potřebujete hodiny reálného času), tlačítko pro zapnutí / vypnutí. Na wiki výrobce jsem našel dobrý popis . Nechybí ani kód pro ovládání modemu v různých režimech.

    Podle výrobce je deska dokonale kompatibilní s Arduino Uno. Deska SIM900 se skutečně jednoduše zapojí do Uno a okamžitě začne fungovat. Jak se však ukázalo, Arduino Uno se může ukázat jako „slabé“ pro implementaci některých funkcí, ale o tom budu mluvit o něco později.

    Deska funguje s Arduino Mega s určitými omezeními. To je způsobeno skutečností, že Mega, na rozdíl od Uno, nejsou piny 7 a 8 k dispozici pro použití jako softwarové sériové (software USART). To je řešeno přepnutím rozhraní USART na nohy 0 a 1, k tomu jsou na desce SIM900 umístěny propojky.

    Obecně lze desku připojit k libovolnému ovladači s rozhraním USART. Zkusil jsem například ovládat modem pomocí ovladače STM32F4.

    SIM900: SMS zprávy a hovory

    Testy modulu pro výměnu SMS zpráv a hovorů prošly "na jedničku"! Modul se s těmito úkoly bez problémů vyrovnal, proto jsem jednoduše zkopíroval c stejné stránky, zkompiloval a flashoval tento kód do Arduino Uno:

    //Sériové relé - Arduino opraví //sériové spojení mezi počítačem a GPRS Shield //při 19200 bps 8-N-1 //Počítač je připojen k hardwarovému UART //GPRS Shield je připojen k softwarovému UART #include SoftwareSerial GPRS(7, 8); unsigned char buffer; // pole vyrovnávací paměti pro příjem dat přes sériový port int count=0; // čítač pro pole vyrovnávací paměti void setup() ( GPRS.begin(19200); // přenosová rychlost GPRS Serial.begin(19200); // sériový port přenosové rychlosti Arduina. ) void loop() ( if (GPRS .available()) // pokud datum přichází ze softwarového sériového portu ==> data přicházejí ze štítu gprs ( while(GPRS.available()) // čtení dat do pole znaků ( buffer=GPRS.read(); // zápis dat do pole if(count == 64)break; ) Serial.write(buffer,count); // pokud žádný přenos dat neskončí, zapíše vyrovnávací paměť na hardwarový sériový port clearBufferArray(); // zavolá funkci clearBufferArray pro vymazání uloženého úložiště data z pole count = 0; // nastaví čítač while smyčky na nulu ) if (Serial.available()) // pokud jsou data dostupná na hardwarusériový port ==> data přicházejí z PC nebo notebooku GPRS.write(Serial .read()); // zapiš to do štítu GPRS ) void clearBufferArray() // funkce pro vymazání pole vyrovnávací paměti ( for (int i=0; i

    Aby bylo možné odesílat příkazy do modulu, musí být připojen k počítači. To lze provést pomocí portu USB Arduino. V počítači to vyžaduje jakýkoli monitor portu COM. Dá se stáhnout odtud, nebo můžete použít monitor zabudovaný do Arduino IDE.

    Vše, co program firmwaru Arduino dělá, je „chytit“ příkazy uživatele a odeslat je do modulu a poté vrátit odpovědi SIM900 uživateli. Zasíláním AT příkazů do modulu v manuálním režimu jsem tedy vyzkoušel příjem a odesílání SMS zpráv a po připojení mikrofonu a sluchátek do příslušných konektorů jsem modul SIM900 použil jako mobilní telefon.

    Přenos dat přes GPRS pomocí SIM900

    Své první experimenty s přenosem dat přes GPRS jsem zahájil pomocí platformy Arduino UNO k ovládání SIM900 (prostě proto, že byl po ruce). Pro začátek jsem si koupil hosting se serverem pod Apache a nasadil na něj jednoduchou aplikaci, která uměla obratně reagovat na požadavky GET. Stalo! Stále jsem posílal příkazy z PC do řadiče Arduino, který je zase přeposílal na SIM900.

    Vše fungovalo správně, pokud byly požadavky GET dostatečně krátké (do 100 znaků). Jakmile se však požadavky prodloužily, začaly selhávat: požadavky nebyly úplně přeneseny. Bylo pozorováno, že závady se mohou objevit nebo zmizet i při zvýšení/snížení ovládacího programu Arduino o několik řádků. Následně se ukázalo, že poruchy souvisí se softwarem USART, který Arduino UNO používá ke komunikaci se SIM900, protože. takový USART je zcela závislý na programovém cyklu jádra řadiče. Při malém množství dat se vždy stihnou přenést a při nárůstu jejich množství závisí výsledek přenosu na délce programového cyklu.

    Ze všeho výše uvedeného vyplývá, že při komunikaci se SIM900 je NEMOŽNÉ používat software USART, zejména pokud jde o velké množství přenášených dat.

    Arduino Uno má pouze jedno „železné“ rozhraní USART, které bylo obsazeno ústřednou s PC, takže jsem musel UNO opustit a nahradit jej Arduino Mega, které nedostatkem „železných“ USARTů netrpí. Po takovém „rošádování“ se provoz zařízení stal stabilním a správným.

    SIM900: zásobník TCP-IP nebo HTTP? co je lepší?

    Při studiu manuálu pro správu modemu jsem zjistil, že existují dvě skupiny AT příkazů. První skupina slouží k přenosu dat prostřednictvím vestavěného zásobníku TCP-IP a druhá využívá protokol HTTP již implementovaný vnitřní logikou SIM900. Bez ohledu na to, jak moc jsem trápil Google a Yandex ve snaze zjistit, jak se tyto metody liší, jaké jsou výhody a nevýhody každé z nich, nenašel jsem nic, a tak jsem vyzkoušel oba a zde se podělil o své praktické zkušenosti.

    Obě metody fungují a mají právo na existenci.

    Zásobník TCP-IP je trochu náročnější na inicializaci (modulu je třeba předat více příkazů) a trochu obtížnější na správu. Chcete-li odeslat požadavek, musíte otevřít připojení, počkat na odpověď a elegantně jej ukončit.

    HTTP je zjednodušeně řečeno prohlížeč zabudovaný do SIM900. Inicializace je snadná, abyste mohli zahájit výměnu se serverem, musíte otevřít relaci. Na bedra SIM900 přitom padá otevírání a uzavírání spojení s každým požadavkem a řešení dalších „organizačních úkolů“. To je pohodlné, kromě toho je přenos dat tímto způsobem poněkud rychlejší, už jen proto, že SIM900 je schopna provádět všechny „pomocné operace“ rychleji než řídicí kontrolér.

    Při volbě způsobu výměny jsem se tedy stále spokojil s protokolem HTTP.

    Nesprávný požadavek GET na server

    Na úplném začátku své práce na přenosu dat přes GPRS jsem udělal chybu, která mě stála nejeden den trápení. Vzhledem k tomu, že nemám dostatečné zkušenosti s interakcí se serverem prostřednictvím požadavků GET, po získání povrchních znalostí na internetu jsem požádal o formulář:

    ZÍSKEJTE http://xxx.ru/d_command.php?UC=1111 HTTP/1.1
    HOST: xxx.ru

    Tento požadavek není správný, ale dokonale ho "sežral" prohlížeč a proxy server, ze kterého jsem posílal požadavky na ladění - proto jsem považoval požadavek za správný.

    Nejpřekvapivější je, že SIM900 si dobře poradila i se „špatným“ požadavkem (a pak jsem požadavky odeslal přes TCP-IP stack). Jednoho krásného dne však server začal na takové požadavky odpovídat chybou 404. Stalo se tak z nevyjasněných okolností, buď poskytovatel hostingu změnil algoritmy zpracování požadavků (popírá to), nebo mobilní operátor to. Faktem ale zůstává. Pak jsem zkusil poslat stejný požadavek přes HTTP - vše fungovalo. To je vysvětleno tím, že interní HTTP protokol modulu SIM900 (jak jsem řekl, ve skutečnosti vestavěný prohlížeč) je schopen správně "parsovat" nesprávné požadavky a vysílat je do sítě ve správném tvaru. To je další výhoda (samozřejmě pochybná) použití HTTP, protože umožňuje programátorovi určité nepřesnosti. Obecně platí, že požadavek musí být samozřejmě napsán správně a vypadat takto:

    GET /d_command.php?UC=1111 HTTP/1.1
    HOST: xxx.ru

    S takovým správným požadavkem SIM900 úspěšně vyměňuje jak přes TCP-IP stack, tak přes HTTP.

    SIM900 zaseknutá

    Občas při výměně přes GPRS nastanou situace, po kterých může modul zamrznout. Může to být způsobeno nesprávnými daty, která přišla přes síť a uvrhla SIM900 do strnulosti, nebo rušením na výměnné lince modulu a řadiče, kdy SIM900 obdržela „ne to, co očekávala“, nebo některými jinými neznámými problémy. Výrobce čipu varuje, že se to může stát, a doporučuje v takových případech modul resetovat pomocí speciální sekvence impulsů aplikovaných na vstup PWRKEY.

    Jak se však ukázalo, ne vždy to pomůže - po takovém restartu se modul může „probudit“ stále „buggy“. A výrobce nás na to také upozorňuje, pokud si pozorně přečtete DataSheet k modulu. Dokumentace doporučuje:

    POZNÁMKA: Pokud SIM900 nemůže reagovat na AT příkaz „AT+CPOWD=1“ a pin PWRKEY, doporučuje se odpojit napájení VBAT přímo místo použití externího resetovacího kolíku.

    Nejsprávnější způsob, jak restartovat modul, je zcela odpojit napájení (z pinu VBAT), podržet pauzu (alespoň sekundu, pro každý případ) a znovu připojit napájení. Pro reset modulu na desce je lepší zajistit relé nebo tranzistorový spínač ovládaný regulátorem.

    Závěr

    V budoucnu plánuji vydat sérii článků-lekcí, ve kterých vám řeknu, jak zorganizovat výměnu mezi serverovou webovou aplikací a SIM900, počínaje nákupem hostingu od poskytovatele a konče psaním kódu pro ovládací programy.

    Ahoj! Zůstaňte naladěni na aktualizace LAZY SMART .

    Nakonec se mi podařilo nastudovat snad nejoblíbenější GSM modul v kutilském prostředí – GSM900. Co je GSM modul? Jedná se o zařízení, které implementuje funkce mobilního telefonu. Jinými slovy, GSM900 vám umožňuje volat ostatním účastníkům mobilní sítě, přijímat hovory, odesílat a přijímat SMS zprávy. A samozřejmě k přenosu dat přes protokol GPRS.

    Tento modul jsem potřeboval k velmi specifickému účelu: objevil se projekt na dálkově ovládaný osvětlovací systém. Nejjednodušší způsob, jak tento problém vyřešit, je pomocí SMS zpráv: odeslaná jedna sms - rozsvícená kontrolka, odeslaná další - zhasnutá. Nejsou potřeba žádné ovladače a každý má telefon (dokonce i bezdomovci). Ve skutečnosti se v tomto článku budu zabývat právě touto možností použití modulu GSM900.

    1. Firmware

    Vůlí osudu jsem měl v rukou modul GSM900A. Po přečtení prvního fóra, na které jsem narazil o oživení této věci, se ukázalo, že písmeno A v názvu znamená, že modul patří do asijské oblasti. A proto nebude spolupracovat s našimi operátory. Sklíčenost 🙁

    Naštěstí následující příspěvky na stejném fóru obsahovaly uklidňující informace :) Ukázalo se, že ne všechno je tak špatné a aby modul v našich končinách fungoval, je potřeba jej jednoduše přeflashovat. Tento proces je dobře popsán v blogu našeho kolegy Alex-EXE: firmware "vše v jednom" sim900
    Pokusím se udělat totéž, ale podrobněji as ohledem na vlastnosti mého modulu.

    Pokud máte správný modul a není vyžadován žádný firmware, můžete okamžitě přejít na sekci #2.

    Nástroje

    Pro začátek si tedy připravíme všechny potřebné pomůcky. Za prvé, přímo pro firmware budete potřebovat aplikaci Tools Develop pro stažení řady SIM900, kterou lze snadno najít na internetu ().

    Za druhé, užitečný je také samotný soubor firmwaru 1137B02SIM900M64_ST_ENHANCE, který lze také snadno získat ().

    Konečně za třetí budeme potřebovat dobrý terminál pro experimentování s modulem. Obvykle používám TeraTerm, ale tentokrát to nestačilo (nebo jsem nepochopil). Musel jsem nainstalovat monstrum s brilantním jménem.

    Připojení k můstku USB-UART

    Nyní připojíme linky RX a TX k můstku. Jako poslední jsem použil CP2102. V mém případě byly v rozporu s logikou RX a TX můstku připojeny k RX a TX GSM modulu symetricky (a ne křížově, jak je zvykem).

    Měli byste také napájet modul ze stabilního a výkonného zdroje, protože špičkový proud na modulu může dosáhnout 2A (prý). Vhodné pro 4 AA baterie. Kompletní schéma zapojení vypadá takto:

    SIM900
    CP2102 Gnd Gnd
    CP2102 +5V VCC_MCU
    CP2102RX SIMR
    CP2102TX SIMT
    Externí zdroj +5V VCC5
    Externí zdroj Gnd Gnd
    RST

    Tento model nemá tlačítko reset, takže pro firmware musíme na pár sekund hodit kontakt RST na zem. Abychom to udělali, necháme ho zatím viset ve vzduchu.

    Předkonfigurace modulu

    Než budeme pokračovat s firmwarem, připojíme se k modulu a změníme jeho rychlost UART. Chcete-li to provést, spusťte terminálový terminál, vyberte správný port a nastavte směnný kurz na 9600. Poté klikněte na „Připojit“.

    Veškerá komunikace s modulem probíhá prostřednictvím AT příkazů.

    První věc, kterou modulu řekneme, bude nejprimitivnější AT příkaz: "AT". Jedná se o takový druh pingu, na který musí modul odpovědět slovem „OK“.

    Pokud vše proběhlo v pořádku a modul nám skutečně odpověděl „OK“, odešleme příkaz k nastavení rychlosti:

    AT+IPR=115200

    Na konci příkazu musí být znak návratu vozíku služby - CR. V ASCII tabulce má kód 13 (nebo 0x0D v hexadecimální soustavě). Symbol bude nahrazen automaticky, pokud zaškrtnete políčko „+CR“ naproti vstupnímu řádku v našem terminálu. Podobné nastavení mají i ostatní terminály.

    V reakci na zadaný příkaz opět obdržíme - „OK“.

    Toto nastavení budeme potřebovat pro urychlení postupu firmwaru. Jinak, jak upozornil Alex-EXE na svém blogu, firmware zabere asi hodinu.

    Nastavení programu

    Poté, co jsou všechny vodiče zapojeny na správná místa a modul je připraven pro firmware, spustíme aplikaci Tools Develop pro stahování řady SIM900. Nastavení programu se skládá pouze z několika položek:

    • v poli Cíl zadejte cílový čip. Z nějakého důvodu jsem nemohl nahrát firmware do SIM900A, tak jsem zvolil „SIM900“;
    • vyberte správný port v poli Port;
    • Přenosová rychlost nastavena na 115200;
    • Nakonec zadejte soubor firmwaru do pole Core File (soubor s příponou cla).

    Vše s nastavením.

    Firmware

    Nyní přísně a důsledně provádíme šest důležitých kroků.

    • Připojíme napájení k modulu (naše 4 baterie). Měla by se rozsvítit červená kontrolka napájení a kontrolka stavu by měla začít blikat.
    • K počítači připojíme USB-UART.
    • Uzavřeme drát RST k zemi (nezapomeňte, že celou tu dobu visel ve vzduchu).
    • Stiskněte tlačítko Spustit stahování v programu.
    • V duchu napočítáme do tří a zvedneme RST ze země.

    Čekáme 6 minut na dokončení firmwaru.

    Co máme po firmware

    Za prvé, modul je nyní schopen spolupracovat s našimi operátory. Za druhé jsme nainstalovali rozšířený firmware, který umožňuje například získávání souřadnic modulů z mobilních věží, práci s e-mailem a přístup k dalším 2,5 MB paměti.

    2. Experimenty s GSM modulem

    Zkusme nyní s modulem provádět různé užitečné operace. Nejprve zadejte kód PIN (pokud existuje):

    AT+CPIN=8899

    Odpověď modulu bude:

    CPIN: PŘIPRAVEN.

    Poté z modulu získáme nějaké informace.

    AT+GMR - identifikátor firmwaru. AT+GSN-IMEI. AT+CPAS - stav (0 - připraven k práci, 2 - neznámý, 3 - příchozí hovor, 4 - hlasové spojení). AT+COPS? - informace o provozovateli.

    Telefonní hovory

    Teď vytočíme nějaké číslo. To se provádí pomocí příkazu:

    ATD+790XXXXXXXX;

    Středník na konci příkazu je velmi důležitý, nezapomeňte na něj!

    Pokud někdo zavolá na zařízení během relace UART, vrátí se následující zpráva:

    Hovor můžete přijmout (zvednout telefon) příkazem:

    Pokud jsou k modulu připojena sluchátka a mikrofon, můžete se vzdáleným účastníkem komunikovat jako s běžným mobilním telefonem.

    Příkaz ukončí hovor:

    Odesílání SMS

    Nejprve povolte režim textových zpráv:

    AT+CMGF=1

    a nastavit kódování:

    AT+CSCS="GSM"

    Modul také podporuje další kódování, která jsou pro automatické systémy výhodnější. Pro naše experimenty je ale nejpohodlnější použít režim GSM, ve kterém je telefon nastaven na čísla a text zprávy je psán v kódování ASCII. Nyní pošleme někomu zprávu:

    AT+CMGS="+79123456789"

    A na konec příkazu musíte přidat dva servisní znaky najednou: CR a LF. V Terminálu to lze provést zaškrtnutím CR=CR+LF nebo ručním přidáním na konec řádku: AT+CMGS="+79123456789"&0D&0A

    Po zadání tohoto příkazu bude odpovědí symbol ">“, označující začátek zadávání zprávy. Píšeme nějaký text:

    Ahoj světe!

    Na konci zprávy budeme muset předat jeden ze dvou speciálních znaků. Pro odeslání zprávy zadejte znak z ASCII tabulky s číslem 26. Pro zrušení odesílání zadejte znak s číslem 27.

    V terminálu, který používáme, lze k odeslání znaku kódem použít jeden ze dvou výrazů: v šestnáctkové soustavě: $1A a v desítkové soustavě: #026

    Příjem SMS

    Pokud je během relace na zařízení přijata SMS, bude vrácena zpráva v následujícím formátu:

    CMTI: "SM",4

    kde 4 je číslo příchozí nepřečtené zprávy.

    AT+CMGR=4

    Jako odpověď dostáváme:

    CMGR: "REC READ","+790XXXXXXXX","","13/09/21,11:57:46+24" Ahoj světe! OK

    Obecně je vše jednoduché. To nám k realizaci našich plánů docela stačí. Pro hlubší studium schopností GFM900 doporučuji přečíst si další článek Alex-EXE: sim900 modem gsm at-commands

    3. Interakce s mikrokontroléry

    Obecně platí, že pro ovládání externích zařízení není vůbec nutné spárovat modul GSM900 s jiným mikrokontrolérem. V tomto modulu si můžete ušít svůj vlastní program, který s volnými GPIO piny udělá cokoliv. Ve většině hotových desek však GPIO nejsou zapojené, takže pro vytvoření prototypu koncipovaného zařízení použijeme nejjednodušší Arduino Uno / Nano.

    Arduino a GSM900 budou komunikovat přes stejné rozhraní UART. Za tímto účelem propojíme tato dvě zařízení podle následujícího schématu:

    GSM 900 GND VCC_MCU SIMT SIMR
    Arduino Uno GND +5V RX TX

    Nyní vytvoříme program, který zachytí SMS zprávy a na pár sekund rozsvítí LED na noze #13. Tím simulujeme ovládání nějakého externího zařízení.

    Const String spin = "1234"; const int rel_pin = 13; Řetězec ss = ""; // Odeslání kódu PIN void sendPin()( String cmd = "AT+CPIN="+spin+char(0x0D); Serial.print(cmd); ) // Rozsvícení LED na 2 sekundy void acceptSMS(String s )( digitalWrite(rel_pin, HIGH); delay(2000); digitalWrite(rel_pin, LOW); ) // Analyzujte řetězec, který přišel z modulu void parseString(String src)( bool collect = false; String s = ""; for(byte i =0;i

    Nahrajeme program na Arduino a otestujeme systém. Pokud je vše provedeno správně, odeslání SMS zprávy do zařízení rozsvítí LED na 2 sekundy. Samozřejmě, místo LED diody můžete zapnout / vypnout výkonné relé, ke kterému je připojen topný kotel ve venkovském domě.