
ESP32-CAM on edullinen kehityslevy, jossa on ESP32-mikrokontrolleri, kamera (tyypillisesti OV2640), microSD-korttipaikka ja langattomat ominaisuudet (Wi-Fi, Bluetooth). Sitä käytetään projekteissa, kuten videon suoratoistossa, valvontakameroissa, valokuvien ottamisessa ja kasvojentunnistuksessa. Levyn avulla voidaan rakentaa verkkopalvelimia ja muita IoT-laitteita, ja sitä voidaan ohjelmoida helposti esimerkiksi Arduino IDE:llä.
Johdanto: Tervetuloa takaisin, fiksut kaverit!
Moi taas, fiksut kaverit ja Elli Enigman lukijat! Hienoa nähdä teidät taas täällä, valmiina avaamaan aivoja ja laittamaan kädet saveen. Jos muistatte aiemman juttumme, “Robottien aivot auki”, perehdyimme siihen, miten koneista voidaan tehdä todella fiksuja kavereita. Silloin käsittelimme suuria aivoja ja monimutkaisia neuroverkkoja – siis sitä teoreettista puolta. Nyt on aika siirtyä teoriaa eteenpäin ja laittaa nuo aivot paketoituna pieneen, mutta sitäkin pippurisempaan pakettiin. Meidän päivän sankarimme on nimeltään ESP32-CAM.
Tämä pikkuinen, taskurahaa halvempi ihme on todellinen pelinmuuttaja. Vain muutaman euron hintainen piirilevy on varustettu kameralla ja kaikilla ominaisuuksilla, joita tarvitaan tekoälyä hyödyntävään konenäköprojektiin. Se pystyy ottamaan kuvia, lähettämään niitä langattomasti ja jopa suorittamaan yksinkertaisia tekoälymalleja suoraan itse laitteella. Voimme kutsua sitä minirobottien aivoksi. Joten, mihin näitä aivoja voisi käyttää? Ja mikä parasta, miten tekoäly tekee koko ohjelmointiprosessista paljon helpompaa? Aivan. Keskitymme tänään siihen, miten teet tästä minikoneesta näkevän ja ajattelevan kaverin, joka osaa suorittaa fiksuja tehtäviä.
Pieni mutta pippurinen: ESP32-CAM pähkinänkuoressa
ESP32-CAM on paljon enemmän kuin pelkkä halpa kameramoduuli. Se on itse asiassa täysiverinen kehitysalusta, joka on suunniteltu erityisesti kuvantunnistussovelluksia varten. Moduulin sydämenä sykkii tehokas ESP32-D0WD-kaksoisydinprosessori, jonka kellotaajuus voi nousta jopa 240 MHz:iin. Tämä antaa sille riittävästi laskentatehoa moniin käytännön projekteihin.
Tekniset tiedot puhuvat puolestaan, kun puhumme tästä pienestä tehopakkauksesta. Moduulissa on sisäänrakennettu Wi-Fi-tuki, joka mahdollistaa reaaliaikaisen kuvansiirron ja videostriimauksen suoraan verkkoon. Se tukee myös Bluetooth-standardeja. Kamerana toimii 2 megapikselin OV2640-kuvasensori, jonka avulla se pystyy ottamaan kuvia, joiden tarkkuus on jopa 1600 x 1200 pikseliä. Tämän lisäksi moduulissa on muistikorttipaikka, johon voi asentaa jopa 4 gigatavun kokoisen SD-kortin kuvien tai videoiden tallennusta varten. Tällainen yhdistelmä tekee siitä erinomaisen työkalun esineiden internetin (IoT) projekteihin, joissa tarvitaan visuaalista dataa.
Ehkä suurin syy sen valtavaan suosioon harrastajien ja keksijöiden keskuudessa on sen uskomaton hinta-laatusuhde. On todella poikkeuksellista saada laite, jossa on näin laajat ominaisuudet, alle 10 euron hintaan. Tämä on tehnyt siitä ihanteellisen vaihtoehdon DIY-projekteihin ja prototyyppien kehittämiseen. Vaikka se saattaa vaatia erillisen ohjelmointilevyn koodin lataamiseksi, koska siinä ei ole sisäänrakennettua USB-UART-muunninta , tämä pieni ylimääräinen askel tekee sen kokonaiskustannuksista todella edulliset. Valmistajan päätös jättää pois tämä komponentti on strateginen: se laskee yksittäisen moduulin hinnan mahdollisimman alas. Harrastajat ostavat ohjelmointilevyn vain kerran ja voivat käyttää sitä uudelleen useisiin projekteihin, mikä tekee jokaisesta seuraavasta ESP32-projektista entistä edullisemman. Tämä on oivallinen esimerkki siitä, miten hardware-suunnittelu voi suoranaisesti edistää innovaatiota ja demokratisoida monimutkaisen tekniikan saatavuutta laajalle yleisölle.
Näkevä, älykäs kone: Konenäköä mikrokontrollerilla
Kun sivustot kuten koodinkutoja.com esittelevät eleiden tai kädenliikkeiden tunnistusta , ne käyttävät usein työkaluja kuten Python ja OpenCV, jotka vaativat tehokkaan tietokoneen tai jopa Linux-koneen. Nämä sovellukset ovat tehokkaita, mutta ne eivät ole suunniteltu toimimaan pienillä mikrokontrollereilla, koska niillä ei yksinkertaisesti ole tarpeeksi prosessointitehoa tai muistia raskaiden kirjastojen pyörittämiseen. Tässä tulee kuvaan uusi ulottuvuus, nimittäin pienlaitteille suunniteltu tekoäly, jota kutsutaan Edge AI:ksi tai TinyML:ksi.
Edge AI ja TinyML – Aivot laitteen sisällä
Edge AI tarkoittaa lyhyesti sitä, että tekoälymalli suoritetaan suoraan laitteessa eli “reunalla” (the edge) pilven sijaan. TinyML on tähän liittyvä ala, joka tekee näistä malleista niin pieniä ja optimoituja, että ne mahtuvat vähävirtaisiin ja muistirajoitettuihin mikrokontrollereihin, kuten ESP32:een. Tällainen lähestymistapa tuo mukanaan useita etuja:
- Nopeus: Koska dataa ei tarvitse lähettää pilveen käsittelyyn, reaktioaika on lähes reaaliaikainen.
- Yksityisyys: Tieto pysyy paikallisesti laitteessa, mikä on kriittistä esimerkiksi turvajärjestelmissä tai henkilökohtaisissa sovelluksissa.
- Energiatehokkuus: Laitteet voivat toimia pitkään akkuvirralla, koska ne eivät tarvitse jatkuvaa verkkoyhteyttä.
Edge Impulse – Pelinmuuttaja
Harrastajalle yksi merkittävimmistä haasteista TinyML:n kanssa on monimutkaisten mallien kouluttaminen. Tässä apuun saapuu Edge Impulse. Se on alusta, joka tekee koko prosessista uskomattoman suoraviivaisen. Se poistaa kynnystä ja vaatimuksia syvällisestä koneoppimisen tuntemuksesta ja tehokkaasta tietokoneesta. Edge Impulse ottaa harteilleen raskaan laskentatyön eli mallin koulutuksen pilvessä, jolloin voit itse keskittyä luovaan ongelmanratkaisuun ja datan keräämiseen.
Työskentely Edge Impulsen kanssa on selkeää ja vaiheistettua :
- Datan kerääminen: Voit kerätä dataa suoraan ESP32-CAM-moduulilla. Tässä vaiheessa on tärkeää kerätä mahdollisimman monta kuvaa (vähintään 50 kuvaa per luokka on hyvä nyrkkisääntö). Kuvia tulisi ottaa eri kulmista ja valaistuksissa, jotta mallista tulee kestävä.
- Impulssin suunnittelu: Määrittelet, miten raakadata esikäsitellään ja miten opittu malli luodaan. Tähän sisältyy esimerkiksi kuvien koon pienentäminen 96×96 pikseliin, joka on optimoitu ESP32:lle.
- Mallin koulutus: Koulutat mallin Edge Impulsen palvelimilla. Tämä on automaattinen prosessi, ja saat valmiin mallin, joka on optimoitu pienlaitteille.
- Mallin käyttöönotto: Koulutettu malli ladataan optimoituna C++-kirjastona, jonka voit lisätä Arduino IDE:hen ja ladata ESP32-CAMiin.
Tämä työnkulku on mullistava. Perinteisesti monimutkaiset koneoppimisprojektit vaativat syvällistä ymmärrystä neuroverkoista ja kalliita laitteita. Edge Impulse muuttaa tämän, koska se tarjoaa avaimet käteen -ratkaisun, joka siirtää laskennallisesti raskaan vaiheen pilveen. Näin pystyt käyttämään edullista laitetta loppusovellukseen ja kehitystyö keskittyy datan laatuun ja luovaan ongelmanratkaisuun. Tämä on aito tekoälykehityksen demokratisaatio, joka avaa oven uusille tekijäsukupolville.
Tässä tiivistetty vertailu siitä, miten perinteinen PC:llä tehtävä konenäkö eroaa TinyML:stä ESP32-CAMilla:
Ominaisuus | Tietokone (Python/OpenCV) | ESP32-CAM (Edge AI) |
Laitteisto | Tehokas PC tai kannettava | Edullinen mikrokontrolleri |
Prosessointi | Gigatavuja, monipuolinen reaaliaikainen käsittely | Megatavuja, optimoitu nopeaan inferenssiin |
Muisti | Useita gigatavuja RAM-muistia | 520 kt RAM ja 4 Mt PSRAM |
Tyypilliset sovellukset | Monimutkaiset analyysit (esim. tarkka kasvojen tunnistus) | Yksinkertainen luokittelu tai esineiden tunnistus |
Koodausympäristö | Python-kirjastot (OpenCV, TensorFlow) | C++ (Arduino/ESP-IDF) & Edge Impulse |
Kustannus | Korkea | Erittäin edullinen (< $10) |
Elli Enigman kolme projektia: Älyä ja näköä käytäntöön
Nyt kun meillä on perusta tiedossa, on aika siirtyä konkreettisiin, innostaviin projekteihin. Valitsin kolme esimerkkiä, jotka näyttävät, kuinka monipuolisesti ESP32-CAMia ja TinyML:ää voi hyödyntää. Yllättävää on, että jokaisessa projektissa on käytännössä sama perusprosessin ydin: kerää dataa, kouluta malli Edge Impulsen avulla ja lataa se ESP32:een. Yhden menetelmän oppimalla voit rakentaa loputtoman määrän luovia sovelluksia.
Projekti 1: Fiksu ovikello, joka tunnistaa ystävän
Tämä projekti vastaa käyttäjien suosituimpaan toiveeseen, eli siihen, kuinka kamerasta voi tehdä älykkään ovikellon, joka lähettää kuvan kännykkään.
- Helppo taso: Yksinkertaisin toteutus on käyttää perinteistä painonappia tai PIR-liiketunnistinta. Kun vierailija painaa ovikelloa, ESP32-CAM ottaa kuvan ja lähettää sen sinulle esimerkiksi sähköpostilla tai Telegram-viestinä. Tämä on hyvä perusprojekti aloittelijalle, ja se antaa jo valtavasti uusia ominaisuuksia perinteiseen ovikelloon verrattuna.
- Edistynyt taso (tekoälyllä): Tässä otamme mukaan TinyML-taian. Koulutat Edge Impulsen mallin, joka erottaa luokat kuten ”tuttu ihminen”, ”tuntematon vierailija” ja ”postinjakaja”. Keräämällä useita kuvia perheenjäsenistäsi ja muista, voit kouluttaa mallin tunnistamaan heidät. Kun ovikello aktivoituu, kamera ottaa kuvan, ja tekoäly malli luokittelee sen. Tieto, kuten “Tunnistettu: Matti!” tai “Tuntematon vierailija ovella”, voidaan sisällyttää kännykkään lähetettävään ilmoitukseen. Tämä antaa järjestelmälle todelliset aivot, sillä se ei ainoastaan näe, vaan myös ymmärtää, mitä se näkee.
Projekti käyntiin:
Täysin toimivan älykkään ovikellon luominen vaatii useita eri komponentteja, joista jokainen on oma kokonaisuutensa:
- ESP32-CAM-koodi: Tämän on otettava kuvia, yhdistettävä Wi-Fiin ja käynnistettävä konenäkö.
- Kuvien käsittely: Koodin on lähetettävä kuvat palvelimelle tai pilvipalveluun.
- Kasvojentunnistusmalli: Itse tekoälymalli on koulutettava tunnistamaan ystäväsi ja perheenjäsenesi.
- Ilmoitusjärjestelmä: Palvelimen on lähetettävä push-ilmoitus puhelimeesi, kun tunnistus on tehty.
Tämä on moniosainen kokonaisuus, jonka valmis koodi olisi satoja, ellei tuhansia rivejä pitkä. Siksi on paljon hyödyllisempää keskittyä ideaan ja työnkulkuun, jotta ymmärrät, miten tällainen projekti rakennetaan, etkä vain kopioi valmista koodia, jonka toimivuudesta et voi olla varma.
Voin kuitenkin antaa sinulle esimerkkikoodin, jolla pääset alkuun ja ymmärrät, miten ESP32-CAMin perustoiminnot toimivat. Tällä koodilla saat kamerasta otettua kuvan ja lähetettyä sen HTTP-palvelimelle, mikä on ensimmäinen ja tärkein askel kohti älykästä ovikelloa.
ESP32-CAM – Kuvan lähetys Wi-Fi-verkossa
Tämä koodi on kirjoitettu Arduino-ympäristöön, ja se toimii hyvänä perustana, jota voit laajentaa kohti monimutkaisempia toimintoja. Tässä on yksinkertainen koodi, joka ottaa kuvan ja lähettää sen HTTP POST -pyynnöllä palvelimelle.
Tarvittavat kirjastot:
esp_camera.h
WiFi.h
WiFiClient.h
ESPAsyncWebServer.h
camera_pins.h
(määrittelyt ESP32-CAMille)
#include "esp_camera.h"
#include <WiFi.h>
#include <HTTPClient.h>
// WiFi-asetukset
const char* ssid = "WIFI_VERKON_NIMI";
const char* password = "WIFI_SALASANA";
// Palvelin, jonne kuva lähetetään
const char* serverName = "http://OMA_PALVELIMEN_IP/upload";
HTTPClient http;
// Kameran asetukset
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
#define D0_GPIO_NUM -1 // Vain M5CAM
#define D1_GPIO_NUM -1 // Vain M5CAM
#define D2_GPIO_NUM -1 // Vain M5CAM
#define D3_GPIO_NUM -1 // Vain M5CAM
#define D4_GPIO_NUM -1 // Vain M5CAM
#define D5_GPIO_NUM -1 // Vain M5CAM
#define D6_GPIO_NUM -1 // Vain M5CAM
#define D7_GPIO_NUM -1 // Vain M5CAM
void setup() {
Serial.begin(115200);
// Yhdistä Wi-Fi-verkkoon
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi yhdistetty!");
// Kameran käynnistys
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = 5;
config.pin_d1 = 18;
config.pin_d2 = 19;
config.pin_d3 = 21;
config.pin_d4 = 36;
config.pin_d5 = 39;
config.pin_d6 = 34;
config.pin_d7 = 35;
config.pin_xclk = 0;
config.pin_pclk = 22;
config.pin_vsync = 25;
config.pin_href = 23;
config.pin_sscb_sda = 26;
config.pin_sscb_scl = 27;
config.pin_pwdn = -1;
config.pin_reset = -1;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
// Kameran resoluutio
config.frame_size = FRAMESIZE_VGA;
config.jpeg_quality = 12;
config.fb_count = 1;
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Kameran käynnistys epäonnistui: %s\n", esp_err_to_name(err));
return;
}
}
void loop() {
// Ota kuva
camera_fb_t * fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Kuvankaappaus epäonnistui");
return;
}
// Lähetä kuva palvelimelle
http.begin(serverName);
http.addHeader("Content-Type", "image/jpeg");
int httpResponseCode = http.POST(fb->buf, fb->len);
if (httpResponseCode > 0) {
Serial.printf("[HTTP] POST... koodi: %d\n", httpResponseCode);
String response = http.getString();
Serial.println(response);
} else {
Serial.printf("[HTTP] POST... epäonnistui, koodi: %d\n", httpResponseCode);
}
http.end();
esp_camera_fb_return(fb);
delay(5000); // Odota 5 sekuntia ennen seuraavaa kuvaa
}
Miten tästä eteenpäin?
- Palvelinpuoli: Sinun on luotava palvelin (esim. Python Flask tai Node.js), joka ottaa vastaan ESP32-CAMin lähettämän kuvan ja tallentaa sen. Tämä palvelin toimisi linkkinä ovikellon ja tekoälymallin välillä.
- Tekoälymalli: Seuraava askel on kouluttaa kasvojentunnistusmalli tietokoneellasi. Tähän voit hyödyntää OpenCV-kirjastoa, kuten koodinkutoja.com -sivustolla on esitetty. Kouluta malli useilla kuvilla ystävistäsi. Kun palvelin vastaanottaa kuvan ESP32:sta, se lähettää kuvan tälle tekoälymallille.
- Ilmoitukset: Kun tekoäly tunnistaa jonkun, se lähettää ilmoituksen (esim. push-ilmoituksen tai sähköpostin) puhelimeesi.
Vinkki: Voit helpottaa projektin toteutusta hyödyntämällä TinyML– ja Edge Impulse -alustoja. Niiden avulla voit kouluttaa tekoälymallin (esim. liiketunnistuksen tai yksinkertaisen kasvojentunnistuksen) suoraan toimimaan ESP32-CAMissa, jolloin sinun ei tarvitse lähettää kuvaa erilliselle palvelimelle. Tämä tekee ovikellosta nopeamman ja itsenäisemmän.
Toivottavasti tämä antaa sinulle hyvän lähtökohdan tähän upeaan projektiin!
Projekti 2: Käsieleillä ohjattava laite
Koodinkutoja.com-sivuston artikkelit näyttävät, miten käden ja sormien tunnistus on mahdollista Pythonilla ja OpenCV:llä. Vaikka ESP32-CAMin laskentateho ei riitä sormien tarkan sijainnin seuraamiseen, se on enemmän kuin riittävä yksittäisten eleiden luokitteluun.
Tämän projektin tavoitteena on muuttaa tietokoneen tai IoT-laitteen ohjaaminen eleillä käsinkosketeltavaksi todellisuudeksi. Voit esimerkiksi kouluttaa mallin tunnistamaan “nappulan” (kuten puristetun nyrkin) tai “valikon” (kuten avoimen kämmenen). Kun kamera tunnistaa tietyn eleen, ESP32 lähettää Wi-Fi-yhteyden yli komennon toiselle laitteelle, kuten älylampulle tai verkkopistorasialle. Tämä on erinomainen esimerkki siitä, miten voit soveltaa perinteisen konenäön periaatteita yksinkertaistettuna TinyML:n rajalliseen ympäristöön. Vaikka sovelluksia voidaan käyttää laajasti teollisuusautomaatiosta aina älykotiin asti , on tämäkin projekti loistava kotiharrastelija projekti.
Projekti käyntiin:
tässä projektissa hyödynnetään TinyML:n rajallista laskentaympäristöä, mikä tekee siitä sekä haastavan että erittäin palkitsevan. Vaikka ESP32-CAMin laskentateho ei riitä reaaliaikaiseen sormien tunnistukseen samalla tavalla kuin tietokone, se on täydellinen alusta yksinkertaisten käsimerkkien, kuten nyrkin tai avoimen kämmenen, tunnistamiseen ja luokitteluun. Tällaisen projektin ydin on Edge Impulse -alusta, joka tekee tekoälymallin kehittämisestä ja käyttöönotosta uskomattoman helppoa. Tämän projektin koodi keskittyy siis pitkälti Edge Impulsen luoman valmiin kirjaston hyödyntämiseen.
Käsieleillä ohjattava laite
Työnkulku:
- Datan keräys: Kokoa ESP32-CAMilla useita kuvia jokaisesta eleestä, jonka haluat laitteen tunnistavan. Esimerkiksi 100-200 kuvaa puristetusta nyrkistä ja vastaava määrä avoimesta kämmenestä.
- Mallin koulutus: Syötä keräämäsi kuvat Edge Impulse -alustalle. Alusta esikäsittelee kuvat, kouluttaa niistä pienen tekoälymallin ja optimoi sen toimimaan tehokkaasti ESP32:ssa.
- Koodin luonti: Edge Impulse generoi valmiin C++-kirjaston, jonka voit tuoda Arduino-ympäristöön. Tämä kirjasto sisältää kaiken tarvittavan, jotta ESP32-CAM voi käyttää kouluttamaasi mallia.
- Laitteen ohjaus: Koodissa määritellään, mitä ESP32 tekee, kun se tunnistaa tietyn eleen. Tässä esimerkissä lähetetään komento Wi-Fin yli.
Tässä on koodi, joka toimii tämän projektin perustana. Muista, että tämä on yleinen malli, ja sinun on korvattava “Edge Impulsen mallikirjasto” ja “Wi-Fi-tiedot” omillasi.
Miten koodi toimii?
- Määritykset: Koodin alussa määritellään Wi-Fi-yhteys ja kameran asetukset. Erityisen tärkeää on asettaa kuvan muoto (
PIXFORMAT_GRAYSCALE
) ja koko (FRAMESIZE_96X96
) vastaamaan Edge Impulse -projektin asetuksia. - Kuvankäsittely:
loop
-funktio ottaa kuvan ja luokittelee sen suoraan ESP32:lla käyttäen Edge Impulsen generoidun kirjastonei_image_classification_run_image_classifier
-funktiota. Tämä toiminto on koko projektin ydin, sillä se hoitaa kaiken monimutkaisen logiikan puolestasi. - Toimintalogiikka: Tunnistuksen jälkeen koodi tarkistaa, mikä eleistä sai korkeimman luotettavuuden. Jos luotettavuus ylittää asetetun rajan (esim. 85%), ESP32 lähettää Wi-Fi-verkon yli HTTP GET -pyynnön. Tässä pyynnössä voidaan lähettää parametrina tunnistetun eleen nimi, jonka ulkoinen palvelin tai laite ottaa vastaan.
- Laitteen ohjaus: Ulkoinen palvelin tai IoT-laite (esim. Raspberry Pi tai verkkopistorasia) kuuntelee näitä HTTP-pyyntöjä. Kun se saa pyynnön, jonka parametrina on esimerkiksi
"nyrkki"
, se suorittaa sille annetun komennon, kuten kytkee valot päälle tai pois päältä.
Tämän koodin avulla pääset alkuun erinomaisella tavalla, ja sen avulla voit luoda todella mielenkiintoisia ja käytännöllisiä sovelluksia!
#include <WiFi.h>
#include <HTTPClient.h>
#include "ei_image_classification.h" // Sisältää Edge Impulsen luoman mallin
// WiFi-asetukset
const char* ssid = "WIFI_VERKON_NIMI";
const char* password = "WIFI_SALASANA";
// Palvelimen osoite, jota ohjataan
const char* serverUrl = "http://OMA_PALVELIMEN_IP/komento";
// Kameran asetukset (malli ESP32-CAM AI-Thinker)
#include "esp_camera.h"
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
camera_config_t config;
void setup() {
Serial.begin(115200);
// Yhdistä Wi-Fi-verkkoon
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi yhdistetty!");
Serial.printf("IP-osoite: %s\n", WiFi.localIP().toString().c_str());
// Kameran käynnistys
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = 5;
config.pin_d1 = 18;
config.pin_d2 = 19;
config.pin_d3 = 21;
config.pin_d4 = 36;
config.pin_d5 = 39;
config.pin_d6 = 34;
config.pin_d7 = 35;
config.pin_xclk = 0;
config.pin_pclk = 22;
config.pin_vsync = 25;
config.pin_href = 23;
config.pin_sscb_sda = 26;
config.pin_sscb_scl = 27;
config.pin_pwdn = -1;
config.pin_reset = -1;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_GRAYSCALE; // Määritä pikselimuoto Edge Impulsen vaatimusten mukaisesti
config.frame_size = FRAMESIZE_96X96; // Määritä kuvan koko Edge Impulsen vaatimusten mukaisesti
config.jpeg_quality = 10;
config.fb_count = 1;
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Kameran käynnistys epäonnistui: %s\n", esp_err_to_name(err));
return;
}
}
void loop() {
// Ota kuva
camera_fb_t * fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Kuvankaappaus epäonnistui");
return;
}
// Luokittele kuva Edge Impulse -mallilla
signal_t signal;
ei::error_t err = ei_image_classification_run_image_classifier(&signal, fb->buf);
if (err != EI_IMPULSE_OK) {
Serial.printf("Luokittelu epäonnistui, virhe: %d\n", err);
esp_camera_fb_return(fb);
return;
}
// Tarkista tulokset
String recognizedGesture = "tuntematon";
float maxConfidence = 0.0;
for (size_t i = 0; i < EI_CLASSIFIER_LABEL_COUNT; i++) {
if (ei_classifier_results.classification[i].confidence > maxConfidence) {
maxConfidence = ei_classifier_results.classification[i].confidence;
recognizedGesture = ei_classifier_results.classification[i].label;
}
}
// Jos luotettavuus on riittävän suuri, lähetä komento
if (maxConfidence > 0.85) { // Säädä luotettavuusrajaa tarpeen mukaan
Serial.printf("Tunnistettu ele: %s (luottamus: %.2f)\n", recognizedGesture.c_str(), maxConfidence);
// Lähetä HTTP-pyyntö riippuen tunnistetusta eleestä
HTTPClient http;
String url = String(serverUrl) + "?ele=" + recognizedGesture;
http.begin(url);
int httpCode = http.GET();
if (httpCode > 0) {
Serial.printf("[HTTP] GET... koodi: %d\n", httpCode);
String payload = http.getString();
Serial.println(payload);
} else {
Serial.printf("[HTTP] GET... epäonnistui, koodi: %d\n", httpCode);
}
http.end();
} else {
Serial.println("Eleen tunnistus ei riittävän luotettava.");
}
esp_camera_fb_return(fb);
delay(100); // Lyhyt viive, jotta prosessori ei käy jatkuvasti täydellä teholla
}
Projekti 3: Automaattinen lemmikkien tunnistin ja syöttölaite
Tämä projekti hyödyntää tekoälyä kodin automaatiossa ja lemmikkien hoidossa. Sen avulla voidaan rakentaa laite, joka annostelee ruokaa lemmikille vain silloin, kun se tunnistaa lemmikin.
Toteutus on suoraviivainen Edge Impulsen avulla. Koulutat mallin tunnistamaan luokan “lemmikki” ottamalla kuvia kissastasi tai koirastasi eri asennoissa ja valaistuksissa. Voit myös lisätä luokan “ei-lemmikki” välttääksesi väärät positiiviset tunnistukset. Kun malli on valmis, se ladataan ESP32-CAMiin. Kamera tarkkailee ruokintapaikkaa, ja kun se tunnistaa lemmikin, ESP32 aktivoi servomoottorin, joka avaa ruoka-annostelijan luukun. Tämän projektin etuna on myös sen energiatehokkuus. Moduuli voi olla lepotilassa ja herätä vain silloin, kun se havaitsee jotain näkökentässään, mikä tekee siitä ihanteellisen akkukäyttöisiin sovelluksiin.
Projekti käyntiin:
Automaattinen lemmikintunnistin ja syöttölaite on täydellinen esimerkki siitä, miten tekoälyä voidaan hyödyntää arkipäiväisissä sovelluksissa kotona. Avain on tässäkin projektissa Edge Impulse -alustassa, joka yksinkertaistaa tekoälymallin kehitystä huomattavasti.
Tässä koodissa keskitytään siihen, miten otetaan kuva, luokitellaan se ja toimitaan sen perusteella – tässä tapauksessa servomoottorin ohjaamiseen. Tämän koodin avulla pääset alkuun. Muista, että tämä on yleinen malli, joka sinun on sovitettava omaan Edge Impulse -projektiisi.
Projekti 3: Automaattinen lemmikkien tunnistin ja syöttölaite
Työnkulku:
- Datan keräys: Kuten ovikelloprojektissa, aloita keräämällä kuvadataa. Ota kuvia lemmikistäsi eri kulmista ja valaistuksissa, merkitse ne luokkaan “lemmikki“. Kerää kuvia myös silloin, kun lemmikkiä ei ole paikalla, ja merkitse ne luokkaan “ei-lemmikki“.
- Mallin koulutus: Lataa kuvat Edge Impulse -alustalle. Alusta esikäsittelee ne ja kouluttaa luokittelumallin, joka erottaa lemmikin muusta ympäristöstä. Voit valita koulutukseen esimerkiksi kuvien tunnistamiseen soveltuvan mallin, kuten FOMO (Faster Objects, More Objects), joka on erinomainen pienten kohteiden havaitsemiseen rajallisella teholla.
- Koodin luonti ja lataus: Kun malli on valmis, Edge Impulse luo sinulle valmiin kirjaston, jonka voit ladata Arduino-ympäristöön. Tämä kirjasto sisältää koko mallin, valmiina ajettavaksi ESP32-CAMilla.
Tässä on C++-koodi, joka yhdistää kameran, tekoälymallin ja servomoottorin ohjauksen.
Miten koodi toimii?
- Alustus:
setup()
-funktiossa alustetaan sekä ESP32-CAM että servomoottori. Servomoottori asetetaan oletusarvoisesti suljettuun tilaan (CLOSE_POSITION
). - Kameran käynnistys: Kameran asetuksissa on määritetty pikselimuoto (
PIXFORMAT_GRAYSCALE
) ja kuvan koko (FRAMESIZE_96X96
) vastaamaan Edge Impulse -projektin vaatimuksia. Tämä on kriittinen askel, jotta malli toimii oikein. - Tunnistus ja toiminta:
loop()
-funktio on projektin moottori. Se ottaa jatkuvasti kuvia ja lähettää ne Edge Impulsen luokittelijanei_object_detection_run_classifier()
-funktioon. - Servon ohjaus: Koodi käy läpi tunnistustulokset. Jos se löytää luokan “lemmikki” ja luotettavuus (
confidence
) on riittävän korkea (esim. yli 85%), se lähettää komennon servomoottorille (servoMotor.write(OPEN_POSITION)
), joka avaa annostelijan. Se myös sulkee luukun tietyn viiveen jälkeen. - Energiansäästö: Tämän toteutuksen voi optimoida energiatehokkaaksi lisäämällä liiketunnistimen, joka herättää laitteen lepotilasta. Tässä koodissa käytetty
delay()
-funktio tekee sen, että laite on koko ajan hereillä, mutta tällaisessa projektissa lepotilan käyttö onnistuu vaivattomasti.
Tämä koodi tarjoaa vankan perustan, jonka avulla voit rakentaa älykkään ja itsenäisen ruoka-annostelijan lemmikillesi!
#include "esp_camera.h"
#include <Servo.h>
#include "ei_object_detection.h" // Edge Impulsen generoi tämän tiedoston
// Servomoottorin nastan numero
#define SERVO_PIN 13
// Servomoottorin asennot
#define CLOSE_POSITION 0
#define OPEN_POSITION 90
Servo servoMotor;
// WiFi-asetukset (vaikka tätä projektia voi käyttää offline-tilassa)
const char* ssid = "WIFI_VERKON_NIMI";
const char* password = "WIFI_SALASANA";
// Kameran asetukset (malli ESP32-CAM AI-Thinker)
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
camera_config_t config;
void setup() {
Serial.begin(115200);
// Servomoottorin alustus
servoMotor.attach(SERVO_PIN);
servoMotor.write(CLOSE_POSITION);
Serial.println("Servomoottori alustettu suljettuun tilaan.");
// Kameran alustus
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = 5;
config.pin_d1 = 18;
config.pin_d2 = 19;
config.pin_d3 = 21;
config.pin_d4 = 36;
config.pin_d5 = 39;
config.pin_d6 = 34;
config.pin_d7 = 35;
config.pin_xclk = 0;
config.pin_pclk = 22;
config.pin_vsync = 25;
config.pin_href = 23;
config.pin_sscb_sda = 26;
config.pin_sscb_scl = 27;
config.pin_pwdn = -1;
config.pin_reset = -1;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_GRAYSCALE;
config.frame_size = FRAMESIZE_96X96;
config.jpeg_quality = 10;
config.fb_count = 1;
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Kameran käynnistys epäonnistui: %s\n", esp_err_to_name(err));
return;
}
}
void loop() {
// Ota kuva
camera_fb_t * fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Kuvankaappaus epäonnistui");
return;
}
// Aja kuva tekoälymallin läpi
signal_t signal;
ei::error_t err = ei_object_detection_run_classifier(&signal, fb->buf);
if (err != EI_IMPULSE_OK) {
Serial.printf("Luokittelu epäonnistui, virhe: %d\n", err);
esp_camera_fb_return(fb);
return;
}
// Tarkista tunnistustulokset
for (size_t i = 0; i < EI_CLASSIFIER_LABEL_COUNT; i++) {
if (strcmp(ei_classifier_results.classification[i].label, "lemmikki") == 0 && ei_classifier_results.classification[i].confidence > 0.85) {
Serial.printf("Lemmikki tunnistettu! Luottamus: %.2f\n", ei_classifier_results.classification[i].confidence);
// Avaa ruoka-annostelija
servoMotor.write(OPEN_POSITION);
Serial.println("Ruoka-annostelija avattu!");
// Odota hetki, jotta lemmikki ehtii syödä
delay(10000); // Odota 10 sekuntia
// Sulje ruoka-annostelija
servoMotor.write(CLOSE_POSITION);
Serial.println("Ruoka-annostelija suljettu.");
break; // Poistu silmukasta, kun lemmikki on tunnistettu ja toiminto suoritettu
}
}
esp_camera_fb_return(fb);
delay(500); // Lyhyt viive
}
Alla on tiivistetty taulukko projekteista:
Projekti | Päätoiminto | Tarvittava AI-ominaisuus | Tärkeimmät komponentit |
Fiksu ovikello | Tunnistaa vierailijat ja lähettää kuvan | Kasvojen/esineiden luokittelu | ESP32-CAM, painonappi/liiketunnistin, puhelin |
Käsieleillä ohjattava laite | Ohjaa laitetta eleillä | Eleiden luokittelu | ESP32-CAM, rele/älypistoke |
Automaattinen lemmikkien tunnistin | Tunnistaa lemmikin ja annostelee ruokaa | Esineiden tunnistus | ESP32-CAM, servomoottori, akku |
Tekoäly kaverina koodauksessa: Vähemmän päänsärkyä, enemmän leikkiä
Ehkä yksi suurimmista kynnysarvoista aloittaa mikrokontrolleriprojekti on koodauksen vaativuus. Koodaaminen on tunnetusti täynnä syntaksivirheitä ja manuaalista työtä. Tiedostoon kirjoitetaan toistuvasti samanlaisia esimerkkikoodeja, jotka konfiguroivat laitteistoa ja luovat perustoimintoja.
Tässä tekoäly tulee apuun ja muuttaa koko kehitysprosessin. Tekoälyn avustama ohjelmointi ei ainoastaan säästä aikaa ja vaivaa, vaan antaa myös luvan keskittyä itse luovaan ongelmanratkaisuun.
Voit ajatella tekoälyä, kuten GitHub Copilotia tai ChatGPT:tä, sinun koodaajaparina. Jos haluat yhdistää ESP32-CAMin Wi-Fi-verkkoon, voit yksinkertaisesti kysyä tekoälyltä koodia tähän tarkoitukseen. Sen sijaan, että joutuisit etsimään oikeaa kirjastoa, muistamaan komentoja ja testaamaan, tekoäly tuottaa valmiin esimerkkikoodin, jonka avulla pääset eteenpäin nopeasti. Tämä pätee myös monimutkaisempiin tehtäviin. Kuvittele, että haluat lähettää kuvan ulkoiselle palvelimelle tai API-rajapinnalle. Se on monimutkainen tehtävä, joka vaatii HTTP POST -pyyntöjen ja JSON-pakettien käsittelyä. Vain kuvailemalla tarpeesi tekoälylle, saat vastaukseksi valmiin koodinpätkän, joka hoitaa vaaditun tehtävän.
Lisäksi tekoäly on korvaamaton apu virheenjäljityksessä ja opettelussa. Jos koodissasi on virhe, voit syöttää virheilmoituksen tekoälylle ja pyytää selityksen ja korjausehdotuksen. Se voi kertoa sinulle tarkalleen, mitä “HTTP Error 401” tarkoittaa, ja kuinka voit korjata sen. Tämän ansiosta koodaus muuttuu paljon miellyttävämmäksi, kun ei tarvitse tuskastella pienissä, teknisissä yksityiskohdissa. Samalla tekoäly tekee oppimisesta vuorovaikutteista ja hauskaa. Sen sijaan, että lukisit tuntikaupalla teknisiä dokumentaatioita, voit esittää kysymyksiä luonnollisella kielellä. Tällainen lähestymistapa siirtää huomion manuaalisesta, mekaanisesta syntaksikirjoittamisesta korkeamman tason suunnitteluun ja luovaan ongelmanratkaisuun. Mikrokontrolleriprojektien parissa työskentely on nykyisin enemmän hauskaa kuin vaivalloista, ja se madaltaa kynnystä uusille ihmisille alalle.
Enigma-yhteenveto: Tulevaisuuden luomista omilla käsilläsi
Tämän artikkelin ydin on siinä, että teknologia on kehittynyt pisteeseen, jossa jokainen voi rakentaa omia, älykkäitä laitteita ilman valtavaa investointia tai syvällistä akateemista taustaa. ESP32-CAM on täydellinen esimerkki tästä. Se on edullinen, monipuolinen ja riittävän tehokas laite, joka mahdollistaa Edge AI -projektit kotona. Konenäön soveltaminen mikrokontrollerilla oli vielä muutama vuosi sitten akateemisten tai insinöörien juttu, mutta nyt se on saatavilla kaikille Edge Impulsen kaltaisten työkalujen ansiosta. Myös koodin luominen on helpompaa kuin koskaan, kun tekoäly auttaa sinua automatisoimalla toistuvia tehtäviä ja keskittymällä olennaiseen.
Toivon, että tämä artikkeli antoi sinulle inspiraatiota ja selkeitä askelmerkkejä siihen, miten pääset alkuun. Nyt on sinun vuorosi päästää luovuus valloilleen. Tulevaisuuden robottien aivot eivät olekaan suurissa ja kalliissa koneissa, vaan ne syntyvät sinun pöydälläsi, pienestä, edullisesta piirilevystä.
Anna mennä ja tee siitä totta!