Taula de continguts:
- Pas 1: recursos utilitzats
- Pas 2: NodeMCU ESP32S: pinout
- Pas 3: perifèrics ESP32
- Pas 4: Control de servomotor PWM
- Pas 5: captura analògica
- Pas 6: Circuit: servidor i client
- Pas 7: Codi font del punt d'accés i del servidor
- Pas 8: codi font del client
- Pas 9: fitxers
Vídeo: Càmera PANTILT amb ESP32: 9 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:14
Avui presentaré el PAN TILT, que és un dispositiu que permet el moviment d’una càmera per a les direccions cap amunt, cap avall i cap als laterals. Jo mateix vaig produir aquest dispositiu a través de peces impreses en 3D, amb dos servos i l’ESP32, que permet controlar aquest mecanisme mitjançant WiFi. A continuació, prenguem lectures mitjançant els canals AD de l'ESP32, així com una operació analògica mitjançant el controlador LED_PWM. A més, apliquem el control sobre una connexió TCP / IP.
Al vídeo, podeu veure que tinc un ESP32 que llegeix els valors dels dos potenciòmetres, que s’envien (via WiFi) a un altre ESP32. Està connectat als dos servomotors. La càmera es mou (i està connectada a la PAN TILT) en direccions cap amunt, cap avall o cap als costats, en funció del control que feu a través de les olles.
L’enllaç al disseny d’impressió 3D PAN TILT es pot trobar aquí:
Pas 1: recursos utilitzats
• Diversos ponts per a la connexió
• Dos MCU ESP32 de node
• Dos cables USB per a l'ESP32
• Una càmera web per al control
• Dues olles de control
• Una protoborda
• Una font per als servos
Pas 2: NodeMCU ESP32S: pinout
Pas 3: perifèrics ESP32
Perifèrics PWM L'ESP32 té dos perifèrics capaços de generar senyals PWM. Aquests inclouen el motor Modulador d'amplada de pols (MCPWM) dissenyat per al control de potència i motor, i el LED_PWM, desenvolupat per al control de la intensitat del LED. Però també es poden utilitzar de manera genèrica.
Utilitzarem el LED_PWM, que pot generar 16 canals PWM independents amb períodes i cicles de treball configurables. Té fins a 16 bits de resolució.
Pas 4: Control de servomotor PWM
El control del servomotor es realitza ajustant la modulació de l'amplada del pols d'un quadrat amb una freqüència específica.
Per al servo utilitzat (així com per a la majoria), la freqüència és de 50Hz. A més, una amplada d’1 a 2 ms de longitud d’impuls determina la posició angular del servo.
Dirigirem el canal 0 de LED_PWM a GPIO13 i el canal 1 a GPIO12, utilitzant aquesta informació per realitzar el control.
Pas 5: captura analògica
Perifèric de conversió analògica a digital
L'ESP32 té convertidors analògics a digitals que es poden aplicar fins a 18 canals, però només en GPIOs habilitats per analògics.
La tensió aplicada no ha de superar el rang de 0 a 3V.
La conversió realitzada no manté un error constant per a totes les tensions mostrejades, i tot depèn del rang configurat. Per a un abast de 150 mV a 2, 450 V, cal una comprovació del comportament per a aplicacions més crítiques.
Per a la captura, utilitzarem un potenciòmetre de 10k com a divisor de tensió. La captura es farà als canals ADC0 i ADC3, accessibles per GPIO36 i GPIO39.
Pas 6: Circuit: servidor i client
Pas 7: Codi font del punt d'accés i del servidor
Declaracions
Inclou la biblioteca WiFi i defineixo algunes variables.
#include // inclusió da biblioteca WiFi const int freq = 50; // frequência do PWM const int canal_A = 0; // primer canal do controlador LED_PWM const int canal_B = 1; // segon canal do controlador LED_PWM const int resolucao = 12; // Resolució usada sense controlador LED_PWM const int pin_Atuacao_A = 13; // Pino para onde o canal 0 será redireccionado const int pin_Atuacao_B = 12; // Pino para onde o canal 1 será redireccionado const char * ssid = "ESP32ap"; // constant com o SSID do WiFi do ponto de acesso ESP32 const char * password = "12345678"; // senha para confirmación 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); // declaració d'objecte servidor IPAddress myIP; // declaração da variável de IP
Configuració ()
Aquí definim els pins de sortida. Establim els canals a la freqüència desitjada i establim el valor PWM.
void setup () {pinMode (pin_Atuacao_A, OUTPUT); // definindo o pino de atuação A com saída pinMode (pin_Atuacao_B, OUTPUT); // definindo o pino de atuação B com saída ledcSetup (canal_A, freq, resolucao); // Ajustant o canal 0 per a freqüència de 50 Hz i resolució de 12bits ledcSetup (canal_B, freq, resolucao); // Ajustant o canal 1 per a freqüència de 50 Hz i resolució 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
Vam començar la sèrie, el punt d’accés amb SSID ESP32ap i la contrasenya. Després obtenim la IP del servidor i iniciem el servidor.
Serial.begin (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, contrasenya); // iniciando o ponto de acesso com SSID ESP32ap e senha 12345678 Serial.println ("Obtendo IP"); // mensagem myIP = WiFi.softAPIP (); // obtenció o IP del servidor (com a no configurat deverà ser o patró de fàbrica) Serial.println ("IP:" + WiFi.localIP ()); // mensagem Serial.println ("Iniciando servidor em:" + String (port)); // mensagem server.begin (); // iniciando o servidor}
Bucle ()
A Loop, el primer que farem és instanciar el client, connectar-se i vincular-se a la variable client. Comproveu si el client està connectat. Si és així, iniciem la variable que rebrà les dades. Mentre s’estableixi la connexió i si es reben dades, llegim els caràcters de la variable c. Finalment, concatenem c a la variable de dades.
bucle buit () {WiFiClient client = server.available (); // se um client connectar, associe a variável client 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
Si es rep un caràcter de línia nova, busquem l'índex del caràcter ',' a la cadena de les dades. Obtenim les subcadenes fins just abans de la coma i les convertim a enter. Establim el PWM dels canals A i B. Esborrem la variable.
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 (); // obtenha a substring até abans da vírgula e converta for 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}}}}
Si el client es desconnecta, confirmem el final de la connexió. Esperem un moment i imprimim "Cap client connectat". Després esperem un segon abans de reiniciar.
// caso o cliente se desconecte, confirma o fim da conexão delay (50); // aguarda um momento cliente.stop (); Serial.println ("Nenhum client connectat."); // retard mensagem (1000); // aguarda um segon abans de reiniciar}
Pas 8: codi font del client
Declaracions
Hem tornat a incloure la biblioteca WiFi, aquesta vegada al client. A més, definim les variables.
#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 d'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; // 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
Configuració ()
Definim els GPIO com a entrada, iniciem la sèrie i ens connectem al punt d’accés.
void setup () {pinMode (pin_Leitura_A, INPUT); // defineix o GPIO com entrada pinMode (pin_Leitura_B, INPUT); // defineix o GPIO com a entrada Serial.begin (115200); // inicia una comunicação serial WiFi.begin (ssid, password); // connecta ao ponto de acesso}
Bucle ()
En aquest bucle, ens connectarem al servidor, és a dir, l’altre ESP.
void loop () {// no es connecta al punt d'accés, es connecta mentre (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + "- Conectando no WiFi" + ssid + "…"); // mensagem WiFi.begin (ssid, contrasenya); endarreriment (2000); } Serial.println (String (millis ()) + "- Conectado …"); // mensagem // no es connecta al servidor, es connecta mentre (! cliente.connect (host, port)) {Serial.println (String (millis ()) + + - Conectando no Servidor "+ host +": " + port + "…"); // retard mensagem (1000); }
En aquest pas, mentre estem connectats al servidor, executem les variables per emmagatzemar la lectura de ADC0 i ADC3. A més, hem realitzat la lectura de 500 mostres i hem fet una mitjana de les lectures. Hem mapat la lectura per crear la durada correcta per al control dels servos i la concatenem i l’enviem al servidor.
// enquanto estiver connectado 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 = mapa (leitura_A, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para control do servo ciclo_B = map (leitura_B, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para control do servo // concatena e envia para o servidor cliente.println (String (ciclo_A) + "," + String (ciclo_B)); }
Finalment, si no està connectat, ens assegurem que la connexió s’ha finalitzat mostrant el missatge equivalent.
// se não coonectado, garante que a conexão foi finalitzada client.stop (); Serial.println (String (millis ()) + "- client desconectat …"); // mensagem}
Pas 9: fitxers
Descarregueu els fitxers:
INO
Recomanat:
Càmera de circuit tancat de televisió amb mòdul de càmera NodeMCU + Old Laptop (amb i sense utilitzar Blynk): 5 passos
Càmera de circuit tancat de televisió amb mòdul de càmera NodeMCU + Old Laptop (amb i sense utilitzar Blynk): Hola, nois! En aquest instructiu, us mostraré com he utilitzat el mòdul de càmera i el nodeMCU d’un ordinador portàtil antic per fer alguna cosa semblant al CCTV
Lent circular polaritzadora (CPL) per a càmera de càmera Roav C1: 9 passos (amb imatges)
Lent circular polaritzadora (CPL) per a la càmera de càmera Roav C1: A continuació, es mostra com he creat un filtre de polarització circular per a la meva càmera de càlcul Roav C1. Això ajudarà a reduir l’enlluernament que surt del parabrisa de la llum del sol durant el dia i dels fars al vespre
Càmera de seguretat de càmera de vídeo reciclada: 7 passos (amb imatges)
Càmera de seguretat de càmera de vídeo reciclada: estic segur que la majoria de vosaltres que llegiu això teniu un calaix o un armari ple de tecnologia una vegada estimada que acaba d’envellir-se i estar obsoleta. Definitivament, tinc la meva part de tecnologia antiga i és trist veure perdre aquest potencial. Bé, en aquesta guia, sóc g
CÀMERA UNICORN: Càmera Raspberry Pi Zero W NoIR 8MP: 7 passos (amb imatges)
CÀMERA UNICORN: construcció de càmera Raspberry Pi Zero W NoIR 8MP: compilació de càmera Pi Zero W NoIR 8MP Aquest instructiu va ser creat per ajudar a qualsevol persona que vulgui una càmera infraroja o una càmera portàtil realment fresca o una càmera portàtil Raspberry Pi o simplement vulgui divertir-se, heheh . Aquest és el més assequible i configurable
Feu fotografies macros increïbles amb qualsevol càmera del telèfon amb càmera Especialment amb un iPhone: 6 passos
Feu fotografies macros increïbles amb qualsevol càmera del telèfon amb càmera … Sobretot amb un iPhone: Mai heu volgut obtenir una d'aquestes increïbles fotografies de prop … la que diu … WOW!? … amb una càmera de telèfon amb càmera !? Bàsicament, es tracta d'un complement d'augment per a qualsevol càmera del telèfon amb càmera per augmentar l'objectiu de la càmera existent i treure's una