Sadržaj:

PANTILT kamera sa ESP32: 9 koraka
PANTILT kamera sa ESP32: 9 koraka

Video: PANTILT kamera sa ESP32: 9 koraka

Video: PANTILT kamera sa ESP32: 9 koraka
Video: ESP32-CAM - Guide to making YOUR first DIY Security Camera 2024, Juli
Anonim
Image
Image
PANTILT kamera sa ESP32
PANTILT kamera sa ESP32

Danas ću vam predstaviti PAN TILT, uređaj koji omogućava kretanje kamere za smjerove gore, dolje i sa strane. Ja sam sam proizvodio ovaj uređaj putem 3D štampanih dijelova, koristeći dva serva i ESP32, što omogućava upravljanje ovim mehanizmom putem WiFi -ja. 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. Povezan je sa dva servo motora. Kamera se pomiče (i pričvršćena je za PAN TILT) u smjeru gore, dolje ili bočno, ovisno o kontroli koju vršite kroz lonce.

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

Korak 1: Korišteni resursi

Korišteni resursi
Korišteni resursi

• Više kratkospojnika za povezivanje

• Dva čvorna MCU ESP32

• Dva USB kabla za ESP32

• Web kamera za kontrolu

• Dva kontrolna lonca

• Protoboard

• Izvor za servo pogone

Korak 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Korak 3: ESP32 periferne jedinice

ESP32 Periferije
ESP32 Periferije

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

Koristićemo LED_PWM, koji može generisati 16 nezavisnih PWM kanala sa podesivim periodima i radnim ciklusima. Ima do 16 bita rezolucije.

Korak 4: PWM za kontrolu servo motora

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 50Hz. Takođe, širina impulsa od 1 do 2 ms određuje kutni položaj servo pogona.

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

Korak 5: Analogno snimanje

Analog Capture
Analog Capture

Periferija analogno -digitalne konverzije

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

Primijenjeni napon ne smije prelaziti raspon 0 do 3V.

Izvršena konverzija ne održava konstantnu grešku za sve napone uzorkovane, a sve ovisi o konfiguriranom rasponu. Za raspon od 150mV na 2, 450V, provjera ponašanja je potrebna za kritičnije aplikacije.

Za hvatanje ćemo koristiti potenciometar od 10k kao razdjelnik napona. Snimanje će se vrš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 tačke i servera

Izjave

Uključujem WiFi biblioteku i definiram neke varijable.

#include // uključuje biblioteku WiFi const int freq = 50; // frekvencija do PWM const int channel_A = 0; // glavni kanal do kontrolera LED_PWM const int kanal_B = 1; // segundo kanal za kontrolu LED_PWM const int resolucao = 12; // Resolução usado bez kontrole LED_PWM const int pin_Atuacao_A = 13; // Pino para onde na kanalu 0 será redirecionado const int pin_Atuacao_B = 12; // Pino para na kanalu 1 redirecionado const char* ssid = "ESP32ap"; // konstantno povezivanje sa SSID -om na WiFi putem pristupa ESP32 const char* password = "12345678"; // senha para confirmmação de conexão no ponto de acesso const int port = 2; // porta na kvalitetu ili primanje servidora kao conexões int ciclo_A = 0; // variável que Receberá o ciclo de atuação do kanala A int ciclo_B = 0; // Variable que Receberá o ciclo de atuação to channel A WiFiServer server (port); // deklarira da objekat poslužitelja IPAddress myIP; // deklaracija o promjeni IP -a

Postaviti ()

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

void setup () {pinMode (pin_Atuacao_A, OUTPUT); // definiranje pino de atuação A como saída pinMode (pin_Atuacao_B, OUTPUT); // definiranje pino de atuação B como saída ledcSetup (canal_A, freq, resolucao); // Podesite kanal 0 za frekvencije od 50 Hz i rezoluciju od 12 bita ledcSetup (kanal_B, frekvencija, rezolucija); // Podesite kanal 1 za frekvencije od 50 Hz i rezoluciju od 12 bita ledcAttachPin (pin_Atuacao_A, kanal_A); // redirecionando o kanalu 0 para pino 13 ledcAttachPin (pin_Atuacao_B, channel_B); // redirecionando o kanalu 1 para pino 12 ledcWrite (kanal_A, ciclo_A); // definiranje hrabrosti do PWM para 0 ledcWrite (canal_B, ciclo_B); // definiranje hrabrosti do PWM -a, para 0

Započeli smo serijsku, pristupnu točku sa SSID -om ESP32ap i lozinkom. Zatim dobijamo IP servera i pokrećemo server.

Serial.begin (115200); // iniciando serijski Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, lozinka); // početni pristup ili pristup za SSID ESP32ap i senzor 12345678 Serial.println ("Obtendo IP"); // mensagem myIP = WiFi.softAPIP (); // dobivanje IP servera (kao što nije konfigurirano za podešavanje servera ili opreme) 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. Proverite da li je 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 varijabli podataka.

void loop () {WiFiClient klijent = server.available (); // se povezuje klijent, pridružuje se različitim klijentima if (cliente.connected ()) {// se povezuje klijent konektado String dados = ""; // inicia a variável que Receberá os Dados Serial.println ("Cliente conectado."); // spominju // leia os caracteres para a variável c dados = dados + c; // concatene c na variável dados

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

if (c == '\ n') {// prikazuje um novog karaktera za ponovni prijem int virgula = dados.indexOf (','); // nabavljamo pelo índice do caracter ',' na string em dados ciclo_A = (dados.substring (0, virgula)). toInt (); // obrtajte podniz u até antes da vírgula i pretvorite para inteiro ciclo_B = dados.substring (virgula + 1, dados.length ()). toInt (); // obtenha podniz u pretvaraču i pretvorite u 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, potvrda o fim da conexão kašnjenje (50); // aguarda um momento cliente.stop (); Serial.println ("Nenhum cliente conectado."); // mensagem delay (1000); // aguarda um segundo antes de reiniciar}

Korak 8: Izvorni kod korisnika

Izjave

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

#include const char* ssid = "ESP32ap"; // SSID za pristup ESP32 const char* password = "12345678"; // Senha para accesscessor 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 deitutacija do ADC0 const int pin_Leitura_B = 39; // GPIO oznaka za ADC3 int ciclo_A = 0; // varijable que receberá o hrabrosti do ciklo do PWM A int ciclo_B = 0; // Variável que receberá o hrabrosti do ciklo do PWM B WiFiClient klijenta; // deklaração do objeto cliente

Postaviti ()

Definiramo GPIO -ove kao ulaz, pokrećemo serijsku vezu i povezujemo se s pristupnom točkom.

void setup () {pinMode (pin_Leitura_A, INPUT); // definiramo GPIO kao unos pinMode (pin_Leitura_B, INPUT); // definirati 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 serverom, što znači drugi ESP.

void loop () {// nije potrebno spojiti ao ponto de acesso, tenta se spojiti while (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " - Conectando bez WiFi" + ssid + "…"); // mensagem WiFi.begin (ssid, lozinka); kašnjenje (2000); } Serial.println (String (millis ()) + " - Conectado …"); // mensagem // ne morate spojiti ao servidor, tenta se spojiti dok (! cliente.connect (host, port)) {Serial.println (String (millis ()) + " - Conectando bez Servidora" + host + ":" + port + "…"); // mensagem delay (1000); }

U ovom koraku, dok smo povezani s poslužiteljem, izvršavamo varijable za spremanje očitanja ADC0 i ADC3. Takođe smo izvršili očitavanje 500 uzoraka i usrednili očitavanja. Mapirali smo očitanje kako bismo stvorili ispravno trajanje za kontrolu servo -a, te ga spojili i poslali na poslužitelj.

// enquanto estiver conectado ao servidor while (cliente.connected ()) {int leitura_A = 0; // varijable para armazenar i ADC0 int leitura_B = 0; // varijable para armazenar i ADC3 int amostras = 500; // nummero 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 to servo ciclo_B = map (leitura_B, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para controle to servo // concatena e envia para 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, garantira que a conexão foi finalizaada cliente.stop (); Serial.println (String (millis ()) + " - cliente desconectado …"); // mensagem}

Korak 9: Datoteke

Preuzmite datoteke:

PDF

JA NE

Preporučuje se: