İçindekiler:

ESP32'li PANTILT Kamera: 9 Adım
ESP32'li PANTILT Kamera: 9 Adım

Video: ESP32'li PANTILT Kamera: 9 Adım

Video: ESP32'li PANTILT Kamera: 9 Adım
Video: Yönlü Hareket Sensörü Olarak ESP32-CAM | Cadılar Bayramı Animatronic Eğlencesi! 2024, Kasım
Anonim
Image
Image
ESP32'li PANTILT Kamera
ESP32'li PANTILT Kamera

Bugün bir kameranın yukarı, aşağı ve yanlara doğru hareket etmesini sağlayan bir cihaz olan PAN TILT'i tanıtacağım. Bu cihazı kendim 3D baskılı parçalarla, iki servo ve bu mekanizmayı WiFi üzerinden kontrol etmeyi mümkün kılan ESP32 kullanarak ürettim. Ardından ESP32'nin AD kanallarını kullanarak okumaları ve ayrıca LED_PWM denetleyicisini kullanarak bir analog işlemi alalım. Ayrıca kontrolü bir TCP/IP bağlantısı üzerinden uyguluyoruz.

Videoda, (WiFi üzerinden) başka bir ESP32'ye gönderilen iki potansiyometrenin değerlerini okuyan bir ESP32'ye sahip olduğumu görebilirsiniz. İki servo motora bağlıdır. Kamera, tencerelerden yaptığınız kontrole bağlı olarak yukarı, aşağı veya yan yönlerde hareket eder (ve PAN TILT'e takılıdır).

PAN TILT 3D baskı tasarımının bağlantısı burada bulunabilir:

Adım 1: Kullanılan Kaynaklar

Kullanılan Kaynaklar
Kullanılan Kaynaklar

• Bağlantı için çoklu jumperlar

• İki Düğüm MCU ESP32

• ESP32 için iki USB kablosu

• Kontrol için bir Web Kamerası

• İki kontrol kabı

• Bir protokol

• Servolar için bir kaynak

2. Adım: NodeMCU ESP32S - Pin çıkışı

NodeMCU ESP32S - Pin çıkışı
NodeMCU ESP32S - Pin çıkışı

3. Adım: ESP32 Çevre Birimleri

ESP32 Çevre Birimleri
ESP32 Çevre Birimleri

PWM Çevre Birimleri ESP32, PWM sinyalleri üretebilen iki çevre birimine sahiptir. Bunlar, güç ve motor kontrolü için tasarlanmış Darbe Genişlik Modülatörü (MCPWM) motorunu ve LED yoğunluk kontrolü için geliştirilmiş LED_PWM'yi içerir. Ancak genel anlamda da kullanılabilirler.

Yapılandırılabilir periyotlar ve çalışma döngüleri ile 16 bağımsız PWM kanalı üretebilen LED_PWM'yi kullanacağız. 16 bit çözünürlüğe sahiptir.

Adım 4: Servo Motor Kontrol PWM

Servo Motor Kontrol PWM
Servo Motor Kontrol PWM

Servo motor kontrolü, belirli bir frekansa sahip bir karenin darbe genişlik modülasyonunu ayarlayarak gerçekleştirilir.

Kullanılan servo için (ve çoğu için), frekans 50Hz'dir. Ayrıca 1 ila 2 ms darbe uzunluğu genişliği servonun açısal konumunu belirler.

Kontrolü gerçekleştirmek için bu bilgiyi kullanarak LED_PWM'nin 0 kanalını GPIO13'e ve kanal 1'i GPIO12'ye yönlendireceğiz.

Adım 5: Analog Yakalama

Analog Yakalama
Analog Yakalama

Analogdan dijitale dönüştürme çevre birimi

ESP32, 18 kanala kadar uygulanabilen, ancak yalnızca analog özellikli GPIO'larda uygulanabilen analogdan dijitale dönüştürücülere sahiptir.

Uygulanan voltaj 0 ila 3V aralığını geçmemelidir.

Gerçekleştirilen dönüştürme, örneklenen tüm voltajlar için sabit bir hata sağlamaz ve bunların tümü, yapılandırılan aralığa bağlıdır. 2, 450V'de 150mV'lik bir aralık için, daha kritik uygulamalar için bir davranış kontrolü gereklidir.

Yakalama için voltaj bölücü olarak 10k'lık bir potansiyometre kullanacağız. Yakalama, GPIO36 ve GPIO39 tarafından erişilebilen ADC0 ve ADC3 kanallarında yapılacaktır.

Adım 6: Devre - Sunucu ve İstemci

Devre - Sunucu ve İstemci
Devre - Sunucu ve İstemci

Adım 7: Erişim Noktası ve Sunucunun Kaynak Kodu

İfadeler

WiFi kütüphanesini ekliyorum ve bazı değişkenleri tanımlıyorum.

#include // biblioteca dahil WiFi const int freq = 50; //frequência do PWM const int canal_A = 0; //ana kanal kontrol cihazı LED_PWM const int canal_B = 1; //segundo canal do controlador LED_PWM const int resolucao = 12; // ABD'de kontrol cihazı yok LED_PWM const int pin_Atuacao_A = 13; //Pino para onde o kanal 0 dizi yeniden yönlendirme const int pin_Atuacao_B = 12; //Pino para onde o kanal 1 sunucu redirecionado const char* ssid = "ESP32ap"; //constante com o SSID Wi-Fi'yi ağ bağlantısına bağla ESP32 const char* şifre = "12345678"; // onaylanmadan önce onaylanmadı, bağlantı noktası yok, sabit bağlantı noktası = 2; //conexões int ciclo_A = 0; //değişken que receberá o ciclo de atuação do canal A int ciclo_B = 0; //bir WiFiSunucusu sunucusu(bağlantı noktası); // sunucu IPAdresi myIP; // IP değişkenlerini bildir

Kurmak ()

Burada çıkış pinlerini tanımlıyoruz. Kanalları istenilen frekansa ayarlayıp PWM değerini ayarlıyoruz.

void setup(){ pinMode(pin_Atuacao_A, OUTPUT); //çevrimiçi pinMode(pin_Atuacao_B, OUTPUT); //çözümleme ve güncelleme ayarları (canal_A, freq, resolucao); //Ajustando o kanal 0 para frekansı de 50 Hz ve resolução de 12bit ledcSetup(canal_B, freq, resolucao); //Ajustando o kanal 1 para frekans de 50 Hz ve resolução de 12 bit ledcAttachPin(pin_Atuacao_A, canal_A); //redirecionando o kanal 0 para o pino 13 ledcAttachPin(pin_Atuacao_B, canal_B); //redirecionando o kanal 1 para o pino 12 ledcWrite(canal_A, ciclo_A); //PWM para 0'ın değerini tanımlayın ledcWrite(canal_B, ciclo_B); // PWM para 0'ı tanımla veya valor yap

Seriyi, erişim noktasını SSID ESP32ap ve şifre ile başlattık. Daha sonra sunucunun IP'sini alıyoruz ve sunucuyu başlatıyoruz.

Seri.başla(115200); //iniciando a Serial Serial.println("Iniciando ponto de acesso: " + String(ssid)); //mensagem WiFi.softAP (ssid, şifre); // SSID ESP32ap ve senha 12345678 Serial.println("Obtendo IP"); //mensagem myIP = WiFi.softAPIP (); // IP sunucu hizmeti (yapılandırma için mevcut değil) Serial.println("IP: " + WiFi.localIP()); //mensagem Serial.println("Iniciando sunucu em: " + String(port)); //mensagem server.begin(); //iniciando veya sunucu }

Döngü ()

Loop'ta yapacağımız ilk şey, istemci değişkenine bağlanıp bağlanarak istemciyi başlatmaktır. İstemcinin bağlı olup olmadığını kontrol edin. Eğer öyleyse, verileri alacak olan değişkeni başlatıyoruz. Bağlantı kurulduğu sürece ve eğer veri alınırsa, c değişkeni için karakterleri okuruz. Son olarak, veri değişkeninde c'yi birleştiriyoruz.

void loop() { WiFiClient cliente = server.available(); // müşteri bağlantıları, değişken istemcileri ilişkilendirme if (cliente.connected()) { //bu istemci bağlantıları String dados = ""; // çok değişkenli bir değişken var. Serial.println("İstemci bağlantısı."); //mensagem while (cliente.connected()) { //enquanto bir conexão estiver estabelecida if (cliente.available()) { //e bir receber char c = cliente.read(); // leia os caracteres para a değişkeni c dados = dados + c; // değişken değişkenleri birleştirir

Bir satırsonu karakteri alınırsa, verilerdeki dizede ',' karakterinin dizinini ararız. Alt dizeleri virgülden hemen öncesine kadar alırız ve sonra onları tamsayıya dönüştürürüz. A ve B kanallarının PWM'sini ayarlıyoruz. Değişkeni temizliyoruz.

if (c == '\n') { //recebido int virgula = dados.indexOf(', '); // pelo índice do caracter ', ' na string em dados ciclo_A = (dados.substring(0, virgula))).toInt(); //bir alt dizgiyi bir alt dizgiyi bir bütünleşik ciclo_B = dados.substring(virgula + 1, dados.length()) ile elde edin; ciclo_A); //Ajusta o PWM do canal A ledcWrite(canal_B, ciclo_B); //Ajusta o PWM do canal B dados = ""; //Bir değişkeni sınırlayın } } } }

İstemcinin bağlantısı kesilirse, bağlantının sona erdiğini onaylarız. Bir an bekleriz ve "Müşteri bağlı değil" yazdırırız. Daha sonra yeniden başlatmadan önce bir saniye daha bekleriz.

// istemci ve bağlantının kaldırılması, gecikmenin onaylanması (50); //korumaya devam et cliente.stop(); Serial.println("Nenhum cliente conectado."); //menagem gecikmesi(1000); // aguarda um segundo antes de reiniciar }

Adım 8: Müşteri Kaynak Kodu

İfadeler

WiFi kütüphanesini bu sefer istemciye tekrar dahil ettik. Ayrıca değişkenleri tanımlıyoruz.

#include const char* ssid = "ESP32ap"; //SSID ponto de acesso ESP32 const char* şifre = "12345678"; //Senha para acessar o ponto de acesso const uint16_t bağlantı noktası = 2; //Bağlantı noktası, sunucu const char * ana bilgisayar = "192.168.4.1"; //endereço IP do server 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; // ciclo do PWM A int ciclo_B = 0; //PWM B WiFiClient istemcisi için geçerli olan değişkenler; // müşteriyi nesne olarak ilan et

Kurmak ()

GPIO'ları giriş olarak tanımlıyoruz, seriyi başlatıyoruz ve erişim noktasına bağlanıyoruz.

geçersiz kurulum(){ pinMode(pin_Leitura_A, INPUT); //tanımla o GPIO ortak giriş pinMode(pin_Leitura_B, INPUT); //tanımla o GPIO ortak giriş Serial.begin(115200); // bir comunicação seri WiFi.begin(ssid, şifre); //bağlantı noktası ponto de acesso }

Döngü ()

Bu Döngüde diğer ESP anlamına gelen sunucuya bağlanacağız.

void loop(){ //en bağımsız bağlantı, bağlantı noktası, geçici bağlantı while (WiFi.status() != WL_CONNECTED) { Serial.println(String(millis()) + " - WiFi bağlantısı yok " + ssid + "…"); //mensagem WiFi.begin(ssid, şifre); gecikme(2000); } Serial.println(String(millis()) + " - Conectado…"); //mensagem //bağlantısız sunucu, geçici bağlantı while (!cliente.connect(host, port)) { Serial.println(String(millis()) + " - Sunucusuz Conectando " + ana bilgisayar + ":" + bağlantı noktası + "…"); //menagem gecikmesi(1000); }

Bu adımda sunucuya bağlıyken ADC0 ve ADC3 okumalarını depolamak için değişkenleri çalıştırıyoruz. Ayrıca, 500 örneğin okumasını gerçekleştirdik ve okumaların ortalamasını aldık. Servoların kontrolü için doğru süreyi oluşturmak için okumanın haritasını çıkardık ve birleştirerek sunucuya gönderdik.

//enquanto estiver conectado ao sunucu while (cliente.connected()) { int leitura_A = 0; //değişken para armazenar a leitura do ADC0 int leitura_B = 0; //değişken para armazenar a leitura do ADC3 int amostras = 500; //número de amostras int contador = 0; //contador de amostras while (contador < amostras) { //acumua değişkenleri 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 = harita(leitura_A, 0, 4095, 140, 490); //mapeia a leitura para criar a duração correta para kontrole do servo ciclo_B = map(leitura_B, 0, 4095, 140, 490); //servo için bir duraç kontrolü parasal kontrol //envia envia para o sunucu cliente.println(String(ciclo_A) + ", " + String(ciclo_B)); }

Son olarak bağlı değilse, eşdeğer mesajı görüntüleyerek bağlantının sonlandırıldığından emin oluyoruz.

//birbirine bağlı değil, müşteriye.stop(); Serial.println(String(millis()) + " - istemci desconectado…"); //mensagem }

9. Adım: Dosyalar

Dosyaları indirin:

PDF

BEN HAYIR

Önerilen: