Cuprins:
- Pasul 1: Resurse utilizate
- Pasul 2: NodeMCU ESP32S - Pinout
- Pasul 3: Periferice ESP32
- Pasul 4: Servomotor Control PWM
- Pasul 5: Captură analogică
- Pasul 6: Circuit - Server și client
- Pasul 7: Codul sursă al punctului de acces și al serverului
- Pasul 8: Codul sursă al clientului
- Pasul 9: Fișiere
Video: Cameră PANTILT cu ESP32: 9 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:44
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
• 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
Pasul 3: 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
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ă
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
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:
EU NU
Recomandat:
Cameră CCTV cu NodeMCU + Modul de cameră pentru laptop vechi (cu și fără utilizarea Blynk): 5 pași
Cameră CCTV cu NodeMCU + Modulul de cameră pentru laptop vechi (cu și fără utilizarea Blynk): Bună băieți! În acest instructable, vă voi arăta cum am folosit modulul de cameră vechi al laptopului și nodeMCU pentru a face ceva similar cu CCTV
Cea mai ușoară cameră web ca cameră de securitate - Detecție de mișcare și imagini prin e-mail: 4 pași
Cea mai ușoară cameră web ca cameră de securitate - Detecție mișcare și imagini trimise prin e-mail: Nu mai trebuie să descărcați sau să configurați software pentru a obține imagini detectate de mișcare de pe camera dvs. web către e-mail - pur și simplu utilizați browserul. Utilizați un browser Firefox, Chrome, Edge sau Opera actualizat pe Windows, Mac sau Android pentru a captura imaginea
Reutilizați un modul de cameră Web HP WebCam 101 Aka 679257-330 ca o cameră Web USB generică: 5 pași
Reutilizați un modul de cameră Web HP WebCam 101 Aka 679257-330 ca o cameră web USB generică: vreau să condimentez Panasonic CF-18 de 14 ani cu o cameră web nouă, dar Panasonic nu mai suportă această mașină minunată, așa că trebuie să folosiți materia cenușie pentru ceva mai ușor decât b & b (beri și burgeri). Aceasta este prima parte
Cameră de rezervă pentru camera video reciclată: 7 pași (cu imagini)
Cameră de rezervă pentru camera video reciclată: sunt sigur că majoritatea dintre voi care citiți acest lucru au un sertar sau un dulap undeva plin de tehnică iubită odată care tocmai a devenit prea veche și depășită. Cu siguranță am partea mea de tehnologie veche și este trist să văd că un astfel de potențial se pierde. Ei bine, în acest ghid, sunt g
Cum să utilizați camera video ca cameră web: 4 pași
Cum să vă folosiți camera video ca cameră web: dacă sunteți ca mine, aveți o mulțime de prieteni care s-au mutat de acasă și locuiesc la mii de kilometri distanță sau aveți prieteni cu care ați mers la universitate cu care locuiesc toți locuri diferite. Eu personal urăsc telefoanele și intrările