Sisällysluettelo:

PANTILT -kamera, jossa ESP32: 9 askelta
PANTILT -kamera, jossa ESP32: 9 askelta

Video: PANTILT -kamera, jossa ESP32: 9 askelta

Video: PANTILT -kamera, jossa ESP32: 9 askelta
Video: Control 32 Servo over Wi-Fi using ESP32 and PCA9685 via desktop or mobile phone V5 2024, Heinäkuu
Anonim
Image
Image
PANTILT -kamera, jossa ESP32
PANTILT -kamera, jossa ESP32

Esittelen tänään PAN TILTin, joka on kamera, joka mahdollistaa kameran liikkeen ylös, alas ja sivuille. Itse valmistin tämän laitteen 3D -tulostettujen osien kautta käyttämällä kahta servoa ja ESP32: ta, mikä mahdollistaa tämän mekanismin ohjaamisen WiFi -yhteyden kautta. Otetaan sitten lukemat käyttämällä ESP32: n AD -kanavia sekä analoginen toiminto ohjaimella LED_PWM. Käytämme myös TCP / IP -yhteyden valvontaa.

Videosta näet, että minulla on ESP32, joka lukee kahden potentiometrin arvot, jotka lähetetään (WiFi -yhteyden kautta) toiseen ESP32 -laitteeseen. Se on kytketty kahteen servomoottoriin. Kamera liikkuu (ja on kiinnitetty PAN TILT -laitteeseen) ylös-, alas- tai sivusuunnassa riippuen ruukkujen läpi tekemästäsi ohjauksesta.

Linkki PAN TILT 3D -tulostussuunnitteluun löytyy täältä:

Vaihe 1: Käytetyt resurssit

Käytetyt resurssit
Käytetyt resurssit

• Useita kytkimiä

• Kaksi solmua MCU ESP32

• Kaksi ESP32 -USB -kaapelia

• Web -kamera ohjausta varten

• Kaksi ohjausastiaa

• Protoboard

• Servojen lähde

Vaihe 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Vaihe 3: ESP32 -oheislaitteet

ESP32 -oheislaitteet
ESP32 -oheislaitteet

PWM -oheislaitteet ESP32: ssa on kaksi oheislaitetta, jotka pystyvät tuottamaan PWM -signaaleja. Näitä ovat tehon ja moottorin ohjaukseen suunniteltu pulssileveysmodulaattori (MCPWM) ja LED -voimakkuuden säätöön kehitetty LED_PWM. Mutta niitä voidaan käyttää myös yleisellä tavalla.

Käytämme LED_PWM: ää, joka voi luoda 16 itsenäistä PWM -kanavaa, joilla on määritettävissä olevat jaksot ja työkierrot. Siinä on jopa 16 bittiä resoluutiota.

Vaihe 4: Servomoottorin ohjaus PWM

Servomoottorin ohjaus PWM
Servomoottorin ohjaus PWM

Servomoottorin ohjaus suoritetaan säätämällä neliön pulssileveysmodulaatiota tietyllä taajuudella.

Käytetyssä servossa (samoin kuin useimmissa) taajuus on 50 Hz. Myös 1 - 2 ms: n pulssin pituus määrittää servon kulma -asennon.

Reititämme LED_PWM -kanavan 0 GPIO13: een ja kanavan 1 GPIO12: een käyttämällä näitä tietoja ohjauksen suorittamiseen.

Vaihe 5: Analoginen sieppaus

Analoginen sieppaus
Analoginen sieppaus

Analoginen digitaaliseen muuntamiseen tarkoitettu oheislaite

ESP32: ssa on analogia-digitaalimuuntimet, joita voidaan käyttää jopa 18 kanavalla, mutta vain analogisia GPIO-laitteita.

Käytetty jännite ei saa ylittää 0–3 V: n aluetta.

Suoritetussa muunnoksessa ei ole jatkuvaa virhettä kaikilla otetuilla jännitteillä, ja tämä kaikki riippuu määritetystä alueesta. 150 mV: n alueella 2, 450 V: n käyttäytymistarkistus vaaditaan kriittisempiin sovelluksiin.

Tallennuksessa käytämme 10k: n potentiometriä jännitteenjakajana. Sieppaus suoritetaan kanavilla ADC0 ja ADC3, joihin pääsee GPIO36: n ja GPIO39: n kautta.

Vaihe 6: Piiri - palvelin ja asiakas

Piiri - palvelin ja asiakas
Piiri - palvelin ja asiakas

Vaihe 7: Tukiaseman ja palvelimen lähdekoodi

Lausunnot

Sisällytän WiFi -kirjaston ja määritän muuttujia.

#include // inclusão da biblioteca WiFi const int freq = 50; // frequência do PWM const int kanava_A = 0; // primeiro canal do controlador LED_PWM const int kanava_B = 1; // segundo canal do controlador LED_PWM const int resolucao = 12; // Ratkaisu ei valvontaa 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"; // vakiomuotoinen tai SSID -yhteys langattomaan verkkoon 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 -palvelin (portti); // deklaração do objeto servidor IPAddress myIP; // IP -osoitteen muuttujan ilmoitus

Perustaa ()

Tässä määritellään ulostulonastat. Asetamme kanavat halutulle taajuudelle ja asetamme PWM -arvon.

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 for Frequência de 50 Hz and resolução de 12bits ledcSetup (canal_B, freq, resolucao); // Ajustando o canal 1 for Frequência de 50 Hz and resolução de 12bits 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

Aloitimme sarjan, tukiaseman SSID ESP32ap -laitteella ja salasanalla. Saamme sitten palvelimen IP -osoitteen ja aloitamme palvelimen.

Sarja.alku (115200); // aloita Serial Serial.println ("Iniciando ponto de acesso:" + Jono (ssid)); // mensagem WiFi.softAP (ssid, salasana); // SSID ESP32ap ja 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:" + Jono (portti)); // mensagem server.begin (); // iniciando o servidor}

Silmukka ()

Loopissa ensimmäinen asia, jonka aiomme tehdä, on asiakkaan hetkellinen luominen, yhdistäminen ja sitoutuminen asiakasmuuttujaan. Tarkista, onko asiakas yhteydessä. Jos näin on, aloitamme muuttujan, joka vastaanottaa tiedot. Niin kauan kuin yhteys on muodostettu ja jos dataa vastaanotetaan, luemme muuttujan c merkit. Lopuksi ketjutamme c datamuuttujassa.

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 ("Asiakasyhteys."); // mensagem while (cliente.connected ()) {// enquanto a conexão estiver estabelecida if (cliente.available ()) {// e se houver dados a receber char c = cliente.read (); // löytää os caracteres para a variável c dados = dados + c; // concatene c na variável dados

Jos vastaanotetaan uuden rivin merkki, etsimme datan merkkijonosta merkin ',' indeksin. Saamme alimerkkijonot ennen pilkkua ja muunnamme ne sitten kokonaislukuiksi. Asetamme kanavien A ja B PWM. Tyhjennämme muuttujan.

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

Jos asiakas katkaisee yhteyden, vahvistamme yhteyden päättymisen. Odotamme hetken ja tulostamme "Ei asiakasta yhdistetty". Odotamme sitten toisen sekunnin ennen kuin aloitamme uudelleen.

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

Vaihe 8: Asiakkaan lähdekoodi

Lausunnot

Olemme lisänneet WiFi -kirjaston uudelleen, tällä kertaa asiakkaan päälle. Lisäksi määritämme muuttujat.

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

Perustaa ()

Määritämme GPIO: t tuloksi, aloitamme sarjan ja muodostamme yhteyden tukiasemaan.

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

Silmukka ()

Tässä silmukassa muodostamme yhteyden palvelimeen, eli toiseen ESP: hen.

void loop () {// koska se ei ole mahdollista, kun ponto de acesso, tenta se conectar while (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " - Conectando no WiFi" + ssid + "…"); // mensagem WiFi.begin (ssid, salasana); viive (2000); } Sarja.println (Jono (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 + ":" + portti + "…"); // mensagem delay (1000); }

Tässä vaiheessa, kun olemme yhteydessä palvelimeen, suoritamme muuttujat ADC0- ja ADC3 -lukujen tallentamiseksi. Lisäksi luimme 500 näytettä ja laskimme lukemien keskiarvon. Kartoimme lukeman luodaksemme oikean keston servojen ohjaukselle ja yhdistämällä ja lähettämällä sen palvelimelle.

// enquanto estiver conectado ao servidor while (cliente.connected ()) {int leitura_A = 0; // variavel 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 + analoginen luku (pin_Leitura_B); contador ++; } leitura_A = leitura_A / amostras; // média das leituras leitura_B = leitura_B /amostras; ciclo_A = kartta (leitura_A, 0, 4095, 140, 490); // mapeia a leitura para criar a duração korreta para controle do servo ciclo_B = kartta (leitura_B, 0, 4095, 140, 490); // mapeia a leitura para criar a duração korjaus para controle do servo // concatena e envia para o servidor cliente.println (String (ciclo_A) + "," + String (ciclo_B)); }

Lopuksi, jos yhteyttä ei ole muodostettu, varmistamme, että yhteys on katkaistu näyttämällä vastaava viesti.

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

Vaihe 9: Tiedostot

Lataa tiedostot:

PDF

INO

Suositeltava: