Taula de continguts:

Càmera PANTILT amb ESP32: 9 passos
Càmera PANTILT amb ESP32: 9 passos

Vídeo: Càmera PANTILT amb ESP32: 9 passos

Vídeo: Càmera PANTILT amb ESP32: 9 passos
Vídeo: ✅ Como identificar bobinas de Motores de Pasos 4, 5, 6 y 8 cables ( CNC y 3D impresora) A4988 #6 2024, Desembre
Anonim
Image
Image
Càmera PANTILT amb ESP32
Càmera PANTILT amb ESP32

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

Recursos utilitzats
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

NodeMCU ESP32S: pinout
NodeMCU ESP32S: pinout

Pas 3: perifèrics ESP32

Perifèrics ESP32
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

Servomotor de control PWM
Servomotor de control 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

Captura analògica
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

Circuit: servidor i client
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:

PDF

INO

Recomanat: