Mundarija:

DuvelBot - ESP32 -CAM pivoga xizmat ko'rsatuvchi robot: 4 qadam (rasmlar bilan)
DuvelBot - ESP32 -CAM pivoga xizmat ko'rsatuvchi robot: 4 qadam (rasmlar bilan)

Video: DuvelBot - ESP32 -CAM pivoga xizmat ko'rsatuvchi robot: 4 qadam (rasmlar bilan)

Video: DuvelBot - ESP32 -CAM pivoga xizmat ko'rsatuvchi robot: 4 qadam (rasmlar bilan)
Video: Очередной рейс (1958) фильм 2024, Iyun
Anonim
DuvelBot - ESP32 -CAM pivoga xizmat ko'rsatuvchi robot
DuvelBot - ESP32 -CAM pivoga xizmat ko'rsatuvchi robot

Qattiq ishdan so'ng, divanda sevimli pivoni ichishga hech narsa yaqin kelmaydi. Mening holatimda, bu belgiyalik "Duvel" sarg'ish yungli. Ammo, yiqilgandan keyin, biz eng jiddiy muammoga duch keldik: mening Duvelli muzlatgich - bu divandan 20 fut balandlikda.

Men tomondan engil majburlash vaqti -vaqti bilan o'sib borayotgan muzlatgichni bir haftalik nafaqani to'kib yuborishga majbur qilishi mumkin edi, lekin uni deyarli tugab qolgan naslga etkazish vazifasi, albatta, juda bir qadam.

Lehimlash temir va klaviaturani ajratish vaqti keldi …

DuvelBot-bu aql bovar qilmaydigan AI-Thinker ESP32-CAM haydovchi veb-kamerasi, uni smartfon, brauzer yoki planshet orqali boshqarish mumkin.

Bu platformani alkogolli ichimliklar iste'moliga moslashtirish yoki kengaytirish oson (SpouseSpy, NeighbourWatch, KittyCam… deb o'ylang).

Men bu robotni asosan veb -dasturlash va Internet haqida hech narsa bilmagan narsalar haqida bilish uchun qurdim. Shunday qilib, ushbu yo'riqnomaning oxirida uning qanday ishlashi haqida batafsil tushuntirish berilgan.

Ushbu ko'rsatmaning ko'p qismlari tasodifiy Nerd darslarida topilgan ajoyib tushuntirishlarga asoslangan, shuning uchun ularga tashrif buyuring!

Ta'minotlar

Sizga nima kerak:

Ehtiyot qismlar ro'yxati toshga o'yilmagan va ko'p qismlarni turli xil versiyalarda va har xil joylardan olish mumkin. Men ko'pini Ali-Expressdan sotib oldim. Machete aytganidek: improvizatsiya.

Uskuna:

  • AI Thinker ESP32-CAM moduli. Ehtimol, u boshqa ESP32-CAM modullari bilan ishlashi mumkin, lekin men buni ishlatganman
  • L298N dvigatel haydovchi platasi,
  • Arzon 4 g'ildirakli robototexnika platformasi,
  • Hammond Electronics 1599KGY kabi katta tekis yuzaga ega korpus,
  • Dasturlash uchun USB-to-3.3V-TTL-konvertori.
  • Yoritish uchun: 3 ta oq LED, BC327 yoki boshqa umumiy maqsadli tranzistorli NPN (Ic = 500mA), 4k7k rezistor, 3 82 Ohmli rezistorlar, perfboard, kabellar (sxemaga va rasmlarga qarang).
  • Dasturlash uchun yoqish/o'chirish tugmasi va odatda ochiq tugma.

Majburiy emas:

  • ESP32-CAM moduli bilan ta'minlangan standart OV2460 kamerasidan ko'ra uzunroq egiluvchan baliq ko'zli kamera,
  • Wi -Fi antennasi mos keladigan uzun kabeli va ultra miniatyurali koaks ulagichi kabi. ESP32-CAM bortli antennaga ega va korpusi plastik, shuning uchun antennaga kerak emas, lekin menimcha, bu juda zo'r edi, shuning uchun …
  • Yuqori qopqoq dizayni uchun inkjet bosma stiker qog'ozi.

Oddiy uskuna asboblari: lehimlantiruvchi temir, matkaplar, tornavidalar, penseler …

1 -qadam: Robot platformasini yaratish

Robot platformasini yaratish
Robot platformasini yaratish
Robot platformasini yaratish
Robot platformasini yaratish
Robot platformasini yaratish
Robot platformasini yaratish

Sxema:

Sxemada alohida narsa yo'q. ESP32-kamerasi dvigatellarni L298N dvigatellar paneli orqali boshqaradi, u ikkita kanalga ega. Chap va o'ng motorlar parallel joylashtirilgan va har bir tomon bitta kanalni egallaydi. Dvigatel pinlariga yaqin bo'lgan to'rtta kichik 10..100nF seramika kondansatkichlari har doimgidek, RF shovqinlariga qarshi turish uchun tavsiya etiladi. Bundan tashqari, sxemada ko'rsatilgandek, dvigatel platasini etkazib berishda katta elektrolitik qopqoq (2200 … 4700uF), kerak bo'lmaganda, besleme zo'riqishining to'lqinlanishini biroz cheklab qo'yishi mumkin (agar siz dahshatli filmni ko'rmoqchi bo'lsangiz, Vbatni tekshiring. motorlar faol bo'lganda osiloskop bilan).

E'tibor bering, har ikkala dvigatel kanali ham ENABLE pinlari ESP32 (IO12) ning bir xil puls kengligi modulyatsiyalangan (PWM) pinidan boshqariladi. Buning sababi shundaki, ESP32-CAM modulida bir tonna GPIO yo'q (modul sxemasi ma'lumot uchun kiritilgan). Robotning svetodiodlari IO4 tomonidan boshqariladi, u ham bortdagi chirog'li LEDni boshqaradi, shuning uchun yopiq korpusda chirog'li LED yonib ketmasligi uchun Q1ni olib tashlang.

Robot ostida dasturlash tugmasi, yoqish/o'chirish tugmasi, zaryadlovchi va dasturlash ulagichi mavjud. Men dasturlash ulagichi uchun ancha yaxshi ish qilishim mumkin edi (3,5 mm raz'em?), Lekin pivo boshqa kuta olmadi. Havodan yangilanishlarni (OTA) sozlash ham yaxshi bo'lardi.

Robotni dasturlash rejimiga o'tkazish uchun dasturlash tugmachasini bosing (IO0 past bo'ladi) va keyin uni yoqing.

Muhim: robotning NiMH batareyalarini zaryad qilish uchun 14V va oqim 250mA bilan cheklangan laboratoriya ta'minot majmuasidan foydalaning (yuklanmagan), kuchlanish batareyalar kuchlanishiga moslashadi. Agar robot qizib ketsa yoki batareya zo'riqishi taxminan 12,5 V ga yetsa, uzing. Bu erda to'g'ri zaryadlovchi qurilmasini birlashtirish mumkin bo'ladi, lekin bu ko'rsatma doirasidan tashqarida.

Uskuna:

Iltimos, rasmlardagi yozuvlarni ham ko'ring. Korpus robot tayanchiga 4 ta M4 murvat va o'z-o'zidan qulflanadigan yong'oqlar yordamida o'rnatiladi. Masofa oralig'i sifatida ishlatiladigan rezina quvurlarga e'tibor bering. Umid qilamanki, bu, shuningdek, Duvelga biroz to'xtash imkonini beradi. ESP32-CAM moduli va L298N dvigatel platasi qo'shimcha teshiklarni burg'ilashni oldini olish uchun plastik yopishqoq oyoqlar yordamida (ingliz tilida to'g'ri nom berilmagan) korpusga o'rnatiladi. Bundan tashqari, ESP32 o'zining shaxsiy taxtasi va ulanadigan pin boshlariga o'rnatiladi. Bu ESP32 -ni almashtirishni osonlashtiradi.

Shuni unutmangki, agar siz o'rnatilgan Wi-Fi o'rniga tashqi antenna bilan ishlasangiz, ESP32-CAM kartasining pastki qismidagi antennani tanlash uchun o'tish moslamasini lehimlang.

DuvelBot.svg faylidagi eng yaxshi logotipni inkjet stikerli qog'ozga chop eting (yoki o'zingiz yaratasiz) va siz tayyormiz!

2 -qadam: Robotni dasturlash

Robotni dasturlash
Robotni dasturlash

Robotni yopishdan oldin, hamma narsa ishlayotganiga va sehrli tutun chiqmasligiga ishonch hosil qilish uchun dasturlash tavsiya etiladi.

Sizga quyidagi dasturiy vositalar kerak bo'ladi:

  • Arduino IDE,
  • ESP32 kutubxonalari, SPIFFS (ketma -ket tashqi flesh -fayl tizimi), ESPAsync veb -server kutubxonasi.

Ikkinchisini "tasodifiy fayllarni tartibga solish" bo'limiga qadar ushbu tasodifiy ko'rsatmalarga rioya qilib o'rnatish mumkin. Men buni yaxshiroq tushuntira olmadim.

Kod:

Mening kodimni quyidagi manzilda topish mumkin:

  • Arduino eskizi DuvelBot.ino,
  • ESP flesh -diskiga SPIFFS yordamida yuklanadigan fayllar saqlanadigan ma'lumotlar ichki papkasi. Bu papkada ESP xizmat ko'rsatadigan veb -sahifa (index.html), veb -sahifaning bir qismi bo'lgan logotip tasviri (duvel.png) va kaskadli uslublar varaqasi yoki CSS fayli (style.css) mavjud.

Robotni dasturlash uchun:

  • USB-TTL konvertorini sxemada ko'rsatilgan tarzda ulang,
  • Fayl -> Ochish -> DuvelBot.ino joylashgan papkaga o'ting.
  • Eskizda tarmoq hisob ma'lumotlarini o'zgartiring:

const char* ssid = "yourNetworkSSIDHere"; const char* password = "yourPassword Here";

  • Asboblar -> Kengash -> "AI -Thinker ESP -32 CAM" va kompyuteringizga mos keladigan ketma -ket portni tanlang (Asboblar -> Port -> /dev /ttyUSB0 yoki COM4 kabi),
  • Arduino IDE -da ketma -ket monitorni oching, PROG tugmachasini bosib (IO0 past), robotni yoqing,
  • ESP32 yuklab olish uchun tayyorligini ketma -ket monitorda tekshiring.
  • Ketma -ket monitorni yoping (aks holda SPIFFS yuklanmaydi)
  • Asboblar -> "ESP32 eskiz ma'lumotlarini yuklash" va tugashini kuting,
  • Dasturlash rejimiga qaytish uchun PROG tugmachasini bosib ushlab turing,
  • Eskizni dasturlash uchun "Yuklash" o'qini bosing va tugashini kuting,
  • Seriyali monitorni oching va ESP32 -ni o'chiring/yoqing,
  • U ishga tushirilgandan so'ng, IP manzilini yozing (192.168.0.121 kabi) va robotni USB-TTL konvertoridan uzing,
  • Ushbu IP -manzilda brauzerni oching. Siz interfeysni rasmdagi kabi ko'rishingiz kerak.
  • Majburiy emas: ESP32-ning mak-manzilini yo'riqnoma ichidagi aniq IP-manzilga o'rnating (yo'riqnoma qanday ishlashiga bog'liq).

Bo'ldi shu! Agar u qanday ishlashini bilmoqchi bo'lsangiz, o'qing …

3 -qadam: Bu qanday ishlaydi

Endi biz qiziqarli qismga keldik: bularning barchasi birgalikda qanday ishlaydi?

Men buni bosqichma -bosqich tushuntirishga harakat qilaman … asta -sekin, lekin unutmangki, Kajnjaps veb -dasturlash bo'yicha mutaxassis emas. Darhaqiqat, veb -dasturlashni o'rganish, DuvelBot -ni yaratishga asos bo'ldi. Agar men aniq xato qilsam, iltimos, izoh qoldiring!

OK, ESP32 yoqilgandan so'ng, odatdagidek, GPIO -ni ishga tushiradi, ularni dvigatel va LEDni boshqarish uchun PWM taymerlari bilan bog'laydi. Dvigatelni boshqarish haqida ko'proq ma'lumot olish uchun bu erga qarang, bu juda standart.

Keyin kamera sozlanadi. Men sekin javob bermaslik uchun ataylab piksellar sonini past darajada ushlab turdim (VGA yoki 640x480). E'tibor bering, AI-Thinker ESP32-CAM kartasida ketma-ket qo'chqor chipi (PSRAM) mavjud, u katta o'lchamdagi kamera ramkalarini saqlash uchun ishlatiladi:

if (psramFound ()) {Serial.println ("PSRAM topildi."); config.frame_size = FRAMESIZE_VGA; config.jpg_quality = 12; config.fb_count = 2; // ramka buferlari soni qarang: https://github.com/espressif/esp32-camera} else {Serial.println ("PSRAM topilmadi."); config.frame_size = FRAMESIZE_QVGA; config.jpg_quality = 12; config.fb_count = 1; }

Keyin ketma -ket periferik flesh -fayl tizimi (SPIFFS) ishga tushiriladi:

// SPIFFS -ni ishga tushirish, agar (! SPIFFS.begin (rost)) {Serial.println ("SPIFFS -ni o'rnatishda xatolik yuz berdi!"); qaytish; }

SPIFFS ESP32 -da kichik fayl tizimi kabi ishlaydi. Bu erda u uchta faylni saqlash uchun ishlatiladi: veb -sahifaning o'zi index.html, kaskadli uslublar jadvali style.css va-p.webp

Keyin ESP32 yo'riqchingizga ulanadi (yuklashdan oldin hisob ma'lumotlarini o'rnatishni unutmang):

// yo'riqnoma ma'lumotlarini o'zgartirish hareconst char* ssid = "yourNetworkSSIDHere"; const char* password = "yourPasswordHere"; … // WiFi Serial.print -ga ulanish ("WiFi -ga ulanish"); WiFi.begin (ssid, parol); while (WiFi.status ()! = WL_CONNECTED) {Serial.print ('.'); kechikish (500); } // hozir yo'riqchiga ulangan: ESP32 endi IP -manzilga ega

Aslida foydali narsa qilish uchun biz asenkron veb -serverni ishga tushiramiz:

// port 80AsyncWebServer serverida (80) AsyncWebServer ob'ektini yaratish; … Server.begin (); // ulanishlarni tinglashni boshlang

Endi, agar siz brauzer manzil satriga yo'riqnoma tomonidan ESP32 ga tayinlangan IP manzilini kiritsangiz, ESP32 so'rovini oladi. Bu shuni anglatadiki, u mijozga (siz yoki brauzeringiz) biror narsaga, masalan, veb -sahifaga xizmat ko'rsatish orqali javob berishi kerak.

ESP32 qanday javob berishni biladi, chunki sozlash paytida ruxsat etilgan barcha so'rovlarga javoblar server.on () yordamida qayd qilingan. Masalan, asosiy veb -sahifa yoki indeks (/) quyidagicha ishlanadi:

server.on ("/", HTTP_GET, (AsyncWebServerRequest *so'rovi) {Serial.println ("/so'rov qabul qilindi!"); so'rov-> yuborish (SPIFFS, "/index.html", String (), noto'g'ri, protsessor);});

Agar mijoz ulansa, ESP32 SPIFFS fayl tizimidan index.html faylini yuborish orqali javob beradi. Parametr protsessori - html -ni oldindan qayta ishlaydigan va har qanday maxsus teglar o'rnini bosuvchi funksiyaning nomi:

// %DATA %// html -dagi to'ldirgichlarni ko'rsatmoqchi bo'lgan o'zgaruvchilar bilan almashtiradi //

Ma'lumotlar: %DATA %

String protsessori (const String & var) {if (var == "DATA") {//Serial.println("protsessorda! "); Qaytish String (dutyCycleNow); } Stringni qaytarish ();}

Keling, index.html veb -sahifasini ajratib ko'rsatamiz. Umuman olganda, har doim uchta qism mavjud:

  1. html kodi: qanday elementlar ko'rsatilishi kerak (tugmalar/matn/slayderlar/rasmlar va boshqalar),
  2. uslub kodi, alohida.css faylida yoki… bo'limida: elementlar qanday bo'lishi kerak,
  3. javascript a… bo'limi: veb -sahifa qanday ishlashi kerak.

Index.html brauzerga yuklangandan so'ng (bu DOCTYPE liniyasi tufayli html ekanligini biladi), u quyidagi qatorga o'tadi:

Bu CSS uslublar varag'i uchun so'rov. Bu varaqning joylashuvi href = "…" da berilgan. Xo'sh, sizning brauzeringiz nima qiladi? To'g'ri, u serverga boshqa so'rov yuboradi, bu safar style.css uchun. Server bu so'rovni yozib oladi, chunki u ro'yxatdan o'tgan:

server.on ("/style.css", HTTP_GET, (AsyncWebServerRequest *so'rovi) {Serial.println ("CSS so'rovi qabul qilindi"); so'rov-> yuborish (SPIFFS, "/style.css", "text/css) ");});

Aniqmi? Aytgancha, bu sizning brauzeringiz uchun g'amxo'rlik qiladigan href = "/some/file/on/the/other/side/of/the/the" bo'lishi mumkin edi. Bu faylni xuddi xursandchilik bilan olib keladi. Men uslublar jadvali haqida tushuntirmayman, chunki u faqat tashqi ko'rinishini boshqaradi, shuning uchun bu erda qiziq emas, lekin agar siz ko'proq ma'lumotga ega bo'lishni istasangiz, ushbu qo'llanmani ko'rib chiqing.

DuvelBot logotipi qanday paydo bo'ladi? Index.html -da bizda:

unga ESP32 javob beradi:

server.on ("/duvel", HTTP_GET, (AsyncWebServerRequest *so'rovi) {Serial.println ("duvel logotipi so'rovi qabul qilindi!"); request-> yuborish (SPIFFS, "/duvel.png", "image/png) ");});

..boshqa SPIFFS fayli, bu safar javobda "image/png" bilan ko'rsatilgan to'liq rasm.

Endi biz haqiqatan ham qiziqarli qismga keldik: tugmalar kodi. FORWARD tugmachasiga e'tibor qaratamiz:

Oldinga

Sinf = "…" nomi - bu uning o'lchamini, rangini va boshqalarni sozlash uchun uni uslublar jadvaliga bog'laydigan ism. Muhim qismlar onmousedown = "toggleCheckbox (" oldinga ")" va onmouseup = "toggleCheckbox (" to'xtatish ") ". Bu tugmachaning harakatlarini tashkil qiladi (ontouchstart/ontouchend uchun ham xuddi shunday, lekin sensorli ekranlar/telefonlar uchun). Bu erda tugma harakati javascript bo'limida toggleCheckbox (x) funktsiyasini chaqiradi:

funktsiya toggleCheckbox (x) {var xhr = new XMLHttpRequest (); xhr.open ("Oling", "/" + x, to'g'ri); xhr.send (); // tayyor bo'lganda javob bilan biror narsa qila olardi, lekin biz emas}

Shunday qilib, oldinga o'tish tugmachasini bosish natijasida darhol o'tish tugmasi ("oldinga") chaqiriladi. Keyin bu funksiya "/oldinga" joylashuvining "Oling" XMLHttpRequest -ni ishga tushiradi, xuddi brauzerning manzil satriga 192.168.0.121/forward yozgandek ishlaydi. Bu so'rov ESP32 ga kelgandan so'ng, u quyidagilar bilan ishlanadi:

server.on ("/oldinga", HTTP_GET, (AsyncWebServerRequest *so'rovi) {Serial.println ("qabul qilingan/oldinga"); actionNow = FORWARD; request-> yuborish (200, "matn/oddiy", "OK oldinga"). ");});

Endi ESP32 "OK oldinga" yozuvi bilan javob beradi. E'tibor bering, toggleCheckBox () bu javob bilan hech narsa qilmaydi (yoki kutmaydi), lekin keyinchalik kamera kodida ko'rsatilgandek bo'lishi mumkin.

O'z -o'zidan, bu javob paytida, dastur faqat tugmani bosishga javob sifatida actionNow = FORWARD o'zgaruvchisini o'rnatadi. Endi dasturning asosiy qismida bu o'zgaruvchi dvigatellarning PWM tezligini oshirish/tushirish maqsadida kuzatiladi. Mantiq shundan iboratki: bizda to'xtab qolmaydigan harakat bo'lsa, ma'lum bir songa (dutyCycleMax) yetguncha dvigatellarni o'sha tomonga ko'taring. ActionNow o'zgarmagan ekan, bu tezlikni saqlang:

void loop () {currentMillis = millis (); if (currentMillis - previousMillis> = dutyCycleStepDelay) {// oxirgi marta oldingiMillis = currentMillis tsiklini bajargan vaqtni saqlang; // mainloop dvigatellarni yuqoriga/pastga siljitish uchun javobgardir, agar (actionNow! = previousAction) {// pastga tushsa, keyin to'xtasa, keyin harakatni o'zgartirsa va rampasini yuksaltirsa, dutyCycleNow = dutyCycleNow-dutyCycleStep; if (dutyCycleNow <= 0) {// agar dc pastga tushgandan keyin 0 bo'lsa, yangi yo'nalishga o'rnating, minDD tsiklidan boshlang (actionNow); previousAction = actionNow; dutyCycleNow = dutyCycleMin; }} else // actionNow == previousAction tezlashdi, faqat yo'nalish STOP bo'lsa {if (actionNow! = STOP) {dutyCycleNow = dutyCycleNow+dutyCycleStep; if (dutyCycleNow> dutyCycleMax) dutyCycleNow = dutyCycleMax; } else dutyCycleNow = 0; } ledcWrite (pwmChannel, dutyCycleNow); // mototsiklni sozlash}}

Bu asta -sekin dvigatellarning tezligini oshiradi, faqat to'liq tezlikda ishga tushirish va qimmatbaho qimmatbaho Duvelni to'kib yuborish o'rniga. Aniq yaxshilanish bu kodni taymerni uzish tartibiga o'tkazish bo'ladi, lekin u xuddi shunday ishlaydi.

Agar biz oldinga yo'naltirish tugmachasini qo'yib yuborsak, sizning brauzeringiz toggleCheckbox ("to'xtatish") ni chaqiradi, natijada GET /stop so'rovi paydo bo'ladi. ESP32 harakatni to'xtatishni belgilaydi (va "OK to'xtatish" bilan javob beradi).

LEDlar haqida nima deyish mumkin? Xuddi shu mexanizm, lekin hozir bizda slayder bor:

JavaScript -da, slayderning sozlamalari kuzatiladi, shunda har bir o'zgarishda "/LED/xxx" ga qo'ng'iroq qilinadi, bu erda xxx - LEDlarning yorqinligi:

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

E'tibor bering, biz hujjat.getElementByID ("slayd") yordamida e'lon qilingan slayder ob'ektining o'zi va qiymat har bir o'zgarish bilan matnli elementga chiqariladi.

Eskizdagi ishlovchi ishlov beruvchini ro'yxatdan o'tkazishda "/LED/*" tugmasi yordamida barcha yorqinlik so'rovlarini oladi. Keyin oxirgi qism (raqam) bo'linadi va int ga yuboriladi:

server.on ("/LED/ *", HTTP_GET, (AsyncWebServerRequest *so'rovi) {Serial.println ("boshlangan so'rov qabul qilindi!"); setLedBrightness ((request-> url ()). substring (5).toInt ()); request-> yuborish (200, "matn/oddiy", "OK Ledlar.");});

Yuqorida aytib o'tilganidek, radio tugmalari PWM standartlarini o'rnatadigan o'zgaruvchilarni boshqaradi, shuning uchun DuvelBot sizni pivo bilan asta -sekin haydab yuborishi mumkin, bu suyuq oltinni to'kib yubormaslik uchun va oshxonaga tezroq qaytib kelish uchun.

… Xo'sh, sahifani yangilamasdan kamera tasviri qanday yangilanadi? Buning uchun biz AJAX (Asenkron JavaScript va XML) deb nomlangan texnikadan foydalanamiz. Muammo shundaki, odatda mijoz-server aloqasi belgilangan tartibda amalga oshiriladi: mijoz (brauzer) so'rov yuboradi, server (ESP32) javob beradi, ish yopiladi. Bajarildi. Endi hech narsa bo'lmaydi. Agar biz biron -bir tarzda brauzerni aldab ESP32 -dan yangilanishlarni muntazam ravishda so'rab olsak edi … va biz bu javascript bilan aynan shunday qilamiz:

setInterval (function () {var xhttp = new XMLHttpRequest (); xhttp.open ("GET", "/CAMERA", true); xhttp.responseType = "blob"; xhttp.timeout = 500; xhttp.ontimeout = funktsiya ()}}} https://www.html5rocks.com/uz/tutorials/file/xhr2/ var urlCreator = window. URL || window.webkitURL; var imageUrl = urlCreator.createObjectURL (this.response); // blokdan ob'ekt yaratish document.querySelector ("#camimage"). src = imageUrl; urlCreator.revokeObjectURL (imageurl)}}; xhttp.send ();}, 250);

setInterval parametr sifatida funktsiyani oladi va uni tez -tez bajaradi (bu erda 250 msda bir marta, natijada 4 kadr/sekund). Amalga oshiriladigan funktsiya /CAMERA manzilidagi ikkilik "blok" so'rovini bajaradi. Bu eskizda ESP32-CAM tomonidan boshqariladi (Randomnerdtutorials dan):

server.on ("/KAMERA", HTTP_GET, (AsyncWebServerRequest * so'rovi) {Serial.println ("kamera so'rovi qabul qilindi!"); camera_fb_t * fb = NULL; // esp_err_t res = ESP_OK; size_t _jpg_buf_len = 0; uint8 * _jpg_buf = NULL; // kadrni olish fb = esp_camera_fb_get (); if (! fb) {Serial.println ("Frame buferi olinmadi"); qaytish;} if (fb-> format! = PIXFORMAT_JPEG)/ /allaqachon bu formatda {bool jpeg_converted = frame2jpg (fb, 80, & _jpg_buf, & _jpg_buf_len); esp_camera_fb_return (fb); fb = NULL; if (! jpeg_converted) {Serial.println ("JPEG qaytarilmasa)" }} boshqa {_jpg_buf_len = fb-> len; _jpg_buf = fb-> buf;} //Serial.println(_jpg_buf_len); // formatlangan rasm so'rovini yuborish-> send_P (200, "image/jpg", _jpg_buf, _jpg_buf)) // tozalash if (fb) {esp_camera_fb_return (fb); fb = NULL; _jpg_buf = NULL;} if if (_jpg_buf) {free (_jpg_buf); _jpg_buf = NULL;}});

Muhim qismlar fb = esp_camera_fb_get () ramkasini jpgga aylantirish (AI-Thinker uchun u allaqachon shunday formatda) va jpegni yuborishdir: request-> send_P (200, "image/jpg", _jpg_buf), _jpg_buf_len).

Keyin JavaScript funktsiyasi bu rasm kelishini kutadi. Keyin olingan "blob" ni urlga aylantirish uchun biroz ish kerak, uni html sahifasida tasvirni yangilash uchun manba sifatida foydalanish mumkin.

Voy, ishimiz tugadi!

4 -qadam: Fikrlar va qoldiqlar

Fikrlar va qoldiqlar
Fikrlar va qoldiqlar

Men uchun bu loyihaning maqsadi, Internetga qo'shimcha qurilmalarni ulash uchun etarlicha veb -dasturlashni o'rganish edi. Ushbu loyihaga bir nechta kengaytmalar mumkin. Mana bir nechta fikrlar:

  • Bu erda va bu erda tushuntirilganidek, "haqiqiy" kamera oqimini amalga oshiring va uni xuddi shu ESP32 -da aytilgan 2 -serverga o'tkazing, lekin boshqa protsessor yadrosida kamerani 1 -server tomonidan html -ga import qiling. Bu kamerani tezroq yangilashiga olib kelishi kerak.
  • Kirish nuqtasi (AP) rejimidan foydalaning, shuning uchun robot bu erda tushuntirilganidek mustaqilroq bo'ladi.
  • Batareya zo'riqishini o'lchash, chuqur uyqu imkoniyatlari va boshqalar bilan kengaytiring. Bu hozircha biroz qiyin, chunki AI-Thinker ESP32-CAMda GPIO ko'p emas; uart va masalan, qul arduino orqali kengayishga muhtoj.
  • Vaqti-vaqti bilan mushukni davolaydigan katta tugmachani bosib chiqaradigan mushuk qidiradigan robotga aylantiring, kun davomida mushuklarning chiroyli rasmlarini olib boring …

Agar sizga yoqqan yoki savollaringiz bo'lsa izoh qoldiring va o'qiganingiz uchun tashakkur!

Tavsiya: