ESP8266 + C328R aneb WiFi (still) kamerka snadno a rychle

IMG_9637_webV diskuzi k Wemos D1 jsem se zmiňoval o projektu, kde jsem narazil na problém se sdílením signálů TX a RX mezi USB převodníkem a aplikací. Destička Witty ale zatím bohužel nedorazila a já musel objednat novou. Protože jsem ale chtěl alespoň část projektu vyzkoušet, pokusil jsem se jít malinko jinou cestou. Jde o to, že mě napadlo, kdyby, na tomto webu již zmiňovaná meteostanice pro Jirky, uměla ještě něco navíc – to “něco” by mělo být pořizování a přenos fotografií z modulku kamery, umístěné přímo ve vnější jednotce stanice.

Protože samotný ESP8266 nestačí pro přímé připojení kamerového modulu pomohl jsem si trikem – rozhodl jsem se použít snímací prvek se sériovým rozhraním a JPEG kompresí. Takové moduly se dají pořídit na Aliexpress za něco kolem $16 a já doma objevil pro první pokusy letitý modul C328R (už se nedodává). Zapojení jsem prozatím realizoval na nepájivém kontaktním poli a je velmi jednoduché – kamera vyžaduje pouze napájení 3,3V a dva komunikační signály TXD a RXD.IMG_9634_web

Protože přenášený datový objem mezi kamerou a ESP8266 je relativně velký, chtěl jsem pro spojení použít hardwarový sériový port, který je normálně použitý pro programování. Abych nepřišel o komfort nahrávání a nemusel jsem pořád kamerový modul odpojovat, doplnil jsem skript o možnost nahrání firmware přes WiFi použitím knihovny ArduinoOTA. Tohle byl můj již asi třetí pokus o použití OTA a teprve tentokrát vyšel – je však třeba dodržet následující pravidla (pracuji na systému Windows 7 64, takže nevím, zda uvedené platí i pro ostatní OS).

  • Používám Arduino IDE ve verzi 1.6.7, nainstalovanou ve variantě “portable”
  • Verzi jádra pro ESP8266 používám Stable 2.0.0, nainstalovanou přes správce desek
  • Poprvé je třeba nahrát skript přes sériové rozhraní. Po restartu modulu se spustí vše, co je potřebné pro běh OTA
  • Vždy je třeba, aby bylo ESP8266 zapnuté dříve, než spustíme Arduino IDE, jinak se zařízení neobjeví v seznamu dostupných portů pro programování. Viděl jsem sice na internetu tvrzení, že se port časem objeví i pokud zapneme modul až po spuštění IDE, ale já jsem takové chování ještě nezaznamenal

Správně běžící OTA skript v modulu se projeví zobrazením v síťových portech v IDE.

D1C328_IDE

Tímto jsem se sice zbavil softwareového problému sdílení sériového portu, ale při realizaci vyvstal problém jiný – kamerový modul nestačil “přetáhnout” svým TXD výstupem výstup z CH340 i když byly oba odděleny odpory 470 ohmů a docházelo k chybám přenosu zejména na vyšších rychlostech (tohle je právě okamžik, kdy se projeví rozdíl v konstrukci mezi Wemos D1 mini a Witty).

Protože ale desku Witty ještě nemám, tak jsem zkusil sériový přenos prozatím realizovat přes knihovnu SoftwareSerial (jde mi zatím spíše o Proof-of-Concept nežli o finální realizaci). Výsledek je vidět na dalším obrázku:

D1C328_Foto

Na obrázku je vidět webová stránka, servírovaná přímo modulem ESP8266. Fotografie je v rozlišení 640×480 (maximální, co “umí” kamera), přenášená ve formátu JPEG. Výsledná velikost obrázku se pohybuje okolo 36kB a přenos trvá cca 48 sekund. Je to proto, že sériová rychlost komunikace s kamerou je 14400Bd díky použití SoftwareSerial. Sestava, použitá pro programování a pořízení fotografie vypadala takto:

IMG_9635_web

Na stativu je obyčejnou gumičkou připevněna sestava kamery na nepájivém poli

IMG_9636_web

a celek je pouze napájený USB nabíječkou od mobilního telefonu. Jak programování, tak pořizování snímků běží přes Wifi.

Na závěr přikládám zdrojový kód skriptu

D1C328 (2.3 KiB, 742 downloads)

… a modifikovanou knihovnu pro obsluhu kamery C328

CameraC328R (6.4 KiB, 766 downloads)

Knihovnu WiFiConfig nepřikládám – je možné ji stáhnout z těchto stránek.

A opět opakuji – jedná se pouze o část většího projektu a spíš o ověření možností, než o hotový celek, přesto uvítám náměty…

D1C328
D1C328
D1C328.zip
2.3 KiB
742 Downloads
Detaily
CameraC328R
CameraC328R
CameraC328R.zip
6.4 KiB
766 Downloads
Detaily

18 komentářů u „ESP8266 + C328R aneb WiFi (still) kamerka snadno a rychle“

  1. Krásná práce, bych nevěřil, že to bude fungovat. Řeším podobnou věc, a potřeboval bych trochu nasměrovat:
    mám esp8266-01 a chtěl bych po seriovém portu přijímat data z arduina, který by se zobrazovaly přes webserver a zároveň ovládat z webu arduino zase přes sériový port.
    Mám něco podobnýho s arduinem a w5100, ale tady bych asi potřeboval nějakej tip.

  2. Tohle je to co bych asi úplně nechtěl, je to sice nejjednodušší a je to skoro to stejný jako mám s w5100, jenom je tam pár AT příkazů pro spuštění esp, mě ale láká využít esp8266 s knihovnou pro konfiguraci a vnitřní webserver, kde bych zasílal z arduina data třeba ve formátu u 152, p 524, e 125225…. a zpracoval je v esp kde bude spuštěn webserver, a zase zpět by mi přicházelo zpracované http get třeba ve formátu u +, umax 250, pmax 450, off, on, a podobně, tohle v arduinu umím zpracovat, ale nevím jak s webserverem v esp8266.
    Takhle bych to chtěl i pro to, že třeba někdo změní wifi síť, a bez přeprogramování je to mrtvý zařízení, navíc bych chtěl udělat pár kusů pro známý, a aby si to mohli sami nakonfigurovat (teda hlavně připojení k wifi)
    Karel
    PS. klidně mi tykej.

  3. Tak to je paráda. Já tím ovládám relátka. Ještě jsem se dozvěděl, že jde pro webové stránky jde použít i SPIFFS (SPI Flash File System), vnitřní filesystém.

  4. Bojuji s OTA. Udělal jsem to (snad) podle Vašeho článku a částečný úspěch. (Napřed to hlásilo, že nemůže najít python, tak jsem zadal cestu do platform.txt c:\KiCad\bin\python.exe) a nahrávání se zahájí a pak zastaví. Když dám seriový monitor, tak na mě vyskočí okno Arduino IDE :”Zadejte přístupové heslo ke konzoli vývojové desky”
    Co jsem přehlédnul?
    Děkuji

  5. Tak wifi konfig ok, akorát bych potřeboval to tlačítko na gpio2 (mám esp8266-01 a port budu potřebovat) a nikde jsem nenašel jaké by to mělo být číslo pinu pro arduino ide….můžete někdo poradit?

    1. No přímo na githubu Arduino ESP8266 je napsaný tohle:

      Pin numbers in Arduino correspond directly to the ESP8266 GPIO pin numbers. pinMode, digitalRead, and digitalWrite functions work as usual, so to read GPIO2, call digitalRead(2).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.