Mündəricat:
- Təchizat
- Addım 1: Robot Platformasının Yaradılması
- Addım 2: Robotu proqramlaşdırın
- Addım 3: Necə Çalışır
- Addım 4: Fikirlər və Qalanlar
Video: DuvelBot - ESP32 -CAM Bira Xidmət Robotu: 4 addım (şəkillərlə birlikdə)
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:44
Çətin bir iş gününün ardından divanda ən sevdiyiniz pivəni yudumlamaq heç bir şeyə yaxın gəlmir. Mənim vəziyyətimdə, Belçikalı sarışın "Duvel". Ancaq yıxıldıqdan sonra ən ciddi bir problemlə üzləşirik: Duvelim olan soyuducu, bu divandan 20 metr aralıda götürülmüşdür.
Yanımdan bəzi yüngül məcburiyyətlər, bir həftəlik yenilənmiş soyuducu zibilçini həftəlik Duvel müavinətimi tökməyə vadar edə bilsə də, əslində tükənmiş nəcisinə çatdırmaq vəzifəsi, çox açıq bir addımdır.
Lehimləmə dəmirini və klaviaturanı çıxarmaq vaxtıdır …
DuvelBot, ağıllı telefonunuzdan, brauzerinizdən və ya planşetinizdən idarə edə biləcəyiniz AI-Thinker ESP32-CAM əsaslı idarəetmə kamerasıdır.
Bu platformanı daha az spirtli içkilərə uyğunlaşdırmaq və ya genişləndirmək asandır (düşünün SpouseSpy, NeighbourWatch, KittyCam…).
Bu robotu, əsasən heç bir şey bilmədiyim bütün veb proqramlaşdırma və IoT məhsulları haqqında bir az öyrənmək üçün qurdum. Beləliklə, bu Təlimatlandırmanın sonunda bunun necə işlədiyini ətraflı şəkildə izah edirik.
Bu Təlimatın bir çox hissəsi Random Nerd Tutorials -da tapılan əla izahlara əsaslanır, buna görə də ziyarət edin!
Təchizat
Nə lazımdır:
Parça siyahısı daşla həkk olunmayıb və bir çox hissəni bir çox fərqli versiyada və bir çox fərqli yerdən əldə etmək olar. Ən çox Ali-Ekspressdən satın aldım. Machete'nin dediyi kimi: doğaçlama.
Avadanlıq:
- AI Thinker ESP32-CAM modulu. Yəqin ki, digər ESP32-CAM modulları ilə işləyə bilər, amma istifadə etdiyim budur
- L298N motor sürücü lövhəsi,
- Ucuz 4 təkərli robototexnika platforması,
- Hammond Electronics 1599KGY kimi böyük düz bir səthə malik bir mənzil,
- Proqramlaşdırma üçün USB-to-3.3V-TTL çeviricisi.
- İşıqlandırma üçün: 3 ağ LED, BC327 və ya digər ümumi təyinatlı tranzistor NPN (Ic = 500mA), 4k7k rezistor, 3 82Ohm rezistor, perfboard, kabellər (sxematik və şəkillərə baxın).
- Açma/söndürmə açarı və proqramlaşdırma üçün normal açılan düymə.
İsteğe bağlı:
- ESP32-CAM modulu ilə təchiz edilmiş standart OV2460 kameradan daha uzun əyilməyə malik bir balıq gözü kamerası,
- Uyğun uzun kabel və Ultra Miniatür Koaks Konnektoru olan WiFi antenası. ESP32-CAM-in göyərtəsində bir antenası var və korpusu plastikdir, buna görə antenaya həqiqətən ehtiyac yoxdur, amma sərin göründüyünü düşünürdüm …
- Üst örtük dizaynı üçün inkjet çaplı etiket kağızı.
Adi aparat vasitələri: lehimləmə dəmiri, matkaplar, tornavidalar, penslər …
Addım 1: Robot Platformasının Yaradılması
Sxematik:
Şematik xüsusi bir şey deyil. ESP32 kamerası, iki kanalı olan L298N motor sürücü lövhəsi vasitəsilə mühərrikləri idarə edir. Sol və sağ motorlar paralel olaraq yerləşdirilir və hər tərəf bir kanal tutur. Mühərrik sancaqlarına yaxın olan dörd kiçik 10..100nF keramika kondansatörü, RF müdaxiləsinə qarşı həmişə olduğu kimi məsləhət görülür. Ayrıca, sxematik olaraq göstərildiyi kimi, motor lövhəsinin təchizatında böyük bir elektrolitik qapaq (2200… 4700uF), qəti şəkildə tələb olunmasa da, təchizat gərginliyinin dalğalanmasını bir qədər məhdudlaşdıra bilər (qorxu filmi görmək istəyirsinizsə, onda Vbatı yoxlayın) mühərriklər aktiv olduqda osiloskopla).
Diqqət yetirin ki, hər iki motor kanalı ENABLE sancaqları ESP32 (IO12) -in eyni nəbz eni modulyasiya edilmiş (PWM) pimi ilə idarə olunur. Bunun səbəbi, ESP32-CAM modulunda bir ton GPIO olmamasıdır (modulun sxeminə istinad üçün daxil edilmişdir). Robotun LED -ləri IO4 tərəfindən idarə olunur, bu da göyərtədəki flaş LED -ini idarə edir, buna görə də flaş LED -inin qapalı korpusda yanmasının qarşısını almaq üçün Q1 -i çıxarın.
Proqramlaşdırma düyməsi, açma/söndürmə açarı, şarj konnektoru və proqramlaşdırma konnektoru robotun altında mövcuddur. Proqramlaşdırma konnektoru üçün daha yaxşı bir iş görə bilərdim (3.5mm jak?), Amma pivə artıq gözləyə bilmədi. Həm də havadan yeniləmələrin (OTA) qurulması yaxşı olardı.
Robotu proqramlaşdırma rejiminə salmaq üçün proqramlaşdırma düyməsini basın (bu IO0 aşağı çəkir) və sonra yandırın.
Mühüm: robotun NiMH batareyalarını doldurmaq üçün təxminən 14V və 250mA ilə məhdudlaşan bir akkumulyatordan (boşaldılmış) istifadə edin. Gərginlik batareyaların gərginliyinə uyğunlaşacaq. Robotun isti olduğunu və ya batareyanın gərginliyinin təxminən 12.5V -ə çatdığını ayırın. Burada açıq bir inkişaf, uyğun bir batareya şarj cihazını birləşdirmək olardı, ancaq bu Təlimatlandırmanın əhatə dairəsi xaricindədir.
Avadanlıq:
Zəhmət olmasa şəkillərdəki qeydlərə də baxın. Korpus 4 ədəd M4 bolt və öz-özünə kilidlənən qoz-fındıqdan istifadə edərək robotun bazasına quraşdırılmışdır. Məsafə ayırıcı kimi istifadə olunan rezin borulara diqqət yetirin. İnşallah, bu da Duvel üçün bir az dayandırma verir, əgər gəzinti enişli olarsa. ESP32-CAM modulu və L298N motor lövhəsi, əlavə deliklər qazmaq məcburiyyətində qalmamaq üçün plastik yapışqan ayaqları istifadə edərək (ingilis dilində düzgün adından əmin deyil) korpusa quraşdırılmışdır. ESP32 ayrıca özünün taxta panelinə və takıla bilən pinheaderlərə quraşdırılmışdır. Bu, ESP32 -ni dəyişdirməyi asanlaşdırır.
Unutmayın: quraşdırılmış deyil, xarici bir WiFi antenası ilə gedirsinizsə, ESP32-CAM lövhəsinin altındakı anten seçim tullananını da lehimləyin.
DuvelBot.svg faylındakı ən yaxşı loqotipi inkjet etiket kağızına çap edin (və ya özünüz dizayn edin) və hazırsınız!
Addım 2: Robotu proqramlaşdırın
Hər şeyi işlədiyindən və heç bir sehrli tüstünün görünmədiyindən əmin olmaq üçün robotu bağlamadan əvvəl onu proqramlaşdırmaq məsləhətdir.
Aşağıdakı proqram vasitələrinə ehtiyacınız var:
- Arduino IDE,
- ESP32 kitabxanaları, SPIFFS (serial periferik flash fayl sistemi), ESPAsync Webserver kitabxanası.
İkincisi, "təsadüfi sənədlərinizi təşkil etmək" bölməsinə qədər bu təsadüfi təlimatı izləyərək quraşdırıla bilər. Həqiqətən daha yaxşı izah edə bilmədim.
Kod:
Kodumu aşağıdakı ünvanda tapa bilərsiniz:
- Bir Arduino eskizi DuvelBot.ino,
- SPIFFS istifadə edərək ESP flash -a yüklənəcək faylları saxlayan bir məlumat alt qovluğu. Bu qovluqda, ESP -nin xidmət göstərəcəyi veb səhifəsi (index.html), veb səhifənin bir hissəsi olan logo şəkli (duvel.png) və kaskadlı bir stil vərəqi və ya CSS faylı (style.css) var.
Robotu proqramlaşdırmaq üçün:
- USB-TTL çeviricisini sxematik şəkildə göstərildiyi kimi bağlayın,
- Fayl -> Aç -> DuvelBot.inonun yerləşdiyi qovluğa gedin.
- Eskizdə şəbəkə məlumatlarınızı dəyişdirin:
const char* ssid = "yourNetworkSSIDHere"; const char* parol = "yourPasswordHere";
- Alətlər -> Board -> "AI -Thinker ESP -32 CAM" və kompüteriniz üçün uyğun seriya portunu seçin (Alətlər -> Port -> /dev /ttyUSB0 və ya COM4 kimi bir şey),
- Arduino IDE -də serial monitoru açın, PROG düyməsini (IO0 aşağı çəkən) basaraq robotu yandırın,
- ESP32 -nin yüklənməyə hazır olduğunu serial monitorunda yoxlayın,
- Serial monitoru bağlayın (əks halda SPIFFS yüklənməsi uğursuz olar),
- Alətlər -> "ESP32 Sketch Data Upload" və bitməsini gözləyin,
- Proqramlaşdırma rejiminə qayıtmaq üçün PROG düyməsini basıb yenidən söndürün və yandırın.
- Eskizi proqramlaşdırmaq üçün "Yüklə" oxuna basın və bitməsini gözləyin,
- Serial monitoru açın və söndürərək/yandıraraq ESP32 -ni sıfırlayın,
- Yükləndikdən sonra ip ünvanını qeyd edin (192.168.0.121 kimi) və robotu USB-TTL çeviricisindən ayırın,
- Bu ip ünvanında bir brauzer açın. Şəkildəki kimi interfeysi görməlisiniz.
- İsteğe bağlı: ESP32-nin mac-ünvanını yönlendiricinizdə sabit bir ip ünvanına təyin edin (marşrutlaşdırıcının necə edəcəyindən asılıdır).
Bu belədir! Bunun necə işlədiyini bilmək istəyirsinizsə oxuyun …
Addım 3: Necə Çalışır
İndi maraqlı hissəyə gəlirik: hamısı birlikdə necə işləyir?
Addım -addım … izah etməyə çalışacağam, amma unutmayın ki, Kajnjaps veb proqramlaşdırma mütəxəssisi deyil. Əslində, bir az veb proqramlaşdırma öyrənmək DuvelBot qurmağın bütün əsasları idi. Açıq səhvlər edərəmsə, şərh yazın!
Yaxşı, ESP32 açıldıqdan sonra, hər zamanki kimi GPIO -ları işə salır, onları motor və LED idarəetmə üçün PWM taymerləri ilə əlaqələndirir. Motor idarə etməsi haqqında daha çox məlumat üçün bura baxın, bu olduqca standartdır.
Sonra kamera konfiqurasiya olunur. Yavaş cavab verməmək üçün qəsdən qətnaməni olduqca aşağı səviyyədə saxladım (VGA və ya 640x480). Qeyd edək ki, AI-Thinker ESP32-CAM lövhəsində daha böyük ölçüdə kamera çərçivələrini saxlamaq üçün istifadə etdiyi serial ram çipi (PSRAM) var:
if (psramFound ()) {Serial.println ("PSRAM tapıldı."); config.frame_size = FRAMESIZE_VGA; config.jpg_quality = 12; config.fb_count = 2; // çərçivə buferlərinin sayı bax: https://github.com/espressif/esp32-camera} başqa {Serial.println ("heç bir PSRAM tapılmadı."); config.frame_size = FRAMESIZE_QVGA; config.jpg_quality = 12; config.fb_count = 1; }
Daha sonra seriyalı periferik flash fayl sistemi (SPIFFS) işə salınır:
// (! SPIFFS.begin (true)) {Serial.println ("SPIFFS quraşdırılarkən bir səhv baş verdi!") olduqda SPIFFS -i işə salın; qayıtmaq; }
SPIFFS, ESP32 üzərində kiçik bir fayl sistemi kimi çıxış edir. Burada üç faylı saxlamaq üçün istifadə olunur: veb səhifəsinin özü index.html, kaskadlı bir fayl üslubu cədvəli style.css və-p.webp
Sonra ESP32 yönlendiricinizə qoşulur (yükləməzdən əvvəl etimadnamənizi təyin etməyi unutmayın):
// yönlendiricinizin etimadnaməsini dəyişdirin hereconst char* ssid = "yourNetworkSSIDHere"; const char* password = "yourPasswordHere"; … // WiFi Serial.print -ə qoşulun ("WiFi -yə qoşulur"); WiFi.begin (ssid, parol); while (WiFi.status ()! = WL_CONNECTED) {Serial.print ('.'); gecikmə (500); } // indi marşrutlaşdırıcıya qoşulub: ESP32 artıq ip ünvanına malikdir
Əslində faydalı bir şey etmək üçün asenkron bir veb serveri işə salırıq:
// 80AsyncWebServer serverində (80) bir AsyncWebServer obyekti yaratmaq; … Server.begin (); // əlaqələri dinləməyə başlayın
İndi, bir brauzerin ünvan çubuğuna yönlendirici tərəfindən ESP32 -ə təyin edilmiş ip ünvanını yazsanız, ESP32 bir sorğu alır. Bu o deməkdir ki, müştəriyə (sənə və ya brauzerinə) bir şey, məsələn bir veb səhifəsi təqdim edərək cavab verməlidir.
ESP32 necə cavab verəcəyini bilir, çünki quraşdırma zamanı icazə verilən bütün sorğulara cavablar server.on () istifadə edərək qeydə alınmışdır. Məsələn, əsas veb səhifəsi və ya indeksi (/) belə işlənir:
server.on ("/", HTTP_GET, (AsyncWebServerRequest *sorğusu) {Serial.println ("/sorğu alındı!"); sorğu-> göndər (SPIFFS, "/index.html", String (), yalan, prosessor);});
Müştəri əlaqə qurarsa, ESP32, index.html faylını SPIFFS fayl sistemindən göndərərək cavab verir. Parametr prosessoru, html əvvəldən işləyən və xüsusi etiketləri əvəz edən bir funksiyanın adıdır:
// %DATA %// kimi html -də yer tutucuları göstərmək istədiyiniz dəyişənlərlə əvəz edir //
Məlumat: %DATA %
String prosessoru (const String & var) {if (var == "DATA") {//Serial.println("prosessorda! "); qayıt String (dutyCycleNow); } String qaytarın ();}
İndi index.html veb səhifəsinin özünü deşifrə edək. Ümumiyyətlə həmişə üç hissədən ibarətdir:
- html kodu: hansı elementlər göstərilməlidir (düymələr/mətn/sürgülər/şəkillər və s.),
- stil ayrı bir.css faylında və ya… bölməsində: elementlərin necə görünməsi,
- javascript a… bölməsi: veb səhifənin necə davranması lazımdır.
İndex.html brauzerə yükləndikdən sonra (DOCTYPE xətti səbəbindən html olduğunu bilir), bu sətrə daxil olur:
Bu, css üslub cədvəli üçün bir tələbdir. Bu vərəqin yeri href = "…" olaraq verilir. Bəs brauzeriniz nə edir? Düzdür, bu dəfə style.css üçün serverə başqa bir sorğu göndərir. Server bu istəyi qeydə alır, çünki qeydiyyatdan keçib:
server.on ("/style.css", HTTP_GET, (AsyncWebServerRequest *sorğusu) {Serial.println ("css sorğusu alındı"); sorğu-> göndər (SPIFFS, "/style.css", "text/css) ");});
Səliqəli? Yeri gəlmişkən, bütün brauzerinizin qayğısına qaldığı üçün href = "/some/file/on/the/other/side/of/the/" "ola bilərdi. Bu faylı məmnuniyyətlə gətirmək olardı. Üslub cədvəli haqqında izah etməyəcəyəm, çünki yalnız görünüşü idarə edir, buna görə burada həqiqətən maraqlı deyil, amma daha çox öyrənmək istəyirsinizsə, bu təlimatı yoxlayın.
DuvelBot loqotipi necə görünür? İndex.html -də bizdə var:
ESP32 cavab verir:
server.on ("/duvel", HTTP_GET, (AsyncWebServerRequest *sorğusu) {Serial.println ("duvel logo sorğusu alındı!"); sorğu-> göndər (SPIFFS, "/duvel.png", "image/png) ");});
..başqa bir SPIFFS faylı, bu dəfə cavabda "image/png" ilə göstərildiyi kimi tam bir şəkil.
İndi həqiqətən maraqlı hissəyə gəlirik: düymələrin kodu. İLERİ düyməsinə diqqət yetirək:
İLƏ
Class = "…" adı, ölçüsü, rəngi və s. Fərdiləşdirmək üçün onu üslub cədvəlinə bağlamaq üçün bir addır. Vacib hissələr onmousedown = "toggleCheckbox ('irəli')" və onmouseup = "toggleCheckbox ('dayan') ". Bunlar düymənin hərəkətlərini təşkil edir (ontouchstart/ontouchend üçün eyni, ancaq toxunma ekranları/telefonlar üçün). Burada düymə hərəkəti javascript bölməsində toggleCheckbox (x) funksiyasını çağırır:
toggleCheckbox (x) {var xhr = yeni XMLHttpRequest () funksiyası; xhr.open ("GET", "/" + x, doğru); xhr.send (); // hazır olduqda cavabla da bir şey edə bilərik, amma etmirik}
Beləliklə, irəli düyməsini basaraq dərhal toggleCheckbox ('irəli') çağırılır. Bu funksiya daha sonra brauzerinizin ünvan çubuğuna 192.168.0.121/for yazsaydınız kimi işləyən "/irəli" yerinin bir XMLHttpRequest "GET "ini işə salır. Bu istək ESP32 -ə çatdıqdan sonra bu işlə məşğul olur:
server.on ("/irəli", HTTP_GET, (AsyncWebServerRequest *sorğusu) {Serial.println ("qəbul/irəli"); actionNow = İLƏ; sorğu-> göndər (200, "mətn/düz", "Tamam irəli"). ");});
İndi ESP32 sadəcə "OK irəli" yazısı ilə cavab verir. Qeyd edək ki, toggleCheckBox () bu cavabla heç bir iş görmür (və ya gözləmir), lakin daha sonra kamera kodunda göstərildiyi kimi ola bilər.
Bu cavab zamanı proqramın özü düyməni basmağa cavab olaraq yalnız ActionNow = FORWARD dəyişənini təyin edir. İndi proqramın əsas hissəsində, bu dəyişən, mühərriklərin PWM -ni yuxarı/aşağı artırmaq məqsədi ilə izlənilir. Məntiq budur: STOP olmayan bir hərəkətimiz olduğu müddətcə, müəyyən bir saya (dutyCycleMax) çatana qədər mühərrikləri bu istiqamətdə artırın. ActionNow dəyişmədiyi müddətdə bu sürəti qoruyun:
void loop () {currentMillis = millis (); if (currentMillis - previousMillis> = dutyCycleStepDelay) {// loopu sonuncu dəfə icra etdiyiniz zaman əvvəlkiMillis = currentMillis saxla; // mainloop, (actionNow! = previousAction) {// aşağı enər, sonra dayandırar, sonra hərəkəti dəyişər və rütbəni artırar dutyCycleNow = dutyCycleNow-dutyCycleStep; if (dutyCycleNow <= 0) {// əgər dc aşağı endikdən sonra 0 olarsa, yeni istiqamətə qoyun, setDir (actionNow) minimum vəzifədən başlayın; previousAction = actionNow; dutyCycleNow = dutyCycleMin; }} else // actionNow == previousAction, STOP olduğu halda istisna olmaqla {rampası (if (actionNow! = STOP)) {dutyCycleNow = dutyCycleNow+dutyCycleStep; if (dutyCycleNow> dutyCycleMax) dutyCycleNow = dutyCycleMax; } else dutyCycleNow = 0; } ledcWrite (pwmChannel, dutyCycleNow); // motorlu motosikleti tənzimləyin}}
Bu, mühərriklərin sürətini yavaş -yavaş artırır, yalnız tam sürətlə işə salmaq və qiymətli qiymətli Duvel tökmək əvəzinə. Açıq bir inkişaf bu kodu bir taymer kəsmə rejiminə köçürmək olardı, amma olduğu kimi işləyir.
İndi irəli düyməsini buraxsaq, brauzeriniz toggleCheckbox ('dayan') çağırır və nəticədə GET /stop tələbi ilə nəticələnir. ESP32, motoru fırlatmaq üçün əsas döngəni işə salan actionNow STOP (və "OK stop" ilə cavab verir) təyin edir.
Bəs LED -lər? Eyni mexanizm, amma indi bir kaydırıcımız var:
JavaScript -də, hər dəyişiklikdə "/LED/xxx" almaq üçün bir zəng olur ki, kaydırıcının ayarı izlənilir, burada xxx, LED -lərin təyin edilməli olduğu parlaqlıq dəyəridir:
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; }
Diqqət yetirin ki, sənəd ilə birlikdə elan edilmiş və hər dəyişikliyə görə bir mətn elementinə çıxarılan kaydırıcı obyektini əldə etmək üçün document.getElementByID ('slayd') istifadə etdik.
Eskizdə işləyən işçi qeydində "/LED/*" işarəsindən istifadə edərək bütün parlaqlıq istəklərini tutur. Sonra son hissə (ədəd) bölünür və int -ə verilir:
server.on ("/LED/ *", HTTP_GET, (AsyncWebServerRequest *sorğusu) {Serial.println ("led sorğu alındı!"); setLedBrightness ((request-> url ()). alt sətir (5).toInt ()); sorğu-> göndər (200, "mətn/düz", "OK Ledlər.");});
Yuxarıda təsvir edildiyi kimi, radio düymələri, PWM standartlarını təyin edən dəyişənləri idarə edir, belə ki, DuvelBot pivə ilə yavaş -yavaş sizə gedə bilər, bu maye qızılı tökməmək üçün diqqətli olun və bir az daha gətirmək üçün mətbəxə qayıdın.
… Səhifəni yeniləmədən kamera görüntüsü necə yenilənir? Bunun üçün AJAX (Asinxron JavaScript və XML) adlı bir texnikadan istifadə edirik. Məsələ ondadır ki, adətən müştəri-server bağlantısı sabit bir prosedura riayət edir: müştəri (brauzer) sorğu göndərir, server (ESP32) cavab verir, iş bağlanır. Bitdi. Artıq heç nə olmur. Kaş ki, bir şəkildə brauzeri aldatmaqla ESP32 -dən mütəmadi olaraq yeniləmələr istəsək … və bu javascript parçası ilə edəcəyimiz şey budur:
setInterval (function () {var xhttp = new XMLHttpRequest (); xhttp.open ("GET", "/CAMERA", true); xhttp.responseType = "blob"; xhttp.timeout = 500; xhttp.ontimeout = funksiya () {}; xhttp.onload = funksiya (e) {if (this.readyState == 4 && this.status == 200) {// bax: 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); // blobdan bir obyekt yaradın document.querySelector ("#camimage"). src = imageUrl; urlCreator.revokeObjectURL (imageurl)}}; xhttp.send ();}, 250);
setInterval parametri olaraq bir funksiyanı götürür və hər dəfə yerinə yetirir (burada 250ms -də bir dəfə 4 kadr/saniyə ilə nəticələnir). İcra olunan funksiya /KAMERA ünvanından ikili "ləkələnmə" tələb edir. Bu, ESP32-CAM tərəfindən eskizdə (Randomnerdtutorialsdan) belə işlənir:
server.on ("/CAMERA", HTTP_GET, (AsyncWebServerRequest * sorğusu) {Serial.println ("kamera istəyi alındı!"); camera_fb_t * fb = NULL; // esp_err_t res = ESP_OK; size_t _jpg_buf_len = 0; uint8 * _jpg_buf = NULL; // bir çərçivə çəkin fb = esp_camera_fb_get (); əgər (! fb) {Serial.println ("Çərçivə buferi alınmadı"); qayıdın;} əgər (fb-> format! = PIXFORMAT_JPEG)/ /artıq bu formatda {bool jpeg_converted = frame-j.webp
Önəmli hissələr fb = esp_camera_fb_get () çərçivəsini bir jpg-ə çevirməkdir (AI-Thinker üçün artıq bu formatda) və jpeg-i göndərməkdir: request-> send_P (200, "image/jpg", _jpg_buf, _jpg_buf_len).
JavaScript funksiyası sonra bu görüntünün gəlməsini gözləyir. Sonra alınan "blob" u html səhifəsindəki görüntünü yeniləmək üçün bir qaynaq olaraq istifadə edilə bilən bir url -ə çevirmək üçün bir az iş lazımdır.
vay, işimiz bitdi!
Addım 4: Fikirlər və Qalanlar
Mənim üçün bu layihənin məqsədi, avadanlıqları vebə birləşdirmək üçün kifayət qədər veb proqramlaşdırma öyrənmək idi. Bu layihənin bir neçə uzantısı mümkündür. Burada bir neçə fikir var:
- Burada və burada izah edildiyi kimi 'həqiqi' kamera axını tətbiq edin və eyni ESP32 -də izah edildiyi kimi ikinci bir serverə köçürün, ancaq digər CPU nüvəsində, sonra kameranı 1 -ci serverin xidmət etdiyi html -ə idxal edin. Bu, daha sürətli kamera yeniləmələri ilə nəticələnməlidir.
- Giriş nöqtəsi (AP) rejimindən istifadə edin ki, robot burada izah edildiyi kimi daha müstəqildir.
- Batareya gərginliyinin ölçülməsi, dərin yuxu qabiliyyətləri və s. İlə genişləndirin. Hazırda AI-Thinker ESP32-CAM-da bir çox GPIO olmadığı üçün bu bir az çətindir; uart və məsələn, bir qul arduino vasitəsilə genişləndirməyə ehtiyac var.
- Zaman zaman böyük bir düyməyə basaraq pişik müalicələrini çıxaran bir pişik axtaran bir robot halına gətirin, gün ərzində tonlarla gözəl pişik şəkli yayın …
Bəyəndiyiniz və ya suallarınız varsa şərh yazın və oxuduğunuz üçün təşəkkürlər!
Tövsiyə:
Bira açan və tökən: 7 addım (şəkillərlə)
Bira Açan və Tökən: Bu layihə üçün tələb, artıq icad edilmiş, lakin bəzi təkmilləşdirmələr tələb edən bir ixtira və ya sistemin ortaya çıxması idi. Bəzilərinin bildiyi kimi, Belçika pivəsi ilə çox məşhurdur. Bu proyektdə bir qədər ehtiyacım olan ixtira
XİDMƏT ROBOTU: 8 addım
SERVİS ROBOTU: Bu robot bütün görüntülərinizdə etibarlı köməkçi olacaq. Robot bir çox hərəkət edən əzaları, fırlanan başı və fırlanan təkərləri ilə birlikdə gəlir. Bədən üçün 7 rəng, gözlər üçün 2 seçim var
Sharp Optonica RP-114H-ni Necə Təmir / Xidmət etməli: 11 Addım (Şəkillərlə birlikdə)
Sharp Optonica RP-114H-ni Necə Təmir / Xidmət etməli: Vertikal dönər tablamı, Optonica RP-114H-ni təmir və xidmətimi belə başa vurdum. Bunu təmir edildiyini və tam işlədiyini iddia edən birindən aldım. ağlayan tip, buna görə də heç vaxt qulluq edilmədiyi məlum oldu
[Arduino Robotu] Bir Motion Capture Robotu Necə Hazırlanır - Başparmak Robotu - Servo Motor - Mənbə Kodu: 26 Adım (Şəkillərlə birlikdə)
[Arduino Robotu] Bir Motion Capture Robotu Necə Hazırlanır | Başparmak Robotu | Servo Motor | Mənbə Kodu: Başparmak Robotu. MG90S servo motor potensialiometrindən istifadə olunub. Çox əyləncəli və asandır! Kod çox sadədir. Cəmi 30 sətirdir. Bir hərəkətə bənzəyir. Hər hansı bir sualınız və ya geribildiriminizi bildirin! [Təlimat] Mənbə Kodu https: //github.c
Sərt Mərkəz Səthi Xidmət edən Portativ Suya Dayanıklı LED Piknik Battaniyəsi !: 10 Addım (Şəkillərlə)
Portativ Suya Dözümlü LED Piknik Battaniyəsi Sərt Mərkəz Səthi Xidmət Edir !: Burada Los Ancelesdə axşamlar piknik etmək və Hollywood Forever Qəbiristanlığındakı Cinespia kimi açıq havada film izləmək üçün bir çox yer var. Bu qorxunc səslənir, ancaq qazona yaymaq üçün öz vinil piknik yorğanınız olduqda