Údržba

Který GSM modul je lepší?

Na chatě je zima a vy chcete zapnout topení několik hodin před vaším příjezdem nebo se obáváte možnosti nouzového vypnutí topného systému venkovského domu ve vaší nepřítomnosti. Všechny tyto problémy lze vyřešit pomocí GSM modulu, který umí odesílat a přijímat SMS zprávy a reagovat na ně, zapínat a vypínat požadovanou zátěž. Teoreticky je vše jednoduché, ale v praxi existuje mnoho úskalí při implementaci takového zařízení.

Mým plánem bylo vytvořit jednoduché a levné zařízení vybavené dvěma teplotními čidly, čidlem vlhkosti, GSM modulem a také polovodičovým relé a zátěžovou zásuvkou. Co se nakonec stalo, je vidět na fotce. Senzor klimatu BME280 byl vybrán jako senzor teploty a vlhkosti, jeho tlakový kanál není použit. Na fotografii je vidět pod průhledným uzávěrem vlevo od hlavního modulu. Toto uspořádání snižuje vliv tvorby tepla uvnitř pouzdra na hodnoty snímače. Jako uzávěr se používá čínská plastová zkumavka se dvěma otvory pro ventilaci. Druhé teplotní čidlo je vzdálené, vyrobené na DS18B20. Je umístěn uvnitř kovové sondy a k tělu je připojen kabelem přes běžný sluchátkový audio jack. Sonda je určena k přímému měření teploty topného systému. Hlavní objem skříně zabírá polovodičové relé (zvolil jsem výkonnější) a převodník z 220V na 5V pro napájení obvodu. Zásuvka pro připojení zátěže je namontována na zadní straně pouzdra, na fotografii není vidět. OLED displej založený na ovladači SH1106 zobrazuje hodnoty senzoru a také ukazuje, zda je zátěž zapnutá. Pro ovládání celého systému je použit modul Arduino Pro Mini ve verzi 3.3V 8MHz. Nejsem velkým fanouškem této platformy, ale množství knihoven, včetně knihoven pečlivě sestavených autorem, z ní dělá tu nejlepší volbu, když potřebujete rychle udělat něco jednoduchého.

GSM modul SIM800L je umístěn v samostatném kovovém pouzdře, aby se snížilo rušení, které vytváří na jiných částech obvodu. Jak ukázala praxe, toto rušení příliš nesníží. A radikálně je redukuje externí anténa připojená stíněným kabelem ke koaxiálnímu konektoru na fotce nahoře je v popředí; Ale o tom si povíme podrobněji později.

O použití GSM modulů, včetně na Habrého, bylo napsáno mnoho článků, takže se vyhnu opakování a budu mluvit o tom, s čím jsem se v publikacích na toto téma nesetkal, totiž jak vyrobit spolehlivě fungující zařízení na základě tohoto modulu.

V garážích, kam často chodím, nedávno nainstalovali závoru u vjezdu, která se otevře, když zavoláte na určité číslo. Zřejmě je vyroben na podobném GSM modulu. Překvapilo mě, jak těžké může být zavolat na toto číslo, aby se otevřelo. Nyní pro to znám mnoho důvodů. Tyto znalosti mě stály několik měsíců experimentů a působivé množství peněz, které jsem za ně utratil. Doufám, že tyto znalosti nyní poslouží někomu dalšímu. Podívejme se na to, čemu je důležité věnovat pozornost, když přecházíme od zjevných hardwarových problémů k méně zjevným softwarovým.

Přečtěte si více
Co se stane, když podlahu pod laminátem nevyrovnáte?

První věc, kterou je důležité udělat správně, je vložit SIM kartu

Zdálo se mi zřejmé, že SIM karta se vkládá zkoseným rohem dopředu. Týden jsem se snažil pochopit, proč se modul nechce registrovat v síti, a zároveň ovládat příkazy v terminálu. V důsledku toho jsem na nějakém anglicky psaném fóru našel zmínku, že je potřeba vložit zkosený roh dozadu. Je zvláštní, že je to vůbec vloženo, tak a tak.

Abyste dobře fungovali, musíte dobře jíst

Požadavky na napájení GSM modulu jsou zcela specifické. Je vyroben na bázi čipu vyvinutého pro tlačítkové mobilní telefony a je určen k napájení přímo z lithiové baterie. Proto je pro něj 5V hodně, ale 3.3V je málo. Navíc je v režimu přenosu při maximálním výkonu schopen odebírat proud až 2A. Pokud napájecí zdroj není schopen poskytnout požadovaný proud, může se GSM modul při pokusu o registraci do sítě restartovat a pokračovat v restartu v nekonečné smyčce. Období špičkového odběru obvykle trvá méně než sekundu, takže je lákavé použít nízkoproudý stabilizátor s akumulací energie pro období špičkového zatížení. Jako takové úložiště lze použít lithiovou baterii. Zároveň je důležité zajistit možnost jeho vypnutí a je důležité nezapomenout na jeho použití, jinak dojde odpojením zařízení od sítě k hlubokému vybití baterie a jejímu nevratnému poškození. Další možností je osadit místo baterie ionistor (superkondenzátor). Hlubokého vybití se nebojí. Ale má také problémy se spolehlivostí. Jeden ionistorový článek je obvykle navržen pro napětí od 2.5 do 3V. Ionistory určené pro vyšší napětí se skládají z několika článků (obvykle 2). V tomto případě však napěťová nerovnováha mezi články může vést k rozpadu článku. Taková nerovnováha může být snadno způsobena rozdíly v kapacitě článku nebo rozdíly ve svodovém proudu. Měli byste také vzít v úvahu parametr vnitřního odporu ionistoru. Ionistory s vysokým vnitřním odporem jsou při vysokých proudech k ničemu a ionistory s nízkým odporem nejsou levnější než baterie. Poté, co mi náhle odumřel ionistor kvůli nevyváženosti článků, jsem jednoduše použil převodník z 220V na 5V dostatečného výkonu. Pro snížení napětí na úroveň požadovanou GSM modulem jsem mezi převodník a modul umístil běžnou křemíkovou diodu. Taková dioda většinou klesne 0.7V, takže modul dostane potřebných 4.3V. Za diodu je účelné umístit velkokapacitní elektrolytický kondenzátor. Vyhladí poklesy napětí při náhlém zapnutí vysílače.

Je lepší se držet dál od vysílací antény

I poté, co jsem dodal GSM modulu požadované napájení, příznak restartu se pravidelně objevoval, ale tentokrát se Arduino restartovalo. Sledování její výživy pomocí osciloskopu ukázalo, že výživa s tím nemá nic společného. Rušení bylo zřejmě způsobeno vysílačem modulu, protože problém se vyskytoval častěji, čím horší byly podmínky příjmu signálu základnové stanice. Takový radikální efekt rušení vysílací anténou je pochopitelný, pokud si uvědomíme, že vysílač modulu je schopen dodat anténě 2 watty. Takový výkon dokáže uvařit mililitr vody za 5 minut nebo zahřát ucho o několik stupňů. Pro boj s tímto problémem byly vyzkoušeny různé metody. Pro začátek jsem připojil externí anténu, která byla umístěna mimo skříň a k modulu byla připojena krátkým koaxiálním kabelem. To však nepřineslo očekávaný efekt. Poté jsem modul umístil do samostatného kovového pouzdra, ke kterému byla zvenčí připevněna anténa. Zlepšilo se to, ale ne moc. Situaci radikálně zlepšilo až posunutí antény na určitou vzdálenost od zařízení jejím propojením koaxiálním kabelem dostatečné délky.

Přečtěte si více
Je možné přilepit LED pásek na pohovku?

Proč se to děje, lze snadno pochopit z fyzikálních úvah. Typická anténa je „čtvrtvlnný pól“, tedy poloviční dipólová anténa. Ale k vytvoření elektrického pole nestačí polovina dipólu, potřebujete druhou polovinu, pak vznikne elektrické pole mezi záporně a kladně nabitými prvky antény. Pro správnou bičovou anténu je druhou polovinou buď povrch země, nebo tělo zařízení, případně speciální vodivé ‚protizávaží‘. To vše je ale pro obchodníky příliš složité, a tak nám běžně prodávají jen polovinu běžné antény. Jak to funguje? Je to velmi jednoduché – druhá polovina je kabel, který spojuje anténu. Nic na tom nemění ani to, že je stíněný. Vnější povrch jeho opletení hraje roli druhé poloviny dipólové antény. V tomto případě se rušení snadno indukuje do blízkých vodičů, přestože se kabel zdá být stíněný. No a co když tam není kabel, třeba jsme modul schovali do kovové clony, ze které trčí anténa? Pokud je obrazovka velká (ve srovnání s vlnovou délkou), pak funguje jako druhá polovina emitoru, a pokud je malá, pak ostatní vodiče, které jsou připojeny k tomuto modulu, vyzařují, nezáleží na tom, které. Výše uvedené ilustruje následující obrázek (pro názornost jsou uvedeny klady a zápory, ve skutečnosti se náboj anténních prvků mění znaménko s nosnou frekvencí).

„Správná“ anténa je zobrazena vlevo, její napájecí kabel nevyzařuje rušení. Prostřední obrázek ukazuje anténu, kterou byste si běžně koupili. Zde je přívodní kabel součástí vysílače a překáží poblíž procházejícím vodičům. Situace vpravo je znázorněna, když je zdroj signálu ukryt v kompaktním stíněném pouzdře. Zde jsou všechny vodiče připojené k takovému pouzdru součástí emitoru.

Morálka je taková, že jediný spolehlivý způsob, jak se chránit před rušením vysílací antény, je oddálit ji od ostatní elektroniky pomocí dostatečné délky koaxiálního kabelu. Jaká délka je dostatečná? Vzdálenost je přirozeně úměrná vlnové délce, v tomto případě je to maximálně 30 cm To je minimální vzdálenost, do které by měla být anténa umístěna, ale čím dále, tím lépe.

Ne všechny sériové porty jsou stejné

V jednoduchých mikrokontrolérech AVR, které běžně používá každý, je pouze jeden hardwarový sériový port a ten slouží ke stažení programu. Proto je softwarová implementace sériového portu velmi oblíbeným řešením. Dokážu tvrzení, které se mnohým bude zdát nečekané – softwarová implementace sériového portu je obecně nevhodná pro ovládání GSM modulu.

Podstatou problému je, že softwarová implementace sériového portu zakazuje přerušení po celou dobu vysílání nebo příjmu dalšího znaku. Zdálo by se, že na tom není nic špatného, ​​mnoho lidí to dělá. Například implementace protokolu 1-Wire od Dallas Semiconductor pro čtení teploměrů také zakazuje přerušení po dobu přenosu jednoho bitu, tedy na 65 mikrosekund. To samozřejmě také není moc dobré. Pokud jsou v systému další obslužné programy přerušení, nebudou schopny poskytnout dobu odezvy přerušení kratší než těchto 65 mikrosekund. Pokud přijde požadavek na přerušení v době, kdy jsou zakázána, bude zpracována až po opětovném povolení přerušení. Například hardwarový sériový port používá přerušení k vložení dalšího přijatého znaku do vyrovnávací paměti přijímače. Pokud další znak dorazí před zpracováním přerušení z předchozího, bude ztracen. To znamená, že hardwarový sériový port nebude schopen pracovat rychlostí vyšší než 115200 bitů za sekundu. V případě softwarové implementace sériového portu je vše horší. Aby to fungovalo, je nutné, aby doba odezvy na přerušení byla kratší než doba přenosu jednoho bitu. To nás omezuje na 9600 bitů za sekundu.

Přečtěte si více
Co je to tepelný odpor?

Závažnějším problémem je, že samotná softwarová implementace sériového portu zakazuje přerušení. Navíc doba, na kterou je vyřadí (doba vysílání nebo příjmu jednoho znaku), je vždy přibližně 10x delší než maximální doba zpracování přerušení potřebná pro správnou funkci přijímače stejného softwarového sériového portu. To znamená, že do sebe vždy zasahuje do takové míry, že nemůže současně přijímat a odesílat data. Ve většině případů to samozřejmě není nutné. Ve většině, ale ne v našem případě s GSM modulem. Může nečekaně začít přenášet data z vlastní iniciativy (například při příjmu SMS zprávy). A pokud je použita softwarová implementace sériového portu, může to snadno vést k selhání výměnného protokolu s modulem. Proto jsem jednoduše použil stejný hardwarový sériový port jak pro programování Arduina, tak pro komunikaci s GSM modulem. Je to samozřejmě nepohodlné, ale je to jediný způsob, jak vyrobit spolehlivě fungující zařízení.

Asynchronní protokol – asynchronní handler

Asynchronní protokol je protokol, ve kterém jedna strana ústředny může začít přenášet informace nečekaně pro druhou stranu, to znamená bez jakékoli synchronizace se svými zprávami. To je právě výměnný protokol s GSM modulem. Pravidelně reaguje na požadavky z Arduina, ale může začít vysílat i něco vlastního, například hlásit přijatou SMS zprávu. A to vytváří skutečný problém, protože žádná z knihoven, které jsou mi známé pro práci s modulem pro Arduino, vůbec nebere v úvahu asynchronní povahu protokolu. Představme si, že Arduino odeslalo příkaz modulu a zároveň modul předal informaci o přijaté SMS zprávě. Tato informace bude přijata namísto odpovědi na příkaz. V důsledku toho knihovna jako odpověď na příkaz vrátí chybu (v lepším případě se vše zasekne) a zpráva o přijaté SMS se ztratí.

Je snadné to opravit – stačí si napsat vlastní obslužný program asynchronního protokolu. Asynchronní handler klade pouze nezbytné minimální požadavky na reakce modulu na jeho příkazy. Modul nakonec odpoví na každý příkaz buď OK nebo ERROR. A to je vše, co je potřeba k zaznamenání odpovědi. Všechny ostatní řádky, které přicházejí z modulu, jsou zpracovány bez ohledu na to, zda přišly jako odpověď na příkaz nebo samy o sobě. Význam těchto řádků lze vždy určit podle jejich začátku. Pokud řádek začíná +CSQ, pak obsahuje informaci o kvalitě signálu. Pokud začíná +CMT, jedná se o informaci o přijaté SMS a obsahuje adresu odesílatele. První řádek je odeslán v rámci odpovědi na příkaz AT+CSQ a druhý řádek odesílá modul z vlastní iniciativy, ale pro nás je tento rozdíl naprosto nepodstatný. Modul odesílá přijaté SMS zprávy přímo na sériový port. Vyhnete se tak jejich čtení z paměti a následnému mazání. Abychom mohli rozpoznat SMS zprávy v obecném toku zpráv z modulu, musí začínat symbolem #, jinak je zpráva ignorována.

Knihovna vytvořená autorem, která implementuje výše popsaný přístup, se nachází zde.

Přečtěte si více
Je možné dát pračku do skříně?

Pro příjem řádků začínajících určitou sekvencí znaků klient vytvoří speciální objekt – past. Může vytvořit libovolný počet takových pastí. Jiné řádky než OK nebo ERROR přijaté z modulu, které nespadají do žádné z pastí, jsou jednoduše ignorovány. Protože tato architektura nevyžaduje kompletní analýzu reakcí modulu na mnoho různých typů příkazů, je kód knihovny mnohonásobně kompaktnější než jakákoliv knihovna, kterou znám.

Výsledek?

Výsledkem je zařízení, které spolehlivě funguje v oblastech se špatným pokrytím, dokonce lépe než průměrný telefon. Níže je jeho kompletní schéma.

Pro zájemce je zde odkaz na github, kde najdete zdroje projektu a popis příkazů, které lze do zařízení posílat v SMS zprávách.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Back to top button