Cuprins:

Cameră PANTILT cu ESP32: 9 pași
Cameră PANTILT cu ESP32: 9 pași

Video: Cameră PANTILT cu ESP32: 9 pași

Video: Cameră PANTILT cu ESP32: 9 pași
Video: Patron görmesin :) 2024, Noiembrie
Anonim
Image
Image
Camera PANTILT Cu ESP32
Camera PANTILT Cu ESP32

Astăzi, voi prezenta PAN TILT, care este un dispozitiv care permite mișcarea unei camere pentru direcțiile de sus, jos și lateral. Eu însumi am produs acest dispozitiv prin piese imprimate 3D, folosind două servouri și ESP32, ceea ce face posibilă controlul acestui mecanism prin WiFi. Să luăm apoi citiri folosind canalele AD ale ESP32, precum și o operație analogică folosind controlerul LED_PWM. De asemenea, aplicăm controlul asupra unei conexiuni TCP / IP.

În videoclip, puteți vedea că am un ESP32 care citește valorile celor două potențiometre, care sunt trimise (prin WiFi) către un alt ESP32. Este conectat la cele două servomotoare. Camera se mișcă (și este atașată la PAN TILT) în direcțiile de sus, jos sau lateral, în funcție de controlul pe care îl faceți prin vase.

Link-ul către designul de imprimare PAN TILT 3D poate fi găsit aici:

Pasul 1: Resurse utilizate

Resurse utilizate
Resurse utilizate

• Jumperi multipli pentru conectare

• Două noduri MCU ESP32

• Două cabluri USB pentru ESP32

• O cameră web pentru control

• Două oale de control

• Un protoboard

• O sursă pentru servos

Pasul 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Pasul 3: Periferice ESP32

Periferice ESP32
Periferice ESP32

Periferice PWM ESP32 are două periferice capabile să genereze semnale PWM. Acestea includ motorul Pulse Width Modulator (MCPWM) conceput pentru controlul puterii și al motorului și LED_PWM, dezvoltat pentru controlul intensității LED-urilor. Dar pot fi folosite și într-un mod generic.

Vom folosi LED_PWM, care poate genera 16 canale PWM independente cu perioade și cicluri de lucru configurabile. Are o rezoluție de până la 16 biți.

Pasul 4: Servomotor Control PWM

Servomotor de control PWM
Servomotor de control PWM

Controlul servomotorului se realizează prin ajustarea modulației lățimii impulsurilor unui pătrat cu frecvență specifică.

Pentru servo utilizat (precum și pentru majoritatea), frecvența este de 50Hz. De asemenea, o lățime de 1 până la 2ms lungimea impulsului determină poziția unghiulară a servo-ului.

Vom direcționa canalul 0 al LED_PWM către GPIO13 și canalul 1 către GPIO12, folosind aceste informații pentru a efectua controlul.

Pasul 5: Captură analogică

Captură analogică
Captură analogică

Periferic de conversie analog la digital

ESP32 are convertoare analog-digitale care pot fi aplicate în până la 18 canale, dar numai în GPIO-uri cu funcție analogică.

Tensiunea aplicată nu trebuie să depășească domeniul de la 0 la 3V.

Conversia efectuată nu menține o eroare constantă pentru toate tensiunile eșantionate și totul depinde de intervalul configurat. Pentru o autonomie de 150mV la 2, 450V, este necesară o verificare a comportamentului pentru aplicații mai critice.

Pentru captură, vom folosi un potențiometru de 10k ca divizor de tensiune. Captura se va face pe canalele ADC0 și ADC3, accesibile de GPIO36 și GPIO39.

Pasul 6: Circuit - Server și client

Circuit - Server și client
Circuit - Server și client

Pasul 7: Codul sursă al punctului de acces și al serverului

Declarații

Includ biblioteca WiFi și definesc câteva variabile.

#include // inclusão da biblioteca WiFi const int freq = 50; // frequência do PWM const int canal_A = 0; // primul canal do controlador LED_PWM const int canal_B = 1; // segundo canal 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á redirecționat const int pin_Atuacao_B = 12; // Pino pentru unde o canal 1 va fi redirecționat const char * ssid = "ESP32ap"; // constant com o SSID do WiFi do ponto de acesso ESP32 const char * password = "12345678"; // senha para confirmmação de conexão no ponto de acesso const int port = 2; // porta na qual o server 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); // declaração do objeto server IPAddress myIP; // declaração da variável de IP

Înființat ()

Aici, definim pinii de ieșire. Setăm canalele la frecvența dorită și setăm valoarea PWM.

void setup () {pinMode (pin_Atuacao_A, OUTPUT); // 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 pentru frecvența de 50 Hz și rezoluția de 12bits ledcSetup (canal_B, freq, resolucao); // Ajustando o canal 1 pentru frecvență de 50 Hz și rezoluție de 12bits 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

Am început serialul, punctul de acces cu SSID ESP32ap și parola. Apoi obținem adresa IP a serverului și pornim serverul.

Serial.begin (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, parolă); // iniciando o ponto de acesso com SSID ESP32ap e senha 12345678 Serial.println ("Obtendo IP"); // mensagem myIP = WiFi.softAPIP (); // obținând IP-ul serverului (cum nu a fost configurat deverá ser sau padrão de fábrica) Serial.println ("IP:" + WiFi.localIP ()); // mensagem Serial.println ("Iniciando server em:" + String (port)); // mensagem server.begin (); // iniciando o servidor}

Bucla ()

În Loop, primul lucru pe care îl vom face este să instanțiem clientul, să ne conectăm și să legăm variabila client. Verificați dacă clientul este conectat. Dacă da, începem variabila care va primi datele. Atâta timp cât conexiunea este stabilită și dacă se primesc date, citim caracterele variabilei c. În cele din urmă, concatenăm c în variabila de date.

bucla void () {WiFiClient client = server.available (); // se um client conectat, asocie a variável client if (cliente.connected ()) {// se há um client 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

Dacă se primește un caracter de linie nouă, căutăm indexul caracterului ',' în șirul din date. Obținem șirurile până chiar înainte de virgulă și apoi le convertim în număr întreg. Setăm PWM pentru canalele A și B. Ștergem variabila.

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

Dacă clientul se deconectează, confirmăm sfârșitul conexiunii. Așteptăm un moment și imprimăm „Niciun client conectat”. Apoi așteptăm încă o secundă înainte de a reporni.

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

Pasul 8: Codul sursă al clientului

Declarații

Am inclus din nou biblioteca WiFi, de data aceasta pe client. De asemenea, definim variabilele.

#include const char * ssid = "ESP32ap"; // SSID do ponto de acesso ESP32 const char * password = "12345678"; // Senha para acessar o ponto de acesso const uint16_t port = 2; // Porta de escuta do server const char * host = "192.168.4.1"; // endereço IP do server 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; // 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 client; // declaração do objeto client

Înființat ()

Definim GPIO-urile ca intrare, pornim serialul și ne conectăm la punctul de acces.

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); // inițiază o comunicație serial WiFi.begin (ssid, parolă); // conecta ao ponto de acesso}

Bucla ()

În acest buclă, ne vom conecta la server, adică celălalt ESP.

void loop () {// se não conectado ao ponto de acesso, tenta se conectar while (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + "- Conectando no WiFi" + ssid + „…”); // mensagem WiFi.begin (ssid, parolă); întârziere (2000); } Serial.println (String (millis ()) + "- Conectado …"); // mensagem // se não conectado ao server, tenta se conectar while (! cliente.connect (host, port)) {Serial.println (String (millis ()) + + - Conectando no Servidor "+ host +": " + port + "…"); // mensagem delay (1000); }

În acest pas, în timp ce suntem conectați la server, executăm variabilele pentru a stoca citirea ADC0 și ADC3. De asemenea, am efectuat citirea a 500 de eșantioane și am citit media. Am cartografiat citirea pentru a crea durata corectă pentru controlul servo-urilor și a concatenat-o și o trimitem la server.

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

În cele din urmă, dacă nu este conectat, ne asigurăm că conexiunea a fost încheiată prin afișarea mesajului echivalent.

// se nu coonectat, garantează că a conexiune a fost finalizată client.stop (); Serial.println (String (millis ()) + "- client desconectat …"); // mensagem}

Pasul 9: Fișiere

Descărcați fișierele:

PDF

EU NU

Recomandat: