Mundarija:

ESP32: 9 qadamli PANTILT kamera
ESP32: 9 qadamli PANTILT kamera

Video: ESP32: 9 qadamli PANTILT kamera

Video: ESP32: 9 qadamli PANTILT kamera
Video: ESP32-S3 + Camera Module(OV2640) + LTE Module(SIM7600G-H) 2024, Noyabr
Anonim
Image
Image
ESP32 bilan PANTILT kamera
ESP32 bilan PANTILT kamera

Bugun men PAN TILT ni taqdim etaman, bu kamera yuqoriga, pastga va yon tomonga harakatlanishini ta'minlaydigan qurilma. Men o'zim bu qurilmani 3D bosilgan qismlar orqali ishlab chiqdim, ikkita servo va ESP32 yordamida, bu mexanizmni WiFi orqali boshqarishga imkon beradi. Keling, ESP32 ning AD kanallari yordamida o'qishni, shuningdek LED_PWM tekshirgichi yordamida analog operatsiyalarni olaylik. Shuningdek, biz TCP / IP ulanishini boshqaramiz.

Videoda siz ESP32 -da ikkita potentsiometrning qiymatlarini o'qiyotganini ko'rishingiz mumkin, ular (WiFi orqali) boshqa ESP32 -ga yuboriladi. U ikkita servo dvigatelga ulangan. Kamera idishlar orqali boshqarishingizga qarab yuqoriga, pastga yoki yonga siljiydi (va PAN TILTga biriktirilgan).

PAN TILT 3D bosma dizayniga havolani bu erda topish mumkin:

1 -qadam: Ishlatilgan manbalar

Ishlatilgan manbalar
Ishlatilgan manbalar

• Ulanish uchun bir nechta o'tish moslamalari

• Ikki tugunli MCU ESP32

• ESP32 uchun ikkita USB kabeli

• nazorat qilish uchun veb -kamera

• Ikkita boshqaruv idishi

• Protoboard

• Servo uchun manba

2 -qadam: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - pinout
NodeMCU ESP32S - pinout

3 -qadam: ESP32 tashqi qurilmalari

ESP32 tashqi qurilmalari
ESP32 tashqi qurilmalari

PWM tashqi qurilmalari ESP32 PWM signallarini ishlab chiqarishga qodir ikkita tashqi qurilmaga ega. Bularga kuch va motorni boshqarish uchun mo'ljallangan Pulse Width Modulator (MCPWM) dvigateli va LED intensivligini boshqarish uchun ishlab chiqilgan LED_PWM kiradi. Lekin ular ham umumiy usulda ishlatilishi mumkin.

Biz LED_PWM -dan foydalanamiz, u konfiguratsiya qilinadigan davrlar va ish tsikllari bilan 16 ta mustaqil PWM kanalini yaratishi mumkin. U 16 bitgacha piksellar soniga ega.

4 -qadam: Servo dvigatelni boshqarish PWM

Servo dvigatelni boshqarish PWM
Servo dvigatelni boshqarish PWM

Servo dvigatelni boshqarish ma'lum chastotali kvadratning impuls kengligi modulyatsiyasini sozlash orqali amalga oshiriladi.

Ishlatiladigan servo uchun (ko'pchilik uchun bo'lgani kabi), chastota 50 Gts. Bundan tashqari, 1 dan 2 ms gacha bo'lgan puls uzunligi kengligi servoning burchak holatini aniqlaydi.

Biz nazorat qilish uchun ushbu ma'lumotdan foydalanib, LED_PWM ning 0 -kanalini GPIO13 ga va 1 -kanalini GPIO12 ga yo'naltiramiz.

5 -qadam: Analog tasvirni olish

Analog suratga olish
Analog suratga olish

Periferik raqamli konvertatsiyaga o'xshash

ESP32 analog-raqamli konvertorlarga ega, ularni 18 kanalgacha ishlatish mumkin, lekin faqat analogli GPIOlarda.

Qo'llaniladigan kuchlanish 0 dan 3V gacha bo'lishi kerak.

Amalga oshirilgan konvertatsiya tanlangan barcha kuchlanishlar uchun doimiy xatolikni saqlamaydi va bularning barchasi tuzilgan diapazonga bog'liq. 2, 450V kuchlanishdagi 150mV diapazoni uchun muhimroq ilovalar uchun xatti -harakatni tekshirish talab qilinadi.

Qo'lga olish uchun biz kuchlanish taqsimlagichi sifatida 10k potentsiometrdan foydalanamiz. Suratga olish GPIO36 va GPIO39 orqali kirish mumkin bo'lgan ADC0 va ADC3 kanallarida amalga oshiriladi.

6 -qadam: O'chirish - server va mijoz

O'chirish - server va mijoz
O'chirish - server va mijoz

7 -qadam: Kirish nuqtasi va serverning manba kodi

Bayonotlar

Men WiFi kutubxonasini o'z ichiga olaman va ba'zi o'zgaruvchilarni aniqlayman.

#include // inclusão da biblioteca WiFi const int freq = 50; // PWM const int kanal_A = 0 chastotasi; // kanalni nazorat qilish LED_PWM const int kanal_B = 1; // kanalni nazorat qilish LED_PWM const int resolucao = 12; // LED_PWM konfiguratsiyasi yo'q pin_Atuacao_A = 13; // Kanalni o'chirib qo'yish 0 raqamini o'zgartiradi, pin_Atuacao_B = 12; // Kanalning 1 -bandini o'zgartirish kerak* ssid = "ESP32ap"; // doimiy SSID yoki Wi -Fi tarmog'iga ulanish ESP32 const char* password = "12345678"; // konfirmachão de conexão no ponto de acesso const int port = 2; // port caflo_A = 0; // variável que receptberá o ciclo de atuação do kanal A int ciclo_B = 0; // WiFiServer serveri (port); // deklaratsiya qilish kerak IPAddress myIP; // IP -ni e'lon qilish

Sozlash ()

Bu erda biz chiqish pinlarini aniqlaymiz. Biz kanallarni kerakli chastotaga o'rnatamiz va PWM qiymatini o'rnatamiz.

void setup () {pinMode (pin_Atuacao_A, OUTPUT); // aniq belgilash uchun pinMode (pin_Atuacao_B, OUTPUT); // lcSetup (kanal_A, chastotalar, rezolyutsiyalar); // Kanal sozlamalari 50 gigagertsli chastotalar va 12 bitli ledcSetup (kanal_B, chastota, rezolyutsiya); // Kanalning 1 chastotali chastotasi 50 Hz va 12 bitli ledcAttachPin (pin_Atuacao_A, kanal_A); // kanalni qayta yo'naltirish 0 para 13 pc ledcAttachPin (pin_Atuacao_B, channel_B); // kanalni qayta yo'naltirish 1 para o pino 12 ledcWrite (channel_A, ciclo_A); // PWM para 0 ledcWrite (kanal_B, ciclo_B) ni aniqlang; // PWM uchun 0 qiymatini aniqlang

Biz ketma -ket, kirish nuqtasini SSID ESP32ap va parol bilan boshladik. Keyin biz serverning IP -manzilini olamiz va serverni ishga tushiramiz.

Serial.begin (115200); // Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)) iniciando; // mensagem WiFi.softAP (ssid, parol); // SSID ESP32ap va boshqa 12345678 Serial.println ("Obtendo IP"); // mensagem myIP = WiFi.softAPIP (); // IP -ni yoki xizmatni ko'rsatish (serverni sozlash) Serial.println ("IP:" + WiFi.localIP ()); // mensagem Serial.println ("Iniciando servidor em:" + String (port)); // mensagem server.begin (); // xizmat ko'rsatuvchi}

Loop ()

Loop -da, biz qilmoqchi bo'lgan birinchi narsa, mijoz o'zgaruvchisiga ulanish va ulanish uchun mijozni ishga tushirishdir. Mijoz ulanganligini tekshiring. Agar shunday bo'lsa, biz ma'lumotlarni oladigan o'zgaruvchini ishga tushiramiz. Aloqa o'rnatilguncha va agar ma'lumotlar qabul qilinsa, biz c o'zgaruvchining belgilarini o'qiymiz. Nihoyat, biz ma'lumotlar o'zgaruvchisida c ni birlashtiramiz.

void loop () {WiFiClient cliente = server.available (); // mijozlar bir -biriga mos kelsa, associe a variável cliente if (cliente.connected ()) {// se há um cliente conectado String dados = ""; // Serial.println ("Cliente conectado.") ni tanlashda; // mensagem while (cliente.connected ()) {// enquanto a conexão estiver setelecida if (cliente.available ()) {// e c houver dados a qabul qiluvchi char c = cliente.read (); // leia os caracteres para a variável c dados = dados + c; // bir -biriga mos kelmaydigan dadalar

Agar yangi qatorli belgi olinsa, biz ma'lumotlar satridan ',' belgisining indeksini qidiramiz. Biz pastki satrlarni vergul oldidan oldik va keyin ularni butun songa aylantiramiz. Biz A va B kanallarining PWM -ni o'rnatamiz. O'zgaruvchini tozalaymiz.

if (c == '\ n') {// se na carova de nova linha for recebido int virgula = dados.indexOf (','); // buyrug'ini bajaring ',' na string em dados ciclo_A = (dados.substring (0, virgula)). toInt (); // obtenha a substring até antes da vírgula e converta para inteiro ciclo_B = dados.substring (virgula + 1, dados.length ()). toInt (); ciclo_A); // LWWite kanalini sozlash uchun PWM (kanal_B, ciclo_B); // B kanalidagi PWM yoki kanalni sozlash = ""; // Limfa varianti}}}}

Agar mijoz uzilsa, biz ulanish tugaganligini tasdiqlaymiz. Biz biroz kutamiz va "Mijoz ulanmagan" ni chop etamiz. Qayta boshlashdan oldin yana bir soniya kutamiz.

// caso o cliente se desconecte, Confirma o fim da conexão delay (50); // mijoz momenti mijozga.stop (); Serial.println ("Nenhum cliente conectado."); // mensagem kechikishi (1000); // bir necha kun oldin

8 -qadam: Mijoz kodi

Bayonotlar

Biz WiFi kutubxonasini yana qo'shdik, bu safar mijoz. Bundan tashqari, biz o'zgaruvchilarni aniqlaymiz.

#includ char const* ssid = "ESP32ap"; // ESP32 const char* password = "12345678" SSID -ni ochish shart emas; // Siz ochishingiz mumkin emas, lekin uess16_t port = 2; // Port of escuta do servidor const char * host = "192.168.4.1"; // IP -xizmatlar uchun xizmat ko'rsatish const pin_Leitura_A = 36; // ADC0 konfiguratsiyasining GPIO -si pin_Leitura_B = 39; // ADC3 int ciclo_A = 0 ga teng GPIO; // o'zgaruvchan PWMni bajarishga majburlash A int ciclo_B = 0; // PWM B WiFiClient mijozlari uchun har xil narxlar; // mijozlar uchun e'lon qilish

Sozlash ()

Biz GPIO -ni kirish sifatida belgilaymiz, ketma -ketlikni ishga tushiramiz va kirish nuqtasiga ulanamiz.

void setup () {pinMode (pin_Leitura_A, INPUT); // GPIO -ga kirishni aniqlash pinMode (pin_Leitura_B, INPUT); // aniqlash GPIO como entrada Serial.begin (115200); // inicia a comunicação serial WiFi.begin (ssid, parol); // conecta ao ponto de acesso}

Loop ()

Ushbu Loopda biz serverga ulanamiz, ya'ni boshqa ESP.

void loop () {// se não conectado ao ponto de acesso, a con conectar while (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " - Conectando no WiFi" + ssid +) "…"); // mensagem WiFi.begin (ssid, parol); kechikish (2000); } Serial.println (String (millis ()) + " - Conectado…"); // mensagem // se não conectado ao servidor, a con conectar while (! cliente.connect (host, port)) {Serial.println (String (millis ()) + " - Conectando no Servidor" + host + ":") + port + "…"); // mensagem kechikishi (1000); }

Ushbu bosqichda, serverga ulanganimizda, biz ADC0 va ADC3 o'qilishini saqlash uchun o'zgaruvchilarni bajaramiz. Shuningdek, biz 500 ta namunani o'qib chiqdik va o'qishni o'rtacha qildik. Biz servolarni boshqarish uchun to'g'ri vaqtni yaratish va uni birlashtirish va serverga yuborish uchun o'qishni xaritaga kiritdik.

// enquanto estiver conectado ao servidor while (cliente.connected ()) {int leitura_A = 0; // ADC0 inte leitura_B = 0 uchun turli xil variantlar; // ADC3 int amostras = 500 ga teng; // amostras int contador = 0; // contador de amostras while (contador <amostras) {// acumua várias leituras leitura_A = leitura_A + analogRead (pin_Leitura_A); leitura_B = leitura_B + analogRead (pin_Leitura_B); kontor ++; } leitura_A = leitura_A / amostralar; // média das leituras leitura_B = leitura_B /amostras; ciclo_A = xarita (leitura_A, 0, 4095, 140, 490); // mapeia a leitura va ciclo_B = servo ciclo_B = xaritada nazorat qilish (leitura_B, 0, 4095, 140, 490); // xaritalar va xizmatlar uchun xizmatlar ro'yxati // mijozlar uchun mijozlar.println (String (ciclo_A) + "," + String (ciclo_B)); }

Nihoyat, agar ulanmagan bo'lsa, biz unga mos keladigan xabarni ko'rsatish orqali aloqaning uzilganligini ta'minlaymiz.

// mijozlar bilan ishlashni yakunlash uchun kafolat berish; Serial.println (String (millis ()) + " - mijoz desconectado…"); // mensagem}

9 -qadam: fayllar

Fayllarni yuklab oling:

PDF

INO

Tavsiya: