Përmbajtje:

Robot i shërbimit të birrës DuvelBot - ESP32 -CAM: 4 hapa (me fotografi)
Robot i shërbimit të birrës DuvelBot - ESP32 -CAM: 4 hapa (me fotografi)

Video: Robot i shërbimit të birrës DuvelBot - ESP32 -CAM: 4 hapa (me fotografi)

Video: Robot i shërbimit të birrës DuvelBot - ESP32 -CAM: 4 hapa (me fotografi)
Video: Top News - Roboti i cili punon në ndërtim/ Teknologjia po zëvendëson njeriun 2024, Qershor
Anonim
DuvelBot - Roboti i Shërbimit të Birrës ESP32 -CAM
DuvelBot - Roboti i Shërbimit të Birrës ESP32 -CAM

Pas punës së një dite të vështirë, asgjë nuk i afrohet gëlltitjes së birrës tuaj të preferuar në shtrat. Në rastin tim, kjo është ale bjonde belge "Duvel". Sidoqoftë, pasi të rrëzohemi, ne përballemi me një problem më serioz: frigoriferi që përmban Duvelin tim është i pakapërcyeshëm 20 metra i larguar nga divani në fjalë.

Ndërsa një detyrim i lehtë nga ana ime mund të lëvizë një pastrues të rastësishëm adoleshent të frigoriferit për të derdhur ndihmën e javës sime të Duvel, detyra e dërgimit të tij në fakt tek paraardhësi i tij pothuajse i rraskapitur është padyshim një hap shumë larg.

Koha për të shpërthyer hekurin dhe tastierën…

DuvelBot është një kamerë uebi e bazuar në AI-Thinker ESP32-CAM, të cilën mund ta kontrolloni nga smartphone, shfletues ose tabletë.

Easyshtë e lehtë të përshtatet ose zgjerohet kjo platformë në përdorime më pak alkoolike (mendoni SpouseSpy, NeighbourWatch, KittyCam…).

Unë e ndërtova këtë robot kryesisht për të mësuar pak për të gjithë programimin e uebit dhe gjërat IoT, për të cilat nuk dija asgjë. Pra, në fund të këtij Udhëzuesi është një shpjegim i përpunuar se si funksionon.

Shumë pjesë të këtij Udhëzuesi bazohen në shpjegimet e shkëlqyera që gjenden në Rutom Nerd Tutorials, kështu që ju lutemi shkoni t'i vizitoni!

Furnizimet

Çfarë ju nevojitet:

Lista e pjesëve nuk është e gdhendur në gur dhe shumë pjesë mund të merren në një ton të versioneve të ndryshme dhe nga shumë vende të ndryshme. Kam blerë shumicën nga Ali-Express. Ashtu siç tha Machete: improvizo.

Hardware:

  • Moduli AI Thinker ESP32-CAM. Ndoshta mund të funksionojë me module të tjera ESP32-CAM, por kjo është ajo që kam përdorur
  • Bordi i drejtuesit të motorit L298N,
  • Një platformë e lirë robotike me 4 rrota,
  • Një strehë me një sipërfaqe të madhe të sheshtë siç është Hammond Electronics 1599KGY,
  • Konvertues USB-në-3.3V-TTL për programim.
  • Për ndriçimin: 3 LED të bardhë, BC327 ose transistorë të tjerë të përgjithshëm NPN (Ic = 500mA), rezistencë 4k7k, 3 rezistorë 82Ohm, tabelë, kabllo (shiko skemën dhe figurat).
  • Një çelës i ndezjes/fikjes dhe një buton normalisht i hapur për programim.

Opsionale:

  • Një aparat fotografik me peshë më të gjatë se kamera standarde OV2460 e pajisur me modulin ESP32-CAM,
  • Antena WiFi me kabllo mjaft të gjatë dhe Lidhës Ultra Miniature Coax, si kjo. ESP32-CAM ka një antenë në bord dhe strehimi është plastik, kështu që një antenë nuk është vërtet e nevojshme, megjithatë unë mendova se dukej e ftohtë, kështu që…
  • Letër ngjitëse e printueshme me bojë për dizajnin e kapakut të sipërm.

Mjetet e zakonshme të harduerit: hekur bashkues, stërvitje, kaçavida, pincë…

Hapi 1: Ndërtimi i Platformës Robot

Ndërtimi i Platformës së Robotëve
Ndërtimi i Platformës së Robotëve
Ndërtimi i Platformës së Robotëve
Ndërtimi i Platformës së Robotëve
Ndërtimi i Platformës së Robotëve
Ndërtimi i Platformës së Robotëve

Skematike:

Skema nuk është asgjë e veçantë. ESP32-cam kontrollon motorët përmes bordit të drejtuesit të motorit L298N, i cili ka dy kanale. Motorët e anës së majtë dhe të djathtë janë vendosur paralelisht dhe secila anë zë një kanal. Katër kondensatorë të vegjël qeramikë 10..100nF pranë kunjave të motorit janë si gjithmonë të këshillueshëm për të kundërshtuar ndërhyrjen RF. Gjithashtu, një kapak i madh elektrolitik (2200… 4700uF) në furnizimin e bordit të motorit siç tregohet në skemë, ndërsa nuk është i nevojshëm, mund të kufizojë pak valën e tensionit të furnizimit (nëse doni të shihni një film horror, atëherë hetoni Vbat me një oshiloskop ndërsa motorët janë aktivë).

Vini re se të dy kanalet motorike KNASHILLIMET e kunjave drejtohen nga e njëjta kunj me modulim të gjerësisë së impulsit (PWM) të ESP32 (IO12). Kjo ndodh sepse moduli ESP32-CAM nuk ka një ton GPIO (skema e modulit e përfshirë për referencë). LED -të e robotit drejtohen nga IO4, i cili gjithashtu drejton LED flash në bord, kështu që hiqni Q1 për të parandaluar që drita LED të ndizet në një strehë të mbyllur.

Butoni i programimit, çelësi i ndezjes/fikjes, lidhësi i karikimit dhe lidhësi i programimit janë të arritshëm nën robot. Mund të kisha bërë një punë shumë më të mirë për lidhësin e programimit (fole 3.5 mm?), Por birra nuk mund të priste më. Gjithashtu përditësimet mbi ajër (OTA) do të ishte mirë të konfiguroheshin.

Për ta vendosur robotin në modalitetin e programimit, shtypni butonin e programimit (kjo tërheq IO0 të ulët) dhe pastaj ndizeni.

E rëndësishme: për të ngarkuar bateritë NiMH të robotit, përdorni një pajisje furnizimi laboratorik (të shkarkuar) në rreth 14V dhe rrymë të kufizuar në 250mA. Tensioni do të përshtatet me tensionin e baterive. Shkëputeni nëse roboti ndihet i nxehtë ose tensioni i baterisë arrin rreth 12.5V. Një përmirësim i dukshëm këtu do të ishte integrimi i një ngarkuesi të duhur të baterisë, por kjo është jashtë fushëveprimit të këtij Udhëzuesi.

Pajisja:

Ju lutemi shikoni gjithashtu shënimet në fotografi. Strehimi është montuar në bazën e robotit duke përdorur 4 bulona M4 dhe arra vetë-mbyllëse. Vini re tubin e gomës të përdorur si ndarës distancash. Shpresojmë, kjo gjithashtu i jep një pezullim Duvel, nëse udhëtimi rezulton me gunga. Moduli ESP32-CAM dhe bordi motorik L298N janë montuar në strehim duke përdorur këmbë ngjitëse plastike (nuk jeni të sigurt për emrin e duhur në anglisht), për të parandaluar nevojën për të shpuar vrima shtesë. Gjithashtu ESP32 është montuar në pllakën e tij të shpimit dhe kapëset me priza që mund të lidhen. Kjo e bën të lehtë shkëmbimin e ESP32.

Mos harroni: nëse po shkoni me një antenë të jashtme WiFi në vend të asaj të integruar, atëherë lidhni edhe bluzën e përzgjedhjes së antenës në pjesën e poshtme të bordit ESP32-CAM.

Shtypni logon kryesore në skedarin DuvelBot.svg në letër ngjitëse me bojë (ose dizajnoni tuajin), dhe jeni gati për të shkuar!

Hapi 2: Programoni Robotin

Programoni Robotin
Programoni Robotin

Këshillohet që të programoni robotin para se ta mbyllni, për t'u siguruar që gjithçka funksionon dhe nuk shfaqet tym magjik.

Keni nevojë për mjetet e mëposhtme softuerike:

  • Arduino IDE,
  • Bibliotekat ESP32, SPIFFS (sistemi serik i skedarëve flash periferik), biblioteka ESPAsync Webserver.

Ky i fundit mund të instalohet duke ndjekur këtë udhëzues rastësor deri në dhe duke përfshirë seksionin "organizimi i skedarëve tuaj". Me të vërtetë nuk mund ta shpjegoja më mirë.

Kodi:

Kodi im mund të gjendet në:

  • Një skicë Arduino DuvelBot.ino,
  • Një nën -dosje e të dhënave që mban skedarët që do të ngarkohen në flash ESP duke përdorur SPIFFS. Kjo dosje përmban faqen në internet që do të shërbejë ESP (index.html), një imazh të logos që është pjesë e faqes në internet (duvel.png) dhe një fletë stili të kaskaduar ose skedar CSS (style.css).

Për të programuar robotin:

  • Lidhni konvertuesin USB-TTL siç tregohet në skemë,
  • Skedar -> Hap -> shkoni te dosja ku është DuvelBot.ino.
  • Ndryshoni kredencialet tuaja të rrjetit në skicë:

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

  • Mjetet -> Bordi -> "AI -Thinker ESP -32 CAM" dhe zgjidhni portën serike të përshtatshme për kompjuterin tuaj (Mjetet -> Porti -> diçka si /dev /ttyUSB0 ose COM4),
  • Hapni monitorin serik në Arduino IDE, Ndërsa shtypni butonin PROG (që tërheq IO0 të ulët), ndizni robotin,
  • Kontrolloni në monitorin serik që ESP32 është gati për shkarkim,
  • Mbyllni monitorin serik (përndryshe ngarkimi i SPIFFS dështon),
  • Mjetet -> "ESP32 Sketch Data Upload" dhe prisni që të përfundojë,
  • Fikni dhe ndizni përsëri duke mbajtur butonin PROG për t'u kthyer në modalitetin e programimit,
  • Shtypni shigjetën "Ngarko" për të programuar skicën dhe prisni që të përfundojë,
  • Hapni monitorin serik dhe rivendosni ESP32 duke e fikur/ndezur,
  • Pasi të jetë nisur, shënoni adresën IP (diçka si 192.168.0.121) dhe shkëputeni robotin nga konvertuesi USB-TTL,
  • Hapni një shfletues në këtë adresë IP. Ju duhet të shihni ndërfaqen si në foto.
  • Opsionale: vendosni adresën mac të ESP32 në një adresë IP fikse në ruterin tuaj (varet nga mënyra se si bëhet ruteri).

Kjo eshte! Lexoni nëse doni të dini se si funksionon…

Hapi 3: Si funksionon

Tani vijmë në pjesën interesante: si funksionon e gjitha së bashku?

Do të përpiqem ta shpjegoj hap pas hapi … por ju lutem mbani në mend Kajnjaps nuk është specialist i programimit në internet. Në fakt, të mësuarit pak e programimit në internet ishte e gjithë premisa e ndërtimit të DuvelBot. Nëse bëj gabime të dukshme, ju lutemi lini një koment!

Ok, pasi të jetë ndezur ESP32, si zakonisht në konfigurim, ai inicializon GPIO -të, i lidh ato me kohëmatësit PWM për kontrollin motorik dhe LED. Shihni këtu për më shumë mbi kontrollin e motorit, është mjaft standarde.

Pastaj kamera është konfiguruar. Me qëllim e kam mbajtur rezolucionin mjaft të ulët (VGA ose 640x480) për të shmangur përgjigjen e ngadaltë. Vini re se bordi AI-Thinker ESP32-CAM ka një çip serial ram (PSRAM) që ai përdor për të ruajtur kornizat e kamerës me rezolucion më të madh:

if (psramFound ()) {Serial.println ("PSRAM u gjet."); config.frame_size = FRAMESIZE_VGA; config.jpg_quality = 12; config.fb_count = 2; // numri i bartësve të kornizave shiko: https://github.com/espressif/esp32-camera} else {Serial.println ("nuk u gjet PSRAM."); config.frame_size = FRAMESIZE_QVGA; config.jpg_quality = 12; config.fb_count = 1; }

Pastaj sistemi serik i skedarëve flash periferik (SPIFFS) është i inicializuar:

// inicializoni SPIFFS nëse (! SPIFFS.begin (true)) {Serial.println ("Ka ndodhur një gabim gjatë montimit të SPIFFS!"); kthim; }

SPIFFS vepron si një sistem i vogël skedarësh në ESP32. Këtu përdoret për të ruajtur tre skedarë: vetë uebfaqja index.html, një stil skedar i stilit të skedarëve të stiluar.css, dhe një logo-p.webp

Pastaj ESP32 lidhet me ruterin tuaj (mos harroni të vendosni kredencialet tuaja para se të ngarkoni):

// ndryshoni kredencialet e ruterit tuaj këtu char* ssid = "yourNetworkSSIDHere"; const char* password = "yourPasswordHere"; … // lidheni me WiFi Serial.print ("Lidhu me WiFi"); WiFi.filloni (ssid, fjalëkalim); ndërsa (WiFi.status ()! = WL_CONNECTED) {Serial.print ('.'); vonesë (500); } // tani i lidhur me ruterin: ESP32 tani ka adresë ip

Për të bërë në të vërtetë diçka të dobishme, ne fillojmë një server në internet asinkron:

// krijoni një objekt AsyncWebServer në portin server 80AsyncWebServer (80); … Server.begin (); // filloni të dëgjoni lidhjet

Tani, nëse shkruani adresën IP që iu caktua ESP32 nga ruteri në shiritin e adresave të një shfletuesi, ESP32 merr një kërkesë. Kjo do të thotë se duhet t'i përgjigjet klientit (ju, ose shfletuesi juaj) duke i shërbyer diçka, për shembull një faqe në internet.

ESP32 di si të përgjigjet, sepse në konfigurim përgjigjet për të gjitha kërkesat e mundshme të lejuara janë regjistruar duke përdorur server.on (). Për shembull, faqja kryesore e internetit ose indeksi (/) trajtohet kështu:

server.on ("/", HTTP_GET, (AsyncWebServerRequest *request) {Serial.println ("/kërkesa u mor!"); kërkesë-> dërgim (SPIFFS, "/index.html", String (), false, procesor);});

Pra, nëse klienti lidhet, ESP32 përgjigjet duke dërguar skedarin index.html nga sistemi i skedarëve SPIFFS. Procesori i parametrave është emri i një funksioni që para -përpunon html dhe zëvendëson çdo etiketë të veçantë:

// Zëvendëson vendmbërritësit në html si %DATA %// me variablat që dëshironi të shfaqni //

Të dhënat: %DATA %

Procesori me tela (const String & var) {if (var == "DATA") {//Serial.println("in procesor! "); string String (dutyCycleNow); } string String ();}

Tani, le të zbërthejë vetë uebfaqja index.html. Në përgjithësi ka gjithmonë tre pjesë:

  1. kod html: cilat elementë duhet të shfaqen (butona/tekst/rrëshqitës/imazhe etj.),
  2. kodi i stilit, ose në një skedar të veçantë.css ose në një … seksion: si duhet të duken elementet,
  3. javascript a … seksioni: si duhet të veprojë uebfaqja.

Pasi index.html të ngarkohet në shfletues (i cili e di se është html për shkak të linjës DOCTYPE), ai shkon në këtë linjë:

Kjo është një kërkesë për një fletë stili css. Vendndodhja e kësaj fletë është dhënë në href = "…". Pra, çfarë bën shfletuesi juaj? E drejta, ajo nis një kërkesë tjetër tek serveri, këtë herë për style.css. Serveri e kap këtë kërkesë, sepse është regjistruar:

server.on ("/style.css", HTTP_GET, (kërkesë AsyncWebServerRequest *) {Serial.println ("kërkesa për css u mor"); kërkesë-> dërgim (SPIFFS, "/style.css", "text/css ");});

I zoti a? Rastësisht, mund të ketë qenë href = "/some/file/on/the/other/side/of/the/moon", për të gjithë kujdesin ndaj shfletuesit tuaj. Do të shkonte ta merrte atë skedar po aq lumturisht. Unë nuk do të shpjegoj në lidhje me fletën e stilit pasi ajo thjesht kontrollon pamjen, kështu që nuk është vërtet interesante këtu, por nëse doni të mësoni më shumë, shikoni këtë mësim.

Si shfaqet logoja e DuvelBot? Në index.html kemi:

të cilit ESP32 i përgjigjet me:

server.on ("/duvel", HTTP_GET, (AsyncWebServerRequest *request) {Serial.println ("kërkesa e logos së duvel u mor!"); kërko-> dërgim (SPIFFS, "/duvel.png", "image/png ");});

..një tjetër skedar SPIFFS, këtë herë një imazh i plotë, siç tregohet nga "image/png" në përgjigje.

Tani vijmë në pjesën vërtet interesante: kodin për butonat. Le të përqendrohemi në butonin FORWARD:

PWRPARA

Emri i klasës = "…" është vetëm një emër për ta lidhur me fletën e stilit për të personalizuar madhësinë, ngjyrën, etj. Pjesët e rëndësishme janë onmousedown = "toggleCheckbox ('përpara')" dhe onmouseup = "toggleCheckbox ('stop') ". Këto përbëjnë veprimet e butonit (e njëjtë për ontouchstart/ontouchend por për atë është ekranet me prekje/telefonat). Këtu, veprimi i butonit thërret një funksion toggleCheckbox (x) në seksionin javascript:

funksioni toggleCheckbox (x) {var xhr = i ri XMLHttpRequest (); xhr.open ("GET", "/" + x, e vërtetë); xhr.dërgo (); // mund të bëjë diçka edhe me përgjigjen kur të jetë gati, por ne nuk}

Pra, duke shtypur butonin përpara, rezulton menjëherë në thirrjen toggleCheckbox ('përpara'). Ky funksion nis më pas një XMLHttpRequest "GET", të vendndodhjes "/forward" i cili vepron njësoj si në rast se do të kishit shtypur 192.168.0.121/forward në shiritin e adresave të shfletuesit tuaj. Pasi kjo kërkesë të arrijë në ESP32, ajo trajtohet nga:

server.on ("/përpara", HTTP_GET, (AsyncWebServerRequest *kërkesë) {Serial.println ("pranuar/përcjellë"); actionNow = PWRPARA; kërkesë-> dërgim (200, "tekst/thjeshtë", "OK përpara. ");});

Tani ESP32 thjesht përgjigjet me një tekst "OK përpara". Shënim toggleCheckBox () nuk bën asgjë me (ose prit) këtë përgjigje, megjithatë mundet siç tregohet më vonë në kodin e kamerës.

Në vetvete gjatë kësaj përgjigjeje, programi vendos vetëm një veprim të ndryshueshëmNow = PARA, si përgjigje ndaj shtypjes së butonit. Tani në pjesën kryesore të programit, kjo variabël monitorohet me qëllim të ngritjes/uljes së PWM të motorëve. Logjika është: për sa kohë që kemi një veprim që nuk është STOP, ngritni motorët në atë drejtim derisa të arrihet një numër i caktuar (dutyCycleMax). Mbajeni atë shpejtësi, për aq kohë sa veprimi Tani nuk ka ndryshuar:

void loop () {currentMillis = millis (); if (currentMillis - previousMillis> = dutyCycleStepDelay) {// ruani herën e fundit që keni ekzekutuar ciklin previousMillis = currentMillis; // mainloop është përgjegjës për ngritjen/zbritjen e motorëve nëse (veprim Tani! = Veprim i mëparshëm) {// zbres poshtë, pastaj ndalo, pastaj ndrysho veprimin dhe ngre detyrënCycleNow = dutyCycleNow-dutyCycleStep; nëse (dutyCycleNow <= 0) {// nëse pas ngritjes poshtë dc është 0, vendoseni në drejtimin e ri, filloni në mincycycle cycle minDIR (actionNow); previousAction = veprimTani; dutyCycleNow = detyrëCycleMin; }} else // actionNow == rakordimi i mëparshëm i veprimit, përveç kur drejtimi është STOP {if (actionNow! = STOP) {dutyCycleNow = dutyCycleNow+dutyCycleStep; if (dutyCycleNow> dutyCycleMax) dutyCycleNow = dutyCycleMax; } else dutyCycleNow = 0; } ledcWrite (pwmChannel, dutyCycleNow); // rregullo motoçikletën e motorit}}

Kjo ngadalë rrit shpejtësinë e motorëve, në vend që të lëshohet me shpejtësi të plotë dhe të derdhë Duvelin e çmuar të çmuar. Një përmirësim i dukshëm do të ishte zhvendosja e këtij kodi në një rutinë të ndërprerjes së kohëmatësit, por funksionon ashtu siç është.

Tani nëse lëshojmë butonin përpara, shfletuesi juaj thërret toggleCheckbox ('stop'), duke rezultuar në një kërkesë për GET /stop. ESP32 vendos veprimin Tani në STOP (dhe përgjigjet me "OK stop."), I cili çon në pjesën kryesore për të rrotulluar motorët.

Po LEDs? I njëjti mekanizëm, por tani kemi një rrëshqitës:

Në javascript, cilësimi i rrëshqitësit monitorohet, në mënyrë që në çdo ndryshim të ndodhë një thirrje për të marrë "/LED/xxx", ku xxx është vlera e shkëlqimit që LED -të duhet të vendosen në:

var slide = document.getElementById ('slide'), sliderDiv = document.getElementById ("sliderAmount"); slide.onchange = funksion () {var xhr = i ri XMLHttpRequest (); xhr.open ("GET", "/LED/" + kjo. vlera, e vërtetë); xhr.dërgo (); sliderDiv.innerHTML = kjo.vlerë; }

Vini re se ne kemi përdorur document.getElementByID ('rrëshqitje') për të marrë vetë objektin e rrëshqitësit, i cili është deklaruar me dhe që vlera i del në një element teksti me çdo ndryshim.

Trajtuesi në skicë kap të gjitha kërkesat e shkëlqimit duke përdorur "/LED/*" në regjistrimin e mbajtësit. Pastaj pjesa e fundit (një numër) ndahet dhe hidhet në një int:

server.on ("/LED/ *", HTTP_GET, (kërkesë AsyncWebServerRequest *) {Serial.println ("kërkesa e udhëhequr u mor!"); setLedBrightness ((kërkesë-> url ()). nënstring (5).toInt ()); kërkesa-> dërgoni (200, "tekst/thjeshtë", "OK Leds.");});

Ngjashëm siç u përshkrua më sipër, butonat e radios kontrollojnë variablat që përcaktojnë standardet e PWM, të tilla që DuvelBot mund të vozisë ngadalë tek ju me birrën, duke pasur kujdes që të mos derdhë atë ar të lëngshëm dhe të kthehet shpejt në kuzhinë për të marrë pak më shumë.

… Pra, si azhurnohet imazhi i kamerës pa pasur nevojë të rifreskoni faqen? Për këtë ne përdorim një teknikë të quajtur AJAX (JavaScript Asinkron dhe XML). Problemi është se normalisht një lidhje klient-server ndjek një procedurë fikse: klienti (shfletuesi) bën kërkesë, serveri (ESP32) përgjigjet, rasti mbyllet. U krye Asgjë nuk ndodh më. Sikur disi të mund të mashtronim shfletuesin të kërkonte rregullisht përditësime nga ESP32 … dhe kjo është pikërisht ajo që do të bëjmë me këtë pjesë të javascript:

setInterval (funksion () {var xhttp = i ri XMLHttpRequest (); xhttp.open ("GET", "/CAMERA", true); xhttp.responseType = "blob"; xhttp.timeout = 500; xhttp.ontimeout = funksion () {}; xhttp.onload = funksion (e) {if (this.readyState == 4 && this.status == 200) {// shiko: 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); // krijoni një objekt nga pika document.querySelector ("#camimage"). src = imageUrl; urlCreator.revokeObjectURL (imageurl)}}; xhttp.send ();}, 250);

setInterval merr si parametër një funksion dhe e ekzekuton atë herë pas here (këtu një herë në 250ms duke rezultuar në 4 kuadro/sekondë). Funksioni që ekzekutohet bën një kërkesë për një "blob" binar në adresën /CAMERA. Kjo trajtohet nga ESP32-CAM në skicën si (nga Randomnerdtutorials):

server.on ("/CAMERA", HTTP_GET, (AsyncWebServerRequest * kërkesë) {Serial.println ("kërkesa e kamerës u mor!"); camera_fb_t * fb = NULL; // esp_err_t res = ESP_OK; size_t _jpg_buf_len = 0; * _jpg_buf = NULL; // kap një kornizë fb = esp_camera_fb_get (); nëse (! fb) {Serial.println ("Tamponi i kornizës nuk mund të merrej"); kthehu;} nëse (fb-> format! = PIXFORMAT_JPEG)/ /tashmë në këtë format nga konfigurimi {bool jpeg_converted = frame2jpg (fb, 80, & _jpg_buf, & _jpg_buf_len); esp_camera_fb_return (fb); fb = NULL; if (! jpeg_converted) {Serial.println dështoi ("JP); }} tjetër {_jpg_buf_len = fb-> len; _jpg_buf = fb-> buf;} //Serial.println(_jpg_buf_len); // dërgoni kërkesën e imazhit të formatuar-> send_P (200, "image/jpg", _jpg_buf, _jpg_buf); // pastrim nëse (fb) {esp_camera_fb_return (fb); fb = NULL; _jpg_buf = NULL;} tjetër nëse (_jpg_buf) {falas (_jpg_buf); _jpg_buf = NULL;}});

Pjesët e rëndësishme janë marrja e kornizës fb = esp_camera_fb_get () duke e kthyer atë në një-j.webp

Funksioni javascript pastaj pret që ky imazh të arrijë. Atëherë duhet vetëm pak punë për ta kthyer "blob" -in e marrë në një url që mund të përdoret si burim për të përditësuar imazhin në faqen html.

epo, ne mbaruam!

Hapi 4: Idetë dhe mbetjet

Ide & Mbetje
Ide & Mbetje

Qëllimi i këtij projekti për mua ishte të mësoja mjaftueshëm programim uebi për të ndërlidhur harduerin me uebin. Disa zgjerime të këtij projekti janë të mundshme. Këtu janë disa ide:

  • Zbatoni transmetimin "e vërtetë" të kamerës siç shpjegohet këtu dhe këtu dhe zhvendoseni atë në një server të dytë siç shpjegohet këtu në të njëjtin ESP32, por në bërthamën tjetër të CPU -së, pastaj importoni kamerastream në html të shërbyer nga serveri i parë duke përdorur një…. Kjo duhet të rezultojë në azhurnime më të shpejta të kamerës.
  • Përdorni modalitetin e pikës së hyrjes (AP) në mënyrë që roboti të jetë më i pavarur siç shpjegohet këtu.
  • Zgjero me matjen e tensionit të baterisë, aftësitë e gjumit të thellë etj. Kjo është pak e vështirë për momentin sepse AI-Thinker ESP32-CAM nuk ka shumë GPIO; ka nevojë për zgjerim nëpërmjet uart dhe për shembull një arduino skllevër.
  • Shndërrohuni në një robot që kërkon mace që nxjerr herë pas here trajtimin e maceve me shtypjen e putrave të një butoni të madh, transmetoni mijëra fotografi të bukura të maceve gjatë ditës…

Ju lutemi komentoni nëse ju pëlqen ose keni pyetje dhe faleminderit për leximin!

Recommended: