Daftar Isi:

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, November
Anonim
Image
Image
Kamera PANTILT Dengan ESP32
Kamera PANTILT Dengan ESP32

Hari ini, saya akan menghadirkan PAN TILT, yaitu perangkat yang memungkinkan pergerakan kamera ke arah atas, bawah, dan ke samping. Saya sendiri memproduksi perangkat ini melalui komponen cetak 3D, menggunakan dua servo dan ESP32, yang memungkinkan untuk mengontrol mekanisme ini melalui WiFi. Mari kita lakukan pembacaan menggunakan saluran AD dari ESP32, serta operasi analog menggunakan pengontrol LED_PWM. Juga, kami menerapkan kontrol atas koneksi TCP / IP.

Dalam video, Anda dapat melihat bahwa saya memiliki ESP32 yang membaca nilai dari dua potensiometer, yang dikirim (melalui WiFi) ke ESP32 lain. Itu terhubung ke dua motor servo. Kamera bergerak (dan terpasang pada PAN TILT) ke arah atas, bawah, atau samping, tergantung pada kontrol yang Anda buat melalui pot.

Tautan ke desain cetak 3D PAN TILT dapat ditemukan di sini:

Langkah 1: Sumber Daya yang Digunakan

Sumber Daya yang Digunakan
Sumber Daya yang Digunakan

• Beberapa jumper untuk koneksi

• Dua Node MCU ESP32s

• Dua kabel USB untuk ESP32

• WebCam untuk kontrol

• Dua pot kontrol

• Protoboard

• Sebuah sumber untuk servos

Langkah 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Langkah 3: Periferal ESP32

Periferal ESP32
Periferal ESP32

Periferal PWM ESP32 memiliki dua periferal yang mampu menghasilkan sinyal PWM. Ini termasuk engine Pulse Width Modulator (MCPWM) yang dirancang untuk kontrol daya dan motor, dan LED_PWM, yang dikembangkan untuk kontrol intensitas LED. Tetapi mereka juga dapat digunakan secara umum.

Kami akan menggunakan LED_PWM, yang dapat menghasilkan 16 saluran PWM independen dengan periode dan siklus kerja yang dapat dikonfigurasi. Ini memiliki resolusi hingga 16 bit.

Langkah 4: Kontrol Motor Servo PWM

Kontrol Motor Servo PWM
Kontrol Motor Servo PWM

Kontrol motor servo dilakukan dengan mengatur modulasi lebar pulsa persegi dengan frekuensi tertentu.

Untuk servo yang digunakan (dan juga sebagian besar), frekuensinya berada pada 50Hz. Juga, lebar 1 hingga 2 ms panjang pulsa menentukan posisi sudut servo.

Kami akan merutekan saluran 0 dari LED_PWM ke GPIO13, dan saluran 1 ke GPIO12, menggunakan informasi ini untuk melakukan kontrol.

Langkah 5: Tangkapan Analog

Tangkapan Analog
Tangkapan Analog

Periferal konversi analog ke digital

ESP32 memiliki konverter analog-ke-digital yang dapat diterapkan hingga 18 saluran, tetapi hanya pada GPIO yang mendukung analog.

Tegangan yang diberikan tidak boleh melebihi kisaran 0 hingga 3V.

Konversi yang dilakukan tidak mempertahankan kesalahan konstan untuk semua tegangan sampel, dan ini semua tergantung pada rentang yang dikonfigurasi. Untuk kisaran 150mV pada 2, 450V, pemeriksaan perilaku diperlukan untuk aplikasi yang lebih kritis.

Untuk penangkapannya, kita akan menggunakan potensiometer 10k sebagai pembagi tegangan. Pengambilan akan dilakukan di saluran ADC0 dan ADC3, dapat diakses oleh GPIO36 dan GPIO39.

Langkah 6: Sirkuit - Server dan Klien

Sirkuit - Server dan Klien
Sirkuit - Server dan Klien

Langkah 7: Kode Sumber Titik Akses dan Server

Pernyataan

Saya menyertakan perpustakaan WiFi, dan saya mendefinisikan beberapa variabel.

#include // incluso da biblioteca WiFi const int freq = 50; //frekuncia melakukan PWM const int canal_A = 0; //primeiro canal do controlador LED_PWM const int canal_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"; //constante com o SSID melakukan WiFi melakukan ponto de acesso ESP32 const char* password = "12345678"; //senha untuk konfirmasi de conexão no ponto de acesso const int port = 2; //porta na qual o server receberá sebagai 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 lakukan kanal Server WiFiServer(port); //deklarasikan lakukan objeto server IPAddress myIP; //deklarasikan da variável de IP

Mempersiapkan ()

Di sini, kita mendefinisikan pin output. Kami mengatur saluran ke frekuensi yang diinginkan dan mengatur nilai PWM.

void setup(){ pinMode(pin_Atuacao_A, OUTPUT); //definisikan pino de atuação A como saída pinMode(pin_Atuacao_B, OUTPUT); //definindo atau pino de atuação B como saída ledcSetup(canal_A, freq, resolucao); //Menyesuaikan kanal 0 untuk frekuensi 50 Hz dan resolusi 12bit ledcSetup(kanal_B, frekuensi, resolusi); //Menyesuaikan kanal 1 untuk frekuensi 50 Hz dan resolusi 12 bit ledcAttachPin(pin_Atuacao_A, canal_A); //redirectionando o canal 0 para o pino 13 ledcAttachPin(pin_Atuacao_B, canal_B); //redirectionando o canal 1 para o pino 12 ledcWrite(canal_A, ciclo_A); //mendefinisikan keberanian melakukan PWM para 0 ledcWrite(canal_B, ciclo_B); //definisikan keberanian melakukan PWM para 0

Kami memulai serial, titik akses dengan SSID ESP32ap, dan kata sandi. Kami kemudian mendapatkan IP server dan memulai server.

Serial.begin(115200); //iniciando a Serial Serial.println("Iniciando ponto de acesso: " + String(ssid)); //mensagem WiFi.softAP (ssid, password); //iniciando ponto de acesso com SSID ESP32ap dan senha 12345678 Serial.println("Obtendo IP"); //mensagem myIP = WiFi.softAPIP(); //obtendo o IP do server (como não foi configurado deverá ser o padrão de fábrica) Serial.println("IP: " + WiFi.localIP()); //mensagem Serial.println("Iniciando server em: " + String(port)); //mensagem server.begin(); //iniciando atau pelayan }

Lingkaran ()

Di Loop, hal pertama yang akan kita lakukan adalah membuat instance klien, menghubungkan dan mengikat ke variabel klien. Periksa apakah klien terhubung. Jika demikian, kita mulai variabel yang akan menerima data. Selama koneksi dibuat, dan jika data diterima, kami membaca karakter untuk variabel c. Akhirnya, kami menggabungkan c dalam variabel data.

void loop() { klien WiFiClient = server.available(); //se um klien conectar, associe a variável klien if (cliente.connected()) { //se há um klien conectado String dados = ""; //inicia a variável que receberá os dados Serial.println("Client conectado."); //mensagem while (cliente.connected()) { //enquanto a conexão estiver estabelecida if (cliente.available()) { //se houver dados a receber char c = cliente.read(); //leia os caracteres para a variável c dados = dados + c; //menggabungkan c na variável dados

Jika karakter baris baru diterima, kami mencari indeks karakter ', ' dalam string di data. Kami mendapatkan substring sampai tepat sebelum koma, dan kemudian kami mengubahnya menjadi integer. Kami mengatur PWM saluran A dan B. Kami menghapus variabel.

if (c == '\n') { //se um caracter de nova linha untuk 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, ciclo_A); //Ajusta o PWM lakukan kanal A ledcWrite(canal_B, ciclo_B); //Ajusta o PWM lakukan kanal B dados = ""; //Limpa a variável } } } }

Jika klien terputus, kami mengkonfirmasi akhir koneksi. Kami menunggu sebentar dan mencetak "Tidak ada klien yang terhubung". Kami kemudian menunggu satu detik lagi sebelum memulai kembali.

// caso o client se desconecte, konfirmasi fim da conexão delay(50); //aguarda um momento cliente.stop(); Serial.println("Nenhum klien terhubung."); //mensage delay(1000); //aguarda um segundo antes de reiniciar }

Langkah 8: Kode Sumber Pelanggan

Pernyataan

Kami telah menyertakan perpustakaan WiFi lagi, kali ini pada klien. Juga, kami mendefinisikan variabel.

#include const char* ssid = "ESP32ap"; //SSID melakukan ponto de acesso ESP32 const char* kata sandi = "12345678"; //Senha para acessar ke ponto de acesso const uint16_t port = 2; //Porta de escuta do servidor const char * host = "192.168.4.1"; //endereço IP melakukan servidor const int pin_Leikura_A = 36; //GPIO dengan waktu luang melakukan ADC0 const int pin_Leitur_B = 39; //GPIO dengan waktu luang melakukan 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 klien WiFiClient; //declaração do objeto cliente

Mempersiapkan ()

Kami mendefinisikan GPIO sebagai input, memulai serial, dan menghubungkan ke titik akses.

void setup(){ pinMode(pin_Leitur_A, INPUT); //menentukan GPIO como entrada pinMode(pin_Leitura_B, INPUT); //menentukan GPIO dan memasukkan Serial.begin(115200); //inicia a comunicao serial WiFi.begin(ssid, password); //konekta ao ponto de acesso }

Lingkaran ()

Dalam Loop ini, kita akan terhubung ke server, artinya ESP yang lain.

void loop(){ //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,password); penundaan(2000); } Serial.println(String(millis()) + " - Conectado…"); //mensagem //se não conectado ao service, tenta se conectar while (!cliente.connect(host, port)) { Serial.println(String(millis()) + " - Conectando no Servidor " + host + ":" + port + "…"); //mensage delay(1000); }

Pada langkah ini, saat terhubung ke server, kami mengeksekusi variabel untuk menyimpan pembacaan ADC0 dan ADC3. Juga, kami melakukan pembacaan 500 sampel dan rata-rata pembacaan. Kami memetakan pembacaan untuk membuat durasi yang benar untuk kontrol servos, dan menggabungkan dan mengirimkannya ke server.

//enquanto estiver conectado ao layanan 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 = leikura_B + analogBaca(pin_Leitura_B); kontador++; } leitura_A = leitur_A / amostras; //média das leituras leitura_B = leitura_B / amostras; ciclo_A = peta(leitur_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 server cliente.println(String(ciclo_A) + ", " + String(ciclo_B)); }

Terakhir, jika tidak terhubung, kami memastikan bahwa koneksi telah dihentikan dengan menampilkan pesan yang setara.

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

Langkah 9: File

Unduh file:

PDF

SAYA TIDAK

Direkomendasikan: