Мазмуну:
- Жабдуулар
- 1 -кадам: Робот платформасын куруу
- 2 -кадам: Роботту программалоо
- 3 -кадам: Бул кантип иштейт
- 4 -кадам: Идеялар жана калдыктар
Video: DuvelBot - ESP32 -CAM пиво тейлөөчү робот: 4 кадам (сүрөттөр менен)
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:39
Кыйын жумуштан кийин, диванда сүйүктүү сыраңызды ичкенге эч нерсе жакындай албайт. Менин учурда, бул бельгиялык сары чач "Дувель". Бирок, кулагандан кийин, биз эң олуттуу көйгөйгө туш болобуз: менин Дювелимди камтыган муздаткыч бул дивандан 20 фут алыстыкта.
Мен тараптан кандайдыр бир жеңил мажбурлоочу, кээде өспүрүм муздаткычты тазалагычты жуманын Дювелге төлөнүүчү каражатты төгүүгө түрткү бериши мүмкүн, бирок аны дээрлик чарчап калган тукумуна жеткирүү милдети, албетте, өтө алыс.
Унааны жана клавиатураны сындыра турган убак …
DuvelBot-бул смартфонуңуздан, браузериңизден же планшетиңизден башкара турган AI-Thinker ESP32-CAM негизиндеги айдоочу веб-камера.
Бул платформаны алкоголдук ичимдиктерди азыраак колдонууга ыңгайлаштыруу же кеңейтүү оңой (SpouseSpy, NeighbourWatch, KittyCam… деп ойлойсуз).
Мен бул роботту негизинен мен эч нерсе билбеген веб программалоо жана IoT нерселери жөнүндө бир аз билүү үчүн кургам. Ошентип, бул Нускаманын аягында анын кантип иштээри жөнүндө кеңири түшүндүрмө берилет.
Бул Нускаманын көптөгөн бөлүктөрү Random Nerd Tutorials программасында табылган эң сонун түшүндүрмөлөргө негизделген, андыктан аларга барып көрүңүз!
Жабдуулар
Эмне керек:
Бөлүктөрдүн тизмеси ташка чегилген эмес жана көптөгөн бөлүктөрдү ар кандай версияларда жана ар кайсы жерден алууга болот. Мен көбүнчө Ali-Expressтен сатып алгам. Machete айткандай: импровизация.
Аппараттык:
- AI Thinker ESP32-CAM модулу. Бул, балким, башка ESP32-CAM модулдары менен иштеши мүмкүн, бирок мен колдонгон нерсе
- L298N мотор айдоочу тактасы,
- Арзан 4 дөңгөлөктүү робототехника платформасы,
- Hammond Electronics 1599KGY сыяктуу чоң тегиз бети бар турак жай,
- Программалоо үчүн USB-to-3.3V-TTL-конвертер.
- Жарык берүү үчүн: 3 ак LED, BC327 же башка жалпы максаттагы транзистор NPN (Ic = 500mA), 4k7k каршылыгы, 3 82Ohm резисторлору, перфорд, кабелдер (схеманы жана сүрөттөрдү караңыз).
- Күйгүзүү/өчүрүү которгуч жана программалоо үчүн кадимкидей ачык баскыч.
Кошумча:
- ESP32-CAM модулу менен камсыздалган стандарт OV2460 камерасына караганда узагыраак ийкемдүү балык көзү камерасы,
- Узун кабели бар WiFi антеннасы жана Ultra Miniature Coax Connector сыяктуу. ESP32-CAMдын бортунда антеннасы бар жана корпусу пластик, антеннанын анча деле кереги жок, бирок мен аны сонун көрүндү деп ойлогом, ошондуктан…
- Үстүнкү мукабасынын дизайны үчүн сыя менен чапталган чаптама кагазы.
Кадимки аппараттык шаймандар: ширетүүчү, бургулоочу, отвертка, кычкач…
1 -кадам: Робот платформасын куруу
Схема:
Схема өзгөчө эч нерсе эмес. ESP32-камерасы моторлорду эки каналы бар L298N мотор айдоочулар тактасы аркылуу башкарат. Сол жана оң тараптын моторлору параллель жайгаштырылган жана ар бир тарап бир каналды ээлейт. Мотор казыктарына жакын төрт кичинекей 10..100nF керамикалык конденсаторлор дайыма RF кийлигишүүсүнө каршы туруу үчүн сунушталат. Ошондой эле, схемада көрсөтүлгөндөй, мотор тактасынын жабдууларындагы чоң электролиттик капкак (2200… 4700uF), керек болбосо да, чыңалуу чыңалуусун бир аз чектей алат (эгер сиз коркунучтуу тасманы көргүңүз келсе, анда Vbatды текшериңиз) кыймылдаткычтар иштеп турганда осциллограф менен).
ЭСКЕРТҮҮ мотор каналдарынын экөө тең ESP32 (IO12) импульстун туурасы модуляцияланган (PWM) пини менен башкарылганына көңүл буруңуз. Бул ESP32-CAM модулунда бир тонна GPIO жок болгондуктан (модулдун схемасы шилтеме үчүн камтылган). Роботтун светодиоддору IO4 тарабынан башкарылат, ал дагы борттогу жаркыраган LEDди айдайт, андыктан жабык корпуста жаркыроо LEDинин күйүп кетишине жол бербөө үчүн Q1ди алып салыңыз.
Программалоо баскычы, күйгүзүү/өчүрүү, заряддоо туташтыргычы жана программалоо туташтыргычы роботтун астында жеткиликтүү. Мен программалоо туташтыргычы үчүн алда канча жакшы жумуш жасасам болмок (3.5мм джек?), Бирок сыра мындан ары күтө албайт. Ошондой эле аба аркылуу жаңыртууларды (OTA) орнотуу жакшы болмок.
Роботту программалоо режимине коюу үчүн, программалоо баскычын басыңыз (бул IO0 төмөн тартат), анан күйгүзүңүз.
Маанилүү: роботтун NiMH батарейкаларын кубаттоо үчүн, лабораториялык камсыздоо топтомун (жүктөлбөгөн) болжол менен 14В жана 250мАга чейин чектелген токту колдонуңуз. Чыңалуу батареялардын чыңалуусуна ылайыкташат. Эгерде робот ысык сезилсе же батареянын чыңалуусу болжол менен 12.5В жетсе, ажыратыңыз. Батареяны туура заряддагыч түзүлүштү интеграциялоо бул жерде айкын жакшыруу болмок, бирок бул Нускаманын чегинен тышкары.
Аппаратура:
Сураныч, сүрөттөрдөгү жазууларды да караңыз. Корпус робот базасына 4 M4 болт жана өзүн өзү бекитүүчү гайкаларды колдонуу менен орнотулган. Аралык аралык катары колдонулган резина түтүктөргө көңүл буруңуз. Үмүт кылам, бул дагы Дювелге кээ бир токтотууларды берет, эгерде айдоо одоно болуп калса. ESP32-CAM модулу жана L298N мотор тактасы корпуста пластикалык жабышчаак буттарды колдонуу менен орнотулган (англис тилинде туура аталышын так билбейт), кошумча тешиктерди бурбоо үчүн. Ошондой эле ESP32 өзүнүн перформатына жана сайылуучу pinheadersге орнотулган. Бул ESP32ди алмаштырууну жеңилдетет.
Унутпаңыз: эгер сиз орнотулган антеннанын ордуна тышкы WiFi антеннасы менен бара жатсаңыз, анда ESP32-CAM тактасынын астындагы антенна тандоо секиргичин да кошуп коюңуз.
DuvelBot.svg файлындагы жогорку логотипти струйный кагазга басып чыгарыңыз (же өзүңүздүн дизайныңызды), жана сиз барууга даярсыз!
2 -кадам: Роботту программалоо
Роботту жабуудан мурун, анын иштешине жана сыйкырдуу түтүн чыкпашына ынануу максатка ылайыктуу.
Сизге төмөнкү программалык каражаттар керек:
- Arduino IDE,
- ESP32 китепканалары, SPIFFS (сериялык перифериялык флеш файл системасы), ESPAsync Webserver китепканасы.
Акыркысы бул randomnerdtutorialдин "файлдарыңызды иретке келтирүү" бөлүмүнө чейин жетүү менен орнотулушу мүмкүн. Мен чындыгында жакшыраак түшүндүрө алган жокмун.
Код:
Менин кодду бул жерден тапса болот:
- An Arduino эскизи DuvelBot.ino,
- ESP флэшине SPIFFS аркылуу жүктөлө турган файлдарды камтыган маалыматтардын папкасы. Бул папкада ESP кызмат кыла турган веб -баракча (index.html), веб -баракчанын бир бөлүгү болгон логотиптин сүрөтү (duvel.png) жана каскаддык стили барагы же CSS файлы (style.css) камтылган.
Роботту программалоо үчүн:
- USB-TTL конвертерин схемада көрсөтүлгөндөй туташтырыңыз,
- Файл -> Ачуу -> DuvelBot.ino жайгашкан папкага өтүңүз.
- Эскизде тармактын грамоталарын өзгөртүү:
const char* ssid = "yourNetworkSSIDHere"; const char* password = "yourPasswordHere";
- Куралдар -> Такта -> "AI -Thinker ESP -32 CAM" жана компьютериңизге ылайыктуу сериялык портту тандаңыз (Куралдар -> Порт -> /dev /ttyUSB0 же COM4 сыяктуу),
- Сериялык мониторду Arduino IDEде ачыңыз, PROG баскычын басып жатканда (IO0 төмөн тартат) роботту күйгүзүңүз,
- ESP32 жүктөп алууга даяр экенин сериялык монитордон текшериңиз,
- Сериялык мониторду жабыңыз (антпесе SPIFFS жүктөлбөй калат),
- Куралдар -> "ESP32 эскиз маалыматын жүктөө" жана анын бүтүшүн күтө туруңуз,
- Өчүрүү жана кайра PROG баскычын басып программалоо режимине кайтуу үчүн,
- Эскизди программалоо үчүн "Жүктөө" жебесин басыңыз жана анын бүтүшүн күтүп,
- Сериялык мониторду ачыңыз жана ESP32ди өчүрүп/күйгүзүү менен,
- Жүктөлгөндөн кийин, IP дарегин жазып коюңуз (192.168.0.121 сыяктуу) жана роботту USB-TTL конвертеринен ажыратыңыз,
- Бул IP дареги боюнча браузерди ачыңыз. Сиз интерфейсти сүрөттөгүдөй көрүшүңүз керек.
- Кошумча: ESP32тин mac-дарегин роутериңиздеги туруктуу IP дарегине коюңуз (роутердин кандай жасалышына жараша болот).
Дал ушул! Эгер анын кандай иштээрин билгиңиз келсе, окуңуз …
3 -кадам: Бул кантип иштейт
Эми биз кызыктуу бөлүккө келебиз: мунун баары кантип бирге иштейт?
Мен муну этап -этабы менен түшүндүрүүгө аракет кылам … этап менен … бирок Кажнжапс веб программалоо боюнча адис эмес экенин унутпаңыз. Чынында, веб -программалоону бир аз үйрөнүү DuvelBotту түзүүнүн негизги шарты болгон. Эгерде мен ачык ката кетирсем, комментарий калтырыңыз!
Макул, ESP32 күйгүзүлгөндөн кийин, адаттагыдай эле, GPIO'лорду инициализациялайт, аларды мотор жана LED башкаруу үчүн PWM таймерлери менен байланыштырат. Моторду башкаруу жөнүндө көбүрөөк билүү үчүн бул жерден караңыз, бул абдан стандарт.
Андан кийин камера конфигурацияланат. Жай жооп бербөө үчүн мен атайылап токтомду өтө төмөн (VGA же 640x480) кармап турдум. Көңүл буруңуз, AI-Thinker ESP32-CAM тактасында чоңураак камера кадрларын сактоо үчүн колдонулган сериялык кочкор чипи (PSRAM) бар:
if (psramFound ()) {Serial.println ("PSRAM табылды."); config.frame_size = FRAMESIZE_VGA; config.jpg_quality = 12; config.fb_count = 2; // framebuffers саны карагыла: https://github.com/espressif/esp32-camera} else {Serial.println ("PSRAM табылган жок."); config.frame_size = FRAMESIZE_QVGA; config.jpg_quality = 12; config.fb_count = 1; }
Андан кийин сериялык перифериялык флеш файл системасы (SPIFFS) башталат:
// баштоо SPIFFS if (! SPIFFS.begin (true)) {Serial.println ("SPIFFSти орнотууда ката кетти!"); кайтуу; }
SPIFFS ESP32деги кичинекей файл тутуму сыяктуу иштейт. Бул жерде ал үч файлды сактоо үчүн колдонулат: веб -баракчанын өзү index.html, каскаддык файл стилдери style.css жана-p.webp
Андан кийин ESP32 роутериңизге туташат (жүктөө алдында ишеним грамотаңызды коюуну унутпаңыз):
// роутериңиздин ишеним грамоталарын өзгөртүү chareconst char* ssid = "yourNetworkSSIDHere"; const char* password = "yourPasswordHere"; … // WiFi Serial.printке туташуу ("WiFiга туташуу"); WiFi.begin (ssid, сырсөз); while (WiFi.status ()! = WL_CONNECTED) {Serial.print ('.'); кечигүү (500); } // азыр роутерге туташты: ESP32де азыр ip дареги бар
Чынында пайдалуу бир нерсе кылуу үчүн, биз асинхрондук веб -серверди баштайбыз:
// 80AsyncWebServer сервериндеги AsyncWebServer объектин түзүү (80); … Server.begin (); // байланыштарды угууну баштаңыз
Эми, эгер сиз браузердин дарек тилкесине роутер тарабынан ESP32ге дайындалган IP дарегин терсеңиз, ESP32 сурам алат. Бул кардарга (сиз, же браузериңиз) бир нерсе, мисалы, веб -баракча менен жооп бериши керек дегенди билдирет.
ESP32 кантип жооп берүүнү билет, анткени орнотууда мүмкүн болгон бардык сурамдарга жооптор server.on () аркылуу катталган. Мисалы, негизги веб -баракча же индекс (/) төмөнкүдөй иштетилет:
server.on ("/", HTTP_GET, (AsyncWebServerRequest *өтүнүчү) {Serial.println ("/суроо-талап алынды!"); request-> жөнөтүү (SPIFFS, "/index.html", String (), false, процессор);});
Эгер кардар туташса, ESP32 SPIFFS файл тутумунан index.html файлын жөнөтүү менен жооп берет. Параметр процессору - бул htmlди кайра иштетүүчү жана кандайдыр бир атайын тегдердин ордун басуучу функциянын аты:
// %DATA %// сыяктуу HTML толтургучтарды сиз көрсөткүңүз келген өзгөрмөлөр менен алмаштырат //
Берилиштер: %DATA %
String процессору (const String & var) {if (var == "DATA") {//Serial.println("процессордо! "); return String (dutyCycleNow); } кайтуу String ();}
Эми, index.html веб -баракчасын өзүнчө бөлүп карайлы. Жалпысынан алганда, үч бөлүк бар:
- html коду: кандай элементтер көрсөтүлүшү керек (баскычтар/текст/слайдерлер/сүрөттөр ж. б.),
- стиль коду, өзүнчө.css файлында же… бөлүмүндө: элементтер кандай болушу керек,
- javascript a… бөлүмү: веб -баракча кандай иштеши керек.
Index.html браузерге жүктөлгөндөн кийин (ал DOCTYPE линиясынан html экенин билет), ал бул сапка кирет:
Бул CSS стили жадыбалы үчүн суроо. Бул барактын жайгашкан жери href = "…" менен берилген. Анда браузериңиз эмне кылат? Туура, ал серверге дагы бир суроо жөнөтөт, бул жолу style.css үчүн. Сервер бул сурамды жазат, анткени ал катталган:
server.on ("/style.css", HTTP_GET, (AsyncWebServerRequest *өтүнүчү) {Serial.println ("css сурамы алынды"); request-> жөнөтүү (SPIFFS, "/style.css", "text/css) ");});
Тыкан? Баса, бул сиздин браузердин баарына кам көргөн href = "/some/file/on/the/other/side/of/the/moon" болушу мүмкүн эле. Бул файлды бактылуу алып келмек. Мен стилдер жадыбалы жөнүндө түшүндүрмө бербейм, анткени ал жөн гана сырткы көрүнүштөрдү көзөмөлдөйт, андыктан бул жерде чындыгында кызыктуу эмес, бирок эгер сиз көбүрөөк билгиңиз келсе, бул окуу куралын текшериңиз.
DuvelBot логотиби кантип пайда болот? Index.htmlде бизде:
буга ESP32 жооп берет:
server.on ("/duvel", HTTP_GET, (AsyncWebServerRequest *өтүнүчү) {Serial.println ("duvel логотип сурамы алынды!"); request-> жөнөтүү (SPIFFS, "/duvel.png", "image/png) ");});
.. Башка SPIFFS файлы, бул жолу жоопто "image/png" менен көрсөтүлгөндөй толук сүрөт.
Эми биз чындыгында кызыктуу бөлүккө келебиз: баскычтардын коду. FORWARD баскычына көңүл буралы:
АЛГА
Класс = "…" аты - бул өлчөмдү, түстү ж.б. ыңгайлаштыруу үчүн аны стиль баракчасына шилтемелөөчү ат гана. Маанилүү бөлүктөр onmousedown = "toggleCheckbox ('алдыга')" жана onmouseup = "toggleCheckbox ('токтотуу') ". Бул баскычтын аракеттерин түзөт (ontouchstart/ontouchend үчүн бирдей, бирок сенсордук экрандар/телефондор). Бул жерде, баскычтын аракети javascript бөлүмүндө toggleCheckbox (x) функциясын чакырат:
toggleCheckbox функциясы (x) {var xhr = new XMLHttpRequest (); xhr.open ("Get", "/" + x, true); xhr.send (); // даяр болгондо жооп менен бир нерсе кыла алмак, бирок биз кылбайбыз}
Ошентип, "Алга" баскычын басуу менен, дароо эле toggleCheckbox ("алдыга") чакырылат. Андан кийин бул функция браузердин дарек тилкесине 192.168.0.121/forward деп жазсаңыз, "/алдыга" жайгашкан XMLHttpRequest "GET" баштайт. Бул суроо ESP32ге келгенден кийин, ал каралат:
server.on ("/алдыга", HTTP_GET, (AsyncWebServerRequest *өтүнүчү) {Serial.println ("алынды/алдыга"); actionNow = FORWARD; request-> жөнөтүү (200, "текст/түз", "OK алдыга. ");});
Эми ESP32 жөн гана "OK алдыга" деген текст менен жооп берет. Эскертүү toggleCheckBox () бул жооп менен эч нерсе кылбайт (же күтпөңүз), бирок кийинчерээк камера кодунда көрсөтүлгөндөй болушу мүмкүн.
Бул жооп учурунда, программа баскычты басууга жооп катары ActionNow = FORWARD өзгөрмөсүн гана орнотот. Эми программанын негизги тилкесинде, бул өзгөрмө моторлордун PWMин өйдө/ылдый жайылтуу максатында көзөмөлдөнөт. Логика: эгерде бизде STOP эмес иш -аракет болсо, моторлорду белгилүү бир санга (dutyCycleMax) жеткенге чейин ошол багытта жогорулатыңыз. ActionNow өзгөрбөсө, анда бул ылдамдыкты карманыңыз:
void loop () {currentMillis = millis (); if (currentMillis - previousMillis> = dutyCycleStepDelay) {// циклди акыркы жолу аткарганыңызды мурункуMillis = currentMillis сактаңыз; // mainloop моторлорду өйдө/ылдый кармоого жооп берет, эгерде (actionNow! = previousAction) {// төмөндөө, андан кийин токтотуу, андан кийин аракетти өзгөртүү жана ramp uputyCycleNow = dutyCycleNow-dutyCycleStep; if (dutyCycleNow <= 0) {// эгер dc ылдый түшкөндөн кийин 0 болсо, жаңы багытка коюңуз, setDir (actionNow) мин циклинен баштаңыз; previousAction = actionNow; dutyCycleNow = dutyCycleMin; }} else // actionNow == previousAction, эгерде багыты STOP {if (actionNow! = STOP) {dutyCycleNow = dutyCycleNow+dutyCycleStep; if (dutyCycleNow> dutyCycleMax) dutyCycleNow = dutyCycleMax; } else dutyCycleNow = 0; } ledcWrite (pwmChannel, dutyCycleNow); // мотоциклди тууралоо}}
Бул акырындык менен моторлордун ылдамдыгын жогорулатат, анын ордуна жөн гана толук ылдамдыкта иштетилип, кымбат баалуу Дювел төгүлбөйт. Бул кодду таймердин үзгүлтүккө учуратуу процессине айкын жакшыртуу болмок, бирок ал ошол бойдон иштейт.
Эми эгерде биз алдыга баскычын коё берсек, анда сиздин браузериңиз toggleCheckbox ('stop') деп аталат, натыйжада GET /stop өтүнүчү келип чыгат. ESP32 моторлорду айлантуу үчүн башкы циклди ачкан actionNow ТОКТОТ (жана "ОК токто" деп жооп берет) орнотот.
LED жөнүндө эмне айтууга болот? Ошол эле механизм, бирок азыр бизде слайдер бар:
JavaScriptте, слайдердин жөндөөсү көзөмөлгө алынат, мында ар бир өзгөрүүдө "/LED/xxx" алуу үчүн чалуу болот, мында xxx - бул светодиоддор орнотулушу керек болгон жарыктыктын мааниси:
var slide = document.getElementById ('slide'), sliderDiv = document.getElementById ("sliderAmount"); slide.onchange = function () {var xhr = new XMLHttpRequest (); xhr.open ("Get", "/LED/" + this.value, true); xhr.send (); sliderDiv.innerHTML = this.value; }
Белгилей кетчү нерсе, биз document.getElementByID ('slide') менен слайдер объектисин алуу үчүн колдонгонубузга көңүл буруңуз, жана мааниси тексттик элементке ар бир өзгөртүү менен чыгарылат.
Эскиздеги иштетүүчү иштетүүчү каттоосунда "/LED/*" колдонуу менен бардык жарыктык сурамдарын кармайт. Андан кийин акыркы бөлүк (сан) бөлүнөт жана intге чыгарылат:
server.on ("/LED/ *", HTTP_GET, (AsyncWebServerRequest *өтүнүчү) {Serial.println ("жетектелген суроо-талап алынды!"); setLedBrightness ((request-> url ()). substring (5).toInt ()); request-> send (200, "text/plain", "OK Leds.");});
Жогоруда айтылгандай, радио түймөлөрү PWM демейки абалын орнотуучу өзгөрмөлөрдү көзөмөлдөйт, мындай DuvelBot пиво менен акырындык менен сизге айдай алат, ошол суюк алтынды төгүүдөн сак болуңуз жана ашканага тезирээк жетүү үчүн.
… Анда баракчаны жаңыртпай туруп камеранын сүрөтү кантип жаңыртылат? Бул үчүн биз AJAX (Асинхрондук JavaScript жана XML) деп аталган техниканы колдонобуз. Көйгөй, адатта, кардар-сервер туташуусу белгиленген тартипте жүрөт: кардар (браузер) суроо берет, сервер (ESP32) жооп берет, иш жабылат. Бүттү. Эми эч нерсе болбойт. Эгерде биз кандайдыр бир жол менен браузерди алдап, ESP32ден жаңыртууларды үзгүлтүксүз сурап турсак … жана биз дал ушул javascript менен жасайбыз:
setInterval (function () {var xhttp = new XMLHttpRequest (); xhttp.open ("GET", "/CAMERA", true); xhttp.responseType = "blob"; xhttp.timeout = 500; xhttp.ontimeout = function () {}; xhttp.onload = функция (e) {if (this.readyState == 4 && this.status == 200) {// кара: 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); // блогдон объект түзүү document.querySelector ("#camimage"). src = imageUrl; urlCreator.revokeObjectURL (imageurl)}}; xhttp.send ();}, 250);
setInterval функцияны параметр катары алат жана аны тез -тез аткарат (бул жерде 250 мске бир жолу 4 кадр/секундага алып келет). Аткарылган функция /КАМЕРА дарегиндеги бинардык "блок" үчүн өтүнүч келтирет. Бул ESP32-CAM тарабынан эскизде иштетилет (Randomnerdtutorialsден):
server.on ("/CAMERA", HTTP_GET, (AsyncWebServerRequest * өтүнүчү) {Serial.println ("камера сурамы алынды!"); camera_fb_t * fb = NULL; // esp_err_t res = ESP_OK; size_t _jpg_buf_len = 0; uint8 * _jpg_buf = NULL; // кадрды тартуу fb = esp_camera_fb_get (); if (! fb) {Serial.println ("Frame buffer алынган жок"); return;} if (fb-> format! = PIXFORMAT_JPEG)/ /буга чейин бул форматта {bool jpeg_converted = frame-j.webp
Маанилүү бөлүктөр фб = esp_camera_fb_get () кадрын jpgге айландыруу (AI-ойчул үчүн ал мурунтан эле ушундай форматта) жана jpegди жөнөтүү: request-> send_P (200, "image/jpg", _jpg_buf), _jpg_buf_len).
Андан кийин JavaScript функциясы бул сүрөттүн келишин күтөт. Андан кийин алынган "блогду" html баракчасындагы сүрөттү жаңыртуу үчүн булак катары колдонула турган urlга айландыруу үчүн бир аз эмгек талап кылынат.
тфу, бүттүк!
4 -кадам: Идеялар жана калдыктар
Бул долбоордун максаты мен үчүн жабдууларды интернеттин интерфейси үчүн жетиштүү веб программалоону үйрөнүү болчу. Бул долбоорго бир нече кеңейтүүлөр мүмкүн. Бул жерде бир нече идеялар бар:
- Бул жерде жана бул жерде түшүндүрүлгөндөй "чыныгы" камера агымын ишке ашырыңыз жана аны ошол эле ESP32де түшүндүрүлгөндөй эле 2 -серверге жылдырыңыз, бирок башка CPU өзөгүндө, анда камераны 1 -сервер тейлеген htmlге импорттоңуз. Бул камераны тезирээк жаңыртууга алып келиши керек.
- Кирүү чекити (AP) режимин колдонуңуз, ошондуктан робот бул жерде түшүндүрүлгөндөй автономдуу болот.
- Батареянын чыңалуусун өлчөө, терең уйку мүмкүнчүлүктөрү ж.б. менен кеңейтүү. Бул учурда бир аз кыйын, анткени AI-Thinker ESP32-CAMдын GPIO'лору көп эмес; uart аркылуу кеңейтүүнү талап кылат, мисалы, кулдук ардуино.
- Мышык издеген роботко айландырыңыз, ал мышыктын дарылоосун маал-маалы менен чоң кнопканы басып, мышыктын сонун сүрөттөрүн күндүз агылтууда …
Сураныч, эгер жакса же комментарийге жазсаңыз жана окууңуз үчүн рахмат!
Сунушталууда:
DIY пиво бөтөлкө чырагы: 4 кадам
DIY пиво бөтөлкөсүнүн лампасы: Эй балдар, бул көрсөтмөдө, мен эски айнек бөтөлкөнү кооз түнкү чырактарга кантип кайра иштетүүнү көрсөтөм. Бул түнкү лампа портативдүү жана CR2032 батареясында иштейт
Робот робот кол кап менен башкарылат: 6 кадам (сүрөттөр менен)
Мээлей менен башкарылган роботтук кол: Максаты: Бүтүрүү үчүн долбоор түзүп, тажрыйбага ээ болуу жана көйгөйлөрдү чечүү Outline-3-D роботтору менен басылган " колун”башкаруу үчүн колкапты колдонуп, arduino аркылуу туташыңыз. 3-D басылган колдогу муундардын ар биринде серво бар, ал
Жеке пиво спикери: 5 кадам
Жеке пиво спикери: Бул ар кандай үн түзмөгү үчүн жасалган динамик түзмөгү. EX: Ipod. Жасоо көрүнгөндөй жөнөкөй эмес. Бул жаратуу үчүн мен эски радиодон чыккан эки спикерди колдондум. Көрүнүп тургандай, мен бул спикерди сыра кутусунан жасадым. Кошулууну коопсуз кылуу үчүн
Өзүн-өзү тейлөөчү CD сатуучусу керексизден: 8 кадам
Өзүн-өзү тейлөөчү CD дүкөнү керексизден: Музыканттар: өзүн-өзү тейлеген CD дисплейи менен концерттериңизде көбүрөөк CD сатыңыз! Меники полигонго арналган нерселерден жасалган: галоген лампасы жана зым илгичтери. Эгерде сизде 40 доллар колдо болсо, туура окууңузду токтотуңуз азыр барып " CD сатуучусун " Jeff Kartakтан: ht
Магниттик пиво бөтөлкөсүнүн камерасы: 4 кадам
Магниттик пиво бөтөлкөсүнүн камера стенди: Бул жерде пиво бөтөлкөсүнөн камера туруу абдан жөнөкөй жана оңой .. Аны муздаткычтын эшигине же башка металл бетине коюуга болот