Indholdsfortegnelse:

PANTILT -kamera med ESP32: 9 trin
PANTILT -kamera med ESP32: 9 trin

Video: PANTILT -kamera med ESP32: 9 trin

Video: PANTILT -kamera med ESP32: 9 trin
Video: Управление 32 серводвигателями с PCA9685 и ESP32 - V4 2024, November
Anonim
Image
Image
PANTILT -kamera med ESP32
PANTILT -kamera med ESP32

I dag vil jeg præsentere PAN TILT, som er en enhed, der muliggør bevægelse af et kamera i retning af op, ned og til siderne. Jeg producerede selv denne enhed gennem 3D -printede dele ved hjælp af to servoer og ESP32, hvilket gør det muligt at styre denne mekanisme via WiFi. Lad os derefter foretage aflæsninger ved hjælp af AD -kanalerne i ESP32, samt en analog operation ved hjælp af controller LED_PWM. Vi anvender også kontrollen over en TCP / IP -forbindelse.

I videoen kan du se, at jeg har en ESP32, der læser værdierne for de to potentiometre, som sendes (via WiFi) til en anden ESP32. Den er forbundet til de to servomotorer. Kameraet bevæger sig (og er fastgjort til PAN TILT) i retning op, ned eller sidelæns, afhængigt af den kontrol, du foretager gennem gryderne.

Linket til PAN TILT 3D -printdesign kan findes her:

Trin 1: Brugte ressourcer

Ressourcer brugt
Ressourcer brugt

• Flere jumpere til tilslutning

• To Node MCU ESP32'er

• To USB -kabler til ESP32

• Et webcam til kontrol

• To kontrolpotter

• Et protoboard

• En kilde til servoerne

Trin 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Trin 3: ESP32 Periferiudstyr

ESP32 Periferiudstyr
ESP32 Periferiudstyr

PWM -periferiudstyr ESP32 har to eksterne enheder, der er i stand til at generere PWM -signaler. Disse inkluderer motoren Pulse Width Modulator (MCPWM) designet til effekt- og motorstyring og LED_PWM, der er udviklet til LED -intensitetskontrol. Men de kan også bruges på en generisk måde.

Vi vil bruge LED_PWM, som kan generere 16 uafhængige PWM -kanaler med konfigurerbare perioder og arbejdscyklusser. Det har op til 16 bit opløsning.

Trin 4: Servomotorstyring PWM

Servomotorstyring PWM
Servomotorstyring PWM

Servomotorstyringen udføres ved at justere pulsbreddemodulationen af en firkant med specifik frekvens.

For den anvendte servo (såvel som for de fleste) er frekvensen ved 50Hz. En bredde på 1 til 2 ms pulslængde bestemmer også servoens vinkelposition.

Vi vil dirigere kanal 0 af LED_PWM til GPIO13 og kanal 1 til GPIO12 ved hjælp af disse oplysninger til at udføre kontrollen.

Trin 5: Analog optagelse

Analog optagelse
Analog optagelse

Perifer analog til digital konvertering

ESP32 har analog-til-digital-konvertere, der kan anvendes i op til 18 kanaler, men kun i analog-aktiverede GPIO'er.

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

Den udførte konvertering opretholder ikke en konstant fejl for alle samplede spændinger, og alt afhænger af det konfigurerede område. For en rækkevidde på 150mV ved 2, 450V kræves en adfærdskontrol for mere kritiske applikationer.

Til optagelsen vil vi bruge et potentiometer på 10k som en spændingsdeler. Optagelsen foretages i kanal ADC0 og ADC3, tilgængelig med GPIO36 og GPIO39.

Trin 6: Kredsløb - Server og klient

Kredsløb - Server og klient
Kredsløb - Server og klient

Trin 7: Kildekode til adgangspunktet og serveren

Erklæringer

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

#include // inclusão da biblioteca WiFi const int freq = 50; // frequência do PWM const int canal_A = 0; // primeiro -kanal gør styring af 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; // variabel kan modtage en kanal til en kanal En WiFiServer -server (port); // declaração do objeto servidor IPAddress myIP; // declaração da variável de IP

Opsætning ()

Her definerer vi udgangsstifterne. Vi indstiller kanalerne til den ønskede frekvens og indstiller PWM -værdien.

ugyldig opsætning () {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 af kanal 1 til 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 startede serienummeret, adgangspunktet med SSID ESP32ap og adgangskode. Vi får derefter serverens IP og starter serveren.

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

Sløjfe ()

I Loop er det første, vi skal gøre, at instantiere klienten, forbinde og binde til klientvariablen. Kontroller, om klienten er tilsluttet. I så fald starter vi den variabel, der vil modtage dataene. Så længe forbindelsen er etableret, og hvis der modtages data, læser vi tegnene for variablen c. Endelig sammenkæder vi c i datavariablen.

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; // konkatene c med forskellige dados

Hvis der modtages et nyt linjetegn, leder vi efter indekset for tegnet ',' i strengen i dataene. Vi får substreringerne indtil lige før kommaet, og derefter konverterer vi dem til et helt tal. Vi indstiller PWM for kanal A og B. Vi rydder variablen.

hvis (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 gør kanal A ledcWrite (kanal_B, ciclo_B); // Ajusta o PWM gør kanal B dados = ""; // Limpa a variável}}}}

Hvis klienten afbryder forbindelsen, bekræfter vi afslutningen af forbindelsen. Vi venter et øjeblik og udskriver "Ingen klient tilsluttet". Vi venter derefter endnu et sekund, før vi genstarter.

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

Trin 8: Kundens kildekode

Erklæringer

Vi har inkluderet WiFi -biblioteket igen, denne gang på klienten. Vi definerer også variablerne.

#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; // Varianter, der kan bruges til værdier for PWM B WiFiClient -klienter; // declaração do objeto cliente

Opsætning ()

Vi definerer GPIO'erne som input, starter serien og opretter forbindelse til adgangspunktet.

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

Sløjfe ()

I denne loop vil vi oprette forbindelse til serveren, hvilket betyder den anden 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, password); 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 trin, mens vi er forbundet til serveren, udfører vi variablerne for at gemme læsningen af ADC0 og ADC3. Vi udførte også aflæsningen af 500 prøver og gennemsnittet af målingerne. Vi kortlagde aflæsningen for at oprette den korrekte varighed for styringen af servoerne 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 = kort (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)); }

Endelig, hvis den ikke er tilsluttet, sikrer vi, at forbindelsen er afbrudt ved at vise den tilsvarende besked.

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

Trin 9: Filer

Download filerne:

PDF

INO

Anbefalede: