Turinys:

„DuvelBot“- ESP32 -CAM alaus tiekimo robotas: 4 žingsniai (su nuotraukomis)
„DuvelBot“- ESP32 -CAM alaus tiekimo robotas: 4 žingsniai (su nuotraukomis)

Video: „DuvelBot“- ESP32 -CAM alaus tiekimo robotas: 4 žingsniai (su nuotraukomis)

Video: „DuvelBot“- ESP32 -CAM alaus tiekimo robotas: 4 žingsniai (su nuotraukomis)
Video: Трактористы (комедия, реж. Иван Пырьев, 1939 г.) 2024, Birželis
Anonim
„DuvelBot“- ESP32 -CAM alaus tiekimo robotas
„DuvelBot“- ESP32 -CAM alaus tiekimo robotas

Po sunkios darbo dienos niekas neprilygsta gurkšnojant mėgstamą alų ant sofos. Mano atveju, tai belgiškas blondinis elis „Duvel“. Tačiau galų gale, kol nesugriuvome, susiduriame su pačia rimčiausia problema: šaldytuvas, kuriame yra mano antklodė, yra 20 metrų atstumu nuo sofos.

Nors lengva prievarta iš mano pusės kartais gali paskatinti paauglius šaldytuvus išplauti iš mano savaitės „Duvel“pašalpos, tačiau užduotis iš tikrųjų ją pristatyti beveik išsekusiam palikuoniui yra vienas žingsnis per toli.

Laikas atsikratyti lituoklio ir klaviatūros …

„DuvelBot“yra beprasmiška „AI-Thinker ESP32-CAM“pagrindu sukurta vairavimo internetinė kamera, kurią galite valdyti iš savo išmaniojo telefono, naršyklės ar planšetinio kompiuterio.

Šią platformą nesunku pritaikyti ar išplėsti mažiau alkoholio vartojantiems (pagalvokite apie SpouseSpy, NeighbourWatch, KittyCam …).

Aš sukūriau šį robotą daugiausia norėdamas šiek tiek sužinoti apie visą žiniatinklio programavimą ir daiktų interneto dalykus, apie kuriuos nieko nežinojau. Taigi šios instrukcijos pabaigoje yra išsamus paaiškinimas, kaip tai veikia.

Daugelis šios instrukcijos dalių yra pagrįstos puikiais paaiškinimais, rastais „Random Nerd Tutorials“, todėl apsilankykite!

Prekės

Ko tau reikia:

Dalių sąrašas nėra iškaltas akmenyje, o daug dalių galima įsigyti daugybe skirtingų versijų ir iš įvairių vietų. Daugiausia pirkdavau iš „Ali-Express“. Kaip sakė Machete: improvizuok.

Techninė įranga:

  • „AI Thinker ESP32-CAM“modulis. Tai tikriausiai galėtų veikti su kitais ESP32-CAM moduliais, bet aš tai naudojau
  • L298N variklio vairuotojo lenta,
  • Pigi keturių ratų robotikos platforma,
  • Korpusas su dideliu lygiu paviršiumi, pvz., „Hammond Electronics 1599KGY“,
  • USB į 3.3V-TTL keitiklis programavimui.
  • Apšvietimui: 3 balti šviesos diodai, BC327 arba kitas bendrosios paskirties tranzistorius NPN (Ic = 500mA), 4k7k rezistorius, 3 82 omų rezistoriai, perforatorius, kabeliai (žr. Schemą ir paveikslėlius).
  • Įjungimo/išjungimo jungiklis ir paprastai atidaromas programavimo mygtukas.

Neprivaloma:

  • Žuvies akių kamera su ilgesniu lankstumu nei standartinė OV2460 kamera, tiekiama su ESP32-CAM moduliu,
  • „WiFi“antena su atitinkamai ilgu kabeliu ir „Ultra Miniature Coax“jungtimi, tokia kaip ši. ESP32-CAM turi įmontuotą anteną, o korpusas yra plastikinis, todėl antena tikrai nereikalinga, tačiau maniau, kad ji atrodo šauniai, todėl…
  • Rašaliniu būdu spausdinamas lipdukas popierius, skirtas viršutiniam viršelio dizainui.

Įprasti aparatūros įrankiai: lituoklis, grąžtai, atsuktuvai, replės …

1 žingsnis: sukurkite roboto platformą

Roboto platformos kūrimas
Roboto platformos kūrimas
Roboto platformos kūrimas
Roboto platformos kūrimas
Roboto platformos kūrimas
Roboto platformos kūrimas

Schema:

Schema nėra nieko ypatingo. ESP32-kumštelis valdo variklius per dviejų kanalų L298N variklio plokštę. Kairės ir dešinės pusės varikliai yra lygiagrečiai ir kiekviena pusė užima vieną kanalą. Keturi nedideli 10..100nF keraminiai kondensatoriai, esantys šalia variklio kaiščių, kaip visada patartina kovoti su RF trukdžiais. Be to, didelis elektrolitinis dangtelis (2200… 4700uF) variklio plokštėje, kaip parodyta schemoje, nors nėra griežtai reikalingas, gali šiek tiek apriboti maitinimo įtampos virpėjimą (jei norite pamatyti siaubo filmą, tada zondas Vbat su osciloskopu, kol varikliai veikia).

Atminkite, kad abu variklio kanalų ENABLE kaiščiai varomi tuo pačiu ESP32 (IO12) impulsų pločio moduliuotu (PWM) kaiščiu. Taip yra todėl, kad ESP32-CAM modulyje nėra daug GPIO (modulio schema įtraukta kaip nuoroda). Roboto šviesos diodus valdo IO4, kuris taip pat valdo blykstės blykstės šviesos diodą, todėl pašalinkite Q1, kad blykstės šviesos diodas neužsidegtų uždarytame korpuse.

Po robotu pasiekiamas programavimo mygtukas, įjungimo/išjungimo jungiklis, įkrovimo jungtis ir programavimo jungtis. Aš galėjau padaryti daug geresnį darbą dėl programavimo jungties (3,5 mm lizdo?), Bet alus nebegalėjo laukti. Taip pat būtų malonu nustatyti atnaujinimus belaidžiu ryšiu (OTA).

Norėdami įjungti robotą į programavimo režimą, paspauskite programavimo mygtuką (tai sumažina IO0 lygį) ir įjunkite.

Svarbu: norėdami įkrauti roboto NiMH baterijas, naudokite laboratorijos maitinimo komplektą (neiškrautą) iki maždaug 14 V, o srovė ribojama iki 250 mA. Įtampa prisitaiko prie baterijų įtampos. Atjunkite, jei robotas jaučiasi įkaitęs arba akumuliatoriaus įtampa siekia apie 12,5 V. Akivaizdus patobulinimas būtų integruoti tinkamą akumuliatoriaus įkroviklį, tačiau tai nepatenka į šios instrukcijos taikymo sritį.

Techninė įranga:

Taip pat žiūrėkite pastabas nuotraukose. Korpusas montuojamas ant roboto pagrindo, naudojant 4 M4 varžtus ir savaime užsifiksuojančias veržles. Atkreipkite dėmesį į guminius vamzdžius, naudojamus kaip atstumo tarpikliai. Tikimės, kad tai taip pat suteiks „Duvel“sustabdymą, jei važiavimas pasirodys nelygus. ESP32-CAM modulis ir L298N variklio plokštė yra sumontuoti korpuse, naudojant plastikines lipnias kojeles (nesu tikras dėl teisingo pavadinimo anglų kalba), kad nereikėtų gręžti papildomų skylių. Be to, ESP32 yra sumontuotas ant savo paties plokštės ir prijungiamų kaiščių. Tai leidžia lengvai pakeisti ESP32.

Nepamirškite: jei ketinate naudoti išorinę „WiFi“anteną, o ne įmontuotą, taip pat lituokite antenos pasirinkimo trumpiklį ESP32-CAM plokštės apačioje.

Išspausdinkite viršutinį logotipą faile DuvelBot.svg ant rašalinio lipduko popieriaus (arba suprojektuokite savo) ir esate pasiruošę!

2 žingsnis: užprogramuokite robotą

Užprogramuokite robotą
Užprogramuokite robotą

Patartina užprogramuoti robotą prieš jį uždarant, kad įsitikintumėte, jog viskas veikia ir neatsiranda stebuklingų dūmų.

Jums reikia šių programinės įrangos įrankių:

  • „Arduino IDE“,
  • ESP32 bibliotekos, SPIFFS (serijinė periferinė „flash“failų sistema), „ESPAsync“žiniatinklio serverio biblioteka.

Pastarąjį galima įdiegti laikantis šio atsitiktinio mokymo vadovo iki skyriaus „Jūsų failų tvarkymas“. Tikrai negalėčiau to geriau paaiškinti.

Kodas:

Mano kodą rasite čia:

  • „Arduino“eskizas „DuvelBot.ino“,
  • Duomenų pakatalogis, kuriame saugomi failai, kuriuos ketinama įkelti į ESP „flash“naudojant SPIFFS. Šiame aplanke yra tinklalapis, kurį pateiks ESP (index.html), logotipo vaizdas, kuris yra tinklalapio dalis (duvel.png), ir pakopinis stiliaus lapas arba CSS failas (style.css).

Norėdami užprogramuoti robotą:

  • Prijunkite USB-TTL keitiklį, kaip parodyta schemoje,
  • Failas -> Atidaryti -> eikite į aplanką, kuriame yra „DuvelBot.ino“.
  • Pakeiskite tinklo kredencialus eskize:

const char* ssid = "yourNetworkSSIDHere"; const char* password = "yourPasswordHere";

  • Įrankiai -> Plokštė -> „AI -Thinker ESP -32 CAM“ir pasirinkite savo kompiuteriui tinkamą nuoseklųjį prievadą (Įrankiai -> Prievadas -> kažkas panašaus į /dev /ttyUSB0 arba COM4),
  • Atidarykite serijinį monitorių „Arduino IDE“, paspausdami mygtuką PROG (kuris sumažina IO0 lygį), įjunkite robotą,
  • Serijiniame monitoriuje patikrinkite, ar ESP32 yra paruoštas atsisiųsti,
  • Uždarykite serijinį monitorių (kitaip nepavyksta įkelti SPIFFS),
  • Įrankiai -> „ESP32 eskizo duomenų įkėlimas“ir palaukite, kol jis bus baigtas,
  • Išjunkite ir vėl įjunkite laikydami mygtuką PROG, kad grįžtumėte į programavimo režimą,
  • Paspauskite rodyklę „Įkelti“, kad užprogramuotumėte eskizą ir palaukite, kol jis bus baigtas,
  • Atidarykite serijinį monitorių ir išjunkite/įjunkite ESP32,
  • Kai jis bus paleistas, užsirašykite IP adresą (kažką panašaus į 192.168.0.121) ir atjunkite robotą nuo USB-TTL keitiklio,
  • Atidarykite naršyklę šiuo IP adresu. Turėtumėte pamatyti sąsają, kaip parodyta paveikslėlyje.
  • Neprivaloma: nustatykite ESP32 „mac“adresą į fiksuotą maršrutizatoriaus IP adresą (priklauso nuo to, kaip tai padaryti).

Viskas! Skaitykite toliau, jei norite sužinoti, kaip tai veikia …

3 žingsnis: kaip tai veikia

Dabar prieiname prie įdomios dalies: kaip visa tai veikia kartu?

Pabandysiu tai paaiškinti žingsnis po žingsnio … tačiau … atminkite, kad Kajnjaps nėra žiniatinklio programavimo specialistas. Tiesą sakant, šiek tiek išmokti interneto programavimo buvo visa „DuvelBot“kūrimo prielaida. Jei darau akivaizdžių klaidų, palikite komentarą!

Gerai, įjungus ESP32, kaip įprasta sąrankoje, jis inicijuoja GPIO, susieja juos su PWM laikmačiais variklio ir LED valdymui. Daugiau informacijos apie variklio valdymą rasite čia, tai gana standartinė.

Tada fotoaparatas sukonfigūruotas. Sąmoningai laikiau gana mažą skiriamąją gebą (VGA arba 640x480), kad išvengčiau vangaus atsakymo. Atkreipkite dėmesį, kad „AI-Thinker ESP32-CAM“plokštėje yra serijinis RAM lustas (PSRAM), kurį jis naudoja didesnės raiškos fotoaparatų rėmeliams saugoti:

if (psramFound ()) {Serial.println ("PSRAM rasta."); config.frame_size = FRAMESIZE_VGA; config.jpg_quality = 12; config.fb_count = 2; // kadrų buferių skaičių žr.: https://github.com/espressif/esp32-camera} else {Serial.println ("nerasta PSRAM"); config.frame_size = FRAMESIZE_QVGA; config.jpg_quality = 12; config.fb_count = 1; }

Tada inicijuojama nuosekli periferinė „flash“failų sistema (SPIFFS):

// inicijuoti SPIFFS if (! SPIFFS.begin (true)) {Serial.println ("Montuojant SPIFFS įvyko klaida!"); grįžti; }

SPIFFS veikia kaip maža ESP32 failų sistema. Čia jis naudojamas trims failams saugoti: pats tinklalapis index.html, pakopinis failo stiliaus lapas style.css ir-p.webp

Tada ESP32 prisijungia prie maršrutizatoriaus (nepamirškite prieš įkeldami nustatyti savo kredencialų):

// keisti maršrutizatoriaus kredencialus čiaconst char* ssid = "yourNetworkSSIDHere"; const char* password = "yourPasswordHere"; … // prisijungti prie „WiFi Serial.print“(„Prisijungimas prie„ WiFi “); WiFi.begin (ssid, slaptažodis); while (WiFi.status ()! = WL_CONNECTED) {Serial.print ('.'); vėlavimas (500); } // dabar prijungtas prie maršrutizatoriaus: ESP32 dabar turi ip adresą

Norėdami iš tikrųjų padaryti kažką naudingo, mes paleidžiame asinchroninį žiniatinklio serverį:

// sukurkite AsyncWebServer objektą 80 prievadeAsyncWebServer serveris (80); … Server.begin (); // pradėk klausytis ryšių

Dabar, jei naršyklės adreso juostoje įvesite IP adresą, kurį maršrutizatorius priskyrė ESP32, ESP32 gauna užklausą. Tai reiškia, kad jis turėtų atsakyti klientui (jums ar jūsų naršyklei), pateikdamas jam kažką, pavyzdžiui, tinklalapį.

ESP32 žino, kaip reaguoti, nes sąrankos metu atsakymai į visas galimas leistinas užklausas buvo užregistruoti naudojant server.on (). Pavyzdžiui, pagrindinis tinklalapis arba rodyklė (/) tvarkoma taip:

server.on ("/", HTTP_GET, (AsyncWebServerRequest *užklausa) {Serial.println ("/užklausa gauta!"); request-> send (SPIFFS, "/index.html", String (), false, procesorius);});

Taigi, jei klientas prisijungia, ESP32 atsako siunčiant failą index.html iš SPIFFS failų sistemos. Parametrų procesorius yra funkcijos, kuri iš anksto apdoroja html ir pakeičia visas specialias žymas, pavadinimas:

// Vietas, esančias html, kaip %DATA %// pakeičia kintamaisiais, kuriuos norite rodyti //

Duomenys: %DATA %

Styginių procesorius (const String & var) {if (var == "DATA") {//Serial.println("in procesorius! "); grąžinimo eilutė (dutyCycleNow); } grąžinimo eilutė ();}

Dabar pašalinkime patį tinklalapį index.html. Apskritai visada yra trys dalys:

  1. html kodas: kokie elementai turėtų būti rodomi (mygtukai/tekstas/slankikliai/vaizdai ir kt.),
  2. stiliaus kodas atskirame.css faile arba… skyriuje: kaip turėtų atrodyti elementai,
  3. javascript a… skyrius: kaip turėtų veikti tinklalapis.

Kai index.html įkeliamas į naršyklę (kuri žino, kad tai html dėl DOCTYPE eilutės), ji patenka į šią eilutę:

Tai yra css stiliaus lapo užklausa. Šio lapo vieta nurodyta href = "…". Taigi, ką daro jūsų naršyklė? Teisingai, ji paleidžia dar vieną serverio užklausą, šį kartą dėl stiliaus.css. Serveris užfiksuoja šią užklausą, nes ji buvo užregistruota:

server.on ("/style.css", HTTP_GET, (AsyncWebServerRequest *užklausa) {Serial.println ("css request gavo"); request-> send (SPIFFS, "/style.css", "text/css" ");});

Tvarkinga a? Beje, tai galėjo būti href = "/some/file/on/the/other/side/of/the/moon", kai rūpinosi visa jūsų naršyklė. Tą failą būtų galima pasiimti taip pat laimingai. Aš nepaaiškinsiu apie stiliaus lapą, nes jis tik kontroliuoja išvaizdą, todėl čia nėra tikrai įdomu, bet jei norite sužinoti daugiau, patikrinkite šią pamoką.

Kaip atsiranda „DuvelBot“logotipas? „Index.html“turime:

į kurį ESP32 atsako:

server.on ("/duvel", HTTP_GET, (AsyncWebServerRequest *užklausa) {Serial.println ("duvel logotipo užklausa gauta!"); request-> send (SPIFFS, "/duvel.png", "image-p.webp

..kitas SPIFFS failas, šį kartą pilnas vaizdas, kaip nurodyta atsakyme „image/png“.

Dabar prieiname prie tikrai įdomios dalies: mygtukų kodo. Sutelkime dėmesį į mygtuką „Į priekį“:

PERSIŲSTI

Pavadinimas „class =" … "yra tik pavadinimas, susiejantis jį su stilių lapu, kad būtų galima pritaikyti dydį, spalvą ir tt Svarbios dalys yra onmousedown =" toggleCheckbox ('forward') "ir onmouseup =" toggleCheckbox ('stop') ". Tai yra mygtuko veiksmai (tas pats, kaip „ontouchstart“/„ontouchend“, bet tai liečiami ekranai/telefonai). Čia mygtuko veiksmas iškviečia funkciją „toggleCheckbox“(x) „JavaScript“skiltyje:

function toggleCheckbox (x) {var xhr = naujas XMLHttpRequest (); xhr.open („GET“, „/“+ x, true); xhr.send (); // galėtume ką nors padaryti su atsakymu, kai būsime pasiruošę, bet mes to nedarome}

Taigi paspaudus pirmyn esantį mygtuką, iškart atsiranda „toggleCheckbox“(„pirmyn“) iškvietimas. Ši funkcija paleidžia XMLHttpRequest „GET“iš vietos „/forward“, kuri veikia taip pat, kaip jei naršyklės adreso juostoje būtumėte įvedę 192.168.0.121/forward. Kai ši užklausa pasiekiama ESP32, ją tvarko:

server.on ("/persiųsti", HTTP_GET, (AsyncWebServerRequest *užklausa) {Serial.println ("gautas/persiųstas"); actionNow = FORWARD; užklausa-> siųsti (200, "text/plain", "OK forward. ");});

Dabar ESP32 tiesiog atsako su tekstu „Gerai pirmyn“. Pastaba toggleCheckBox () nieko nedaro su šiuo atsakymu (arba nelaukia), tačiau taip gali būti, kaip parodyta vėliau fotoaparato kode.

Šio atsakymo metu programa nustato tik kintamą actionNow = FORWARD, kaip atsaką į mygtuko paspaudimą. Dabar pagrindiniame programos cikle šis kintamasis yra stebimas siekiant padidinti/sumažinti variklių PWM. Logika yra tokia: tol, kol atliekame veiksmą, kuris nėra STOP, padidinkite variklius ta kryptimi, kol bus pasiektas tam tikras skaičius (dutyCycleMax). Tada išlaikykite šį greitį, kol „actionNow“nepasikeis:

void loop () {currentMillis = millis (); if (currentMillis - previousMillis> = dutyCycleStepDelay) {// išsaugoti paskutinį kartą, kai įvykdėte ciklą previousMillis = currentMillis; // „mainloop“yra atsakingas už variklių pakėlimą aukštyn/žemyn, jei (actionNow! = previousAction) {// rampa žemyn, tada sustokite, tada pakeiskite veiksmą ir padidinkite dutyCycleNow = dutyCycleNow-dutyCycleStep; if (dutyCycleNow <= 0) {// jei nusileidus dc yra 0, nustatykite naują kryptį, pradėkite nuo min. dutycycle setDir (actionNow); previousAction = actionNow; dutyCycleNow = dutyCycleMin; }} else // actionNow == previousAction ramp up up, išskyrus atvejus, kai kryptis yra STOP {if (actionNow! = STOP) {dutyCycleNow = dutyCycleNow+dutyCycleStep; if (dutyCycleNow> dutyCycleMax) dutyCycleNow = dutyCycleMax; } else dutyCycleNow = 0; } ledcWrite (pwmChannel, dutyCycleNow); // koreguoti variklio darbo ciklą}}

Tai lėtai didina variklių greitį, užuot tik paleidęs visu greičiu ir išsiliejęs brangų brangųjį kaištį. Akivaizdus patobulinimas būtų perkelti šį kodą į laikmačio pertraukimo rutiną, tačiau jis veikia taip, kaip yra.

Dabar, jei atleisime pirmyn nukreipimo mygtuką, jūsų naršyklė skambina į „toggleCheckbox“(„stop“), todėl gaunama užklausa GET /stop. ESP32 nustato „ActionNow“į STOP (ir reaguoja „OK stop“), o tai leidžia pagrindiniam kilpui nusukti variklius.

Ką apie šviesos diodus? Tas pats mechanizmas, bet dabar turime slankiklį:

„JavaScript“programoje stebimas slankiklio nustatymas taip, kad kiekvieną kartą keičiant skambėtų „/LED/xxx“, kur xxx yra ryškumo vertė, kurią turėtų nustatyti šviesos diodai:

var slide = document.getElementById ('skaidrė'), sliderDiv = document.getElementById ("sliderAmount"); slide.onchange = function () {var xhr = new XMLHttpRequest (); xhr.open ("GET", "/LED/" + this.value, true); xhr.send (); sliderDiv.innerHTML = this.value; }

Atminkite, kad mes naudojome document.getElementByID („slide“), kad gautume patį slankiklio objektą, kuris buvo deklaruotas su ir kad reikšmė išvedama į teksto elementą kiekvieną kartą keičiant.

Eskizo tvarkytojas užfiksuoja visas ryškumo užklausas, naudodamas registratoriaus „/LED/*“. Tada paskutinė dalis (skaičius) padalijama ir perduodama į int:

server.on ("/LED/ *", HTTP_GET, (AsyncWebServerRequest *užklausa) {Serial.println ("LED užklausa gauta!"); setLedBrightness ((prašymas-> url ()). antrinė eilutė (5). toInt ()); prašymas-> siųsti (200, "text/plain", "OK Leds.");});

Panašiai, kaip aprašyta aukščiau, radijo mygtukai valdo kintamuosius, nustatančius PWM numatytuosius nustatymus, kad „DuvelBot“galėtų lėtai važiuoti pas jus su alumi, atsargiai, kad neišsilietų tas skystas auksas, ir greitai grįžkite į virtuvę, kad gautumėte daugiau.

… Taigi, kaip atnaujinamas fotoaparato vaizdas, nereikia atnaujinti puslapio? Tam naudojame techniką, vadinamą AJAX (asinchroninė „JavaScript“ir XML). Problema ta, kad paprastai kliento ir serverio ryšys vyksta pagal fiksuotą procedūrą: klientas (naršyklė) pateikia užklausą, serveris (ESP32) atsako, byla uždaryta. Padaryta. Daugiau nieko nevyksta. Jei tik kažkaip galėtume apgauti naršyklę, kad ji reguliariai prašytų atnaujinimų iš ESP32 … ir būtent tai ir darysime su šiuo „javascript“kūriniu:

setInterval (function () {var xhttp = new XMLHttpRequest (); xhttp.open ("GET", "/CAMERA", true); xhttp.responseType = "blob"; xhttp.timeout = 500; xhttp.ontimeout = function () {}; xhttp.onload = function (e) {if (this.readyState == 4 && this.status == 200) {// žr. https://stackoverflow.com/questions/7650587/using… // https://www.html5rocks.com/en/tutorials/file/xhr2/ var urlCreator = window. URL || window.webkitURL; var imageUrl = urlCreator.createObjectURL (this.response); // sukurkite objektą iš BLOB document.querySelector ("#camimage"). src = imageUrl; urlCreator.revokeObjectURL (imageurl)}}; xhttp.send ();}, 250);

„setInterval“kaip funkciją atlieka parametrą ir vykdo ją taip dažnai (čia kartą per 250 ms, todėl gaunami 4 kadrai per sekundę). Vykdoma funkcija pateikia dvejetainio „blob“užklausą adresu /CAMERA. Tai tvarko ESP32-CAM eskize kaip (iš „Randomnerdtutorials“):

server.on ("/CAMERA", HTTP_GET, (AsyncWebServerRequest * užklausa) {Serial.println ("kameros užklausa gauta!"); camera_fb_t * fb = NULL; // esp_err_t res = ESP_OK; size_t _jpg_buf_len = 0; uint8 * _jpg_buf = NULL; // užfiksuoti kadrą fb = esp_camera_fb_get (); if (! fb) {Serial.println ("Nepavyko gauti kadrų buferio"); return;} if (fb-> format! = PIXFORMAT_JPEG) /jau tokiu formatu iš config {bool jpeg_converted = frame-j.webp

Svarbios dalys yra kadro fb = esp_camera_fb_get () konvertavimas į-j.webp

Tada „JavaScript“funkcija laukia, kol pasirodys šis vaizdas. Tada tereikia šiek tiek padirbėti, kad gautas „blob“būtų paverstas URL, kurį galima naudoti kaip šaltinį, norint atnaujinti vaizdą html puslapyje.

Fau, baigėme!

4 žingsnis: idėjos ir likučiai

Idėjos ir likučiai
Idėjos ir likučiai

Šio projekto tikslas man buvo išmokti tik tiek interneto programavimo, kad būtų galima prijungti aparatūrą prie interneto. Galimi keli šio projekto pratęsimai. Štai keletas idėjų:

  • Įdiekite „tikrą“vaizdo transliaciją, kaip paaiškinta čia ir čia, ir perkelkite ją į antrąjį serverį, kaip paaiškinta čia tame pačiame ESP32, bet kitame procesoriaus branduolyje, tada importuokite vaizdo srautą į html, kurį aptarnauja 1 -asis serveris, naudodami…. Tai turėtų lemti greitesnius fotoaparatų atnaujinimus.
  • Naudokite prieigos taško (AP) režimą, kad robotas būtų savarankiškesnis, kaip paaiškinta čia.
  • Išplėskite naudodami akumuliatoriaus įtampos matavimą, gilaus miego galimybes ir pan. Šiuo metu tai yra šiek tiek sunku, nes „AI-Thinker ESP32-CAM“neturi daug GPIO; reikia išplėsti per uart ir, pavyzdžiui, vergą arduino.
  • Paverskite katės ieškančiu robotu, kuris kartkartėmis išmeta kačių skanėstus paspausdamas letenėlę didelį mygtuką, per dieną transliuokite daugybę gražių kačių nuotraukų …

Prašome komentuoti, jei patiko ar turite klausimų ir ačiū, kad skaitote!

Rekomenduojamas: