Biškį apie ESP32

Posted: 2018-04-26 in Darbeliai
Žymos:, , ,

ESP32 — tai patobulintas ir naujesnis sėkmingojo ESP8266 tęsinys. Turi gerokai daugiau periferijos, dviejų branduolių procesorių, toolkitas pilnas visokiausių gudrių draiverių su visokiomis apsaugomis ir panašiai. Plius šitas daikčiukas turi ir fizinį Ethernet tinklo palaikymą — jei tik įsigysite plokštę su papildoma periferija.

Pabandymui nusipirkau porą ESP32 devboardų iš draugiškųjų kinų, bet be Ethernet. Žadu daryt šiltnamiui valdymą, o ten su ESP8266 kažkaip pritrūko galimybių man. Ir kodijimas su Arduino kažkaip nebaisiai lipo, WiFi patikimumas, kaip žinia, nelabai geras ir ne visiems veikiantis.

ESP32 plokštė ir Dallas DS18B20 temperatūros davikliai | Darau, blė | Elektronika

Disclaimeris: rašinius apie ESP32 taip pat dėsiu po NodeMCU tagu, nors tai ir nevisai tikslu.

ESP32 turi dviejų branduolių procesorių, taigi kai ką galima pilnai išlygiagretinti. Ir čia Espressif (gamintojas, jei ką) pavarė su savo toolkitu. Jie mandrai taip sugalvojo: viename branduolyje suksis jų firmwarė, tikras branduolys, kuris rūpinsis periferijos palaikymu, įskaitant ir WiFi priežiūrą. Tuo tarpu antrasis branduolys skirtas taikomosioms programoms — t.y. tam, ką aš, jūs ir visi kiti norėtų ten prikodyti.

Tokia tad teorija. ESP32 toolkitas pilnai pagrįstas FreeRTOS netgi nepervadinant jos į kokią nors „ESPRTOS“ ar „Es32Os“ ar dar kaip nors. Viskas ten aišku, kas su FreeRTOS susidūrę, tuoj pasijus kaip namie.

Visai periferijai yra prikurta draiverių ir pavyzdukų. Draiveriai, turiu pasakyti, gan sunkiasvoriai, su visokiais spinlockais ir kitom apsaugom, atminties valdymu ir pan. Kitaip sakant — beveik kaip normalioj OS 🙂

Aš pasivartęs Reference Manualą supratau, kad ESP32 periferija — ne iš lengvųjų. Net mano čiupinėjamų ST ARM procesoriukų periferijos valdymas yra palyginti paprastas, nors gerokai sudėtingesnis už AVR. Bet EPS32 — visai trenktas lygis. Pagalvojau, kad pradėsiu nuo to, jog pasidarysiu pabandymui OneWire draiverį ant laisvo UARTo. Jų yra trys, UART0 dažniausiai sukonfigūruotas, kaip stdout, o tai irgi palengvina kodijimą naudojant visokias mielas funkcijas, kaip printf. Aišku, jos suvalgo atminties su savo buferiais ir reikia biškį prisižiūrėti, kad nesusikirstų su pertraukimais. Bet, tikėtina, kad ESP32 draiveriuose daug kas sutvarkyta.

Kaip viską susikonfigūruoti, parašyta Getting Started ir gan aiškiai. Trumpai:

  • Parsisiųsti Xtensa GCC kompiliatorių
  • Įsidėti bin į PATH
  • Parsisiųsti Espressif IDF toolkitą
  • Susikonfigūruoti IDF_PATH iki to toolkito
  • Pabandyti susikompiliuoti kokį nors paprastą pavyzduką
  • Jei viskas kompiliuojasi, kopijuoti ir daryti savo projektą

Susidūriau su keletu įdomių ir su keletu užknisančių dalykų rašydamas OneWire draiverį ESP32 platformai. Visų pirma, pavyzdinis draiveris veikia ne iki galo tiksliai ir, nors nenorėjau, teko truputį lįsti į registrus. Galėjau išspręsti bukai, įdėdamas į kelias vietas 70 µs pauzes, bet žiauriai to nemėgstu. Na, nebent koks bitbangas ir nieko daugiau neišeina padaryt.

Pirmas dalykas: nežinau, kodėl, bet naudojant draiverio duodamą funkciją nevisada persijungdavo baudrate. Pagal 160 MHz dažnį pasiskaičiavau registro reikšmes — suveikia patikimai.

Antras: be DMA UARTas iš viso neveikia — arba neradau kaip kitaip jis galėtų veikti. Regis, kad tiesiog taip padaryta, bet, prisipažinsiu, neskaičiau iki galo, tik taip pasirodė.

Trečias: ogi nors ESP32 draiverio baitukų išsiuntimo funkcija be buferio turėtų „palaukti“, kol bus baitas išsiųstas — taip neįvyksta. Ilgai gaudžiau. Nustačiau, kad tarp po baitukų įrašymo su 115200 reikia apie 70 µs palaukti. Teko nagrinėtis UART būsenos registrą. O ESP32 tas registras pilnas labai daug ko. Reference Manualas apie TX ir RX būsenos bitukus rašo labai lakoniškai, susiprask pats:

UART_ST_UTX_OUT
This register stores the state of the transmitter’s finite state machine.

0: TX_IDLE; 1: TX_STRT; 2: TX_DAT0; 3: TX_DAT1; 4: TX_DAT2; 5: TX_DAT3; 6: TX_DAT4; 7: TX_DAT5; 8: TX_DAT6; 9: TX_DAT7; 10: TX_PRTY; 11: TX_STP1; 12: TX_STP2; 13: TX_DL0; 14: TX_DL1. (RO)

Toks pat yra ir RX. Kas tie TX_DAT0, TX_STP1 ir pan. — susiprask pats. Na, po kelių bandymų susipratau. TX_DAT7, pvz., reiškia, kad visi aštuoni bitukai jau išsiųsti. Va taip va, nuo TX_STRT (start, jei ką), nuo TX_DAT0 (pirmas išsiųstas bitukas) iki TX_DAT7. Jei įjungtas parity, peršoks į TX_PRTY. Linksmumėlis. Kaip ir su STM32 DMA draiveriu, taip ir čia — draiveris baitą išsiuntė, o UARTas dar sau fone dirba. Reikia tikrinti registrą ir laukti, kitaip susigadina duomenukai.

Ketvirtas punktas: TX koja yra aktyvi, t.y. push-pull. Neradau dar, ar įmanoma ją sukonfigūruoti kaip open drain. Tad jungiant termometrus reikia naudoti diodą (kaip nuotraukoje).

Penktas dalykas: prieš pirkdamas neapsižiūrėjau, kad ESP32 turi ir Ethernet PHY. Todėl nusipirkau porą plokščių tik su WiFi. Olimex tuo tarpu jau siūlo ir plokšteles su Ethernet — o visokiems virvėlaidiniams projektams tai yra didelis pliusas. ESP32 galimybės ir kodo pavyzdžių pelkės tikrai plačios, tad tikrai verta pasidomėt devboardais su Ethernet.

ESP32 termometrų skaitymo draiveris ir pavyzdinis kodas guli GitHube, galit jamt ir naudot.

Reklama
Komentarai
  1. Ramzis parašė:

    Ką planuoji valdyti šiltnamyje?

  2. Aras parašė:

    Nereikėjo tiek vargintis ir visą kodą rašyti ant Arduino IDE, viskas puikiai veikia. Kiek buvau sugalvojęs projektų pažaidimui visus padariau su arduino ide. Kartais paimi ESP8266 projektą darytą ant arduino ide, pakeiti bibliotekas ir viskas puikiai veikia… 🙂

  3. O Sole Mio parašė:

    Viskas cia gerai – pazanga (ir malonumas) turi buti.
    ESP8266 tikrai turi kabliuku – srove siurbia kaip alkoholikas, ikaista taip, kad patalpas gali pasisildyti. WiFi kartais nuluzta ar uzsikemsa, is nevilties tik restartinimas tepadeda (nespecialistams, tokiems, kaip as).
    Todel godziai laukiam tolimesniu istoriju apie ESP32, ir visai nesvarbu, kad daugumai sprendimu, ypac decentralizuotu, pilnai pakanka mazojo broliuko.

  4. Aras parašė:

    Supratau. 😀 Šiltnamyje labai svarbu ne tik Šiluma ir drėgmė, bet ir tinkama Co2 koncentracija, jei norime gero derliaus. 🙂 Štai daviklis prie ESP32 CO2 koncentracijai matuoti: https://www.facebook.com/notes/esp32-arduino/esp32-co2-monitor/1060583147426571/

  5. O Sole Mio parašė:

    Klausimas apie laistyma – kokius dirvozemio dregnumo jutiklius planuojate naudoti?

    • Darau, Blė parašė:

      Kažką tokio. Jeigu iš viso naudosiu. Nes labai gali būti, kad laistymas bus empirinis, pvz. „kas trečią dieną leisti vandenį 30 min.“

      • scaniagti parašė:

        Maksimoj yra toks savaitinis programuojamas daiktas, 25€ su laistymo žarnos prijungimais, laikrodžiu ir savaitės kalendoriumi 🙂
        Geriau daryk analizuojantį, kad nesigautų kaip iš maksimos 😉

  6. Ramzis parašė:

    Nemėginsi gaminti varžinio drėgnumo matuoklio iš dviejų metalo plokštelių? Kaip planuoji laistymą daryti? Aš naudoju ESP8266 katilo, šiltnamio, namų temperatūros stebėjimui, tai buvau susidūręs su pakibimu tik kai buvo silpnas maitinimas. Dabar su sočiu maitinimu nepakimba.

    • Darau, Blė parašė:

      Ne, varžinio nedarysiu. Kaip minėjau, abejoju, ar iš viso tas drėgmės matavimas ką duos. Galima daryti išvestines iš temperatūros ir oro drėgnumo, paprasčiau. Bet greičiausiai irgi nereikės. Kai eini su livaru palaistyt, nežiūri per daug kiek ten tos drėgmės.

      Laistymą paprastai: subadyta šlanga ir elektrinis vožtuvas.

      Taip, brown-out’as visus MCU veikia cherovai ir prasideda nesąmonės. Geras maitiakas yra pirmas vaistas nuo daugumos problemų.

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 )

w

Connecting to %s

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