Sisukord:

PANTILT -kaamera ESP32: 9 sammuga
PANTILT -kaamera ESP32: 9 sammuga

Video: PANTILT -kaamera ESP32: 9 sammuga

Video: PANTILT -kaamera ESP32: 9 sammuga
Video: ESP32-S3 + Camera Module(OV2640) + LTE Module(SIM7600G-H) 2024, November
Anonim
Image
Image
PANTILT kaamera koos ESP32 -ga
PANTILT kaamera koos ESP32 -ga

Täna tutvustan PAN TILT -i, mis on seade, mis võimaldab kaamera liikumist üles, alla ja külgedele. Ma ise valmistasin selle seadme 3D -prinditud osade kaudu, kasutades kahte servot ja ESP32, mis võimaldab seda mehhanismi juhtida WiFi kaudu. Võtame siis näidud, kasutades ESP32 AD -kanaleid, samuti analoogoperatsiooni, kasutades kontrollerit LED_PWM. Samuti rakendame kontrolli TCP / IP -ühenduse üle.

Videost näete, et mul on ESP32, mis loeb kahe potentsiomeetri väärtusi, mis saadetakse (WiFi kaudu) teisele ESP32 -le. See on ühendatud kahe servomootoriga. Kaamera liigub (ja on kinnitatud PAN TILT -i külge) üles, alla või külgsuunas, olenevalt potist läbi viidud juhtimisest.

PAN TILT 3D -trükikujunduse lingi leiate siit:

Samm: kasutatud ressursid

Kasutatud ressursid
Kasutatud ressursid

• Mitu džemprid ühendamiseks

• Kaks sõlme MCU ESP32

• Kaks USB -kaablit ESP32 jaoks

• Veebikaamera juhtimiseks

• Kaks kontrollpotti

• Protoboard

• Servode allikas

2. samm: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Samm: ESP32 välisseadmed

ESP32 välisseadmed
ESP32 välisseadmed

PWM -i välisseadmed ESP32 -l on kaks välisseadet, mis on võimelised genereerima PWM -signaale. Nende hulka kuuluvad impulsi laiuse modulaatori (MCPWM) mootor, mis on ette nähtud võimsuse ja mootori juhtimiseks, ning LED_PWM, mis on välja töötatud LED -i intensiivsuse reguleerimiseks. Kuid neid saab kasutada ka üldisel viisil.

Kasutame LED_PWM -i, mis suudab genereerida 16 sõltumatut PWM -kanalit koos seadistatavate perioodide ja töötsüklitega. Sellel on kuni 16 bitti eraldusvõimet.

Samm: servomootori juhtimine PWM

Servomootori juhtimine PWM
Servomootori juhtimine PWM

Servomootori juhtimine toimub ruudu impulsi laiuse modulatsiooni reguleerimisega kindla sagedusega.

Kasutatava servo (nagu ka enamiku) puhul on sagedus 50 Hz. Samuti määrab servo nurgaasendi laius 1 kuni 2 ms.

Me suuname LED_PWM kanali 0 kanalile GPIO13 ja kanali 1 GPIO12 -le, kasutades seda teavet juhtimiseks.

Samm: analooghõive

Analoogpilt
Analoogpilt

Analoog -digitaalmuundamise välisseade

ESP32-l on analoog-digitaalmuundurid, mida saab kasutada kuni 18 kanalil, kuid ainult analoog-toega GPIO-des.

Rakendatud pinge ei tohi ületada vahemikku 0 kuni 3 V.

Teostatud teisendus ei säilita kõigi proovivõetud pingete korral pidevat viga ja see kõik sõltub konfigureeritud vahemikust. Vahemiku 150 mV juures 2, 450 V korral tuleb kriitilisemate rakenduste puhul kontrollida käitumist.

Pildistamiseks kasutame pingejagurina 10k potentsiomeetrit. Jäädvustamine toimub kanalites ADC0 ja ADC3, millele pääsevad juurde GPIO36 ja GPIO39.

6. samm: ahel - server ja klient

Ahel - server ja klient
Ahel - server ja klient

Samm: pääsupunkti ja serveri lähtekood

Avaldused

Lisan WiFi -teegi ja määratlen mõned muutujad.

#include // inclusão da biblioteca WiFi const int freq = 50; // frequência do PWM const int canal_A = 0; // primeiro kanal do controlador LED_PWM const int kanal_B = 1; // segundo kanal do controlador 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á redirecionado const int pin_Atuacao_B = 12; // Pino para onde o canal 1 será redirecionado const char* ssid = "ESP32ap"; // konstant com või SSID, mis ühendab WiFi -d, lisab ESP32 const char* password = "12345678"; // senha para confirmaçã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 WiFiServeri server (port); // deklaração do objeto servidor IPAddress myIP; // deklaração da variável de IP

Seadistamine ()

Siin määratleme väljundtihvtid. Seadsime kanalid soovitud sagedusele ja seadsime PWM väärtuse.

void setup () {pinMode (pin_Atuacao_A, VÄLJUND); // 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); // Ajustando o canal 0 para Frequência de 50 Hz and resolução de 12bits ledcSetup (canal_B, freq, resolucao); // Ajustando o canal 1 para Frequência de 50 Hz and resolução de 12bits ledcAttachPin (pin_Atuacao_A, canal_A); // redirecionando o canal 0 para o pino 13 ledcAttachPin (pin_Atuacao_B, canal_B); // ümbersuunamine või kanal 1 para või 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

Alustasime seeriat, pääsupunkti SSID ESP32ap ja parooliga. Seejärel saame serveri IP -aadressi ja käivitame serveri.

Seriaalne algus (115200); // initsialiseeri a Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, parool); // SSID ESP32ap e senha 12345678 Serial.println ("Obtendo IP") alustamine või käivitamine; // 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}

Silmus ()

Loopis esimene asi, mida me teeme, on kliendi kiirendamine, ühendades ja sidudes kliendi muutujaga. Kontrollige, kas klient on ühendatud. Kui jah, siis käivitame muutuja, mis andmeid vastu võtab. Niikaua kui ühendus on loodud ja kui andmeid võetakse vastu, loeme muutuja c märke. Lõpuks ühendame andmete muutujaga c.

void loop () {WiFiClient cliente = server.available (); // se um cliente conectar, associe a variável cliente if (cliente.connected ()) {// se há um cliente conectado String dados = ""; // inicia a variável que receberá os dados Serial.println ("Cliente conectado."); // mensagem while (cliente.connected ()) {// enquanto a conexão estiver estabelecida 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

Uue rea märgi vastuvõtmisel otsime andmete stringist märgi ',' indeksi. Me saame alamstringid enne koma ja seejärel teisendame need täisarvuks. Seadime kanalite A ja B PWM. Tühjendame muutuja.

if (c == '\ n') {// se um caracter de nova linha for recebido int virgula = dados.indexOf (','); // hankige pelo índice do caracter ',' ja 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 (); // obtenha a substring após a vírgula e converta para inteiro ledcWrite (canal_A, tsüklo_A); // Ajusta või PWM do kanal A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do kanal B dados = ""; // Limpa a variável}}}}

Kui klient katkestab ühenduse, kinnitame ühenduse lõppemise. Ootame hetke ja trükime "Klienti pole ühendatud". Seejärel ootame enne taaskäivitamist veel sekund.

// caso o cliente se desconecte, confirma o fim da conexão delay (50); // aguarda um momento cliente.stop (); Serial.println ("Nenhum cliente conectado."); // mensagem delay (1000); // aguarda um segundo antes de reiniciar}

8. samm: kliendi lähtekood

Avaldused

Oleme taas kaasanud WiFi raamatukogu, seekord kliendi peale. Samuti määratleme muutujad.

#include const char* ssid = "ESP32ap"; // SSID ponto de ESC32 const char* password = "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"; // endereço IP do servidor const int pin_Leitura_A = 36; // GPIO de leitura do ADC0 const int pin_Leitura_B = 39; // GPIO de leitura do ADC3 int ciclo_A = 0; // vará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; // deklaração do objeto cliente

Seadistamine ()

Me määratleme GPIOd sisendina, käivitame jada ja loome ühenduse pääsupunktiga.

void setup () {pinMode (pin_Leitura_A, INPUT); // define o GPIO como entrada pinMode (pin_Leitura_B, INPUT); // define o GPIO como entrada Serial.begin (115200); // inicia a comunicação jada WiFi.begin (ssid, parool); // conecta ao ponto de acesso}

Silmus ()

Selles silmus loome ühenduse serveriga, mis tähendab teist ESP -d.

void loop () {// kui see ei ole võimalik, siis tuleb seda teha, kui (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " - Conectando WiFi puudub + ssid + "…"); // mensagem WiFi.begin (ssid, parool); viivitus (2000); } Serial.println (String (millis ()) + " - Conectado …"); // mensagem // se não conectado ao servidor, tenta se conectar while (! cliente.connect (host, port)) {Serial.println (String (millis ()) + " - Conectando no Servidor" + host + ":" + port + "…"); // mensagem delay (1000); }

Selles etapis, kui oleme serveriga ühendatud, käivitame muutujad ADC0 ja ADC3 lugemise salvestamiseks. Samuti lugesime 500 proovi ja keskmistasime näidud. Kaardistasime lugemise, et luua servode juhtimiseks õige kestus, ühendada ja saata see serverisse.

// enquanto estiver conectado ao servidor while (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); kontador ++; } leitura_A = leitura_A / amostras; // média das leituras leitura_B = leitura_B /amostras; ciclo_A = kaart (leitura_A, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correctta para controle do servo ciclo_B = kaart (leitura_B, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correctta para controle do servo // concatena e envia para o servidor cliente.println (String (ciclo_A) + "," + String (ciclo_B)); }

Lõpuks, kui pole ühendust, tagame samaväärse teate kuvamisega ühenduse katkestamise.

// se não coonectado, garante que a conexão foi finalizada cliente.stop (); Serial.println (String (millis ()) + " - klientide desconectado …"); // mensagem}

9. samm: failid

Laadige failid alla:

PDF

INO

Soovitan: