Obsah:

Kamera PANTILT s ESP32: 9 krokov
Kamera PANTILT s ESP32: 9 krokov

Video: Kamera PANTILT s ESP32: 9 krokov

Video: Kamera PANTILT s ESP32: 9 krokov
Video: esp 32 cam. Плата ESP с камерой ov2640 Установка ESP32, подключение 2024, Júl
Anonim
Image
Image
Kamera PANTILT s ESP32
Kamera PANTILT s ESP32

Dnes predstavím PAN TILT, čo je zariadenie, ktoré umožňuje pohyb kamery v smeroch hore, dole a do strán. Toto zariadenie som sám vyrobil prostredníctvom 3D tlačených dielov pomocou dvoch serv a ESP32, ktoré umožňuje ovládať tento mechanizmus prostredníctvom WiFi. Potom vykonajme merania pomocou AD kanálov ESP32, ako aj analógovej operácie pomocou ovládača LED_PWM. Aplikujeme tiež kontrolu nad pripojením TCP / IP.

Na videu vidíte, že mám ESP32 čítajúci hodnoty dvoch potenciometrov, ktoré sú odoslané (cez WiFi) do iného ESP32. Je spojený s dvoma servomotormi. Fotoaparát sa pohybuje (a je pripevnený k PAN TILT) v smere nahor, nadol alebo do strán, v závislosti od ovládacieho prvku, ktorý vykonáte v hrncoch.

Odkaz na 3D tlačový návrh PAN TILT nájdete tu:

Krok 1: Použité zdroje

Použité zdroje
Použité zdroje

• Viacnásobné prepojky na pripojenie

• Dva uzlové MCU ESP32

• Dva káble USB pre ESP32

• Webová kamera na ovládanie

• Dva ovládacie hrnce

• Protoboard

• Zdroj pre serva

Krok 2: NodeMCU ESP32S - pinout

NodeMCU ESP32S - vývod
NodeMCU ESP32S - vývod

Krok 3: Periférne zariadenia ESP32

Periférne zariadenia ESP32
Periférne zariadenia ESP32

Periférne zariadenia PWM ESP32 má dve periférne zariadenia schopné generovať signály PWM. Patria sem motor modulátora šírky impulzu (MCPWM) určený na ovládanie výkonu a motora a LED_PWM vyvinutý na ovládanie intenzity LED. Ale dajú sa použiť aj genericky.

Použijeme LED_PWM, ktorý môže generovať 16 nezávislých kanálov PWM s konfigurovateľnými periódami a pracovnými cyklami. Má rozlíšenie až 16 bitov.

Krok 4: Ovládanie servomotora PWM

Ovládanie servomotora PWM
Ovládanie servomotora PWM

Ovládanie servomotora sa vykonáva nastavením modulácie šírky impulzu štvorca so špecifickou frekvenciou.

Pre použité servo (ako aj pre väčšinu) je frekvencia 50 Hz. Uhlová poloha serva tiež určuje šírku impulzu s dĺžkou 1 až 2 ms.

Kanál 0 LED_PWM nasmerujeme na GPIO13 a kanál 1 na GPIO12, pričom pomocou týchto informácií vykonáme riadenie.

Krok 5: Analógové snímanie

Analógové snímanie
Analógové snímanie

Periférne zariadenie na konverziu analógového signálu na digitálny

ESP32 má analógovo-digitálne prevodníky, ktoré je možné použiť až v 18 kanáloch, ale iba v analógových GPIO.

Privedené napätie nesmie prekročiť rozsah 0 až 3V.

Vykonaná konverzia neudržiava konštantnú chybu pre všetky vzorkované napätia a to všetko závisí od nakonfigurovaného rozsahu. Pre rozsah 150 mV pri 2,450 V je pre kritickejšie aplikácie potrebná kontrola správania.

Na zachytenie použijeme ako delič napätia potenciometer 10k. Zachytávanie sa bude vykonávať v kanáloch ADC0 a ADC3, prístupných pomocou GPIO36 a GPIO39.

Krok 6: Okruh - server a klient

Okruh - server a klient
Okruh - server a klient

Krok 7: Zdrojový kód prístupového bodu a servera

Vyhlásenia

Zahŕňam knižnicu WiFi a definujem niektoré premenné.

#include // inclusão da biblioteca WiFi const int freq = 50; // frekvencia do PWM const int canal_A = 0; // hlavný kanál na ovládanie LED_PWM const int canal_B = 1; // segundo kanál do ovládača LED_PWM const int resolucao = 12; // Resolução usado no controlador LED_PWM const int pin_Atuacao_A = 13; // Pino para onde o canal 0 será presmerovanie const int pin_Atuacao_B = 12; // Pino paraboly kanála 1 presmerovania konštantného char* ssid = "ESP32ap"; // konštantná SSID do WiFi do prístupového bodu ESP32 const char* heslo = "12345678"; // senha para confirmmação de conexão no ponto de acesso const int port = 2; // porta na qual o servidor receberá as conexões int ciclo_A = 0; // variável que receberá o ciclo de atuação do canal A int ciclo_B = 0; // variável que receberá o ciclo de atuação do canal A WiFiServer server (port); // deklaração do objektu servidor IPAddress myIP; // deklarujte svoju IP

Nastaviť ()

Tu definujeme výstupné kolíky. Kanály nastavíme na požadovanú frekvenciu a nastavíme hodnotu PWM.

neplatné nastavenie () {pinMode (pin_Atuacao_A, VÝSTUP); // definindo o pino de atuação A como saída pinMode (pin_Atuacao_B, OUTPUT); // definindo o pino de atuação B como saída ledcSetup (canal_A, freq, resolucao); // Úroveň kanála 0 Hz s frekvenciou 50 Hz a rozlíšením 12 bitov ledcSetup (kanál_B, frekvencia, rozlíšenie); // Úroveň kanála 1 s frekvenciou 50 Hz a rozlíšením 12 bitov ledcAttachPin (pin_Atuacao_A, canal_A); // redirecionando o canal 0 para o pino 13 ledcAttachPin (pin_Atuacao_B, canal_B); // redirecionando o canal 1 para o pino 12 ledcWrite (canal_A, ciclo_A); // definindo o valor do PWM para 0 ledcWrite (canal_B, ciclo_B); // definindo o valor do PWM para 0

Spustili sme sériový prístupový bod s SSID ESP32ap a heslom. Potom získame IP servera a spustíme server.

Serial.begin (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, heslo); // inicializácia prechodu na SSID ESP32ap e senha 12345678 Serial.println ("Obtendo IP"); // mensagem myIP = WiFi.softAPIP (); // obtendo o IP do servidor (como não foi configurado deverá ser o padrão de fábrica) Serial.println ("IP:" + WiFi.localIP ()); // mensagem Serial.println ("Iniciando servidor em:" + String (port)); // mensagem server.begin (); // iniciando o servidor}

Slučka ()

V slučke prvá vec, ktorú urobíme, je inštancia klienta, pripojenie a väzba na klientsku premennú. Skontrolujte, či je klient pripojený. Ak je to tak, spustíme premennú, ktorá prijme údaje. Pokiaľ je nadviazané spojenie a ak sú prijaté dáta, čítame znaky pre premennú c. Nakoniec zreťazíme c v dátovej premennej.

void loop () {WiFiClient cliente = server.available (); // spojovací kód klienta, asocie a rôzne klienty if (cliente.connected ()) {// se há um kliente conectado String dados = ""; // inicia a variável que receberá os dados Serial.println ("Cliente conectado."); // mensagem while (cliente.connected ()) {// enquanto a conexão estiver establishmentelecida if (cliente.available ()) {// e se houver dados a receber char c = cliente.read (); // leia os caracteres para a variável c dados = dados + c; // concatene c na variável dados

Ak je prijatý znak nového riadka, v reťazci v údajoch hľadáme index znaku „,“. Získame podreťazce tesne pred čiarkou a potom ich prevedieme na celé číslo. Nastavíme PWM kanálov A a B. Vymažeme premennú.

if (c == '\ n') {// se um caracter de nova linha for recebido int virgula = dados.indexOf (','); // obstaranie pelo índice do caracter ',' na string em dados ciclo_A = (dados.substring (0, virgula)). toInt (); // obntha a substring até antes da vírgula e converta para inteiro ciclo_B = dados.substring (virgula + 1, dados.length ()). toInt (); // obtenha a substring apos a vírgula e converta para inteiro ledcWrite (canal_A, ciclo_A); // Ajusta o PWM do canal A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do kanála B dados = ""; // Limpa a variável}}}}

Ak sa klient odpojí, potvrdíme koniec pripojenia. Chvíľu počkáme a vytlačíme „Nie je pripojený žiadny klient“. Potom počkáme ďalšiu sekundu, kým sa reštartuje.

// caso o cliente se desconecte, confirmma o fim da conexão delay (50); // aguarda um momento cliente.stop (); Serial.println („Nenhum cliente conectado.“); // oneskorenie mensagemu (1000); // aguarda um segundo antes de reiniciar}

Krok 8: Zdrojový kód zákazníka

Vyhlásenia

Knižnicu WiFi sme opäť zaradili, tentokrát na klienta. Tiež definujeme premenné.

#include const char* ssid = "ESP32ap"; // SSID do prístupového bodu ESP32 const char* heslo = "12345678"; // Senha para acessar o ponto de acesso const uint16_t port = 2; // Porta de escuta do servidor const char * host = "192.168.4.1"; // endereco IP to servidor const int pin_Leitura_A = 36; // GPIO leitura do ADC0 const int pin_Leitura_B = 39; // GPIO de leitura do ADC3 int ciclo_A = 0; // variável que receberá o valor do ciclo do PWM A int ciclo_B = 0; // Variável que receberá o valor do ciclo do PWM B WiFiClient cliente; // deklarujte svoje klienty

Nastaviť ()

GPIO definujeme ako vstup, spustíme sériový port a pripojíme sa k prístupovému bodu.

neplatné nastavenie () {pinMode (pin_Leitura_A, INPUT); // definujte o GPIO como entrada pinMode (pin_Leitura_B, INPUT); // definujte o GPIO como entrada Serial.begin (115200); // inicia a komunikacny serial WiFi.begin (ssid, heslo); // conecta ao ponto de acesso}

Slučka ()

V tejto slučke sa pripojíme k serveru, čo znamená druhý ESP.

void loop () {// sa pripojí a pripojí sa, pripojí sa súčasne (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " - Conectando no WiFi" + ssid + „…“); // mensagem WiFi.begin (ssid, heslo); oneskorenie (2000); } Serial.println (String (millis ()) + " - Conectado …"); // mensagem // sa pripojí k servidoru, pripojí sa súčasne (! cliente.connect (host, port)) {Serial.println (String (millis ()) + " - Conectando no Servidor" + host + ":" + port + "…"); // oneskorenie mensagemu (1000); }

V tomto kroku, keď sme pripojení k serveru, spustíme premenné na uloženie čítania ADC0 a ADC3. Tiež sme vykonali čítanie 500 vzoriek a spriemerovali sme ich. Namapovali sme čítanie, aby sme vytvorili správne trvanie riadenia serv a zreťazili a odoslali na server.

// pripojenie zdroja k serveru a súčasne (cliente.connected ()) {int leitura_A = 0; // variável para armazenar a leitura do ADC0 int leitura_B = 0; // variável para armazenar a leitura do ADC3 int amostras = 500; // número de 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); contador ++; } leitura_A = leitura_A / amostras; // média das leituras leitura_B = leitura_B /amostras; ciclo_A = mapa (leitura_A, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para control to servo ciclo_B = map (leitura_B, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para control to servo // concatena e envia para o servidor cliente.println (String (ciclo_A) + "," + String (ciclo_B)); }

Nakoniec, ak nie je pripojené, zaistíme, aby bolo pripojenie ukončené zobrazením ekvivalentnej správy.

// aby ste sa spojili, zaručili ste si konečnú finalizáciu klienta.stop (); Serial.println (String (millis ()) + " - klientske riešenie …"); // mensagem}

Krok 9: Súbory

Stiahnite si súbory:

PDF

INO

Odporúča: