• Možnosti připojení Wi-Fi modulu esp8266 k arduinu. Vytváříme aplikaci pro Android pro ovládání domácího robota přes Bluetooth

    Kanál Science Vetal ukázal, jak vyrobit auto, které lze ovládat téměř z jakéhokoli smartphonu s Androidem. V tomto případě nepoužijeme „Arduino“, vezmeme mikrokontrolér od čínského výrobce „Espressive“ „esp 8266“, mašinkou je „Arduino“ plus wi-fi modul.
    Všechny rádiové komponenty a moduly v tomto čínském obchodě.

    Pamatuješ si " arduino uno“, je velký a tady je malá taková věc, která má wi-fi, schopnosti „Arduino“. Pro tento mikrokontrolér Číňané takový štít vyvinuli. Je to pohodlné: můžete připojit 2 motory, nebo dokonce 4, přičemž můžete použít 11 pinů. Bereme také 2 motory, 2 standardní "Arduino" kola.

    Když zadáte „Arduino“ do vyhledávání na „aliexpress“, otevřou se nejen desky, ale související produkty. Zajímavé prvky, určitě něco zajímavého najdete, vyzkoušejte.

    Vezmeme 2 baterie 18650 na napájení, k nim krabici na 2 baterie, vezmeme i 2 rohy, asi 5 palců, tam to není tak důležité, plus minus půl palce, palec. Faktem je, že návrh může být váš, ale ten autorský prezentovaný ve videu je povedený, jednoduchý.

    Vezmeme 2 rohy, pomocí šroubů je třeba je spojit, aby se sem dal štít snadno umístit. Vrtákem o průměru 3 mm uděláme 4 otvory. Vezmeme malé šrouby, svorku, spojíme tuto strukturu. Ukázalo se, že taková mašinka je síla tato sloučenina neboť takových strojů, jako my, je mnoho.

    Na straně pro video šachtu vyvrtáme otvor o průměru 8 mm, získáme design, ale ještě potřebujeme udělat 3 otvory o průměru 3 mm: jeden pro tento výstupek, pro tyto montážní otvory 2 další.

    Vezmeme, nahradíme tímto způsobem, utáhneme šrouby. Jeden z ideálních případů, automat se mi líbí, tady není co dodat, není potřeba to předělávat. Vyrábíme otvory pro montáž desky.

    Nic neměníme, kromě zde, kde je zaškrtnutí, vyberte adresu souboru, který nahrajeme, a poté vyberte požadovanou com port, stiskněte tlačítko start. Pod videem je také odkaz na program, který si musíte nainstalovat na svůj oblíbený android.

    Opravil jsem tuto desku, vložte mikrokontrolér. Připojíme vodiče od motorů, podívejte se, pokud je spodní „A-“, pak na této straně bude „B-“ horní. Je čas připevnit kola. To se provádí snadno, protože kola motorů jsou sada. V tomto místě vyvrtáme otvor o průměru 4 mm, vložíme šroub. Děláme takovou jednoduchou operaci, nastavujeme výšku, je to možné i nižší, něco se ukázalo jako šroub, který hodně trčí. Je to příliš mnoho. Ukazuje se, že zařízení je dražší o cent, což obecně nepotřebujeme, nějak to vypadá neohrabaně.

    Pojďme se tedy podívat, jak se získá zařízení, které bude ovládat android na dálku přes wifi. Samozřejmě lepší věc. Připevněte přihrádku na baterie horkým lepidlem, stroj se ukáže.

    Vkládáme baterie, musíte být opatrní, protože se často stává, že se vše zdá být správně sestaveno, baterie jsou vloženy a zařízení nefunguje. Ukázalo se, že jde o černé plastové krabice. Nedovolí, aby baterie zapadla na místo.


    Program a skica http://bbs.smartarduino.com/showthread.php?tid=2013
    Ovládací aplikace https://play.google.com/store/apps/details?id=com.doit.carset

    Čip ESP8266 je jedním z nejpopulárnějších organizačních nástrojů. bezdrátová komunikace v projektech chytrý domov. Pomocí bezdrátového ovladače můžete organizovat komunikaci přes rozhraní WiFi, poskytovat Projekty Arduino Přístup k internetu a možnost vzdáleného ovládání a sběru dat. Na základě ESP8266 byly vytvořeny tak populární desky jako WeMos a NodeMcu a také obrovské množství domácích projektů. V tomto článku se dozvíme, co je ESP82266, jaké jsou jeho odrůdy, jak pracovat s ESP8266 v Arduino IDE.

    ESP8266 je WiFi mikrokontrolér, který dokáže spouštět programy z flash paměti. Zařízení bylo vydáno v roce 2014 od čínské firmy Espressif a téměř okamžitě se stal populární.

    Regulátor je levný, má malý počet vnějších prvků a má následující technické parametry:

    • Podporuje Wi-Fi protokoly 802.11 b/g/n s WEP, WPA, WPA2;
    • Má 14 vstupních a výstupních portů, SPI, I2C, UART, 10bitový ADC;
    • Podporuje externí paměť až 16 MB;
    • Potřebné napájení je od 2,2 do 3,6 V, proudový odběr až 300 mA v závislosti na zvoleném režimu.

    Důležitou vlastností je absence uživatelské energeticky nezávislé paměti na čipu. Program je spouštěn z externí SPI ROM pomocí dynamického načítání potřebných programových prvků. Přístup k interním periferiím lze získat nikoli z dokumentace, ale z API sady knihoven. Výrobce uvádí přibližnou velikost paměti RAM – 50 kB.

    Vlastnosti desky ESP8266:

    • Pohodlné připojení k počítači USB kabel, jím poháněný;
    • Přítomnost vestavěného měniče napětí 3,3V;
    • Dostupnost 4 MB flash paměti;
    • Vestavěná tlačítka pro restart a blikání;
    • Všechny porty jsou na desku vyvedeny na dvou hřebíncích s roztečí 2,5 mm.

    Oblasti použití modulu ESP8266

    • Automatizace;
    • Různé systémy chytré domácnosti: Bezdrátové ovládání, bezdrátové zásuvky, regulace teploty, doplněk k poplašným systémům;
    • Mobilní elektronika;
    • ID značky;
    • Dětské hračky;
    • Mesh sítě.

    esp8266 pinout

    Existuje velké množství variant modulu ESP8266. Obrázek ukazuje některé z nich. Nejoblíbenější možností je ESP 01.

    Provádění programu musí být specifikováno stavem portů GPIO0, GPIO2 a GPIO15 při ukončení napájení. Existují 2 důležité režimy - když je kód spuštěn z UART (GPIO0 = 0, GPIO2 = 1 a GPIO15 = 0) pro flash kartu a když je spuštěn z externí ROM (GPIO0 = 1, GPIO2 = 1 a GPIO15 = 0) ve standardním režimu.

    Pinout pro ESP01 je zobrazen na obrázku.

    Popis kontaktu:

    • 1 - zem, 8 - výkon. Podle dokumentace je napětí dodáváno do 3,6 V - to je důležité vzít v úvahu při práci s Arduinem, které je obvykle dodáváno s 5 V.
    • 6 - RST, potřebné k restartování mikrokontroléru, když je na něj aplikována nízká logická úroveň.
    • 4 - CP_PD, také slouží k uvedení zařízení do úsporného režimu.
    • 7 a 0 - RXD0 a TXD0, jedná se o hardwarový UART potřebný k flashování modulu.
    • 2 - TXD0, na tento pin je připojena LED, která se rozsvítí při nízké logické úrovni na GPIO1 a při přenosu dat přes UART.
    • 5 - GPIO0, vstupní a výstupní port, také umožňuje uvést zařízení do programovacího režimu (když je port připojen na nízkou logickou úroveň a je přivedeno napětí).
    • 3 - GPIO2, vstupní a výstupní port.

    Pinout ESP-12

    Hlavní rozdíly mezi Arduinem a ESP8266

    • ESP8266 má více flash paměti, zatímco ESP8266 nemá energeticky nezávislou paměť;
    • Procesor ESP8266 je rychlejší než Arduino;
    • ESP8266 má Wi-Fi;
    • ESP8266 spotřebovává více proudu než Arduino;

    Programování ESP8266 v Arduino IDE

    esp8266 dev kit obsahuje:

    • Kompilátor z kolekce GNU Compiler Collection.
    • Knihovny, WiFi, zásobníky protokolů TCP/IP.
    • Prostředek pro načítání informací do řídicího programu.
    • Provozní IDE.

    Zpočátku jsou moduly ESP8266 dodávány s firmwarem od výrobce. S jeho pomocí můžete modul ovládat z externího mikrokontroléru, realizovat práci s Wi-Fi jako s modemem. Existuje také mnoho dalšího hotového firmwaru. Některé z nich umožňují konfigurovat modul pomocí WEB rozhraní.

    Lze naprogramovat z Prostředí Arduino IDE. S jeho pomocí můžete snadno psát skici a nahrávat je do ESP8266, flashovat ESP8266 a samotná deska Arduino není potřeba. Arduino IDE podporuje všechny druhy modulů ESP8266.

    V v současné době Pro ESP8266 lze implementovat následující funkce:

    • Základní funkce jazyka Wiring. Porty GPIO můžete ovládat stejným způsobem jako piny na desce Arduino: pinMode, digitalRead, digitalWrite, analogWrite. Příkaz analogRead(A0) umožňuje číst hodnoty ADC. Pomocí příkazu analogWrite (pin, value) můžete připojit PWM k požadovanému výstupu GPIO. S hodnotou=0 je PWM zakázáno, maximální hodnota dosahuje konstantní hodnoty 1023. Pomocí funkcí attachmentInterrupt, removeInterrupt můžete přerušit na libovolném portu GPIO kromě 16.
    • Načasování a zpoždění. Pomocí příkazů millis a micros můžete vrátit ms a ms, které uplynuly od začátku. Delay umožňuje pozastavit provádění programu na správný čas. Funkce zpoždění (…) vám také umožňuje podporovat normální práce Wi-Fi, pokud jsou v náčrtu velké prvky, jejichž dokončení trvá déle než 50 ms. Yield() je analogický s funkcí delay(0).
    • Serial a Serial1 (UART0 a UART1). Sériová práce na ESP8266 je podobná práci na arduinu. Zápis a čtení dat blokuje provádění kódu, pokud je 128bajtová vyrovnávací paměť FIFO a 256bajtová vyrovnávací paměť programu plná. Objekt Serial využívá hardware UART0 a lze jej nastavit na GPIO15 (TX) a GPIO13 (RX) místo GPIO1(TX) a GPIO3(RX). Chcete-li to provést, po funkci Serial.begin(); musíte zavolat Serial.swap();. Podobně Serial1 používá UART1, který funguje jako přenos. Požadovaný pin pro toto GPIO2.
    • Makro PROGMEM. Jeho práce je podobná práci v Arduinu. Umožňuje přesunout data pouze pro čtení a řetězcové konstanty do paměti flash. Zároveň se v ESP8266 neukládají stejné konstanty, což vede k dalšímu plýtvání flash pamětí.
    • I2C. Před prací se sběrnicí I2C se sběrnice vybírají pomocí funkce Wire.pins(int sda, int scl).
    • SPI, OneWire jsou plně podporovány.

    Použití esp8266 ke komunikaci Arduina přes WiFi

    Před připojením k Arduinu je důležité si uvědomit, že napájecí napětí ESP8266 nemůže být vyšší než 3,6, přičemž napětí na desce Arduino je 5 V. Je potřeba propojit 2 mikrokontroléry pomocí odporových děličů. Před připojením modulu se musíte seznámit s pinoutem vybraného ESP8266. Schéma zapojení pro ESP8266-01 je znázorněno na obrázku.

    3,3V z Arduina na Vcc&CH_PD na modulu ESP8266, Uzemnění z Arduina na zem z ESP8266, 0 - TX, 1 - RX.

    Pro podporu stabilní provoz ESP8266 potřebuje zdroj konstantní napětí při 3,3 V a maximálním proudu 250 mA. Pokud napájení pochází z převodníku USB-TTL, může dojít k poruchám a poruchám.

    Práce s knihovnou Wi-Fi pro ESP8266 je podobná jako s knihovnou pro obyčejný štít. Existuje několik funkcí:

    • mode(m) - pro výběr jednoho ze tří režimů: klient, přístupový bod nebo oba režimy současně.
    • softAP(ssid) - potřebné k vytvoření otevřený bod přístup.
    • softAP(ssid, heslo) - vytvoří přístupový bod s heslem, které musí mít alespoň 8 znaků.
    • WiFi.macAddress(mac) a WiFi.softAPmacAddress(mac) – určuje MAC adresu.
    • WiFi.localIP() a WiFi.softAPIP() - určení IP adresy.
    • printDiag(Serial); - Poskytuje diagnostické informace.
    • WiFiUDP - podpora pro vysílání a příjem multicastového paketu v klientském režimu.

    Práce se provádí podle následujícího algoritmu:

    • Připojení USB-TTL k USB a k ESP.
    • Spusťte Arduino IDE.
    • Vyberte požadovaný port, desku, frekvenci a velikost flash paměti z nabídky nástrojů.
    • Soubor - Příklady - ESP8266WiFi - WiFiWebServer.
    • Do náčrtu si zapište SSID a heslo sítě Wi-Fi.
    • Začněte kompilovat a stahovat kód.
    • Počkejte na konec procesu firmwaru, odpojte GPIO0 od země.
    • Nastavte rychlost na 115200.
    • Bude navázáno spojení a bude zaznamenána IP adresa.
    • Otevřete prohlížeč, zadejte adresní řádek IP číslo/gpio/1
    • Podívejte se na monitor portu, pokud je LED připojena k výstupu GPIO2, měla by se rozsvítit.

    NodeMCU založený na esp8266

    NodeMCU je platforma založená na modulu esp8266. Slouží k ovládání okruhu na dálku pomocí internetu přes Wi-Fi. Deska je malá, skladná, levná a na přední straně má USB konektor. Nedaleko jsou tlačítka pro ladění a restartování mikrokontroléru. Osazen je také čip ESP8266. Napájecí napětí je od 5 do 12 V, je žádoucí dodávat více než 10 V.

    Velkou výhodou desky je její nízká spotřeba. Často se používají v obvodech s vlastním napájením. Na desce je pouze 11 portů obecný účel, některé z nich mají speciální funkce:

    • D1 a D2 - pro rozhraní I2C / TWI;
    • D5-D8- pro rozhraní SPI;
    • D9, D10 - pro UART;
    • D1-D10 - může pracovat jako PWM.

    Platforma má moderní API pro hardwarový vstup a výstup. To vám umožní snížit počet akcí při práci se zařízením a při jeho nastavování. S firmwarem NodeMCU můžete využít plný pracovní potenciál pro rychlý vývoj zařízení.

    WeMos založený na esp8266

    WeMos je další typ platformy založené na mikrokontroléru esp8266. V souladu s tím existuje wifi modul, podporovaný Arduino IDE, je zde konektor pro externí anténa. Deska má 11 digitálních vstupů/výstupů, které (kromě D0) podporují přerušení/pwm/I2C/jednodrát. Maximální napájecí napětí dosahuje 3,3 V. Na platformě je také USB konektor. Analogový vstup 1 s maximální napětí 3,2 V.

    Pro práci s modulem je potřeba nainstalovat ovladač CH340 a nakonfigurovat Arduino IDE pro ESP8266. Chcete-li to provést, přidejte adresu http://arduino.esp8266.com/stable/package_esp8266com_index.json v nabídce nastavení v řádku „další odkaz pro správce desky“.

    Poté musíte najít balíček esp8266 by ESP8266 a nainstalovat jej. Poté je třeba v nabídce nástrojů vybrat mikrokontrolér Wemos D1 R2 a zapsat požadovaný náčrt.

    ESP8266 Závěry

    S deskami založenými na čipu ESP8266 můžete přidat „ velký internet“, díky čemuž jsou mnohem inteligentnější. Dálkové ovládání, sběr a analýza dat na serveru, zpracování hlasu a obrazu – to vše je dostupné, když náš projekt připojíme přes WiFi k internetu. V následujících článcích se blíže podíváme na to, jak můžete programovat zařízení založená na esp8266, a také věnovat pozornost tak populárním deskám, jako jsou WeMos a NodeMcu.

    Stejně jako mnoho jiných domácích kutilů pravidelně používám mikrokontroléry AVR pro nejrůznější amatérská řemesla. A díky konceptu „Arduino“ nyní tato řemesla získávají elegantní vzhled. Opravdu, za nějakých 300-400 rublů dostaneme miniaturní vícevrstvou desku s maskou, sítotiskem a s periferiemi pro mikrokontrolér kompletně zapojenými (a ve verzi SMD!). Nemluvím o všemožných zásuvných modulech stejné řady „Arduino“: senzorech, ovladačích, displejích a celých sadách přídavných periferií, které tolik potřebujeme. A opět je vše také levné a ve vynikajícím výkonu. Prakticky není potřeba něco ředit a pájet na „koleno“.

    Ale všechna tato různá amatérská řemesla přirozeně vyžadují, předprogramování. A v budoucnu, s různými vylepšeními, tato řemesla neustále musí reflash. Je jasné, že je pohodlnější to udělat na dálku, než je neustále tahat za konvenčním programátorem. Obecně platí, že díky stejné platformě Arduino je zde mnoho možností: Bluetooth, ZigBee, rádiový kanál s vaším osobní protokol, IR a dokonce i Wi-Fi. Všechny umožňují navázat bezdrátový kontakt s vaším mikrokontrolérem. My se ale zaměříme na poslední možnost. Jsou zde čtyři hlavní důvody:

    1: moderní, internet věcí!

    2: bezdrátový router k dispozici v každém bytě, registrujte se na domácí síť vaše zařízení a voila!

    3: vaše řemesla dělají revoluční skok ve svém vývoji; nejenže je lze na dálku naprogramovat, ale nyní mohou také komunikovat s okolním světem: Digitální hodinky samostatně brát přesný čas z hodinových NTP serverů jsou výkonná zařízení řízena z druhé strany města nebo země, registrační zařízení ukládají nashromážděná data do cloudu atd. a tak dále.

    4: Existuje nádherná řada čipů ESP8266, na kterých není příliš snadné toto vše implementovat.

    Dále v tomto článku na příkladu mechanické ruky na servech, vzdálené programování a výměnu dat z PC (nebo čehokoli) se zařízeními založenými na Mikrokontroléry AVR. Chci hned poznamenat, že všechny níže uvedené programy jsou čistě demonstrační a nemají žádnou komerční hodnotu. Proto tvrzení, jako proč je programátor tak vykastrovaný a málo funkční nebo proč ne Doplňkové služby, které jsou všude, nejsou přijímány. Vzhledem k tomu, že kódy jsou otevřené, může si je dodělat kdokoli podle svého uvážení, ale pro mě je jich stále dost na práci.

    Předpokládá se, že čtenář je již obeznámen s „Arduino“ moduly (štíty) a s připojením a firmwarem ESP8266. Ve skutečnosti bylo na webu zveřejněno obrovské množství materiálů vysvětlujících základy práce s těmito zařízeními a nerad bych se zde opakoval. Pro začátečníky je na konci článku seznam užitečných odkazů k této problematice, kde najdete spoustu informací, proč vám to nefunguje. Ze své zkušenosti bývalého inženýra elektroniky mohu zodpovědně prohlásit, že 99 % problémů se týká následujících:

    1. Špatné kontakty. Vzhledem k tomu, že štíty „Arduino“ znamenají vzájemné přepínání pomocí vodičů typu „otec-matka“, a nikoli pájením, velmi často někde něco, ale odejde. Šek. A obecně, jak se říká, elektronika je věda o kontaktech.

    2. Problémy s výživou. Nepoužívejte napětí 5 V tam, kde je požadováno 3,3. Někdy z ESP8266 vychází kouř. I když na druhou stranu bez problémů tráví logické signály z pětivoltových zařízení.

    3. Problémy s dostatečným napájením. ESP8266 má střední náturu a občas dokáže vytáhnout skoro tři sta miliampérů, i když předtím se mohl spokojit s třiceti. V souladu s tím křehký 3,3 voltový stabilizátor desky Arduino, ke kterému jste ji bez váhání připojili, okamžitě klesá na mikroskopické hodnoty. A vy nemůžete pochopit, proč to funguje nebo ne.

    4. Zmatek se závěry. Vždy zkontrolujte, které signály kam jdou. Přijímač RXD musí být připojen k vysílači TXD, stejně jako TXD k RXD, ale MOSI musí být připojen k MOSI, MISO k MISO a tak dále.

    5. Nespoléhejte na obvodové pull-up odpory ESP8266, vždy vytáhněte piny na nulu nebo výkon, přes 5-10 kiloohmové externí odpory, nejen propojku. Jinak můžete nejlepší případ získat dosud nebývalý odběr proudu, a pak cítit nepříjemný zápach spáleného plastu.

    6. Plevel software. Protože software pro jednotlivé uživatele píší stejní nadšenci, při aktualizaci verzí stejného firmwaru se pravidelně objevují závady samotného firmwaru a chyby. Léčí se to prolézáním příslušných fór, někdy i v angličtině. Někteří soudruzi dokonce tvrdili, že samotný čip ESP je vlhký jako počasí v Petrohradě, ale na druhou stranu existuje i názor, že od roku 2014 (rok jeho prvního vydání) se situace dramaticky zlepšila (na rozdíl od počasí).

    7. Záhadné závady. Jde o vzácný, ale nervy náročný jev. Například jsem neměl jedno zařízení „Arduino“ šité na dálku. Spíš to bylo šité, ale s chybami. Ale byl ušitý bez chyb, pokud na něm visel kabel od programátoru (ale bez programátoru samotného). "YAH," řekl jsem si a připájel 15 pF kondenzátor mezi vysílací kolík a hodinový kolík. Všechno fungovalo. Ale zabil den.

    Začněme tedy tím nejjednodušším. Máme mechanickou končetinu MechArm (ale ne tu, kterou postavil Howard Wolowits) vyrobenou v Číně a Osobní počítač s Windows. úkol - vzdálený firmware programovat a ovládat z počítače.


    Za řídicí ovladač si vezměme pěknou miniaturní desku Arduino Nano s kamínkem ATmega328P. Tato deska dokonale zapadá do mechanického ramene.


    Nyní se rozhodneme, jak to naprogramujeme. Pro vzdálený firmware jsou nejvhodnější tři hlavní metody: přes rozhraní SPI, přes vestavěný bootloader, přes JTAG port.

    Nejjednodušší možností je samozřejmě vestavěný bootloader (bootloader). Toto je předem napsané FLASH paměť, program, který přijímá kód pomocí určitého protokolu (například pomocí nejjednoduššího UART) a zapisuje jej speciálními příkazy na místo staženého programu. Takto funguje například samotný bootloader ARDUINO IDE. Po resetu nebo startu zavaděč nějakou dobu čeká na příjem dat, a pokud nepočká, spustí program od adresy nula. Pokud data přijdou, zapíše je do programové sekce. Po dalším resetu se spustí načtený program. V detailech jsem to možná popsal nepřesně, ale podstata je přesně taková. V důsledku toho potřebujeme pro programování pouze tři výstupy: RTD přijímač, RESETOVAT a zem GND. Obecně se k ověření nahraného programu používá i vysílač TRD, ale pro jednoduché demonstrační aplikace (ne pro jadernou elektrárnu) lze ověření vynechat.

    Samotný bootloader je napsán v assembleru, příklady jednoduchých bootloaderů jsou v datasheetech AVR. Můžete odemknout existující zavaděč, pokud je v něm otevřený přístup a stačí jej použít v hotové podobě, pokud je znám protokol, na kterém to funguje. Jedinou výhradou je, že k tomu je třeba nakonfigurovat AVR ve speciálním režimu, a to blikáním speciálních pojistkových bitů, což provádí obyčejný programátor, a poté zašitím bootloaderu do paměti mikrokontroléru (to znamená, že stále nemůžete jednou se obejít bez programátora).

    Druhou možností je programování sériové rozhraní SPI. Není zde žádný interní bootloader, ale programujeme odesíláním speciálních příkazů a následně dat přes zmíněné rozhraní. Zde máme externí bootloader, ale musíme ho ještě napsat. Při přenosu jsou kromě RESETu a GND použity další čtyři výstupy MOSI, MISO - data, synchronizace SLK, CS - výběr krystalů. Obecně ale můžete také odebrat MISO a CS. Data budou pouze přijímána (pak nedojde k ověření programu) a stejně máme jen jeden krystal.

    Každý přístup má své pro a proti (a to jsem JTAG vůbec nezvažoval, jelikož lidský život je krátký). Nakonec jsem se ale přiklonil ke SPI, protože jsem byl příliš líný psát v assembleru a nenašel jsem otevřené hotové loadery (jen jsem nevypadal dobře).

    Pro vybudování bezdrátového kanálu jsem, jak již bylo zmíněno, zvolil aktuálně extrémně známý čip ESP8266 - mikrokontrolér, respektive celý SoC (System-on-Chip) od čínského výrobce Espressif s Wi-Fi rozhraním. Kromě Wi-Fi se vyznačuje schopností spouštět programy z externí flash paměti. A speciálně pro můj projekt jsem vzal ESP8266-07 s 512 KB paměti na palubě.


    Obecně je vhodné jakékoli ESP8266, kde jsou další nohy pro implementaci SPI. Nejjednodušší ESP8266-01 nám proto nebude vyhovovat, protože má velmi málo nohou pro I / O porty. Ale na druhou stranu, rozdíl v ceně za ně je méně než sto rublů a jsou stejně dostupné. No a velké ladicí desky s ESP, kde je pro pohodlí rozvedena hromada periferií, se nám také nehodí, jelikož se nehodí tam, kam je chceme strčit do mechanické ruky.

    Globální podstata myšlenky obecně byla následující. Z počítače do ESP se tělo programu načteného do mikrokontroléru přenáší bezdrátově přes WI-FI (v rámci vaší domácí sítě). A ESP již po drátě pomocí SPI rozhraní zapisuje tento program přímo do FLASH paměti mikrokontroléru. Poté jej přirozeně resetuje a umožní spuštění načteného programu. ESP navíc musí mít nezávislou jednotku, která zvládá i výměnu dat s mikrokontrolérem, jelikož s ním chceme nejen programovat, ale i vyměňovat data. Speciálně pro projekt MechArm vysíláme po nahrání programu také signály ovládání serva, aby bylo toto rameno uvedeno do pohybu. Proto je na samotném ESP žádoucí, abychom vytvořili TCP server pro přenos programu a UDP server pro ovládání MechArm. V souladu s tím se tyto servery připojí k domácí síti a pozorně poslouchají, zda někdo nechce nahrát nový kód do MechaArm nebo s ním někomu zamávat.

    Na webu jsem tedy našel, že firmware vám již umožňuje vyrábět Programování AVR letecky, ale tam je hlavní problém, že na co jiného už tento firmware nelze použít. A rádi bychom po naprogramování s AVR komunikovali i na dálku.

    Jaký software budeme používat:

    Pro PC jsem vše napsal v JAVA, prostředí IntelliJ IDEA. V zásadě ale můžete použít cokoliv, pro nás je tam hlavní napsat klienta, který pošle program pro firmware AVR na ESP8266.

    Programy pro AVR píšu v ATMEL STUDIO, v C, zřídka v assembleru. V zásadě nepoužívám skici Arduina, téměř žádné požadovaná knihovna napsáno v jinou hodinu as plným pochopením jeho práce. Zkoušel jsem skici, ale zatím to na AVR nemáte operační systém náčrtky budou i nadále odebírat periferie od přítele a pravidelně selžou. Ano sama Arduino IDE ve srovnání s ATMEL STUDIO je to samozřejmě věc velmi primitivní. Ale tady je otázka samozřejmě diskutabilní, pro humanitní obory a školáky to bude zábavnější a snadnější s nákresy.

    Pro programování ESP8266 jsem použil firmware NodeMCU a programy jsem napsal v Lua. Ne, rád bych psal v Javě a C, ale v ESP žádné nejsou. Jazyk Lua v aplikaci na náš úkol není těžký, jeho zvládnutí je pár maličkostí. A vlastně, abych si stáhl programy a ladil je na ESP, vzal jsem IDE ESPlorer. Domácí bezplatný produkt(ale můžete přispět autorovi), což se samozřejmě nedá srovnávat s výše zmíněnými prostředími, ale jak se říká dárkovému koni... Ale abychom mohli používat ESPlorer a psát v LUA, musíme nejprve změnit základní firmware (dodaný od výrobce) v čipu ESP8266 na nový. V tomto podniku nám pomůže program NODE MCU PyFlasher. V jistém smyslu to pomůže přeflashovat. A samotný firmware vytvoříme a dostaneme ho do rukou na webu tvůrců: NodeMCU. A o tomto procesu si můžete přečíst více

    Vše je velmi přístupné a srozumitelné. Do základních knihoven přidáváme podporu SPI a bitové operace (v LUA jsou v našem případě bitové operace přetížené a málo použitelné). Do firmwaru byste neměli strkat spoustu knihoven, protože kvůli přítomnosti všemožného softwaru zbývá na ESP8266 velmi málo paměti, nějakých mizerných 20 kB.

    Samozřejmě můžete jen vzít hotový firmware, kterých už na internetu visí spousta, ale nedoporučuji. Už jen proto, že některé nepodporují bitové operace (a my je potřebujeme) a neexistuje regulace rychlosti přenosu dat přes SPI.
    Podle toho jsou standardně vysílány rychlostí 40 MHz děleno nějakým malým koeficientem, a proto je AVR nestihne strávit.

    Pokud jste příliš líní vytvářet firmware, můžete si stáhnout můj z cloudu.

    Nyní máme firmware a musíme jej nahrát do ESP8266 místo toho základního. K tomu potřebujeme to nejjednodušší USB adaptér- UART.


    Připojíme nohy TXD k RXD a RXD k TXD, vytvoříme společnou zem, ale nepoužíváme, jak se zdálo, pohodlný výstup 3,3 V na adaptéru. Ve většině případů to ESP8266 úplně promrhá. Proto se na to ptáme samostatně. Poté dáme ESP do programovacího režimu (GP0 do země, kdyby někdo zapomněl) a spustíme NODE MCU PyFlasher.

    Hlavně nezapomeňte vymazat flash paměť (ano, vymaže všechna data), jinak v závislosti na verzi firmwaru může po naprogramování zůstat v paměti zbytečné odpadky, který zase nasype odpadky do konzole, když další práce. Předtím jsem používal software, kde nebyla možnost předem vymazat paměť, strašně jsem trpěl, protože nic nefungovalo. A právě se otevřela rakev, jen pravda je na anglicky psaném fóru tvůrců NODE MCU.

    Zaimev požadovaný firmware nyní můžeme psát a ladit programy v jazyce LUA (existuje i MicroPython, ale ten jsem nepoužíval) pomocí velmi pohodlných API z NODE MCU. Spouštíme již dříve zmíněný ESPlorer.

    Nakonfigurujeme jej také pro práci s ESP8266, nastavíme parametry sériové připojení. Vše je velmi jednoduché a opakovaně uváděné na internetu.

    Nyní píšeme program v LUA, který pak nahrajeme do ESP8266:

    Bootloader Lua pro AVR zapsaný do ESP8266

    function InstrProgrammingEnable () -- instrukce pro MC "povolit programování" p=0 zatímco p<31 do p=p+1 pin=8 gpio.write(pin, gpio.LOW) spi.send(1, 0xAC,0x53) read = spi.recv(1, 8) spi.send(1,0,0) gpio.write(pin, gpio.HIGH) if (string.byte(read)== 83) then print("connection established") p=33 if(p==31) then print("no connection") end end end end functionProgrammingDisable() pin=2--KONEC ESETU PRO MK gpio.mode(pin, gpio.INPUT) pin=8 gpio.mode(pin, gpio.INPUT) pin=5--CLK MASTER pro SPI gpio.mode(pin, gpio. INPUT) pin=6--MISO MASTER pro SPI gpio.mode(pin, gpio.INPUT) pin=7--MOSI MASTER pro SPI gpio.mode(pin, gpio.INPUT) konec funkce ProgrammingEnable() pin=2-- RESET PRO MK gpio.mode(pin, gpio.OUTPUT) gpio.write(pin, gpio.LOW) pin=2--POZITIV PRO 4MSEC RESET PRO MK gpio.mode(pin, gpio.OUTPUT) gpio .write(pin, gpio.HIGH) tmr.delay(4) gpio.mode(pin, gpio.OUTPUT) gpio.write(pin, gpio.LOW) tmr.delay(25000) end funkce InstrFlashErase() pin=8 gpio.write(pin, gpio.LOW) spi.send(1,0xAC,0x80,0,0) gpio.write(pin, gpio.HIGH) tmr.delay(15000) pin=2--RESET PRO MK gpio.mode(pin, gpio.OUTPUT) gpio.write(pin, gpio.HIGH) tmr.delay(20000) gpio.write(pin, gpio.LOW) print("FLASH je vymazán") InstrProgrammingEnable () end funkce InstrStorePAGE(H, adresa, data) pin=8 gpio.write(pin, gpio.LOW) spi.send(1,H,0,adresa,data) gpio.write(pin, gpio.HIGH) tmr.delay(500) end funkce InstrWriteFLASH(adresa_stránky_nízká,_vysoká_adresa_stránky) pin=8 gpio.write(pin, gpio.LOW) spi.send(1,0x4C,page_address_high,page_address_low,0) gpio.write(pin, gpio.HIGH) tmr.delay(5000)-- někdy se flash nezapíše když krátká zpoždění skončí funkce Programování (užitné zatížení) pin=8--CS MASTER pro SPI gpio.mode(pin, gpio.OUTPUT, gpio.PULLUP) pin=4--LED SVÍTÍ NÍZKY gpio.mode(pin, gpio.OUTPUT) gpio.write(pin, gpio. NÍZKÁ) print(string.len(payload)) page_count = 7 -- napište 1 kilobajt pro k =0 ,page_count ,1 do--počet stránek pro i=0 , 127, 2 do-- -1 adresa = i/ 2 data=payload:byte(i+1+128*k) if data == nula then data = 0xff end InstrStorePAGE(0x40,adresa,data) -- tmr.delay(100)-- jinak nebude včas zápis dat = payload:byte(i+1+1+128*k) if data == nil then data = 0xff end InstrStorePAGE(0x48,adresa,data) -- tmr.delay(100) end page_address_low=bit.band(k ,3 )*64 -- 3 je binární 11 page_address_high=k/4+frame1024*2 tmr.delay(1000) InstrWriteFLASH(page_address_low,page_address_high) tmr.wdclr() end pin=4--LED gpio.mode. OUTPUT) gpio.write(pin, gpio.HIGH) konec --HLAVNÍ BLOK wifi.setmode(wifi.STATION) --wifi.sta.config("název sítě","heslo") -- nastavte SSID a heslo vašeho přístupového bodu station_cfg=() tmr.delay(30000) station_cfg.ssid=" název sítě" tmr.delay(30000) station_cfg.pwd="heslo" tmr.delay(30000) wifi.sta.config(station_cfg) tmr.delay(30000) wifi.sta.connect() tmr.delay(1000000) tisk (wifi.sta.status()) print(wifi.sta.getip()) while (wifi.sta.status()~=1) do if(wifi.sta.status()==5) then break end end sv=net.createServer(net.TCP,30) tmr.delay(100) print("SERVER PŘIPRAVEN") sv:listen(4000,funkce(c) c:on("příjem", funkce(c, užitečné zatížení) tisk (payload) if (payload =="program\r\n") then c:send("připraveno\r\n") print("připraveno pro program\r\n") spi.setup(1, spi.MASTER , spi.CPOL_LOW, spi.CPHA_LOW, spi.DATABITS_8,320,spi.FULLDUPLEX) ProgrammingEnable () tmr.delay(100) InstrProgrammingEnable () tmr.delay(100) InstrFlashErase() tmr.delay=04) frame10 -počet přenesených rámců st=net.createServer(net.TCP,30) st:listen(4001,function(c) c:on("receive", function(c, payload) tmr.wdclr() Programování (payload) frame1024=frame1024+1 end) end) end if (payload =="data\r\n") then c:send("ready\r\n") print("ready for data\r\n") srv= net.createServer(net.UDP) tmr.delay(1000) pin=10 gpio.write(pin, gpio.HIGH) uart.setup(0,9600,8,0,1,0) srv:listen(5000) srv :on("receive", function(srv, pl) pl=pl*1 --print(pl) uart.write(0,pl) tmr.wdclr() end) end if (payload =="stop\r\ n") then if(st~=nula) then st:close() frame1024=0 ProgrammingDisable () print("stop program") end if(srv~=nil) then srv:close() print("stop data" ) konec konec konec) konec) konec)


    Kde odpovídající funkce dělají následující:

    funkce InstrProgrammingEnable()- uvede mikrokontrolér do programovacího režimu speciálním příkazem zaslaným přes SPI.

    funkce ProgrammingEnable()– před programováním stačí resetovat AVR na 25 ms

    functionProgrammingDisable()- po naprogramování převedeme piny SPI v ESP8266 do neaktivního stavu, aby nám nepřekážely při provádění kódu na mikrokontroléru (najednou jsou tam použity)

    funkce InstrFlashErase()- před zahájením programování přepište flash paměť na mikrokontroléru. Proč je to třeba vysvětlovat, není nutné.

    funkce InstrStorePAGE(H, adresa, data)- tímto příkazem se zapíše programový byte do vnitřní vyrovnávací paměti mikrokontroléru. Nejedná se však o samotný flash záznam, protože flash je zde zapsán po 128 bytech.

    funkce InstrWriteFLASH(adresa_stránky_nízká,_vysoká_adresa_stránky)- ale toto je bleskový záznam a vyžaduje to čas, pozor na časové zpoždění 5000 µs.

    funkce Programování (užitné zatížení)- největší a nejdůležitější funkce využívající výše uvedené funkce. Přenesený program vezme po částech o velikosti 1024 bajtů, rozdělí je na bajty a vytvoří pro ně adresy a poté je odešle do mikrokontroléru ve vnitřní vyrovnávací paměti a každých 128 bajtů inicializuje flash záznam. Poté vezme další kilobajt kódu a operaci zopakuje, samozřejmě s posunem v adresách, aby psal dále a nepřepisoval to, co bylo napsáno. Nejprve jsem zkoušel posílat celé programy, ale pokud ESP8266 přesáhne 6 kilobajtů, dostupná paměť prostě skončí a dojde k pádu. Jeden kilobajt se ukázal jako nejvhodnější jednotka, protože je přehledně rozdělen na části a pohodlně přenášen přes TCP (ještě ho potřebujeme získat z počítače). Větší velikost také není potřeba, TCP, víte, v aktuální verzi omezuje přenášený paket na 1500 bajtů nebo tak něco (ale z nějakého důvodu jsem přenesl 1440).

    Bez ohledu na to, jak je to těžké, ale bylo potřeba překonat pár nástrah.

    Registrujeme se v bezdrátové síti.

    Nejprve vytvoříme TCP server, který naslouchá třem příkazům:

    1. „program“ (budeme programovat),

    2. „data“ (budeme si vyměňovat údaje),

    3. „stop“ (všechno zastavíme).

    Pokud programujeme, pak nejprve inicializujeme SPI a vytvoříme další TCP server, který sbírá data (kód flashovaného programu) po kilobajtech a volá pro ně programovací funkce mikrokontroléru. Chápu, že vytvářet druhý server vypadá hloupě, ale je to nutnost, protože lokální API podporuje vytvoření pouze jednoho soketu a musíme oddělit příkazy „program“ a „data“ od samotných přenášených dat, protože okem se neliší, jsou zde bajty a bajty.

    Pokud nechceme programovat, ale vyměňovat si data, v našem případě je posílat do mikrokontroléru, pak nejprve pošleme řetězec „data“ přes TCP. V reakci na to již bude vytvořen UDP server (připomínám, že ovládáme dynamicky mechanickou rukou a nepotřebujeme zpoždění při vytváření TCP paketů a skutečně posíláme jeden bajt jako celý TCP rámec špatným způsobem ). A datagramy UDP budou malé a budou se tvořit rychle.

    Poté je UART inicializován a každý bezdrátově přijatý bajt je po TXD drátu odeslán do mikrokontroléru, který je povinen jej přijmout, pokud tam blikne příslušný program. Není také těžké organizovat výměnu dat opačným směrem, ale zatím jsem to neimplementoval.

    No a na příkaz „stop“ výše zmíněné servery (kromě prvního) uzavřou spojení a ten nejdůležitější server se opět dostane do stavu čekání na příkazy „program“ a „data“.

    Vzhledem k tomu, že rozhraní SPI je v ESP8266 programově emulováno, můžete použít jakékoli I/O porty pro CS, CLK, MISO, MOSI, RESET signály (pro AVR), které jsou k dispozici, a ne ty, které jsou uvedeny v mém bootloaderu. Navíc se ukázalo, že CS a MISO lze v zásadě v tomto případě také odříznout, půjde to i bez nich. No a jeden výstup je použit na LED vestavěné do desky ESP8266, takže občas zabliká a ukáže, že program stále žije.

    Nechybí kontroly chyb zápisu (s výjimkou prvního požadavku na AVR, ale tato informace se jednoduše zobrazí na konzoli), EEPROM není naprogramována, více než 32 KB není šito - zkrátka pořád něco je pracovat na. Směnný kurz přes SPI je přibližně 115 Kbps, vše se flashne během několika sekund, přibližně jako běžný sériový programátor, jako je ISP500).

    Vezměte kód, zadejte své sítě a hesla, zkompilujte jej na ESplorer, nazvěte jej „init“ (pro spuštění při restartu) a odešlete jej do ESP8266. Měl by pracovat. Alespoň ve smyslu pracovat jako bezdrátový programátor.

    Nyní se budeme zabývat ovládací stránkou – osobním počítačem.

    Ve skutečnosti musíme vzít HEX soubor, na který se vaše programy napsané v prostředí ATMEL STUDIO promění, a poslat ho přes WI-FI do nám známého socket portu (v tomto případě 4000). Malý háček je v tom, že k odeslání potřebujeme binární BIN soubor a ATMEL STUDIO nás potěší pouze HEX. Jsou zde dva východy; nebo jej převeďte do formátu BIN pomocí speciálního konvertorového programu, jako je WinHex, nebo to udělejte sami ve svém programu. Ještě jsem to neudělal, ale zdá se, že to není nic těžkého, musíte odříznout nadpis a udělat něco jiného.

    V důsledku toho jsem napsal program loader v JAVA (hlavně proto, že neumím nic jiného), pracuji v jednoduše krásném a svobodném prostředí IntelliJ IDEA. Vytvoří klienta TCP, který hledá server běžící na ESP8266. Pokud jej najde, kontaktuje jej a zašle mu soubor umístěný na takové a takové adrese. Kód níže.

    Nahrávač souborů JAVA běžící na straně PC

    import java.io.*; import java.net.*; import java.util.ArrayList; import java.util.List; veřejná třída Net( public static void main (String args) ( new Http_client(4000); )) class Http_client rozšiřuje vlákno ( int port; String s; String Greetings_from_S; Http_client(int port)( this.port = port; start(); ) public void run() ( //192.168.1.113 je adresa ESP8266 v mé síti Ale obecně se to učí z komunikace s routerem // je lepší to udělat statické, routery to mohou udělat (Socket socket = new Socket("192.168.1.113", port)) ( PrintWriter pw = new PrintWriter( new OutputStreamWriter(socket.getOutputStream()),true); pw.println("program");// Zdravíme SERVER System.out.println("program"); ​​​​BufferedReader br = new BufferedReader(new InputStreamReader(socket) .getInputStream())); Greetings_from_S = br.readLine(); System.out.println(Greetings_from_S); if(Greetings_from_S.equals("ready")) ( try ( File file = new File("d:BlinkOUT.bin) ");// adresa souboru k nahrání BufferedInputStream bis = new BufferedInputStream(new FileInputStream(soubor)); byte data = nový byte; bis.read(data); byte data_buffer = nový byte; int frames = data.length/1024 System.out.println(frames); int bydliště = data.length%1024; for (int i = 0; i< frames;i++) { for (int k = 0; k< (1024); k++) { data_buffer[k] = data; } sendingChunk(data_buffer); } byte data_buffer2= new byte; for (int i = 0; i < residy;i++) { data_buffer2[i] = data; } sendingChunk(data_buffer2); pw.println("stop");// System.out.println("stop program"); } catch (Exception e) { System.out.println(e); } } } catch (Exception e) { System.out.println(e); } } public void sendingChunk (byte data_buffer){ try (Socket socket = new Socket("192.168.1.113", 4001)){ BufferedOutputStream bos = new BufferedOutputStream((socket.getOutputStream())); bos.write(data_buffer); bos.flush(); System.out.println(data_buffer.length); } catch (Exception e) { System.out.println(e); } } }


    Zde se samozřejmě navíjejí nadbytečné věci, všemožné připravené v zásadě nejsou potřeba. Pokud je navázáno TCP spojení, je navázáno. Jediným problémem bylo, že soubor nechtěl být odeslán v sudých blocích po 1024 bajtech, jak jsem opravdu potřeboval, ačkoliv jsem výslovně uvedl velikost. Zřejmě je tam z JAVA nepřístupný nějaký finální buffer a ten posílá pakety v takové velikosti, jakou chce, což je pro přijímající stranu naprosto nepřijatelné. Nejprve jsem se snažil udělat zpoždění, aby se buffer omrzel čekáním na další kusy a poslal to tak, jak to je. Prodleva ale začala fungovat, když dosáhla 10 sekund, což se mi na jeden přenesený kilobajt zdálo nějak moc.

    Pak jsem si ale všiml, že z nějakého důvodu vždy první kus vyjde přesně podle objednávky a od druhého začíná nepředvídatelná bakchanálie. Proto jsem to udělal tak, že klient otevřel spojení, poslal část kódu v 1024 bajtech a spojení uzavřel. A tak dále, dokud není odeslán celý soubor. Vše úspěšně fungovalo.

    Jediná věc je, že k jeho spuštění je potřeba nainstalovat do počítače běhové prostředí JAVA. Ale obvykle začínám okamžitě od IntelliJ IDEA, protože tam vždy vidíte, co se děje v konzoli (ale zde je také potřeba prostředí JAVA). I když je samozřejmě potřeba udělat GUI chytrým způsobem. Tedy okno, kde vypadne cesta k souboru, možnost změnit čísla portů ve stejném okně a no a další potřebné věci. A to vše shromáždit ve formě spustitelného souboru.

    A tapericho, jak říkal Korovjev, vraťme občany vlastně k mechanickému údu MechArmu, který byl zmíněn hned na začátku. Nyní máme možnost jej vzdáleně naprogramovat a následně ovládat. Přejděme k ovládacímu programu na straně mikrokontroléru.

    V tomto případě potřebujeme ovládat čtyři serva. Tyto jsou.


    Takový pohon je řízen pravoúhlými impulsy, perioda 20 ms (50 Hz) s pracovním cyklem 2 až 4 procenta. To znamená, že 2 % je úplný obrat v jednom směru, 4 % ve druhém. Úkol je pouze pro vestavěné PWM v AVR.

    Jedno servo se používá pro pohyb zprava doleva; druhý na sebe - od sebe; třetí nahoru-dolů; čtvrtý je samotný dráp, který je nutné stlačit a uvolnit. Vše je napsáno v C a zkompilováno do HEX souboru v ATMEL STUDIO. Trochu zvláštní vzhled programu je způsoben tím, že zpočátku byla ruka ovládána z klávesnice přivázané dráty k mikrokontroléru. Ale dráty jsou včera, musíme se vyvinout dál.

    Samozřejmě můžete použít skici pro serva od "ARDUINO", ale mě se nelíbily. Je zábavnější psát sám. Kromě toho musí všechna čtyři serva pracovat současně a ne v multiplexním režimu, když je PWM postupně přepínáno na každé servo. Nikdo totiž nezrušil gravitaci a zvednutá končetina okamžitě spadne, pokud řídicí impulsy přestanou přijímat řídicí impulsy na odpovídající servo. Nejsem si jistý, zda skica "ARDUINO" poskytuje současný provoz pro čtyři serva. Ale my sami dokážeme napsat program, který splňuje potřebné požadavky. A obecně, při absenci operačního systému, který odděluje ovce od koz, je použití náčrtů soutěžících o periferie mikrokontrolérů (a ani předem nevíme, které) příliš bug-produkující.

    Zde je skutečný kód, který zapisujeme do Arduino Nano pomocí ESP8266-07.

    Ovládací program MechArm pro mikrokontrolér AVRmega328P

    #define F_CPU 16000000 #zahrnout #zahrnout // standardní celá čísla #include #zahrnout // math #include //standardní I/O #include #zahrnout #zahrnout //standardní funkce #define UART_BAUD_RATE 115200 // čítač T1 nastaví časový interval 20ms #define COUNTER1_OFF TCCR1B=0b00000000 // CS02 CS01 CS00 - 000 - vypnuto; 001 bez přepážky; 010 s dělitelem 8; 011-64; 100-256; 101 -1024 #define COUNTER1_ON TCCR1B=0b00000011 // čítač T0 nastavuje šířku řídicího impulzu pro serva PB0 a PB1 #define COUNTER0_OFF TCCR0B=0b00000000 // CS02 CS01 CS00 - 000 - zakázáno 001 bez přepážky; 010 s dělitelem 8; 011-64; 100-256; 101 -1024 #define COUNTER0_ON TCCR0B=0b00000100 // čítač T2 nastavuje šířku řídicího impulsu pro serva РB2(PD6) a РВ3(PD7) #define COUNTER2_OFF TCCR2B=0b000/000001 CS0001 zakázán; 001 bez přepážky; 010 s dělitelem 8; 011-64; 100-256; 101 -1024 #define COUNTER2_ON TCCR2B=0b00000110 volatile uint16_t period_20ms; volatile uint8_t Stav_klávesnice; volatilní uint8_t počáteční_pozice ; volatile int8_t číslo_servo; ISR(USART_RX_vect)// přerušení pro UART ( State_of_keyboard=UDR0; return; ) ISR(TIMER0_COMPA_vect)// šířka řídicího impulsu serva PB0 ( PORTB &=~(1<<0); TIMSK0&=~(1<
    Podstata programu je zřejmá z textu a komentářů. Čítač T1 používáme pro referenční období 20 ms a čítače T0, T2 pro vydávání signálů PWM do čtyř linek I/O portu, protože každý z těchto dvou čítačů může pracovat pro dvě zařízení.
    Program nastaví počáteční polohy serv načtením čítacích registrů OCR0A, OCR0B, OCR2A, OCR2B. Jsou také zavedeny limitní konstanty, protože ne vždy potřebujeme rozpětí 180 stupňů. No a dále, přerušením od UART, program zachytí číslo zaslané ESP8266 (od 1 do 8) a převede ho na příkaz pro odpovídající servo. Jednotky jsou čtyři, každý pracuje ve dvou směrech, takže stačí celá čísla od jedné do osmi. Jakmile je zvoleno číslo, obsah výše uvedených čítačových registrů je buď inkrementován nebo dekrementován, přičemž se mění pracovní cyklus řídicího impulsu a úhel natočení zvoleného serva. Pohony, které jsme nevybrali, si zachovávají starou hodnotu úhlu natočení (protože obsah odpovídajících registrů, i když byl aktualizován, se nezměnil) a nadále drží mechanické rameno ve stejné poloze.

    Teď nám zbývá napsat ovládací program, pardon za tautologii, pro ovládání mechanického ramene přímo z počítače přes WI-FI.
    Kód je také napsán v JAVA, ale trochu zušlechtěný. Bylo tam GUI a možnost upravovat čísla portů a síťovou adresu ESP8266.

    Co se tam děje, je jasné z okna. Text programu zde neuvádím (je dostupný na

    Dobré odpoledne

    Nedávno jsem se začal zajímat o myšlenku vytvořit "chytrý dům". Jelikož jediné potřebné komponenty, které mám k dispozici, jsou zatím arduino a telefon s Androidem, bylo rozhodnuto začít vytvořením ovládacího panelu a jeho propojením se zbytkem systému.

    Moje vize systému vypadá takto:

    Myslím, že se vyplatí zkombinovat domácí a webové servery zakoupením statické IP, ale poprvé to bude stačit. Začněme jednoduše – naučte se na dálku ovládat LED a LCD displej.

    webový server
    Na webovém serveru vytvoříme databázi se dvěma tabulkami - led a texty. Tabulka LED obsahuje 2 pole – id a status. Obsahuje jeden záznam s aktuálním stavem LED. Tabulka textů obsahuje 2 pole - id a text. Obsahuje také jeden záznam s textem aktuálně zobrazeným na LCD.

    Nyní si napíšeme pár skriptů, které budeme volat z telefonu a přenášet informace do databáze. Píšeme v php.

    Skript led.php (kontrola LED):

    Skript msg.php (ovládání LCD):

    Myslím, že z komentářů je jasné, jak tyto skripty fungují. To je vše, co je na webovém serveru. Nyní přejdeme k domovskému serveru (nebo jednodušeji k počítači, ke kterému je arduino připojeno).

    domácí server
    Neustále na něm bude pracovat program (můžete ho nazvat i démonem), posílat požadavky do databáze a když se změní informace tam umístěné, pošle z arduina příslušný příkaz na COM port. Napišme program v jazyce Processing:

    Importovat zpracování.seriál.*; //knihovna pro práci s COM portem import de.bezier.data.sql.*; // knihovna pro práci s databází MySQL Sériový port; dbconnection MySQL; int prevLEDState = 0; //předchozí stav LED String prevS = ""; //předchozí text odeslaný na LCD void setup() ( port = new Serial(this, "COM4", 9600); //inicializace COM portu 4 (Arduin není připojen), přenosová rychlost je 9600 port. bufferUntil("\ n"); String user = "username"; String pass = "heslo"; String database = "dbname"; dbconnection = new MySQL(this, "yourdomain.ru", databáze, uživatel, pass); / /připojit k database dbconnection.connect(); ) void draw() ( //monitorování informací o LED v databázi dbconnection.query("SELECT * FROM LED WHERE id = "1""); //proveďte dotaz do tabulky LED while (dbconnection.next()) //procházení výběru z výsledku dotazu ( int n = dbconnection.getInt("status"); //získání hodnoty ze stavového pole if (n != prevLEDState) //pokud je se změnil oproti předchozímu "cyklu" programu, pak odešleme příkaz na COM port ( prevLEDState = n; port.write("1"); //první přenesený znak bude znamenat kód právě probíhající operace provedeno: 1 - ovládání LED, 2 - ovládání LCD port.write(n); ) ) //sledování informací o LCD v databázi dbconnection.query("SELECT * FROM texts WHERE id = "1""); //provede dotaz na textovou tabulku, zatímco (dbconnection.next())//projde výběr z výsledku dotazu (String s = dbconnection.getString("text"); //získáte hodnotu z textového pole if ( s != prevS) ( prevS = s;port.write("2"); port.write(s); ) ) delay(50); // udělejte zpoždění 50 ms, abyste neodesílali požadavky nepřetržitě)
    Ani tento kód nebudu vysvětlovat, vše je jasné.
    Další důležitý bod. Aby mohl program z našeho počítače přistupovat k databázi umístěné na vzdáleném serveru, musí to být povoleno. Zadejte naši IP do seznamu povolených:

    Telefonní aplikace
    Mám telefon s Androidem, píšeme si o něj. Nebudu se příliš rozepisovat (je to velmi dobré jak o instalaci programovacího prostředí, tak o psaní první aplikace v tomto článku - odkaz).

    Vzhled aplikace vypadá poměrně skromně, ale v tomto případě to není to hlavní:

    Uvedu pouze fragmenty kódu programu pro Android. Funkce, která volá skript, který ovládá LED:
    public void changeLED() ( try ( URL url1 = new URL("http://your_domain.ru/led.php"); HttpURLConnection urlConnection = (HttpURLConnection) url1.openConnection(); try ( InputStream in = new BufferedInputStream(urlConnection) .getInputStream()); ) nakonec ( urlConnection.disconnect(); ) ) catch (Výjimka e) ( ) )
    Funkce, která odesílá text k zobrazení na LCD:
    public void submitMsg() ( final EditText tt = (EditText) findViewById(R.id.editText1); try ( URL url1 = new URL("http://your_domain.ru/msg.php?msg="+tt.getText ()); HttpURLConnection urlConnection = (HttpURLConnection) url1.openConnection(); zkuste ( InputStream in = new BufferedInputStream(urlConnection.getInputStream()); ) nakonec ( urlConnection.disconnect(); ) ) catch (Výjimka) e) ( )
    No, hlavní funkce, ve které jsou obsluhy událostí vázány na tlačítka:
    public void onCreate(Bundle SavedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.main); final Button btn1 = (Button) findViewById(R.id.button1); btn1.setOnClickListener(new Button.On)ClickListener ( public void onClick(View v) // kliknutí na tlačítko ( changeLED(); ) )); final Button btn2 = (Button) findViewById(R.id.button2); btn2.setOnClickListener(new Button.OnClickListener() ( public void onClick(View v) // kliknutí na tlačítko ( submitMsg(); ) )); )
    A ještě jeden důležitý bod je přidat do aplikace oprávnění pro přístup k internetu. Chcete-li to provést, přidejte řádek do souboru AndroidManifest.xml (nachází se v adresáři naší aplikace pro Android):

    Exportujeme naši aplikaci do souboru APK a nainstalujeme ji do telefonu. Ovládací panel chytré domácnosti je připraven!

    Arduino
    A nakonec, v neposlední řadě – připojení arduina a jeho firmwaru. Schéma připojení LCD obrazovky a LED k Arduino Uno je následující:

    Vezmeme odpor 220 ohmů. Více o připojení LCD obrazovky si můžete přečíst zde - odkaz

    A takhle to všechno vypadá ve skutečnosti:

    Je to opravdu krásné?

    Úkolem arduina je poslouchat, co program démona na domácím serveru posílá na COM port, ke kterému je arduino připojeno (i když skutečné připojení je přes USB kabel, ale počítač jej rozpozná jako sériový port). Po přijetí jakýchkoliv dat z počítače ovladač rozpozná příkazový kód podle prvního znaku přenášené informace (tedy toho, co má být nyní ovládáno - LCD displej nebo LED). Dále, v závislosti na kódu a informacích následujících za ním, se buď rozsvítí / zhasne LED, nebo se zobrazí přenášená zpráva. Takže tady je skutečný kód:

    #zahrnout //vestavěná knihovna pro práci s LCD displejem boolean isExecuting = false; //proměnná odrážející, že nějaký příkaz se již provádí //Hned vysvětlím, proč je to potřeba. Pro každý „tik“ smyčky načte Arduino kód jednoho znaku z COM portu. //Proto bude řetězec přenášen v několika cyklech. V tomto případě se před každým ze dvou možných příkazů (změna stavu LED a odeslání textu na displej) odešle //kód tohoto příkazu (1 a 2). Tato proměnná se //používá k oddělení kódů příkazů od dalších informací (stav LED nebo text na displeji). LiquidCrystal lcd(4,5,10,11,12,13); //zobrazení inicializace int ledPin = 8; //číslo Arduino pinu, ke kterému je LED připojena int prevLEDStatus = 0; //předchozí stav LED (zapnuto/vypnuto) int newLEDStatus = 0; //nový stav LED int cmd = 0; //kód provedeného příkazu void setup() ( Serial.begin(9600); //inicializace COM portu (9600 - přenosová rychlost) pinMode(ledPin,OUTPUT); //inicializace 8. pinu arduina as lcd výstup. begin(20,4); //inicializace LCD displeje (4 řádky po 20 znacích) ) void loop() ( if (Serial.available() > 0) //pokud na COM port ( if (isExecuting == false) //pokud v tuto chvíli není prováděn žádný příkaz ( cmd = Serial.read() - "0"; //přečtěte si kód prováděného příkazu isExecuting = true; // nyní proměnná indikuje, že provádění příkazu začalo ) if (cmd == 1) //ovládání LED ( newLEDStatus = (int) Serial.read(); //přečtení nového stavu LED if (newLEDStatus != prevLEDStatus) //pokud se změnil oproti aktuálnímu stavu, pak změň aktuální stav ( digitalWrite(ledPin,newLEDStatus); prevLEDStatus = newLEDStatus; ) ) else //zobrazí ovládací prvek ( if (isExecuting == false) //pokud žádný příkaz právě probíhá ( lcd.clear(); //vymazat obrazovku ) else ( lcd.print((char)Serial.read()); //vytisknout znak na displej ) ) ) else //pokud na COM port nepřišla žádná informace ( delay(50); // udělá zpoždění 50 ms if (Serial.available()<= 0) //если информации по-прежнему нет isExecuting = false; //считаем, что никакая команда не выполняется } }
    Myslím, že to nevyžaduje vysvětlení, protože jsem vše popsal velmi podrobně v komentářích. Jediná věc, která stojí za zmínku, jsou určitá omezení týkající se řetězců předávaných k zobrazení. Nesmí obsahovat mezery (toto omezení je způsobeno nedokonalostí mého algoritmu) a nesmí obsahovat azbuku (protože ji nepodporují všechny displeje, a pokud je podporována, vyžaduje přenos kódů znaků ve vlastním kódování, převádění postav, do kterých nejsou žádné touhy).

    Závěr
    Dobře, teď je po všem. Ukázalo se, že je to docela jednoduché.
    Video jak to funguje:

    Desky Arduino a podobné mikrokontroléry činí kreativitu přístupnější než kdy jindy, píší. Ať už se používá k automatizaci vašeho domova nebo ovládání LED pásků nebo dokonce k ochraně vašeho majetku, tyto úžasné malé technické pomůcky jsou srdcem většiny elektronických zařízení pro kutily.

    Pokud potřebujete svému Arduinu přikázat, aby změnilo polohu propojek pinů (například rozsvítilo světlo), pak bude Arduino vyžadovat, aby uživatel stiskl fyzické tlačítko nebo použil senzor. Pro mnoho projektů je použití tlaku lidského prstu nebo podobné metody ovládání zařízení naprosto přijatelné, ale co by se mělo použít, pokud byste chtěli postavit pouze obvod s možností vzdáleného přístupu?

    Tento článek poskytuje stručný popis šesti způsobů, jak připojit vaše zařízení Android k jakékoli kompatibilní desce Arduino.

    1. ArduinoDroid umožňuje vytvářet náčrty

    Prvním zařízením na našem seznamu je ArduinoDroid. Tato aplikace funguje přes USB On The Go (OTG), připojuje vaše mobilní zařízení k Arduinu pomocí USB kabelu. Jednou z výhod kabelu USB je, že pro fungování zařízení nepotřebujete připojení k internetu nebo Bluetooth.

    Aplikace je plnohodnotné IDE, které uživateli umožňuje psát kód na chytrém telefonu, nahrávat dříve napsané náčrty, které jsou uloženy v Dropboxu nebo na disku Google, a poté spustit proces kompilace.

    Výhody používání aplikace ArduinoDroid jsou jasné. Mít po ruce IDE vám umožní rychle provádět změny v polích a proces připojení zařízení Android je méně komplikovaný a časově náročný než pokus o vyvážení objemného notebooku na ruce!

    Zjevnou nevýhodou aplikace ArduinoDroid je, že psaní kódu na vašem zařízení může být trochu utrpení, zvláště pokud k tomuto účelu používáte smartphone. Tato slabá stránka aplikace však není tak výrazná, když na jedné straně váhy je pohodlí ultrapřenosného způsobu programování na vaší desce bez nutnosti připojení k internetu a na druhé straně váhy není příliš pohodlný způsob psaní kódu.

    Na druhou stranu, mít ArduinoDroid je levný způsob, jak se naučit základy Arduina, protože klon desky arduino a USB On The Go stojí pár dolarů. Pro ty, kteří mají zřídka přístup k počítači, je aplikace ArduinoDroid skvělou alternativou!

    2. Ovladač Arduino Bluetooth

    Dalším programem na našem seznamu je příhodně pojmenovaný Arduino Bluetooth Controller. Tato aplikace má velký význam pro spouštění změn v nahraných skicách a méně důležitá pro programování Arduina. Ovladač Arduino Bluetooth posílá data na vaši desku přes Bluetooth, což vám umožňuje odesílat sériová data stisknutím tlačítka. Budete potřebovat bluetooth modul pro vaši desku, i když modul HC-06široce používané a dostupné za pouhých 3 $.

    Za zmínku stojí skutečnost, že program je stažen v angličtině, ačkoli obrázky v Obchodě Play ukazují italštinu!

    3. Blynk aplikace pro vývoj projektu

    Aplikace Blynk je skvělý vývoj pro vytváření projektů. Flexibilita a jednoduchost aplikace poskytuje intuitivní přístup ke spouštění událostí na vaší desce. Práce s Blynk vyžaduje připojení k internetu, protože aplikace používá svůj vlastní server. Pro přístup k aplikaci Blynk, která je skvělá pro chytré telefony, můžete použít buď Wi-Fi, nebo mobilní data.

    Jednou z nejsilnějších stránek aplikace je variabilita připojení k zařízení. Díky podpoře téměř všech vývojových desek se můžete k serveru připojit bezdrátově nebo pomocí ethernetu a dokonce i počítače přes USB. Služba je dobře zdokumentována a její intuitivní aplikace usnadňuje integraci vlastní kontroly nad vaším projektem. Knihovna Blynk pro Arduino IDE zpracovává veškerou komunikaci.

    Pokud dáváte přednost zapnutí kávovaru pomocí smartphonu, než brzy ráno vstanete z postele, tato aplikace je opravdu pro vás!

    Blynk není jedinou službou v této kategorii. Stojí za to věnovat pozornost tak extrémně přizpůsobené službě, jako je Thinger.io a téměř neomezený, i když extrémně obtížný OpenHAB. Z těchto tří služeb se nejrychleji zprovozňuje Blynk, ačkoli učení OpenHAB je z dlouhodobého hlediska skvělý nápad.

    4. Komunikace od nuly

    Výše popsané aplikace předpokládají použití již existujících služeb, které vám pomáhají při poskytování různých možností připojení. Co musíte udělat, abyste měli úplnou a úplnou kontrolu nad každým aspektem svých aplikací pro zařízení Android? Proč tento problém nevyřešíte sami a od nuly?

    Problém poskytování kontroly nad balíkem aplikací je vyřešen pouhým otevřením USB komunikace a reciproční přenos sériových dat mezi aplikacemi a deskou Arduino. Tato možnost ovládání je jedním z nejlepších způsobů, jak začít s Android Studio a vytvářením aplikací obecně.

    Je třeba poznamenat, že za přítomnosti metod a metod pro vytváření aplikací pro zařízení na platformě Android bez kódu si studium základů softwarového kódování v Javě zaslouží pozornost.

    5. Proměňte své Arduino na server

    Alternativní způsob, jak komunikovat s vaší deskou, je přeměnit ji na malý server. Klíčovou výhodou této transformace desky na server je možnost komunikovat s deskami z jakéhokoli zařízení, které dokáže přejít na IP adresu nebo odeslat webový požadavek. To bude vyžadovat přílohu ethernet štít na vaši domácí síťovou kartu.

    Pokud nemáte Ethernet shield , pak lze podobného efektu dosáhnout pomocí štítu Wi-Fi nebo prostřednictvím desky připojené k Wi-Fi, jako je NodeMCU.

    Pokud je kód node.js vaším jamem, má smysl podívat se na projekt arduino-android github. Opět platí, že aplikace pro Android jsou open source a vše, co musíte udělat, je nainstalovat server node.js na desku Arduino dle vašeho výběru.

    6. Infračervené ovládání

    Pokud hledáte univerzální komunikační nástroj se svým Arduinem nebo byste si rádi zahráli roli legendárního tajného agenta MacGyvera, pak se podívejte infračervený přijímač(IT) z vašeho starého stereo nebo VHS přehrávače a použijte jej ke komunikaci s vaší deskou Arduino!