Sadržaj:

PANTILT kamera s ESP32: 9 koraka
PANTILT kamera s ESP32: 9 koraka

Video: PANTILT kamera s ESP32: 9 koraka

Video: PANTILT kamera s ESP32: 9 koraka
Video: ESP32-S3 + Camera Module(OV2640) + LTE Module(SIM7600G-H) 2024, Studeni
Anonim
Image
Image
PANTILT kamera s ESP32
PANTILT kamera s ESP32

Danas ću vam predstaviti PAN TILT, uređaj koji omogućuje kretanje kamere za smjerove gore, dolje i u stranu. I sam sam proizvodio ovaj uređaj putem 3D ispisanih dijelova, koristeći dva serva i ESP32, što omogućuje upravljanje ovim mehanizmom putem WiFi -a. Uzmimo tada očitanja pomoću AD kanala ESP32, kao i analognu operaciju pomoću kontrolera LED_PWM. Također, primjenjujemo kontrolu nad TCP / IP vezom.

U videu možete vidjeti da imam ESP32 koji čita vrijednosti dva potenciometra, koji se šalju (putem WiFi -a) na drugi ESP32. Spojen je na dva servo motora. Fotoaparat se pomiče (i pričvršćen je za PAN TILT) u smjeru gore, dolje ili bočno, ovisno o kontroli koju vršite kroz lonce.

Link do dizajna 3D ispisa PAN TILT možete pronaći ovdje:

Korak 1: Korišteni resursi

Korišteni resursi
Korišteni resursi

• Više kratkospojnika za povezivanje

• Dva NSP MCU ESP32

• Dva USB kabela za ESP32

• Web kameru za kontrolu

• Dva kontrolna lonca

• Protoboard

• Izvor za servo pogone

Korak 2: NodeMCU ESP32S - ispis

NodeMCU ESP32S - Ispis
NodeMCU ESP32S - Ispis

Korak 3: ESP32 periferne jedinice

ESP32 periferne jedinice
ESP32 periferne jedinice

PWM periferije ESP32 ima dvije periferije koje mogu generirati PWM signale. To uključuje motor s modulatorom širine impulsa (MCPWM) dizajniran za kontrolu snage i motora, te LED_PWM, razvijen za kontrolu intenziteta LED dioda. Ali mogu se koristiti i na generički način.

Koristit ćemo LED_PWM, koji može generirati 16 neovisnih PWM kanala s podesivim razdobljima i radnim ciklusima. Ima do 16 bita rezolucije.

Korak 4: PWM za upravljanje servo motorom

PWM za upravljanje servo motorom
PWM za upravljanje servo motorom

Upravljanje servo motorom vrši se podešavanjem širine impulsa modulacije kvadrata sa specifičnom frekvencijom.

Za korišteni servo (kao i za većinu) frekvencija je na 50Hz. Također, širina impulsa od 1 do 2 ms određuje kutni položaj serva.

Kanal 0 LED_PWM -a usmjerit ćemo na GPIO13, a kanal 1 na GPIO12, koristeći ove informacije za obavljanje kontrole.

Korak 5: Analogno snimanje

Analogno snimanje
Analogno snimanje

Periferija analogno -digitalne konverzije

ESP32 ima analogno-digitalne pretvarače koji se mogu primijeniti u do 18 kanala, ali samo u analognim GPIO-ovima.

Primijenjeni napon ne smije prelaziti raspon 0 do 3V.

Provedena pretvorba ne održava konstantnu pogrešku za sve uzorkovane napone, a sve ovisi o konfiguriranom rasponu. Za raspon od 150mV na 2, 450V, provjera ponašanja je potrebna za kritičnije primjene.

Za hvatanje ćemo koristiti potenciometar od 10k kao razdjelnik napona. Snimanje će se izvršiti u kanalima ADC0 i ADC3, kojima su dostupni GPIO36 i GPIO39.

Korak 6: Krug - poslužitelj i klijent

Krug - poslužitelj i klijent
Krug - poslužitelj i klijent

Korak 7: Izvorni kod pristupne točke i poslužitelja

Izjave

Uključujem WiFi knjižnicu i definiram neke varijable.

#include // uključuje biblioteku WiFi const int freq = 50; // frekvencija do PWM const int kanal_A = 0; // primeiro channel do controlador LED_PWM const int canal_B = 1; // segundo kanal do controlador LED_PWM const int resolucao = 12; // Resolução usado bez kontrole 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 channel 1 será redirecionado const char* ssid = "ESP32ap"; // konstantno povezivanje SSID -a s Wi -Fi mrežom na ESP32 const char* password = "12345678"; // senha para confirmationmaçã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; // varijaável que receberá o ciclo de atuação do kanala A int ciclo_B = 0; // variável que Receberá o ciclo de atuação do canal A WiFiServer poslužitelj (port); // deklarira da objekat poslužitelja IPAddress myIP; // deklariranje da variável de IP

Postaviti ()

Ovdje definiramo izlazne pinove. Postavili smo kanale na željenu frekvenciju i postavili vrijednost PWM.

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 (canal_A, freq, resolucao); // Ajustando o kanalu 0 za frekvencije od 50 Hz i razlučivost od 12 bita ledcSetup (kanal_B, frekvencija, razlučivost); // Ajustando o kanalu 1 za frekvencije od 50 Hz i razlučivost od 12 bita ledcAttachPin (pin_Atuacao_A, kanal_A); // redirecionando o channel 0 para o pino 13 ledcAttachPin (pin_Atuacao_B, canal_B); // redirecionando o kanalu 1 para o pino 12 ledcWrite (kanal_A, ciclo_A); // definiranje o valor do PWM para 0 ledcWrite (canal_B, ciclo_B); // definindo o valor do PWM paragraf 0

Započeli smo serijsku, pristupnu točku sa SSID -om ESP32ap i lozinkom. Zatim dobivamo IP poslužitelja i pokrećemo poslužitelj.

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

Petlja ()

U Loopu, prvo što ćemo učiniti je instancirati klijenta, povezati ga i povezati s klijentskom varijablom. Provjerite je li klijent povezan. Ako je tako, pokrećemo varijablu koja će primati podatke. Sve dok je veza uspostavljena i ako se primaju podaci, čitamo znakove za varijablu c. Konačno, povezujemo c u varijablu podataka.

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

Ako se primi znak novog retka, tražimo indeks znaka ',' u nizu u podacima. Podniz dobijamo točno ispred zareza, a zatim ih pretvaramo u cijeli broj. Postavljamo PWM kanala A i B. Brišemo varijablu.

if (c == '\ n') {// se um karaktera de nova linha za recebido int virgula = dados.indexOf (','); // nabavljamo 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 niz após a vírgula e converta para inteiro ledcWrite (channel_A, ciclo_A); // Ajusta o PWM do kanala A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do kanala B dados = ""; // Limpa a variável}}}}

Ako se klijent prekine, potvrđujemo kraj veze. Čekamo trenutak i ispisujemo "No client connected". Zatim čekamo još jednu sekundu prije ponovnog pokretanja.

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

Korak 8: Izvorni kod korisnika

Izjave

Ponovno smo uključili WiFi biblioteku, ovaj put na klijentu. Također, definiramo varijable.

#include const char* ssid = "ESP32ap"; // SSID za pristup ESP32 const char* lozinka = "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; // deklaração do objeto cliente

Postaviti ()

Definiramo GPIO -ove kao ulaz, započinjemo serijsku vezu i povezujemo se s pristupnom točkom.

void setup () {pinMode (pin_Leitura_A, INPUT); // definiramo GPIO kao entrada pinMode (pin_Leitura_B, INPUT); // definirati o GPIO kao entrada Serial.begin (115200); // inicia a comunicação serijski WiFi.begin (ssid, lozinka); // conecta ao ponto de acesso}

Petlja ()

U ovoj petlji ćemo se povezati sa poslužiteljem, što znači drugi ESP.

void loop () {// se não conectado ao ponto de acesso, tenta se conectar while (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " - Conectando nema WiFi" + ssid + "…"); // mensagem WiFi.begin (ssid, lozinka); odgoda (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 + "…"); // kašnjenje mensagema (1000); }

U ovom koraku, dok smo povezani s poslužiteljem, izvršavamo varijable za spremanje očitanja ADC0 i ADC3. Također smo izvršili čitanje 500 uzoraka i prosječno očitali. Mapirali smo očitanje kako bismo stvorili ispravno trajanje za kontrolu servomotora, te ga spojili i poslali na poslužitelj.

// enquanto estiver conectado ao servidor while (cliente.connected ()) {int leitura_A = 0; // variável para armazenar a leitura do ADC0 int leitura_B = 0; // varijable 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 + analogno čitanje (pin_Leitura_B); contador ++; } leitura_A = leitura_A / amostras; // média das leituras leitura_B = leitura_B /amostras; ciclo_A = karta (leitura_A, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para controle do servo ciclo_B = map (leitura_B, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para controle do servo // concatena e envia para o servidor cliente.println (String (ciclo_A) + "," + String (ciclo_B)); }

Konačno, ako nismo povezani, osiguravamo da je veza prekinuta prikazivanjem ekvivalentne poruke.

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

Korak 9: Datoteke

Preuzmite datoteke:

PDF

INO

Preporučeni: