Sisällysluettelo:
- Tarvikkeet
- Vaihe 1: Robotialustan rakentaminen
- Vaihe 2: Ohjelmoi robotti
- Vaihe 3: Näin se toimii
- Vaihe 4: Ideoita ja jäämiä
Video: DuvelBot - ESP32 -CAM -oluen tarjoilurobotti: 4 vaihetta (kuvilla)
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 09:00
Kovan työpäivän jälkeen mikään ei ole lähellä siemailla suosikkioluttasi sohvalla. Minun tapauksessani se on belgialainen vaalea ale "Duvel". Loppujen lopuksi kuitenkin romahdamme, mutta kohtaamme vakavimman ongelman: Duvelini sisältävä jääkaappi on ylittämätön 20 metrin päässä sohvalta.
Vaikka kevyt pakottaminen minun puolelta saattaa liikuttaa satunnaista teini -ikäistä jääkaappikuorijaa kaatamaan viikon Duvelin korvaukseni, tehtävä tosiasiallisesti toimittaa se lähes uupuneelle esi -isälleen on tietysti yksi askel liian pitkälle.
On aika murtaa juotin ja näppäimistö…
DuvelBot on yksinkertainen AI-Thinker ESP32-CAM -pohjainen ajo-verkkokamera, jota voit ohjata älypuhelimella, selaimella tai tabletilla.
Tätä alusta on helppo mukauttaa tai laajentaa vähemmän alkoholikäyttöön (ajattele SpouseSpy, NeighbourWatch, KittyCam …).
Rakensin tämän robotin lähinnä oppiakseni hieman koko web -ohjelmoinnista ja IoT -asioista, joista en tiennyt mitään. Joten tämän ohjeen lopussa on yksityiskohtainen selitys siitä, miten se toimii.
Monet tämän ohjeen osat perustuvat Random Nerd Tutorialsin erinomaisiin selityksiin, joten mene käymään!
Tarvikkeet
Mitä tarvitset:
Osaluettelo ei ole veistetty kiveen, ja monia osia on saatavana monina eri versioina ja monista eri paikoista. Ostin suurimman osan Ali-Expressistä. Kuten Machete sanoi: improvisoi.
Laitteisto:
- AI Thinker ESP32-CAM -moduuli. Se voisi luultavasti toimia muiden ESP32-CAM-moduulien kanssa, mutta sitä käytin
- L298N moottorin ohjainkortti,
- Halpa 4-pyöräinen robottialusta,
- Kotelo, jossa on suuri tasainen pinta, kuten Hammond Electronics 1599KGY,
- USB-3.3V-TTL-muunnin ohjelmointia varten.
- Valaistukseen: 3 valkoista LEDiä, BC327 tai muu yleiskäyttöinen transistori NPN (Ic = 500mA), 4k7k vastus, 3 82 ohmin vastukset, perfboard, kaapelit (katso kaavio ja kuvat).
- Virtakytkin ja normaalisti auki oleva painike ohjelmointia varten.
Valinnainen:
- Kalansilmäkamera, joka joustaa pidempään kuin tavallinen OV2460-kamera ESP32-CAM-moduulin mukana,
- WiFi -antenni, jossa on sopivan pitkä kaapeli ja Ultra Miniature Coax -liitin, kuten tämä. ESP32-CAM: ssä on sisäinen antenni ja kotelo on muovia, joten antennia ei oikeastaan tarvita, mutta mielestäni se näytti siistiltä, joten…
- Mustesuihkutulostettava tarrapaperi yläkannen suunnitteluun.
Tavalliset laitteistot: juotin, porat, ruuvimeisselit, pihdit…
Vaihe 1: Robotialustan rakentaminen
Kaavio:
Kaaviossa ei ole mitään erikoista. ESP32-nokka ohjaa moottoreita L298N-moottorin ohjainkortin kautta, jossa on kaksi kanavaa. Vasemman ja oikean puolen moottorit on sijoitettu rinnakkain ja kummallakin puolella on yksi kanava. Neljä pientä 10..100nF keraamista kondensaattoria lähellä moottorin tappeja ovat aina suositeltavia RF -häiriöiden torjumiseksi. Myös suuri elektrolyyttikorkki (2200… 4700uF) moottorilevyn kaaviossa esitetyllä tavalla, vaikka sitä ei ehdottomasti tarvita, voi rajoittaa hieman syöttöjännitteen aaltoilua (jos haluat nähdä kauhuelokuvan, koetin Vbat oskilloskoopilla moottorien ollessa aktiivisia).
Huomaa, että molemmat moottorikanavat ENABLE-nastoja käyttävät ESP32: n (IO12) samalla pulssileveysmoduloidulla (PWM) tapilla. Tämä johtuu siitä, että ESP32-CAM-moduulissa ei ole tonnia GPIO: ita (moduulin kaavio sisältyy viitteeksi). Robotin LED -valoja ohjaa IO4, joka myös ohjaa sisäistä salaman LEDiä, joten poista Q1 estääksesi salaman LED -valon syttymisen suljetussa kotelossa.
Ohjelmointipainike, virtakytkin, latausliitin ja ohjelmointiliitin ovat käytettävissä robotin alla. Olisin voinut tehdä paljon paremman työn ohjelmointiliittimelle (3,5 mm: n liitin?), Mutta olut ei voinut odottaa enää. Myös langattomat päivitykset (OTA) olisi hyvä asentaa.
Laita robotti ohjelmointitilaan painamalla ohjelmointipainiketta (tämä laskee IO0 -arvon alhaiseksi) ja käynnistä se sitten.
Tärkeää: Lataa robotin NiMH -akut laboratoriovirtasarjalla (tyhjä) noin 14 V: n jännitteellä ja enintään 250 mA: n jännitteellä. Katkaise yhteys, jos robotti tuntuu kuumalta tai akun jännite saavuttaa noin 12,5 V. Ilmeinen parannus tässä olisi oikean akkulaturin integrointi, mutta se ei kuulu tämän ohjeen soveltamisalaan.
Laitteisto:
Katso myös kuvien huomautukset. Kotelo on asennettu robotin pohjaan 4 M4-pultilla ja itselukittuvalla mutterilla. Huomaa etäisyysvälikappaleina käytetyt kumiputket. Toivottavasti tämä antaa myös jousituksen Duvelille, jos ajo osoittautuu kuoppaiseksi. ESP32-CAM-moduuli ja L298N-moottorilevy on asennettu koteloon muovisilla tahmeilla jaloilla (en ole varma oikeasta nimestä englanniksi), jotta ylimääräisiä reikiä ei tarvitse porata. Myös ESP32 on asennettu omaan perfboardiin ja pistokkeisiin. Tämä helpottaa ESP32: n vaihtamista.
Älä unohda: jos käytät ulkoista WiFi-antennia sisäänrakennetun antennin sijasta, juota myös ESP32-CAM-kortin alapuolella oleva antenninvalintahyppy.
Tulosta DuvelBot.svg -tiedoston ylin logo mustesuihkutarrapaperille (tai suunnittele oma) ja olet valmis lähtemään!
Vaihe 2: Ohjelmoi robotti
On suositeltavaa ohjelmoida robotti ennen sen sulkemista, jotta kaikki toimii ja ettei maagista savua ilmesty.
Tarvitset seuraavat ohjelmistotyökalut:
- Arduino IDE,
- ESP32 -kirjastot, SPIFFS (sarjaperifeerinen flash -tiedostojärjestelmä), ESPAsync -verkkopalvelinkirjasto.
Jälkimmäinen voidaan asentaa noudattamalla tätä satunnaisopetusta osioon "tiedostojen järjestäminen" asti. En todellakaan voinut selittää sitä paremmin.
Koodi:
Koodini löytyy osoitteesta:
- Arduino -luonnos DuvelBot.ino,
- Tietojen alikansio, joka sisältää tiedostot, jotka ladataan ESP -salamaan SPIFFS -salauksen avulla. Tämä kansio sisältää verkkosivun, jota ESP palvelee (index.html), verkkosivulle kuuluvan logokuvan (duvel.png) ja porrastetun tyylitaulukon tai CSS -tiedoston (style.css).
Robotin ohjelmointi:
- Liitä USB-TTL-muunnin kaavion mukaisesti,
- Tiedosto -> Avaa -> siirry kansioon, jossa DuvelBot.ino on.
- Muuta verkon kirjautumistietoja luonnoksessa:
const char* ssid = "yourNetworkSSIDHere"; const char* password = "yourPassword Here";
- Työkalut -> Levy -> "AI -Thinker ESP -32 CAM" ja valitse tietokoneellesi sopiva sarjaportti (Työkalut -> Portti -> jotain /dev /ttyUSB0 tai COM4),
- Avaa sarjamonitori Arduino IDE -laitteessa. Samalla kun painat PROG -painiketta (joka laskee IO0 -arvon alhaiseksi), kytke robotti päälle,
- Tarkista sarjamonitorista, että ESP32 on ladattavissa,
- Sulje sarjamonitori (muuten SPIFFS -lähetys epäonnistuu),
- Työkalut -> "ESP32 Sketch Data Upload" ja odota sen päättymistä,
- Kytke virta pois päältä ja takaisin päälle pitämällä PROG -painiketta painettuna palataksesi ohjelmointitilaan,
- Ohjelmoi luonnos painamalla "Lataa" -nuolta ja odota sen päättymistä,
- Avaa sarjamonitori ja nollaa ESP32 kytkemällä virta päälle/pois,
- Kun se on käynnistynyt, kirjoita ip-osoite muistiin (jotain 192.168.0.121) ja irrota robotti USB-TTL-muuntimesta,
- Avaa selain tästä ip -osoitteesta. Sinun pitäisi nähdä käyttöliittymä kuten kuvassa.
- Valinnainen: aseta ESP32: n mac-osoite kiinteään IP-osoitteeseen reitittimessäsi (riippuu reitittimen toiminnasta).
Se siitä! Lue, jos haluat tietää, miten se toimii…
Vaihe 3: Näin se toimii
Nyt päästään mielenkiintoiseen osaan: miten kaikki toimii yhdessä?
Yritän selittää sen vaihe vaiheelta… vaihe… mutta muista, että Kajnjaps ei ole web -ohjelmoinnin asiantuntija. Itse asiassa hieman web -ohjelmoinnin oppiminen oli koko DuvelBotin rakentamisen lähtökohta. Jos teen ilmeisiä virheitä, jätä kommentti!
Ok, kun ESP32 on kytketty päälle, se asetuksissa tavallisesti alustaa GPIO: t, yhdistää ne PWM -ajastimiin moottori- ja LED -ohjaukseen. Katso täältä lisätietoja moottorin ohjauksesta, se on melko vakio.
Sitten kamera on määritetty. Pidin tarkoituksella resoluutiota melko alhaisena (VGA tai 640x480) välttääkseni hitaan vastauksen. Huomaa, että AI-Thinker ESP32-CAM -kortissa on sarjamuistisiru (PSRAM), jota se käyttää suuremman resoluution kamerakehysten tallentamiseen:
if (psramFound ()) {Serial.println ("PSRAM löydetty."); config.frame_size = FRAMESIZE_VGA; config.jpg_quality = 12; config.fb_count = 2; // kehyspuskurien lukumäärä: https://github.com/espressif/esp32-camera} else {Serial.println ("PSRAM-tiedostoa ei löydy."); config.frame_size = FRAMESIZE_QVGA; config.jpg_quality = 12; config.fb_count = 1; }
Sitten alustetaan sarjaliitännän flash -tiedostojärjestelmä (SPIFFS):
// alustaa SPIFFS if (! SPIFFS.begin (true)) {Serial.println ("Virhe on ilmennyt SPIFFS: n asennuksessa!"); palata; }
SPIFFS toimii kuin pieni tiedostojärjestelmä ESP32: ssa. Tässä sitä käytetään kolmen tiedoston tallentamiseen: itse verkkosivu index.html, CSS -tiedostotyylisivu style.css ja-p.webp
Seuraavaksi ESP32 muodostaa yhteyden reitittimeesi (älä unohda asettaa tunnistetietojasi ennen lataamista):
// muuta reitittimesi tunnistetietoja täälläconst char* ssid = "yourNetworkSSIDHere"; const char* password = "yourPassword Here"; … // muodosta yhteys WiFi -sarjaan.print ("Yhdistäminen WiFi -verkkoon"); WiFi.begin (ssid, salasana); while (WiFi.status ()! = WL_CONNECTED) {Serial.print ('.'); viive (500); } // nyt kytketty reitittimeen: ESP32: lla on nyt ip -osoite
Jotta voimme todella tehdä jotain hyödyllistä, aloitamme asynkronisen verkkopalvelimen:
// luo AsyncWebServer -objekti porttiin 80AsyncWebServer -palvelin (80); … Server.begin (); // alkaa kuunnella yhteyksiä
Jos nyt kirjoitat ip -osoitteen, jonka reititin antoi ESP32: lle selaimen osoiteriville, ESP32 saa pyynnön. Tämä tarkoittaa, että sen pitäisi vastata asiakkaalle (sinulle tai selaimellesi) tarjoamalla sille jotain, esimerkiksi verkkosivua.
ESP32 osaa vastata, koska asennuksen yhteydessä vastaukset kaikkiin mahdollisiin sallittuihin pyyntöihin on rekisteröity palvelimella server.on (). Esimerkiksi pääsivua tai hakemistoa (/) käsitellään seuraavasti:
server.on ("/", HTTP_GET, (AsyncWebServerRequest *-pyyntö) {Serial.println ("/pyyntö vastaanotettu!"); request-> send (SPIFFS, "/index.html", String (), false, prosessori);});
Joten jos asiakas muodostaa yhteyden, ESP32 vastaa lähettämällä tiedoston index.html SPIFFS -tiedostojärjestelmästä. Parametriprosessori on toiminnon nimi, joka esikäsittelee html -tiedoston ja korvaa kaikki erikoismerkit:
// Korvaa html: n paikkamerkit, kuten %DATA %//, muuttujilla, jotka haluat näyttää //
Tiedot: %DATA %
Jono -prosessori (const String & var) {if (var == "DATA") {//Serial.println("in -prosessori! "); paluujono (dutyCycleNow); } paluujono ();}
Nyt poistetaan verkkosivun index.html itse. Yleensä on aina kolme osaa:
- html -koodi: mitä elementtejä tulisi näyttää (painikkeet/teksti/liukusäätimet/kuvat jne.),
- tyylikoodi, joko erillisessä.css -tiedostossa tai… -osiossa: miltä elementtien pitäisi näyttää,
- javascript a… -osio: miten verkkosivun pitäisi toimia.
Kun index.html latautuu selaimeen (joka tietää olevansa html DOCTYPE -rivin takia), se tulee tälle riville:
Tämä on css -tyylitaulukon pyyntö. Tämän taulukon sijainti on annettu muodossa href = "…". Joten mitä selaimesi tekee? Aivan, se käynnistää toisen pyynnön palvelimelle, tällä kertaa style.css. Palvelin tallentaa tämän pyynnön, koska se on rekisteröity:
server.on ("/style.css", HTTP_GET, (AsyncWebServerRequest *-pyyntö) {Serial.println ("css-pyyntö vastaanotettu"); request-> send (SPIFFS, "/style.css", "text/css ");});
Siisti vai? Muuten, se olisi voinut olla href = "/some/file/on/the/other/side/of/the moon" kaikille selaimellesi. Se haisi tiedoston yhtä onnellisesti. En selitä tyylitaulukosta, koska se vain hallitsee ulkonäköä, joten se ei ole todella mielenkiintoista täällä, mutta jos haluat oppia lisää, tutustu tähän opetusohjelmaan.
Miten DuvelBot -logo näkyy? Hakemisto index.html sisältää:
johon ESP32 vastaa:
server.on ("/duvel", HTTP_GET, (AsyncWebServerRequest *-pyyntö) {Serial.println ("duvel-logopyyntö vastaanotettu!"); request-> send (SPIFFS, "/duvel.png", "image-p.webp
.. toinen SPIFFS -tiedosto, tällä kertaa täydellinen kuva, kuten vastauksessa näkyy "image/png".
Nyt päästään todella mielenkiintoiseen osaan: painikkeiden koodiin. Keskitytään ETEENPÄIN -painikkeeseen:
ETEENPÄIN
Nimi class = "…" on vain nimi, joka yhdistää sen tyylitaulukkoon, jotta voit mukauttaa kokoa, väriä jne. Tärkeitä osia ovat onmousedown = "toggleCheckbox ('forward')" ja onmouseup = "toggleCheckbox ('stop') ". Nämä muodostavat painikkeen toiminnot (sama kosketusnäytölle/päällekäynnistykselle, mutta kosketusnäytöt/puhelimet). Tässä painiketoiminto kutsuu funktion toggleCheckbox (x) javascript -osiossa:
function toggleCheckbox (x) {var xhr = uusi XMLHttpRequest (); xhr.open ("GET", "/" + x, true); xhr.send (); // voisimme tehdä jotain myös vastauksella, kun olemme valmiita, mutta emme}
Joten eteenpäin -painikkeen painaminen johtaa välittömästi toggleCheckbox ('eteenpäin') kutsumiseen. Tämä toiminto käynnistää sitten XMLHttpRequest "GET", sijainnista "/eteenpäin", joka toimii aivan kuten jos olisit kirjoittanut selaimen osoiteriville 192.168.0.121/forward. Kun tämä pyyntö saapuu ESP32: een, sen käsittelee:
server.on ("/eteenpäin", HTTP_GET, (AsyncWebServerRequest *-pyyntö) {Serial.println ("vastaanotettu/eteenpäin"); actionNow = ETEENPÄIN; pyyntö-> lähetä (200, "teksti/tavallinen", "OK eteenpäin. ");});
Nyt ESP32 vastaa yksinkertaisesti tekstillä "OK eteenpäin". Huomautus toggleCheckBox () ei tee mitään tämän vastauksen kanssa (tai odota sitä), mutta se saattaa tapahtua myöhemmin kamerakoodissa.
Ohjelma itsessään asettaa tämän vastauksen aikana vain muuttuvan actionNow = FORWARD -toiminnon vastauksena painikkeen painamiseen. Nyt ohjelman pääosassa tätä muuttujaa valvotaan tavoitteena nostaa ylös/alas moottorien PWM. Logiikka on: niin kauan kuin meillä on toiminto, joka ei ole STOP, nosta moottoreita siihen suuntaan, kunnes tietty määrä (dutyCycleMax) on saavutettu. Pidä sitten yllä tätä nopeutta niin kauan kuin actionNow ei ole muuttunut:
void loop () {currentMillis = millis (); if (currentMillis - previousMillis> = dutyCycleStepDelay) {// tallenna silmukan viimeinen suorituskerta previousMillis = currentMillis; // mainloop on vastuussa moottorien nostamisesta ylös/alas, jos (actionNow! = previousAction) {// ramppi alas, pysähdy, muuta sitten toimintaa ja nosta tehtävääCycleNow = dutyCycleNow-dutyCycleStep; if (dutyCycleNow <= 0) {// jos rampin laskun jälkeen dc on 0, aseta uuteen suuntaan, aloita min. dutycycle setDir (actionNow); previousAction = actionNow; dutyCycleNow = dutyCycleMin; }} else // actionNow == previousAction ramppi ylös, paitsi kun suunta on STOP {if (actionNow! = STOP) {dutyCycleNow = dutyCycleNow+dutyCycleStep; if (dutyCycleNow> dutyCycleMax) dutyCycleNow = dutyCycleMax; } muu dutyCycleNow = 0; } ledcWrite (pwmChannel, dutyCycleNow); // säädä moottorin käyttöjaksoa}}
Tämä lisää hitaasti moottorien nopeutta sen sijaan, että se käynnistyisi täydellä nopeudella ja roiskuisi arvokasta arvokasta Duvelia. Ilmeinen parannus olisi siirtää tämä koodi ajastimen keskeytysrutiiniin, mutta se toimii sellaisenaan.
Jos nyt vapautamme eteenpäin -painikkeen, selaimesi kutsuu toggleCheckbox ('stop'), mikä johtaa GET /stop -pyyntöön. ESP32 asettaa actionNow -toiminnon STOP -asentoon (ja vastaa "OK stop" -toiminnolla).
Entä LEDit? Sama mekanismi, mutta nyt meillä on liukusäädin:
Javascriptissa liukusäätimen asetuksia valvotaan siten, että jokaisen muutoksen yhteydessä soitetaan "/LED/xxx", jossa xxx on kirkkausarvo, johon LEDit tulisi asettaa:
var slide = document.getElementById ('dia'), sliderDiv = document.getElementById ("sliderAmount"); slide.onchange = function () {var xhr = new XMLHttpRequest (); xhr.open ("GET", "/LED/" + this.value, true); xhr.send (); sliderDiv.innerHTML = tämä.arvo; }
Huomaa, että käytimme dokumenttia document.getElementByID ('dia') hakea itse liukusäädinobjekti, joka on ilmoitettu ja että arvo tulostetaan tekstielementtiin jokaisen muutoksen yhteydessä.
Luonnoksen käsittelijä kerää kaikki kirkkauspyynnöt käyttämällä "/LED/*" käsittelijän rekisteröinnissä. Sitten viimeinen osa (numero) jaetaan ja heitetään int:
server.on ("/LED/ *", HTTP_GET, (AsyncWebServerRequest *-pyyntö) {Serial.println ("led-pyyntö vastaanotettu!"); setLedBrightness ((request-> url ()). alimerkkijono (5). toInt ()); request-> send (200, "text/plain", "OK Leds.");});
Kuten edellä on kuvattu, radiopainikkeet ohjaavat muuttujia, jotka asettavat PWM -oletusarvot, niin että DuvelBot voi ajaa hitaasti luoksesi oluen kanssa varoen, ettei nestemäinen kulta läiky, ja nopeasti takaisin keittiöön hakemaan lisää.
… Joten miten kameran kuva päivitetään ilman, että sinun on päivitettävä sivu? Tätä varten käytämme tekniikkaa nimeltä AJAX (Asynchronous JavaScript and XML). Ongelmana on, että normaalisti asiakas-palvelin-yhteys noudattaa kiinteää menettelyä: asiakas (selain) pyytää, palvelin (ESP32) vastaa, tapaus suljettu. Tehty. Mitään ei tapahdu enää. Jos vain jotenkin voisimme huijata selaimen pyytämään säännöllisesti päivityksiä ESP32: lta … ja juuri sitä teemme tällä javascript -osalla:
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) {// katso: 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); // luo objekti blobista document.querySelector ("#camimage"). src = imageUrl; urlCreator.revokeObjectURL (imageurl)}}; xhttp.send ();}, 250);
setInterval ottaa parametrin funktiona ja suorittaa sen aina silloin tällöin (täällä kerran 250 ms: ssa, jolloin tuloksena on 4 kuvaa sekunnissa). Suoritettava toiminto pyytää binaarista "blob" -kohtaa osoitteessa /CAMERA. Tämän käsittelee luonnoksessa oleva ESP32-CAM muodossa (Randomnerdtutorials):
server.on ("/CAMERA", HTTP_GET, (AsyncWebServerRequest * -pyyntö) {Serial.println ("kamerapyyntö vastaanotettu!"); camera_fb_t * fb = NULL; // esp_err_t res = ESP_OK; size_t _jpg_buf_len = 0; uint8 * _jpg_buf = NULL; // kaappaa kehys fb = esp_camera_fb_get (); if (! fb) {Serial.println ("Kehyspuskuria ei voitu hankkia"); return;} if (fb-> format! = PIXFORMAT_JPEG)/ /jo tässä muodossa konfiguraatiosta {bool jpeg_converted = frame-j.webp
Tärkeimmät osat ovat kehyksen fb = esp_camera_fb_get () muuntaminen jpg-muotoon (AI-Thinkerille se on jo tässä muodossa) ja jpeg-tiedoston lähettäminen: request-> send_P (200, "image/jpg", _jpg_buf, _jpg_buf_len).
JavaScript -toiminto odottaa tämän kuvan saapumista. Sitten kestää vain vähän työtä muuttaa vastaanotettu "blob" urliksi, jota voidaan käyttää lähteenä päivittää kuva html -sivulla.
huh, olemme valmiita!
Vaihe 4: Ideoita ja jäämiä
Tämän projektin tavoitteena oli oppia juuri tarpeeksi web -ohjelmointia laitteiston liittämiseksi verkkoon. Tähän projektiin on mahdollista lisätä useita laajennuksia. Tässä muutamia ideoita:
- Toteuta "todellinen" kameran suoratoisto täällä ja täällä selitetyllä tavalla ja siirrä se toiselle palvelimelle, kuten tässä on kuvattu samalla ESP32: lla, mutta toisella CPU -ytimellä, ja tuo sitten kameravirta 1. palvelimen palvelemalle html -tiedostolle…. Tämän pitäisi nopeuttaa kamerapäivityksiä.
- Käytä tukiasematilaa (AP), jotta robotti on itsenäisempi, kuten tässä on selitetty.
- Laajenna akun jännitteen mittauksella, syvän lepotilan ominaisuuksilla jne. Tämä on tällä hetkellä hieman vaikeaa, koska AI-Thinker ESP32-CAM -laitteessa ei ole paljon GPIO: ita. tarvitsee laajennusta uartin ja esimerkiksi orja -arduinon kautta.
- Muunna kissan etsiväksi robotiksi, joka heittää kissojen herkkuja aika ajoin ison napin painalluksella, striimaa tonnia hienoja kissakuvia päivän aikana…
Kommentoi, jos pidit tai sinulla on kysymyksiä ja kiitos lukemisesta!
Suositeltava:
DIY 37 Leds Arduino -rulettipeli: 3 vaihetta (kuvilla)
DIY 37 Leds Arduino Roulette Peli: Ruletti on kasinopeli, joka on nimetty ranskalaisen sanan mukaan, joka tarkoittaa pientä pyörää
Covid -suojakypärä, osa 1: johdanto Tinkercad -piireihin!: 20 vaihetta (kuvilla)
Covid -suojakypärä, osa 1: johdanto Tinkercad -piireihin!: Hei, ystävä! Tässä kaksiosaisessa sarjassa opimme käyttämään Tinkercadin piirejä - hauskaa, tehokasta ja opettavaista työkalua piirien toiminnasta! Yksi parhaista tavoista oppia on tehdä. Joten suunnittelemme ensin oman projektimme: th
Weasleyn sijaintikello neljällä kädellä: 11 vaihetta (kuvilla)
Weasleyn sijaintikello neljällä kädellä: Joten Raspberry Pi: n kanssa, joka oli pyörinyt jonkin aikaa, halusin löytää mukavan projektin, jonka avulla voisin hyödyntää sitä parhaalla mahdollisella tavalla. Löysin ppeters0502 tämän upean Instructable Build Your Own Weasley Location Clockin ja ajattelin, että
3D -painettu Twin Paddle Cw -avain (566 g.): 21 vaihetta (kuvilla)
3D -painettu Twin Paddle Cw -avain (566 g.): Toistaiseksi tarkka, pehmeä ja raskas_käyttöinen kaksoismela -avain on merkinnyt paljon rahaa. Tarkoitukseni tämän avaimen suunnittelussa oli tehdä mela: a)- Halpa --- Se on valmistettu muovista tavallisella 3D-tulostimella b)- Kestävä --- Olen käyttänyt palloa
Pultti - DIY -langaton latauskello (6 vaihetta): 6 vaihetta (kuvilla)
Pultti - DIY -langaton latausyökello (6 vaihetta): Induktiiviset lataukset (tunnetaan myös nimellä langaton lataus tai langaton lataus) on langattoman voimansiirron tyyppi. Se käyttää sähkömagneettista induktiota sähkön tuottamiseen kannettaville laitteille. Yleisin sovellus on langaton Qi -latauslaite