Inhoudsopgave:

PANTILT-camera met ESP32: 9 stappen
PANTILT-camera met ESP32: 9 stappen

Video: PANTILT-camera met ESP32: 9 stappen

Video: PANTILT-camera met ESP32: 9 stappen
Video: ESP32-S3 + Camera Module(OV2640) + LTE Module(SIM7600G-H) 2024, November
Anonim
Image
Image
PANTILT-camera met ESP32
PANTILT-camera met ESP32

Vandaag zal ik de PAN TILT presenteren, een apparaat dat de beweging van een camera mogelijk maakt voor de richtingen omhoog, omlaag en opzij. Ik heb dit apparaat zelf geproduceerd door middel van 3D-geprinte onderdelen, met behulp van twee servo's en de ESP32, waardoor het mogelijk is om dit mechanisme via WiFi te bedienen. Laten we dan metingen uitvoeren met behulp van de AD-kanalen van de ESP32, evenals een analoge bewerking met behulp van de controller LED_PWM. Ook passen wij de besturing toe over een TCP/IP verbinding.

In de video kun je zien dat ik een ESP32 heb die de waarden uitleest van de twee potentiometers, die (via WiFi) naar een andere ESP32 worden verzonden. Het is verbonden met de twee servomotoren. De camera beweegt (en is bevestigd aan de PAN TILT) in de richtingen omhoog, omlaag of zijwaarts, afhankelijk van de controle die u door de potten maakt.

De link naar het PAN TILT 3D-printontwerp is hier te vinden:

Stap 1: Gebruikte bronnen

Gebruikte bronnen
Gebruikte bronnen

• Meerdere jumpers voor verbinding

• Twee Node MCU ESP32's

• Twee USB-kabels voor de ESP32

• Een webcam voor controle

• Twee controlepotten

• Een protobord

• Een bron voor de servo's

Stap 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Stap 3: ESP32 Randapparatuur

ESP32 Randapparatuur
ESP32 Randapparatuur

PWM-randapparatuur De ESP32 heeft twee randapparatuur die PWM-signalen kan genereren. Deze omvatten de Pulse Width Modulator (MCPWM)-engine die is ontworpen voor stroom- en motorbesturing, en de LED_PWM, ontwikkeld voor LED-intensiteitsregeling. Maar ze kunnen ook op een generieke manier worden gebruikt.

We zullen de LED_PWM gebruiken, die 16 onafhankelijke PWM-kanalen kan genereren met configureerbare perioden en werkcycli. Het heeft een resolutie tot 16 bits.

Stap 4: Servomotorbesturing PWM

Servomotorbesturing PWM
Servomotorbesturing PWM

De servomotorbesturing wordt uitgevoerd door de pulsbreedtemodulatie van een vierkant met een specifieke frequentie aan te passen.

Voor de gebruikte servo (evenals voor de meeste), is de frequentie 50 Hz. Ook bepaalt een pulslengte van 1 tot 2 ms de hoekpositie van de servo.

We zullen kanaal 0 van LED_PWM naar GPIO13 en kanaal 1 naar GPIO12 routeren, waarbij we deze informatie gebruiken om de controle uit te voeren.

Stap 5: Analoge opname

Analoge opname
Analoge opname

Analoog naar digitaal conversie randapparaat

De ESP32 heeft analoog-naar-digitaal-converters die in maximaal 18 kanalen kunnen worden toegepast, maar alleen in analoog-compatibele GPIO's.

De aangelegde spanning mag het bereik van 0 tot 3V niet overschrijden.

De uitgevoerde conversie handhaaft geen constante fout voor alle bemonsterde spanningen, en dit hangt allemaal af van het geconfigureerde bereik. Voor een bereik van 150mV bij 2.450V is een gedragscontrole vereist voor meer kritische toepassingen.

Voor het vastleggen gebruiken we een potentiometer van 10k als spanningsdeler. De opname zal worden gedaan in kanaal ADC0 en ADC3, toegankelijk via GPIO36 en GPIO39.

Stap 6: Circuit - Server en client

Circuit - Server en Client
Circuit - Server en Client

Stap 7: Broncode van het toegangspunt en de server

Verklaringen

Ik neem de WiFi-bibliotheek op en definieer enkele variabelen.

#include // inclusief biblioteca WiFi const int freq = 50; //frequência do PWM const int canal_A = 0; //primeiro canal do controlador LED_PWM const int canal_B = 1; // segundo canal do controlador LED_PWM const int resolucao = 12; // Gebruik geen controle meer 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 voor WiFi met toegang tot ESP32 const char * wachtwoord = "12345678"; //senha para confirmaçã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 Een WiFiServer-server (poort); // declaração do objeto servidor IPAddress myIP; //declaração da variável de IP

Opstelling ()

Hier definiëren we de uitgangspinnen. We stellen de kanalen in op de gewenste frequentie en stellen de PWM-waarde in.

void setup(){ pinMode(pin_Atuacao_A, OUTPUT); // definieer of pino de atuação Een como saída pinMode (pin_Atuacao_B, OUTPUT); // definieer of pino de atuação B como saída ledcSetup (canal_A, freq, resolucao); //Ajustando of kanaal 0 voor frequenties van 50 Hz en resolutie van 12bits ledcSetup (canal_B, freq, resolucao); //Aanpassing van kanaal 1 voor frequentie van 50 Hz en resolutie van 12bits ledcAttachPin (pin_Atuacao_A, canal_A); //redirecionando van kanaal 0 voor pino 13 ledcAttachPin (pin_Atuacao_B, kanaal_B); // redirecionando o kanaal 1 para o pino 12 ledcWrite (canal_A, ciclo_A); // definieer o valor do PWM para 0 ledcWrite (canal_B, ciclo_B); // definieer o valor do PWM para 0

We begonnen het seriële, toegangspunt met SSID ESP32ap en wachtwoord. We krijgen dan het IP-adres van de server en starten de server.

Serieel.begin(115200); //iniciando a Serial Serial.println ("Iniciando ponto de acesso: " + String (ssid)); //mensagem WiFi.softAP (ssid, wachtwoord); //iniciando o ponto de acesso com SSID ESP32ap en senha 12345678 Serial.println ("Obtendo IP"); //mensagem mijnIP = WiFi.softAPIP (); //obtendo o IP-server (como não foi configurado deverá ser o padrão de fábrica) Serial.println("IP: " + WiFi.localIP()); //mensagem Serial.println ("Iniciando servador em: " + String (poort)); //mensagem server.begin(); //iniciando of servidor}

lus ()

In Loop is het eerste wat we gaan doen de client instantiëren, verbinden en binden aan de clientvariabele. Controleer of de client is verbonden. Als dat zo is, starten we de variabele die de gegevens zal ontvangen. Zolang de verbinding tot stand is gebracht en als er gegevens worden ontvangen, lezen we de tekens voor de variabele c. Ten slotte voegen we c samen in de gegevensvariabele.

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

Als een newline-teken wordt ontvangen, zoeken we de index van het teken ', ' in de string in de data. We krijgen de substrings tot vlak voor de komma, en dan converteren we ze naar integer. We stellen de PWM van kanalen A en B in. We wissen de variabele.

if (c == '\n') { //se um karakter van nova linha voor recebido int virgula = dados.indexOf(', '); //koop pelo índice do caracter ', ' na string em dados ciclo_A = (dados.substring(0, virgula)).toInt(); //obtenha een substring die voorafgaat aan de oorspronkelijke conversie ciclo_B = dados.substring(virgula + 1, dados.length()).toInt();//obtenha een substring met een vírgula en converta para inteiro ledcWrite(canal_A, ciclo_A); //Ajusta o PWM doen kanaal A ledcWrite (canal_B, ciclo_B); //Ajusta o PWM do kanaal B dados = ""; //Limpa en variável } } } }

Als de client de verbinding verbreekt, bevestigen we het einde van de verbinding. We wachten even en printen "No client connected". We wachten dan nog een seconde voordat we opnieuw beginnen.

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

Stap 8: Broncode van de klant

Verklaringen

We hebben de WiFi-bibliotheek opnieuw opgenomen, dit keer op de client. Ook definiëren we de variabelen.

#include const char* ssid = "ESP32ap"; //SSID doe toegang tot ESP32 const char* wachtwoord = "12345678"; //Senha para acessar op ponto de acesso const uint16_t port = 2; // Porta de escuta do servidor const char * host = "192.168.4.1"; // endereço IP-server const int pin_Leitura_A = 36; //GPIO de leitura doen 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

Opstelling ()

We definiëren de GPIO's als invoer, starten de serie en maken verbinding met het toegangspunt.

void setup(){ pinMode(pin_Leitura_A, INPUT); //definieer o GPIO como entrada pinMode (pin_Leitura_B, INPUT); //definieer o GPIO como entrada Serial.begin (115200); //inicia a comunicação seriële WiFi.begin (ssid, wachtwoord); // sluit aan op ponto de acesso }

lus ()

In deze Loop zullen we verbinding maken met de server, dat wil zeggen de andere ESP.

void loop () { // geen verbinding maken met ao ponto de acesso, tenta se conectar while (WiFi.status ()! = WL_CONNECTED) { Serial.println (String (millis ()) + " - Verbinding geen wifi " + ssid + "…"); //mensagem WiFi.begin (ssid, wachtwoord); vertraging (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 + ":" + poort + "…"); //mensagem vertraging (1000); }

In deze stap voeren we, terwijl we verbonden zijn met de server, de variabelen uit om de uitlezing van ADC0 en ADC3 op te slaan. Ook hebben we de lezing van 500 monsters uitgevoerd en de metingen gemiddeld. We hebben de uitlezing in kaart gebracht om de juiste duur voor de besturing van de servo's te creëren, en samen te voegen en naar de server te sturen.

// enquanto estiver conectado en 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; // nummer van 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 = kaart(leitura_A, 0, 4095, 140, 490); //mapeia a leitura para criar en duração correta para control do servo ciclo_B = map(leitura_B, 0, 4095, 140, 490); //mapeia a leitura para criar and duração correta para control do servo //concatena en envia para o servidor cliente.println(String(ciclo_A) + ", " + String(ciclo_B)); }

Ten slotte, als er geen verbinding is, zorgen we ervoor dat de verbinding is verbroken door het equivalente bericht weer te geven.

// geen coonectado, garant voor een conexo foi finalizada cliente.stop(); Serial.println(String(millis()) + " - cliente desconectado…"); //mensage }

Stap 9: Bestanden

Download de bestanden:

PDF

INO

Aanbevolen: