Innehållsförteckning:

PANTILT -kamera med ESP32: 9 steg
PANTILT -kamera med ESP32: 9 steg

Video: PANTILT -kamera med ESP32: 9 steg

Video: PANTILT -kamera med ESP32: 9 steg
Video: Как отслеживать и контролировать ESP32 из любой точки мира с помощью RemoteXY IoT Cloud 2024, Juli
Anonim
Image
Image
PANTILT -kamera med ESP32
PANTILT -kamera med ESP32

Idag kommer jag att presentera PAN TILT, som är en enhet som möjliggör rörelse av en kamera för riktningarna uppåt, nedåt och till sidorna. Jag producerade själv denna enhet genom 3D -tryckta delar, med två servon och ESP32, vilket gör det möjligt att styra denna mekanism via WiFi. Låt oss sedan ta avläsningar med hjälp av AD -kanalerna i ESP32, såväl som en analog operation med styrenheten LED_PWM. Vi tillämpar också kontrollen över en TCP / IP -anslutning.

I videon kan du se att jag har en ESP32 som läser värdena för de två potentiometrarna, som skickas (via WiFi) till en annan ESP32. Den är ansluten till de två servomotorerna. Kameran rör sig (och är fäst på PAN TILT) i riktningarna uppåt, nedåt eller i sidled, beroende på kontrollen du gör genom krukorna.

Länken till PAN TILT 3D -utskriftsdesignen hittar du här:

Steg 1: Resurser som används

Resurser som används
Resurser som används

• Flera hoppare för anslutning

• Två Node MCU ESP32s

• Två USB -kablar för ESP32

• En webbkamera för kontroll

• Två kontrollkrukor

• Ett protoboard

• En källa för servon

Steg 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Steg 3: ESP32 kringutrustning

ESP32 kringutrustning
ESP32 kringutrustning

PWM -kringutrustning ESP32 har två kringutrustning som kan generera PWM -signaler. Dessa inkluderar motorn Pulse Width Modulator (MCPWM) avsedd för effekt- och motorstyrning och LED_PWM, utvecklad för LED -intensitetskontroll. Men de kan också användas på ett generiskt sätt.

Vi kommer att använda LED_PWM, som kan generera 16 oberoende PWM -kanaler med konfigurerbara perioder och arbetscykler. Den har upp till 16 bitar av upplösning.

Steg 4: Servomotorstyrning PWM

Servomotorstyrning PWM
Servomotorstyrning PWM

Servomotorkontrollen utförs genom att justera pulsbreddsmoduleringen för en kvadrat med specifik frekvens.

För den servo som används (liksom för de flesta) är frekvensen vid 50Hz. Dessutom bestämmer en bredd på 1 till 2ms pulslängd servolets vinkelläge.

Vi kommer att dirigera kanal 0 för LED_PWM till GPIO13 och kanal 1 till GPIO12 med hjälp av denna information för att utföra kontrollen.

Steg 5: Analog Capture

Analog Capture
Analog Capture

Perifer till analog till digital konvertering

ESP32 har analog-till-digital-omvandlare som kan användas i upp till 18 kanaler, men bara i analog-aktiverade GPIO: er.

Den applicerade spänningen får inte överstiga 0 till 3V intervallet.

Den utförda konverteringen upprätthåller inte ett konstant fel för alla spänningar som samplas, och allt beror på det konfigurerade intervallet. För ett intervall på 150mV vid 2, 450V krävs en beteendekontroll för mer kritiska applikationer.

För att fånga kommer vi att använda en potentiometer på 10k som en spänningsdelare. Fångsten kommer att göras i kanal ADC0 och ADC3, tillgänglig med GPIO36 och GPIO39.

Steg 6: Krets - Server och klient

Krets - Server och klient
Krets - Server och klient

Steg 7: Källkod för åtkomstpunkten och servern

Uttalanden

Jag inkluderar WiFi -biblioteket och jag definierar några variabler.

#include // inclusão da biblioteca WiFi const int freq = 50; // frequência do PWM const int canal_A = 0; // primeiro -kanalen gör kontrollen 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á redirecionado const int pin_Atuacao_B = 12; // Pino para onde o canal 1 será redirecionado const char* ssid = "ESP32ap"; // constante 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 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 En WiFiServer -server (port); // declaração do objeto servidor IPAddress myIP; // declaração da variável de IP

Uppstart ()

Här definierar vi utgångsstiften. Vi ställer in kanalerna till önskad frekvens och ställer in PWM -värdet.

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 (kanal_A, frekvens, upplösning); // Ajustando o canal 0 para frequência de 50 Hz e resolução de 12bits ledcSetup (canal_B, freq, resolucao); // Ajustando o canal 1 para frequência de 50 Hz e resolução 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 (kanal_A, ciclo_A); // definindo o valor do PWM para 0 ledcWrite (canal_B, ciclo_B); // definindo o valor do PWM para 0

Vi startade serien, åtkomstpunkten med SSID ESP32ap och lösenord. Vi får sedan serverns IP och startar servern.

Serial.begin (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, lösenord); // iniciando o ponto de acesso com SSID ESP32ap e senha 12345678 Serial.println ("Obtendo IP"); // 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}

Loop ()

I Loop är det första vi ska göra att instansera klienten, ansluta och binda till klientvariabeln. Kontrollera om klienten är ansluten. Om så är fallet startar vi variabeln som tar emot data. Så länge anslutningen upprättas och om data tas emot läser vi tecknen för variabeln c. Slutligen sammanfogar vi c i datavariabeln.

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

Om ett nyradstecken tas emot letar vi efter indexet för tecknet ',' i strängen i data. Vi får substreringarna tills rätt före komma, och sedan konverterar vi dem till heltal. Vi ställer in PWM för kanalerna A och B. Vi rensar variabeln.

if (c == '\ n') {// se um caracter de nova linha for recebido int virgula = dados.indexOf (','); // skaffa pelo índice do caracter ',' na 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, ciclo_A); // Ajusta o PWM gör kanal A ledcWrite (kanal_B, ciklo_B); // Ajusta o PWM gör kanal B dados = ""; // Limpa a variável}}}}

Om klienten kopplar bort, bekräftar vi slutet av anslutningen. Vi väntar en stund och skriver ut "Ingen klient ansluten". Vi väntar sedan ytterligare en sekund innan vi startar om.

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

Steg 8: Kundkällkod

Uttalanden

Vi har inkluderat WiFi -biblioteket igen, den här gången på klienten. Vi definierar också variablerna.

#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 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 cliente; // declaração do objeto cliente

Uppstart ()

Vi definierar GPIO: er som inmatning, startar serien och ansluter till åtkomstpunkten.

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

Loop ()

I denna loop kommer vi att ansluta till servern, vilket betyder den andra 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, lösenord); fördröjning (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 fördröjning (1000); }

I detta steg, medan vi är anslutna till servern, kör vi variablerna för att lagra avläsningen av ADC0 och ADC3. Vi utförde också avläsning av 500 prover och i genomsnitt avläsningar. Vi kartläste avläsningen för att skapa rätt varaktighet för kontrollen av servon och sammanfoga och skicka den till servern.

// 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 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)); }

Slutligen, om den inte är ansluten, säkerställer vi att anslutningen har avslutats genom att visa motsvarande meddelande.

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

Steg 9: Filer

Ladda ner filerna:

PDF

INO

Rekommenderad: