Satura rādītājs:

PANTILT kamera ar ESP32: 9 soļi
PANTILT kamera ar ESP32: 9 soļi

Video: PANTILT kamera ar ESP32: 9 soļi

Video: PANTILT kamera ar ESP32: 9 soļi
Video: ESP32-CAM - Guide to making YOUR first DIY Security Camera 2024, Jūlijs
Anonim
Image
Image
PANTILT kamera ar ESP32
PANTILT kamera ar ESP32

Šodien es iepazīstināšu ar PAN TILT, kas ir ierīce, kas ļauj pārvietot kameru virzienos uz augšu, uz leju un uz sāniem. Es pats ražoju šo ierīci, izmantojot 3D drukātas detaļas, izmantojot divus servos un ESP32, kas ļauj kontrolēt šo mehānismu, izmantojot WiFi. Pēc tam ņemsim rādījumus, izmantojot ESP32 AD kanālus, kā arī analogo darbību, izmantojot kontrolieri LED_PWM. Mēs arī kontrolējam TCP / IP savienojumu.

Videoklipā varat redzēt, ka man ir ESP32, kas nolasa abu potenciometru vērtības, kuras tiek nosūtītas (izmantojot WiFi) uz citu ESP32. Tas ir savienots ar diviem servomotoriem. Kamera pārvietojas (un ir pievienota PAN TILT) augšup, lejup vai uz sāniem atkarībā no vadības, ko veicat caur katliem.

Saite uz PAN TILT 3D drukas dizainu atrodama šeit:

1. darbība. Izmantotie resursi

Izmantotie resursi
Izmantotie resursi

• Vairāki džemperi savienošanai

• Divu mezglu MCU ESP32

• Divi USB kabeļi ESP32

• Tīmekļa kamera kontrolei

• Divi vadības podi

• protobords

• Servo avots

2. solis: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

3. darbība: ESP32 perifērijas ierīces

ESP32 perifērijas ierīces
ESP32 perifērijas ierīces

PWM perifērijas ierīces ESP32 ir divas perifērijas ierīces, kas spēj ģenerēt PWM signālus. Tie ietver impulsa platuma modulatora (MCPWM) dzinēju, kas paredzēts jaudas un motora vadībai, un LED_PWM, kas izstrādāts LED intensitātes kontrolei. Bet tos var izmantot arī vispārīgā veidā.

Mēs izmantosim LED_PWM, kas var ģenerēt 16 neatkarīgus PWM kanālus ar konfigurējamiem periodiem un darba cikliem. Tam ir līdz 16 bitu izšķirtspēja.

4. solis: Servo motora vadība PWM

Servomotoru vadība PWM
Servomotoru vadība PWM

Servomotora vadība tiek veikta, pielāgojot kvadrāta impulsa platuma modulāciju ar noteiktu frekvenci.

Izmantotajam servo (kā arī lielākajai daļai) frekvence ir 50 Hz. Arī impulsa garums no 1 līdz 2 ms nosaka servo leņķisko stāvokli.

Mēs novirzīsim LED_PWM 0. kanālu uz GPIO13 un 1. kanālu uz GPIO12, izmantojot šo informāciju, lai veiktu vadību.

5. darbība: analoga tveršana

Analog Capture
Analog Capture

Analogā un digitālā pārveidošanas perifērija

ESP32 ir analogu-ciparu pārveidotāji, kurus var izmantot līdz 18 kanāliem, bet tikai GPIO, kas nodrošina analogu.

Spriegums nedrīkst pārsniegt diapazonu no 0 līdz 3 V.

Veiktā pārveidošana neuztur nemainīgu kļūdu visiem spriegumiem, kas ņemti paraugā, un tas viss ir atkarīgs no konfigurētā diapazona. 150 mV diapazonam pie 2, 450 V kritiskākām lietojumprogrammām ir jāpārbauda uzvedība.

Uzņemšanai mēs izmantosim 10k potenciometru kā sprieguma dalītāju. Uzņemšana tiks veikta kanālos ADC0 un ADC3, kuriem var piekļūt GPIO36 un GPIO39.

6. darbība: ķēde - serveris un klients

Ķēde - serveris un klients
Ķēde - serveris un klients

7. darbība: piekļuves punkta un servera avota kods

Paziņojumi

Es iekļauju WiFi bibliotēku un definēju dažus mainīgos.

#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 kanāls_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"; // nemainīgs SSID vai WiFi, lai piekļūtu 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 (ports); // deklaração do objeto servidor IPAddress myIP; // deklarācija par IP variāciju

Uzstādīt ()

Šeit mēs definējam izejas tapas. Mēs iestatām kanālus vēlamajā frekvencē un iestatām PWM vērtību.

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 0

Mēs sākām sēriju, piekļuves punktu ar SSID ESP32ap un paroli. Pēc tam mēs iegūstam servera IP un sākam serveri.

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

Cilpa ()

Programmā Loop pirmā lieta, ko mēs darīsim, ir klienta parauga izveidošana, savienojot un saistot ar klienta mainīgo. Pārbaudiet, vai klients ir savienots. Ja tā, mēs sākam mainīgo, kas saņems datus. Kamēr savienojums ir izveidots un dati tiek saņemti, mēs lasām mainīgā c rakstzīmes. Visbeidzot, datu mainīgajā mēs savienojam 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 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

Ja tiek saņemta jaunas rindas rakstzīme, datu virknē mēs meklējam rakstzīmes “,” indeksu. Mēs iegūstam apakšvirknes līdz pat komatam, un pēc tam pārvēršam tās par veselu skaitli. Mēs iestatām A un B kanālu PWM. Mēs notīrām mainīgo.

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 vai PWM do kanāls A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do kanāls B dados = ""; // Limpa a variável}}}}

Ja klients atvienojas, mēs apstiprinām savienojuma beigas. Mēs pagaidām kādu brīdi un izdrukājam “Nav pievienots klients”. Pēc tam mēs gaidām vēl vienu sekundi pirms restartēšanas.

// 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. darbība. Klienta avota kods

Paziņojumi

Mēs atkal esam iekļāvuši WiFi bibliotēku, šoreiz uz klienta. Mēs arī definējam mainīgos.

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

Uzstādīt ()

Mēs definējam GPIO kā ievadi, sākam sēriju un izveidojam savienojumu ar piekļuves punktu.

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

Cilpa ()

Šajā cilpā mēs izveidosim savienojumu ar serveri, kas nozīmē otru ESP.

void loop () {// tas nav iespējams, bet pēc tam būs nepieciešams, lai gan (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " - Conectando no WiFi" + ssid + "…"); // mensagem WiFi.begin (ssid, parole); kavēšanās (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 + ":" + ports + "…"); // mensagem delay (1000); }

Šajā solī, kamēr ir izveidots savienojums ar serveri, mēs izpildām mainīgos, lai saglabātu ADC0 un ADC3 nolasījumus. Mēs arī nolasījām 500 paraugus un aprēķinājām vidējos rādītājus. Mēs kartējām lasījumu, lai izveidotu pareizu servo vadības ilgumu, savienotu un nosūtītu to uz serveri.

// 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 + analogRead (pin_Leitura_B); kontadors ++; } leitura_A = leitura_A / amostras; // média das leituras leitura_B = leitura_B /amostras; ciclo_A = karte (leitura_A, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correctta para controle do servo ciclo_B = karte (leitura_B, 0, 4095, 140, 490); // mapeia a leitura para criar a duração koreta para controle do servo // concatena e envia para o servidor cliente.println (String (ciclo_A) + "," + String (ciclo_B)); }

Visbeidzot, ja nav izveidots savienojums, mēs nodrošinām savienojuma pārtraukšanu, parādot līdzvērtīgu ziņojumu.

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

9. darbība: faili

Lejupielādējiet failus:

PDF

ES NĒ

Ieteicams: