Kazalo:

Kamera PANTILT z ESP32: 9 koraki
Kamera PANTILT z ESP32: 9 koraki

Video: Kamera PANTILT z ESP32: 9 koraki

Video: Kamera PANTILT z ESP32: 9 koraki
Video: ESP32-CAM - Guide to making YOUR first DIY Security Camera 2024, November
Anonim
Image
Image
PANTILT kamera z ESP32
PANTILT kamera z ESP32

Danes bom predstavil PAN TILT, ki je naprava, ki omogoča premikanje kamere za smeri navzgor, navzdol in v stranice. Sam sem to napravo izdelal prek 3D tiskanih delov, z uporabo dveh servomotorjev in ESP32, kar omogoča nadzor tega mehanizma prek WiFi. Nato vzemimo odčitke z uporabo AD kanalov ESP32, pa tudi analogno delovanje s krmilnikom LED_PWM. Uporabljamo tudi nadzor nad povezavo TCP / IP.

V videoposnetku lahko vidite, da imam ESP32, ki bere vrednosti dveh potenciometrov, ki sta poslana (prek WiFi) drugemu ESP32. Povezan je z dvema servo motorjema. Kamera se premika (in je pritrjena na PAN TILT) v smeri navzgor, navzdol ali vstran, odvisno od nadzora, ki ga izvajate skozi lončke.

Povezavo do oblikovanja 3D tiska PAN TILT najdete tukaj:

1. korak: Uporabljeni viri

Uporabljeni viri
Uporabljeni viri

• Več mostičkov za povezavo

• Dva vozlišča MCU ESP32

• Dva kabla USB za ESP32

• Spletna kamera za nadzor

• Dva kontrolna lonca

• Protoboard

• Vir za servomotorje

2. korak: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Korak: ESP32 zunanje naprave

ESP32 periferne enote
ESP32 periferne enote

PWM periferne enote ESP32 ima dve zunanji napravi, ki lahko ustvarjata signale PWM. Med njimi sta motor Pulse Width Modulator (MCPWM), zasnovan za krmiljenje moči in motorja, ter LED_PWM, razvit za nadzor intenzivnosti LED. Lahko pa jih uporabimo tudi generično.

Uporabili bomo LED_PWM, ki lahko ustvari 16 neodvisnih kanalov PWM z nastavljivimi obdobji in delovnimi cikli. Ima do 16 bitov ločljivosti.

Korak: Krmiljenje PWM servo motorja

PWM krmiljenje servo motorja
PWM krmiljenje servo motorja

Krmiljenje servo motorja se izvede s prilagajanjem modulacije širine impulza kvadrata s posebno frekvenco.

Za uporabljeni servo (kot tudi za večino) je frekvenca 50Hz. Tudi širina impulza od 1 do 2 ms določa kotni položaj servomotorja.

Kanal 0 LED_PWM bomo preusmerili v GPIO13 in kanal 1 v GPIO12, pri čemer bomo te podatke uporabili za izvajanje nadzora.

5. korak: Analogni zajem

Analogni zajem
Analogni zajem

Periferna enota za analogno -digitalno pretvorbo

ESP32 ima analogno-digitalne pretvornike, ki jih je mogoče uporabiti v do 18 kanalih, vendar le v analognih GPIO-jih.

Uporabljena napetost ne sme presegati območja od 0 do 3 V.

Izvedena pretvorba ne vzdržuje konstantne napake za vse vzorčene napetosti, vse pa je odvisno od konfiguriranega območja. Za območje 150mV pri 2, 450V je za bolj kritične aplikacije potreben preverjanje obnašanja.

Za zajem bomo kot delilnik napetosti uporabili potenciometer 10k. Zajem bo izveden v kanalih ADC0 in ADC3, do katerih lahko dostopata GPIO36 in GPIO39.

6. korak: Krog - strežnik in odjemalec

Vezje - strežnik in odjemalec
Vezje - strežnik in odjemalec

7. korak: izvorna koda dostopne točke in strežnika

Izjave

Vključujem knjižnico WiFi in definiram nekatere spremenljivke.

#include // vključuje biblioteco WiFi const int freq = 50; // frekvenca do PWM const int channel_A = 0; // primeiro channel do controlador LED_PWM const int canal_B = 1; // segundo channel 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 kanalu 0 será redirecionado const int pin_Atuacao_B = 12; // Pino para onde o channel 1 será redirecionado const char* ssid = "ESP32ap"; // konstantno povezovanje SSID -a z WiFi -jem prek povezave 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 kanala A int ciclo_B = 0; // spremenljivka za preverjanje o kanalu Strežnik WiFiServer (vrata); // razglasi objektu strežnika IP naslov MyIP; // razglasi spremenljivko IP

Nastaviti ()

Tu definiramo izhodne zatiče. Kanale nastavimo na želeno frekvenco in nastavimo vrednost 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); // Nastavitev kanala 0 za frekvenco 50 Hz in resolucijo 12bit ledcSetup (kanal_B, frekvenca, resolucija); // Ajustando o kanalu 1 za frekvenco 50 Hz in resolucijo 12bit ledcAttachPin (pin_Atuacao_A, channel_A); // preusmeritev kanala 0 para o pino 13 ledcAttachPin (pin_Atuacao_B, kanal_B); // redirecionando o kanalu 1 para o pino 12 ledcWrite (kanal_A, ciclo_A); // opredelitev valor do PWM para 0 ledcWrite (channel_B, ciclo_B); // Določitev o hrabrosti do PWM, odstavek 0

Začeli smo serijsko, dostopno točko s SSID ESP32ap in geslom. Nato dobimo IP strežnika in zaženemo strežnik.

Serial.begin (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + niz (ssid)); // mensagem WiFi.softAP (ssid, geslo); // iniciando o ponto de acesso com SSID ESP32ap e senha 12345678 Serial.println ("Obtendo IP"); // mensagem myIP = WiFi.softAPIP (); // obiskujte IP do strežnika (kot ni mogoče konfigurirati deverá ser o padrão de fábrica) Serial.println ("IP:" + WiFi.localIP ()); // mensagem Serial.println ("Iniciando servidor em:" + niz (vrata)); // mensagem server.begin (); // iniciando o servidor}

Zanka ()

V Loopu bomo najprej naredili primerek odjemalca, ga povezali in povezali s spremenljivko odjemalca. Preverite, ali je odjemalec povezan. Če je tako, zaženemo spremenljivko, ki bo prejela podatke. Dokler je povezava vzpostavljena in če so podatki prejeti, beremo znake za spremenljivko c. Nazadnje povežemo c v podatkovni spremenljivki.

void loop () {odjemalci WiFiClient = 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 še vedno nahajata kot receber char c = cliente.read (); // leia os caracteres para a variaável c dados = dados + c; // concatene c na variaável dados

Če je prejet znak nove vrstice, poiščemo indeks znaka ',' v nizu v podatkih. Podniz dobimo tik pred vejico, nato pa jih pretvorimo v celo število. Nastavimo PWM kanalov A in B. Počistimo spremenljivko.

if (c == '\ n') {// se um caracter de nova linha for recebido int virgula = dados.indexOf (','); // nabavi pelo índice do caracter ',' na niz 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 podtring 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}}}}

Če odjemalec prekine povezavo, potrdimo konec povezave. Počakamo trenutek in natisnemo »No client connected«. Nato pred ponovnim zagonom počakamo še sekundo.

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

8. korak: Izvorna koda stranke

Izjave

Knjižnico WiFi smo ponovno vključili, tokrat na odjemalca. Določimo tudi spremenljivke.

#include const char* ssid = "ESP32ap"; // SSID za dostop do 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; // Variável que receberá o valor do ciclo do PWM B WiFiClient client; // deklaração do objeto cliente

Nastaviti ()

GPIO -je opredelimo kot vhodne, zaženemo serijo in se povežemo z dostopno točko.

void setup () {pinMode (pin_Leitura_A, INPUT); // opredelimo GPIO kot como entrada pinMode (pin_Leitura_B, INPUT); // opredelimo o GPIO kot vnos Serial.begin (115200); // inicia a comunicação serijski WiFi.begin (ssid, geslo); // conecta ao ponto de acesso}

Zanka ()

V tej zanki se bomo povezali s strežnikom, kar pomeni drugi ESP.

void loop () {// ni povezano z ao ponto de acesso, tenta se povezuje medtem ko (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " - Conectando brez WiFi" + ssid + "…"); // mensagem WiFi.begin (ssid, geslo); zamuda (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 + ":" + vrata + "…"); // zakasnitev mensagema (1000); }

V tem koraku, ko smo povezani s strežnikom, izvedemo spremenljivke za shranjevanje odčitkov ADC0 in ADC3. Opravili smo tudi branje 500 vzorcev in povprečje odčitkov. Branje smo preslikali, da bi ustvarili pravilno trajanje za upravljanje servomotorjev, ga združili in poslali na strežnik.

// 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 + analogno branje (pin_Leitura_B); contador ++; } leitura_A = leitura_A / amostras; // média das leituras leitura_B = leitura_B /amostras; ciclo_A = zemljevid (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)); }

Nazadnje, če nismo povezani, zagotovimo, da je bila povezava prekinjena, tako da prikažemo enakovredno sporočilo.

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

9. korak: Datoteke

Prenesite datoteke:

PDF

JAZ NE

Priporočena: