Isi kandungan:

Kamera PANTILT Dengan ESP32: 9 Langkah
Kamera PANTILT Dengan ESP32: 9 Langkah

Video: Kamera PANTILT Dengan ESP32: 9 Langkah

Video: Kamera PANTILT Dengan ESP32: 9 Langkah
Video: Arduino IDE + ESP32 CAM | ESP32-CAM Video Streaming Web Server with Pan and Tilt Cam Mount (2 Axis) 2024, Julai
Anonim
Image
Image
Kamera PANTILT Dengan ESP32
Kamera PANTILT Dengan ESP32

Hari ini, saya akan mempersembahkan PAN TILT, yang merupakan alat yang membolehkan pergerakan kamera untuk arah atas, bawah, dan ke sisi. Saya sendiri menghasilkan peranti ini melalui bahagian bercetak 3D, menggunakan dua servo dan ESP32, yang memungkinkan untuk mengawal mekanisme ini melalui WiFi. Mari kita kemudian membaca bacaan menggunakan saluran AD ESP32, dan juga operasi analog menggunakan pengawal LED_PWM. Juga, kami menerapkan kawalan pada sambungan TCP / IP.

Dalam video tersebut, anda dapat melihat bahawa saya mempunyai ESP32 membaca nilai dua potensiometer, yang dihantar (melalui WiFi) ke ESP32 yang lain. Ia disambungkan ke dua motor servo. Kamera bergerak (dan terpasang pada PAN TILT) ke arah atas, bawah, atau ke samping, bergantung pada kawalan yang anda buat melalui periuk.

Pautan ke reka bentuk cetak PAN TILT 3D boleh didapati di sini:

Langkah 1: Sumber yang Digunakan

Sumber Yang Digunakan
Sumber Yang Digunakan

• Pelompat berganda untuk sambungan

• Dua Node MCU ESP32s

• Dua kabel USB untuk ESP32

• Kamera Web untuk kawalan

• Dua periuk kawalan

• Protoboard

• Sumber untuk servos

Langkah 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Langkah 3: Periferal ESP32

Perisian ESP32
Perisian ESP32

Periferal PWM ESP32 mempunyai dua periferal yang mampu menghasilkan isyarat PWM. Ini termasuk enjin Pulse Width Modulator (MCPWM) yang direka untuk kawalan kuasa dan motor, dan LED_PWM, yang dikembangkan untuk kawalan intensiti LED. Tetapi ia juga boleh digunakan secara umum.

Kami akan menggunakan LED_PWM, yang dapat menghasilkan 16 saluran PWM bebas dengan tempoh dan kitaran kerja yang boleh dikonfigurasi. Ia mempunyai resolusi sehingga 16 bit.

Langkah 4: PWM Kawalan Motor Servo

Kawalan Motor Servo PWM
Kawalan Motor Servo PWM

Kawalan motor servo dilakukan dengan menyesuaikan modulasi lebar nadi segiempat dengan frekuensi tertentu.

Untuk servo yang digunakan (dan juga untuk kebanyakan), frekuensi berada pada 50Hz. Juga, lebar nadi 1 hingga 2ms menentukan kedudukan sudut servo.

Kami akan mengarahkan saluran 0 LED_PWM ke GPIO13, dan saluran 1 ke GPIO12, menggunakan maklumat ini untuk melakukan kawalan.

Langkah 5: Tangkapan Analog

Rakaman Analog
Rakaman Analog

Perisian penukaran analog ke digital

ESP32 mempunyai penukar analog-ke-digital yang dapat diterapkan dalam hingga 18 saluran, tetapi hanya pada GPIO yang dibolehkan analog.

Voltan yang dikenakan tidak boleh melebihi julat 0 hingga 3V.

Penukaran yang dilakukan tidak mengekalkan ralat berterusan untuk semua voltan yang disampel, dan ini semua bergantung pada julat yang dikonfigurasi. Untuk julat 150mV pada 2, 450V, pemeriksaan tingkah laku diperlukan untuk aplikasi yang lebih kritikal.

Untuk penangkapan, kami akan menggunakan potensiometer 10k sebagai pembahagi voltan. Penangkapan akan dilakukan di saluran ADC0 dan ADC3, dapat diakses oleh GPIO36 dan GPIO39.

Langkah 6: Litar - Pelayan dan Pelanggan

Litar - Pelayan dan Pelanggan
Litar - Pelayan dan Pelanggan

Langkah 7: Kod Sumber Titik Akses dan Pelayan

Penyataan

Saya menyertakan perpustakaan WiFi, dan saya menentukan beberapa pemboleh ubah.

#include // inclusão da biblioteca WiFi const int freq = 50; // freência do PWM const int canal_A = 0; // kanal primeiro do controlador LED_PWM const int canal_B = 1; // terusan segundo 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"; // conste com o SSID do WiFi do ponto de acesso 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 Pelayan WiFiServer (port); // Dekaração do objeto servidor IPAdress myIP; // dekaração da variável de IP

Persediaan ()

Di sini, kami menentukan pin output. Kami menetapkan saluran ke frekuensi yang diingini dan menetapkan nilai PWM.

batal persediaan () {pinMode (pin_Atuacao_A, OUTPUT); // definindo o pino de atuação PinMode como saída (pin_Atuacao_B, OUTPUT); // definindo o pino de atuação B como saída ledcSetup (canal_A, freq, resolucao); // Ajustando o canal 0 para frequncia de 50 Hz e resolução de 12bits ledcSetup (canal_B, freq, resolucao); // Ajustando o kanal 1 untuk frekuensi 50 Hz e 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

Kami memulakan siri, titik akses dengan SSID ESP32ap, dan kata laluan. Kami kemudian mendapat IP pelayan dan memulakan pelayan.

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

Gelung ()

Di Loop, perkara pertama yang akan kita lakukan adalah memberi contoh kepada klien, menghubungkan dan mengikat kepada pemboleh ubah klien. Periksa sama ada pelanggan tersambung. Sekiranya demikian, kami memulakan pemboleh ubah yang akan menerima data. Selagi sambungan dibuat, dan jika data diterima, kita membaca watak-watak untuk pemboleh ubah c. Akhirnya, kami menggabungkan c dalam pemboleh ubah data.

gelung kosong () {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 houver dados a receiver char c = cliente.read (); // leia os caracteres para a variável c dados = dados + c; // concatene c na variável dados

Sekiranya watak barisan baru diterima, kita mencari indeks watak ',' dalam rentetan dalam data. Kami mendapat substring sehingga tepat sebelum koma, dan kemudian kami menukarnya menjadi bilangan bulat. Kami menetapkan PWM saluran A dan B. Kami membersihkan pemboleh ubahnya.

if (c == '\ n') {// se um caracter de nova linha untuk penerimabb int virgula = dados.indexOf (','); // dapatkan 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 apos a vírgula e converta para inteiro ledcWrite (kanal_A, ciclo_A); // Ajusta o PWM do canal A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do canal B dados = ""; // Limpa a variável}}}}

Sekiranya pelanggan memutuskan hubungan, kami mengesahkan berakhirnya sambungan. Kami menunggu sebentar dan mencetak "Tiada pelanggan yang disambungkan". Kami kemudian menunggu sesaat lagi sebelum memulakan semula.

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

Langkah 8: Kod Sumber Pelanggan

Penyataan

Kami telah memasukkan perpustakaan WiFi sekali lagi, kali ini kepada pelanggan. Kami juga menentukan pemboleh ubah.

#masuk const char * ssid = "ESP32ap"; // SSID lakukan 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; // 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 pelanggan; // Dekaração do objeto cliente

Persediaan ()

Kami mendefinisikan GPIO sebagai input, memulakan siri, dan menyambung ke titik akses.

batal persediaan () {pinMode (pin_Leitura_A, INPUT); // tentukan o GPIO como entrada pinMode (pin_Leitura_B, INPUT); // tentukan o GPIO como entrada Serial.begin (115200); // inicia a comunicação siri WiFi.begin (SSID, kata laluan); // conecta ao ponto de acesso}

Gelung ()

Dalam Gelung ini, kami akan menyambung ke pelayan, yang bermaksud ESP yang lain.

gelung void () {// se não conectado ao ponto de acesso, tenta se conectar while (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + "- Conectando no WiFi" + ssid + "…"); // mensagem WiFi.begin (ssid, kata laluan); kelewatan (2000); } Serial.println (String (milis ()) + "- Conectado…"); // mensagem // se não conectado ao servidor, tenta se conectar while (! cliente.connect (host, port)) {Serial.println (String (millis ()) + "- Conectando no Servidor" + host + ":" + port + "…"); // kelewatan mensagem (1000); }

Pada langkah ini, semasa disambungkan ke pelayan, kami melaksanakan pemboleh ubah untuk menyimpan pembacaan ADC0 dan ADC3. Kami juga membaca 500 sampel dan rata-rata bacaannya. Kami memetakan bacaan untuk membuat jangka masa yang betul untuk kawalan servos, dan menggabungkan dan menghantarnya ke pelayan.

// enquanto estiver conectado ao servidor manakala (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 manakala (contador <amostras) {// acumua várias leituras leitura_A = leitura_A + analogRead (pin_Leitura_A); leitura_B = leitura_B + analogRead (pin_Leitura_B); contador ++; } leitura_A = leitura_A / amostras; // média das leituras leitura_B = leitura_B / amostras; ciclo_A = peta (leitura_A, 0, 4095, 140, 490); // mapeia a leitura para criar a duração coreta para controle do servo ciclo_B = peta (leitura_B, 0, 4095, 140, 490); // mapeia a leitura para criar a duração coreta para controle do servo // concatena e envia para o servidor cliente.println (String (ciclo_A) + "," + String (ciclo_B)); }

Akhirnya, jika tidak disambungkan, kami memastikan bahawa sambungan telah ditamatkan dengan memaparkan mesej yang setara.

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

Langkah 9: Fail

Muat turun fail:

PDF

INO

Disyorkan: