Turinys:

PANTILT kamera su ESP32: 9 žingsniai
PANTILT kamera su ESP32: 9 žingsniai

Video: PANTILT kamera su ESP32: 9 žingsniai

Video: PANTILT kamera su ESP32: 9 žingsniai
Video: Using Servo Motors with Arduino 2024, Lapkritis
Anonim
Image
Image
PANTILT kamera su ESP32
PANTILT kamera su ESP32

Šiandien pristatysiu „PAN TILT“, kuris yra prietaisas, leidžiantis judėti fotoaparatu aukštyn, žemyn ir į šonus. Aš pats gaminau šį įrenginį per 3D spausdintas dalis, naudodamas du servo įrenginius ir ESP32, o tai leidžia valdyti šį mechanizmą per „WiFi“. Tada imkime rodmenis naudodami ESP32 AD kanalus, taip pat analoginę operaciją naudodami valdiklį LED_PWM. Be to, mes valdome TCP / IP ryšį.

Vaizdo įraše galite pamatyti, kad turiu ESP32, rodančią dviejų potenciometrų vertes, kurios siunčiamos (per „WiFi“) į kitą ESP32. Jis prijungtas prie dviejų servo variklių. Fotoaparatas juda (ir yra pritvirtintas prie „PAN TILT“) aukštyn, žemyn arba į šoną, atsižvelgiant į valdymą, kurį atliekate per puodus.

Nuorodą į PAN TILT 3D spausdinimo dizainą rasite čia:

1 žingsnis: naudojami ištekliai

Naudojami ištekliai
Naudojami ištekliai

• Keli jungikliai prijungimui

• Dviejų mazgų MCU ESP32

• Du ESP32 USB kabeliai

• Interneto kamera, skirta valdyti

• Du valdymo puodai

• Protoboard

• Servo šaltinis

2 žingsnis: „NodeMCU ESP32S“- „Pinout“

„NodeMCU ESP32S“- „Pinout“
„NodeMCU ESP32S“- „Pinout“

3 žingsnis: ESP32 išoriniai įrenginiai

ESP32 išoriniai įrenginiai
ESP32 išoriniai įrenginiai

PWM išoriniai įrenginiai ESP32 turi du išorinius įrenginius, galinčius generuoti PWM signalus. Tai apima impulsinio pločio moduliatoriaus (MCPWM) variklį, skirtą galios ir variklio valdymui, ir LED_PWM, sukurtą LED intensyvumo valdymui. Bet jie taip pat gali būti naudojami bendrai.

Mes naudosime LED_PWM, kuris gali sukurti 16 nepriklausomų PWM kanalų su konfigūruojamais laikotarpiais ir darbo ciklais. Jis turi iki 16 bitų skiriamąją gebą.

4 žingsnis: Servo variklio valdymas PWM

Servo variklio valdymas PWM
Servo variklio valdymas PWM

Servo variklio valdymas atliekamas reguliuojant tam tikro dažnio kvadrato impulsų pločio moduliaciją.

Naudojamo servo (kaip ir daugumos) dažnis yra 50 Hz. Be to, 1–2 ms impulsų ilgio plotis lemia servo kampinę padėtį.

Naudodami šią informaciją valdymui atliksime LED_PWM 0 kanalą į GPIO13 ir 1 kanalą į GPIO12.

5 veiksmas: analoginis fiksavimas

Analoginis fiksavimas
Analoginis fiksavimas

Analoginis į skaitmeninį konvertavimo periferinis įrenginys

ESP32 turi analoginius skaitmeninius keitiklius, kurie gali būti naudojami iki 18 kanalų, bet tik GPIO, kuriuose yra analoginis ryšys.

Taikoma įtampa neturi viršyti 0–3 V diapazono.

Atlikta konversija neišlaiko nuolatinės klaidos visoms atrinktoms įtampoms, ir visa tai priklauso nuo sukonfigūruoto diapazono. 150 mV diapazone esant 2, 450 V, kritiškesnėms programoms reikia patikrinti elgseną.

Norėdami užfiksuoti, kaip įtampos daliklį naudosime 10k potenciometrą. Fotografavimas bus atliekamas naudojant kanalus ADC0 ir ADC3, pasiekiamus GPIO36 ir GPIO39.

6 veiksmas: grandinė - serveris ir klientas

Grandinė - serveris ir klientas
Grandinė - serveris ir klientas

7 veiksmas: prieigos taško ir serverio šaltinio kodas

Pareiškimai

Įtraukiu „WiFi“biblioteką ir apibrėžiu kai kuriuos kintamuosius.

#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 kanalas_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"; // nuolatinis SSID ar „Wi -Fi“ryšys su ESP32 const char* password = "12345678"; // senha para confirmaçã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); // deklaração do objeto servidor IPAddress myIP; // deklaração da variável de IP

Sąranka ()

Čia mes apibrėžiame išvesties kaiščius. Mes nustatome kanalus norimu dažniu ir nustatome PWM vertę.

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 canal 0 dažnis 50 Hz ir 12 bitų ledcSetup (canal_B, freq, resolucao) nustatymas; // „Ajustando o canal 1“dažnis 50 Hz ir rezoliucija 12 bitų ledcAttachPin (pin_Atuacao_A, canal_A); // redirecionando o canal 0 para o pino 13 ledcAttachPin (pin_Atuacao_B, canal_B); // redirecionando o canal 1 para o pino 12 ledcWrite (canal_A, ciclo_A); // definindo o valor do PWM para 0 ledcWrite (canal_B, ciclo_B); // definindo o valor do PWM para 0

Pradėjome serijinį, prieigos tašką naudodami SSID ESP32ap ir slaptažodį. Tada mes gauname serverio IP ir paleidžiame serverį.

Serial.begin (115200); // iniciand a a Serial Serial.println ("Iniciando ponto de acesso:" + Styga (ssid)); // mensagem WiFi.softAP (ssid, slaptažodis); // inicijuoti arba gauti prieigą prie SSID ESP32ap ir 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:" + Styga (prievadas)); // mensagem server.begin (); // iniciando o servidor}

Ciklas ()

„Loop“pirmas dalykas, kurį ketiname padaryti, yra kliento momentinis sujungimas, prisijungimas ir susiejimas su kliento kintamuoju. Patikrinkite, ar klientas prijungtas. Jei taip, pradedame kintamąjį, kuris gaus duomenis. Kol ryšys užmegztas ir jei gaunami duomenys, skaitome kintamojo c simbolius. Galiausiai duomenų kintamajame sujungiame c.

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 vará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 varável c dados = dados + c; // concatene c na variável dados

Jei gaunamas naujos eilutės simbolis, duomenų eilutėje ieškome simbolio „,“indekso. Poeilius gauname prieš pat kablelį, o tada konvertuojame į sveikus skaičius. Mes nustatome A ir B kanalų PWM. Išvalome kintamąjį.

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

Jei klientas atsijungia, patvirtiname ryšio pabaigą. Laukiame akimirką ir atspausdiname „Nėra kliento prijungtas“. Tada mes laukiame dar vieną sekundę prieš iš naujo paleisdami.

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

8 veiksmas: kliento šaltinio kodas

Pareiškimai

Vėl įtraukėme „WiFi“biblioteką, šį kartą į klientą. Be to, mes apibrėžiame kintamuosius.

#include const char* ssid = "ESP32ap"; // SSID prie ponto 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; // vará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

Sąranka ()

GPIO apibrėžiame kaip įvestį, paleidžiame serijinį ir prisijungiame prie prieigos taško.

void setup () {pinMode (pin_Leitura_A, INPUT); // define o GPIO como entrada pinMode (pin_Leitura_B, INPUT); // apibrėžti o GPIO como entrada Serial.begin (115200); // inicia a comunicação serial WiFi.begin (ssid, password); // conecta ao ponto de acesso}

Ciklas ()

Šioje kilpoje mes prisijungsime prie serverio, tai reiškia kitą ESP.

void loop () {// nesvarbu, kaip susigrąžinti ponto de acesso, tenta se conectar while (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " -„ Conectando no WiFi " + ssid + "…"); // mensagem WiFi.begin (ssid, slaptažodis); vėlavimas (2000 m.); } Serial.println (Styga (milis ()) + " - Conectado …"); // meniu + prievadas + „…“); // mensagem delay (1000); }

Šiame žingsnyje, būdami prisijungę prie serverio, vykdome kintamuosius, kad išsaugotume ADC0 ir ADC3 rodmenis. Be to, mes nuskaitėme 500 mėginių ir vidutiniškai parodėme. Mes susiejome rodmenis, kad sukurtume teisingą servo valdymo trukmę, sujungtume ir nusiųstume į serverį.

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

Galiausiai, jei nesate prisijungę, rodome lygiavertį pranešimą, kad ryšys būtų nutrauktas.

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

9 veiksmas: failai

Atsisiųskite failus:

PDF

AŠ NE

Rekomenduojamas: