Innholdsfortegnelse:

PANTILT -kamera med ESP32: 9 trinn
PANTILT -kamera med ESP32: 9 trinn

Video: PANTILT -kamera med ESP32: 9 trinn

Video: PANTILT -kamera med ESP32: 9 trinn
Video: Beamz MHL 1410 Moving head 2024, Juli
Anonim
Image
Image
PANTILT -kamera med ESP32
PANTILT -kamera med ESP32

I dag vil jeg presentere PAN TILT, som er en enhet som muliggjør bevegelse av et kamera for retningene opp, ned og til sidene. Selv produserte jeg denne enheten gjennom 3D -trykte deler, ved hjelp av to servoer og ESP32, som gjør det mulig å kontrollere denne mekanismen via WiFi. La oss deretter ta avlesninger ved hjelp av AD -kanalene til ESP32, samt en analog operasjon ved hjelp av kontrolleren LED_PWM. Vi bruker også kontrollen over en TCP / IP -tilkobling.

I videoen kan du se at jeg har en ESP32 som leser verdiene til de to potensiometrene, som sendes (via WiFi) til en annen ESP32. Den er koblet til de to servomotorene. Kameraet beveger seg (og er festet til PAN TILT) i retning opp, ned eller sidelengs, avhengig av kontrollen du gjør gjennom grytene.

Lenken til PAN TILT 3D -utskriftsdesign finner du her:

Trinn 1: Ressurser brukt

Ressurser brukt
Ressurser brukt

• Flere hoppere for tilkobling

• To Node MCU ESP32 -er

• To USB -kabler for ESP32

• Et webkamera for kontroll

• To kontrollpotter

• En protoboard

• En kilde til servoene

Trinn 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Trinn 3: ESP32 eksterne enheter

ESP32 Periferutstyr
ESP32 Periferutstyr

PWM -eksterne enheter ESP32 har to eksterne enheter som er i stand til å generere PWM -signaler. Disse inkluderer motoren Pulse Width Modulator (MCPWM) designet for effekt og motorstyring, og LED_PWM, utviklet for LED -intensitetskontroll. Men de kan også brukes på en generisk måte.

Vi vil bruke LED_PWM, som kan generere 16 uavhengige PWM -kanaler med konfigurerbare perioder og arbeidssykluser. Den har opptil 16 bits oppløsning.

Trinn 4: Servomotorkontroll PWM

Servomotorstyring PWM
Servomotorstyring PWM

Servomotorstyringen utføres ved å justere pulsbreddemodulasjonen til et kvadrat med spesifikk frekvens.

For servoen som brukes (så vel som for de fleste) er frekvensen på 50Hz. En bredde på 1 til 2 ms pulslengde bestemmer også servoens vinkelposisjon.

Vi vil rute kanal 0 av LED_PWM til GPIO13, og kanal 1 til GPIO12, ved å bruke denne informasjonen til å utføre kontrollen.

Trinn 5: Analog fangst

Analog fangst
Analog fangst

Perifer til analog til digital konvertering

ESP32 har analog-til-digital-omformere som kan brukes i opptil 18 kanaler, men bare i analog-aktiverte GPIO-er.

Den påførte spenningen må ikke overstige 0 til 3V -området.

Konverteringen utfører ikke en konstant feil for alle spenninger som samples, og alt avhenger av det konfigurerte området. For et område på 150mV ved 2, 450V, er det nødvendig med en atferdskontroll for mer kritiske applikasjoner.

For fangst vil vi bruke et potensiometer på 10k som en spenningsdeler. Fangsten vil bli utført i kanal ADC0 og ADC3, tilgjengelig med GPIO36 og GPIO39.

Trinn 6: Krets - Server og klient

Krets - Server og klient
Krets - Server og klient

Trinn 7: Kildekode til tilgangspunktet og serveren

Uttalelser

Jeg inkluderer WiFi -biblioteket, og jeg definerer noen variabler.

#include // inclusão da 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; // 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 for 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 A WiFiServer server (port); // declaração do objeto servidor IPAddress myIP; // declaração da variável de IP

Oppsett ()

Her definerer vi utgangspinnene. Vi setter kanalene til ønsket frekvens og angir PWM -verdien.

ugyldig oppsett () {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, resolucao); // 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); // omdirigering av kanal 1 for 12 ledcWrite (kanal_A, ciklo_A); // definindo o valor do PWM para 0 ledcWrite (canal_B, ciclo_B); // definindo o valor do PWM para 0

Vi startet serienummeret, tilgangspunktet med SSID ESP32ap og passord. Vi får deretter IP -adressen til serveren og starter serveren.

Serial.begin (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, passord); // 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}

Løkke ()

I Loop er det første vi skal gjøre å instantiere klienten, koble til og binde seg til klientvariabelen. Sjekk om klienten er tilkoblet. I så fall starter vi variabelen som vil motta dataene. Så lenge forbindelsen er etablert, og hvis data mottas, leser vi tegnene for variabelen c. Til slutt kombinerer vi c i datavariabelen.

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

Hvis et nytt linjetegn mottas, ser vi etter indeksen til tegnet ',' i strengen i dataene. Vi får substreringene til rett før komma, og deretter konverterer vi dem til heltall. Vi setter PWM for kanalene A og B. Vi fjerner variabelen.

if (c == '\ n') {// se um caracter de nova linha for recebido int virgula = dados.indexOf (','); // skaffe 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 do canal A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do canal B dados = ""; // Limpa a variável}}}}

Hvis klienten kobler fra, bekrefter vi slutten av tilkoblingen. Vi venter et øyeblikk og skriver ut "Ingen klient tilkoblet". Vi venter deretter et sekund til vi starter på nytt.

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

Trinn 8: Kundens kildekode

Uttalelser

Vi har inkludert WiFi -biblioteket igjen, denne gangen på klienten. Vi definerer også variablene.

#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; // Variabel som kan hjelpe deg å bruke PWM B WiFiClient -klient; // declaração do objeto cliente

Oppsett ()

Vi definerer GPIO -ene som input, starter serien og kobler til tilgangspunktet.

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

Løkke ()

I denne løkken vil vi koble til serveren, det vil si den andre 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, passord); forsinkelse (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 forsinkelse (1000); }

I dette trinnet, mens vi er koblet til serveren, utfører vi variablene for å lagre avlesningen av ADC0 og ADC3. Vi utførte også avlesningen av 500 prøver og gjennomsnittet avlesningene. Vi kartla avlesningen for å lage riktig varighet for kontrollen av servoene, og sammenkoble og sende den til serveren.

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

Til slutt, hvis den ikke er tilkoblet, sikrer vi at tilkoblingen er avsluttet ved å vise tilsvarende melding.

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

Trinn 9: Filer

Last ned filene:

PDF

INO

Anbefalt: