NodeMCU: WiFi žaisliukas, 1 dalis

Posted: 2018-01-28 in Darbeliai
Žymos:, ,

NodeMCU yra tokia gudri eLua pagrįsta firmwarė, kurią galima sugrūsti į ESP8266 mikroschemą ir kodyti visokius IoT daikčiukus su Lua. Su sąlyga, kad aš esu Lua profas, šitas žaisliukas mane smarkiai sudomino. Aišku, man dar ir su STM mikrovaldikliais yra kur tobulintis, bet norisi ir prasiplėsti šviežiai. NodeMCU, aišku, didžiausias džiaugsmas tame, kad jis turi WiFi ir praktiškai nebelieka problemų su visokiais prijungimais ir galvojimais, kaip čia bitukus persiųsti. Pridedam čia dar MQTT ir galim pradėti kurti visokius briedus ir brėdžius.

Užsisakiau iš draugiškųjų kinų pabandymui porą ESP8266 devboardukų su integruotais CH341 USB-UART keitikliais:

Bandomoji NodeMCU ESP8266 plokštė iš AliExpress | Darau, blė

Atkeliavo, prijungiau prie kompo, prisijungiau su 115200 bodų greičiu. Nieko. Paspaudžiu „reset“ knopkę — į ekraną pabyra krūvelė brėdžių ir tada atsiranda užrašiukas „ready“. Aiškus reikalas, kad ten kažkokia firmwarė sukišta, bet kokia — neaišku. Tikrai ne NodeMCU, nes tada iš karto Lua promptas atsirast turėtų. Nieko nebus, einam aiškintis, ką sukompiliuot ir ką daryt.

Užbėgdamas už akių pasakysiu, kad NodeMCU firmwarę galimą kažkur debesyse susikompiliuot ir tik susikišt į savo turimą plokštę. Bet aš nusprendžiau viską pasikurti ant nuosavo kompiuterio, nes, nu, galbūt sugalvosiu firmwarę pakodyt giliau. O ir įdomiau šitaip, truputį daugiau galima išsiaiškint. Gi susirinkom čia smagiai ir įdomiai laiką praleist, o ne būti eiliniais vartotojais, ne?

Dabar taip. Kad galima būtų pasidaryti NodeMCU firmwarę pačiam, reikia dviejų dalykų: gamintojo SDK ir NodeMCU firmwarės. Ir čia yra smulkmena: pirmiausia reikia nueiti į NodeMCU githubą ir pasižiūrėti, su kokia SDK versija yra pagaminta paskutinė NodeMCU versija! Nesgi kompiliuojant SDK reikia pasirinkti jo versiją. Galit iš lempos pasirinkti pačią naujausią, bet gal ji dar NodeMCU nepalaikoma. Tai va.

Kai jau žinom, tai pirmas dalykas, kurį reikia susikompiliuot — gamintojo SDK. Kitaip sakant, visas įrankynas, su kuriuo jau paskui galima norimas firmwares gamintis. Labai išsamiai parašyta, kaip ten viską setupintis. Aišku, aš viską pasileidau ant savo darbinio kompiuterio su Linuxu, tai ten visą info apie virtualios mašinos kūrimą praleidau. Kaip jūs susibuildinsit SDK, tai jau jūsų reikalas, galit ir virtualkę pasikurt. Parsisiųskit ką nors iš OSBoxes ir viskas, bus paprasta ir malonu.

Tiesa, šitame aprašyme yra juokingas toks momentas. Parašyta, iš kur SDK parsisiųst, kaip kompiliuot, kaip jo versiją nusistatyt. Bet kokias priklausomybes suinstaliuoti — parašyta tik pačioj apačioj 😀 Nu keistai kažkaip. Tad ką reikia susidėti su „apt-get“, žiūrėkit pirma puslapio apačioje, o paskui grįžkit prie kompiliavimo.

Susikompiliavo viskas paprastai. Tada į kelią (PATH) įsitraukiam, kas parašyta aprašyme ir einam toliau.

Antras dalykas — NodeMCU firmwarės kompiliavimas. Pasiimam naujausią NodeMCU iš githubo. Tada pagal šį aprašymą einam galvot, kokius modulius norėsim įkompiliuot. Čia kai kuriems gali būti baisioji dalis, bet man pasirodė viskas paprasta. Modulių sąrašas yra pateiktas, tai belieka sugalvot ko iš jo norėsit. Norėsit, pavyzdžiui, DS18B20 termometrų palaikymo — įsidėkit. Reikės ADC? Nereikės — nedėkit. Čia reikia pasistengti apsiriboti, kad neprisidėtumėt ko reikia ir ko nereikia. WiFi ir NET modulių reikia būtinai, MQTT — jei naudosit. O toliau jau viskas savo nuožiūra. Dar siūlau app/include/user_version.h pasiredaguot, kad būtų smagiau 🙂

Ir vėl kompiliuojam. Jei viskas gerai, tai bin kataloge rasit du failu: 0x00000.bin ir 0x10000.bin. Galima kažkaip ir vieną biną pasidaryt, bet nesigilinau, nesudėtinga sukišt ir du.

Gamintojo SDK yra toks esptool.py įrankėlis firmwarėms įrašinėti. Pirmiausia, sako, reikia išsiaiškinti, kokia plokštė yra, kiek ji atminties turi. Bandom:

$ esptool.py --port /dev/ttyUSB1 flash_id
esptool.py v1.2
Connecting...
Manufacturer: 5e
Device: 4016

4016 yra 32 Mb (megabitų) plokštė, t.y. 4 MB flash atminties. Nuo to, kokia flash apimtis, priklauso firmarės įrašymo metodas. Šiuo atveju tai yra dio. Na ir įrašom tuomet firmwarę:

$ esptool.py --port /dev/ttyUSB1 write_flash -fm dio 0x
0x00000.bin  0x10000.bin  
sp@X:~/Programs/ESP-8266/nodemcu-firmware/bin$ esptool.py --port /dev/ttyUSB1 write_flash -fm dio 0x00000 0x00000.bin 
esptool.py v1.2
Connecting...
Auto-detected Flash size: 32m
Running Cesanta flasher stub...
Flash params set to 0x0240
Writing 32768 @ 0x0... 32768 (100 %)
Wrote 32768 bytes at 0x0 in 2.9 seconds (92.0 kbit/s)...
Leaving...

$ esptool.py --port /dev/ttyUSB1 write_flash -fm dio 0x10000 0x10000.bin 
esptool.py v1.2
Connecting...
Auto-detected Flash size: 32m
Running Cesanta flasher stub...
Writing 376832 @ 0x10000... 376832 (100 %)
Wrote 376832 bytes at 0x10000 in 32.7 seconds (92.3 kbit/s)...
Leaving...

Viskas susirašė. Jungiamės į terminalą pažiūrėt, kas gero yra. O ten gerai, pakraigalioja biškį hieroglifų ir išdidžiai parašo:

NodeMCU 2.1.0 Darau, ble build 2018-01-25 powered by Lua 5.1.4 on SDK 2.1.0(116b762)
lua: cannot open init.lua
>

Galima barškinti interaktyvų Lua kodą ir žiūrėt, kas gausis 🙂

Be abejo, „Hello, world“ atitikmuo — pabandyti prisijungti prie savo WiFi tinklo ir pažiūrėti, ar duos IP adresą:

NodeMCU | Darau, blė

Tiesa, jeigu jums pradės į ekraną keiktis tokiom klaidom, kaip „stdin: bad header in precompiled chunk“, tai labai nebijokit. Taip būna, jeigu kodą iš tikro rašinėjate NodeMCU konsolėje ir kartais taisote paspausdami Backspace. Geriau bandomojo kodo gabaliukus susirašyti į kokį nors interaktyvų redaktorių ir paskui į konsolę kopijuoti.

Kaip matote ekrano nuotrauoje, pradžioje yra eilutė: lua: cannot open init.lua. Tai reiškia, kad įkėlus init.lua failą jis būtų vykdomas ir galėtų paleisti norimą „programą“. Kaip įkelti į NodeMCU failus — tema kitam kartui. Taip pat ir kaip struktūrizuoti savo kodą.

Dar kitam kartui žiūrėsiu, kaip čia su NodeMCU nusiskaityti termometrus ir sukišti per MQTT į Home Assistant. Reikės persižiūrėti visus Lua pavyzdukus, išsiaiškinti, kaip atsistatyti WiFi ryšį, jei jis dėl kažkokių priežasčių dingsta ir pan. Pradžia yra, krapštysimės.

Tiesa, yra galimybė šitą plokštę programuoti ir Arduino principu su Arduino IDE. Aš šituo neužsiimsiu, nes, kaip minėjau, esu Lua profas, gerai raukiu C ir šiaip nebijau rankų kišti ten, kur kitiems nekvepia. Tad Arduino pavyzdukų nebus.

Nuorodų koncentratas:

Reklama
Komentarai
  1. Andrius Norkus parašė:

    sveiki, naudoju situos modulius, bet su Arduino. jei bus pamoku, gal pereisiu prie LUA jei nebus per sudetinga. ant arduino yra trukumas kad nevisus pin’us gali naudoti ( tik su D raide). Su LUA turbut taip nera? o siaip jau isbandziau ir ESP32 nerealus daiktas.

    • Darau, Blė parašė:

      Pasistengsiu su Lua pateikti pavyzdukų. Šiaip didesniems projektams Lua nelabai tinka, nes gerai ėda atmintį, o ten jos ne kažkas. Dėl PINų tai nežinau, dar neišsiaiškinau. Gali būti, kad prie jų priėjimas iš viso tik su pliku toolchainu įmanomas.

  2. Sigitas parašė:

    Viskas normaliai su tais pinais. O vat su lua tai dvipusis jausmas – labai gerai prototipavimui, nes nereikia komiliuot visko, bet jei užsirauni ant kokio elementatraus (stringų manipuliavimo) bugo, tai gali iš proto išeit.
    Beje, dar siūlau witty ( pasidomėt https://www.aliexpress.com/af/esp8266-witty.html?d=y&origin=n&blanktest=0&jump=afs&initiative_id=SB_20180128013958&isViewCP=y&catId=0 /) Turi integruotą šviesos jutiklį ir RGB ledą, o nurovus programatoriaus dalį (apatinė plokštelė) gaunasi visai kompaktiškas prietaisiukas. Čia, aišku, jei nėra poreikio dėt gryno ESP

    • Andrius Norkus parašė:

      jei sakot kad viskas gerai su pinais tai pasakykit kaip su Arduino valyti ne su D raide pinus, pvz: S3, S2, SK, SC ir pan
      P.S. jei norit sumazinti NODEMCU tam pukiai tinka WEMOS d1 mini, turi daug moduliu, sujungi ir programini, gaunasi kaip koks arduino su shield’ais

      • Sigitas parašė:

        Tai reikia jų paskirtį žiūrėti. https://i.stack.imgur.com/93qIq.jpg S3 ir S2 turėtų būti pasiekiami kaip 9 ir 10 pinai – digitalWrite(9, LOW); O šiaip tų S pinų pskirtis turėtų būti SPI sąsaja, ir, turbūt, geriausia būtų valdyti naudojantis biblioteka

  3. Kamiccolo parašė:

    Už LUA žmonės yra kariami. Lua, gerbiamieji, Lua.

  4. n\a parašė:

    Išbandžiau ir aš šį reikalą, tik šiektiek susdūriau su problema, kai išmetė “Device: 2516“, o tokio flash chip’ų sąraše nėra. Primečiau, kad kažkas panašaus kaip 2515 ir kad reikia flash’inti su dio. Atrodo viskas suveikė gerai, nors detektavo, kad 32Mb (manau, kad ištikrųjų ten 16Mb).
    Virtualią mašiną pagal aprašymą susikurti problemų nebuvo, tik aprašyme dar neparašyta, kad reikia pridėti ir python-dev paketą.

    Dar gal kas žinot kaip PuTTY susikonfiguruoti? Dabar maigant klaviatūrą visiškai nieko nerašo į konsolę (default nustatymai), o su RealTerm viskas gerai (čia ant Windows’ų).

    p.s. Firmware’s rašymo pavyzdyje kažkas suvelta. Vietoj pirmos-antros eilučių
    $ esptool.py –port /dev/ttyUSB1 write_flash -fm dio 0x
    0x00000.bin 0x10000.bin
    turėtų būti
    $ esptool.py –port /dev/ttyUSB1 write_flash -fm dio 0x00000.bin 0x00000.bin
    , o trečia eilutė išvis ištrinti reiktų arba pirmas dvi ištrinti ir žemiau path’ą suvienodinti su trečia eilute 🙂

    • Darau, Blė parašė:

      Aš čia tiesiog papeistinau savo termonalą, neredagavau. Musėt, koks tabas įsipainiojo.

      Jo, su dio, dout ir man buvo, kad vienaip veikė, kitaip neveikė, neišsiaiškinau. O dėl putės tai nežinau, aš screeną naudoju…

      • n\a parašė:

        Del putty gal kam naudinga bus. Tiesiog reikia pakeisti nustatyma “Flow control“ is “XON/XOFF“ į “None“ ir atsigauna terminalas.

  5. Rimas Baltrušis parašė:

    Be LUA yra dar vienas iškrypėliškas variantas – micropython. Tas iškrypimas turi gerą savybę: nuotolinę prieigą WebREPL. Gali tiesiai naršyklėje vykdyt komandas, upload/download ir leist ką tik nori, nereikia į modulį USB kaišiot. Man tai beveik orgazmas gaunas, nes tai dar lanksčiau už OTA firmware atnaujinimus.

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti /  Keisti )

Google+ photo

Jūs komentuojate naudodamiesi savo Google+ paskyra. Atsijungti /  Keisti )

Twitter picture

Jūs komentuojate naudodamiesi savo Twitter paskyra. Atsijungti /  Keisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti /  Keisti )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.