विषयसूची:

ESP32 के साथ PANTILT कैमरा: 9 कदम
ESP32 के साथ PANTILT कैमरा: 9 कदम

वीडियो: ESP32 के साथ PANTILT कैमरा: 9 कदम

वीडियो: ESP32 के साथ PANTILT कैमरा: 9 कदम
वीडियो: ESP32-Cam Complete Guide 2024, नवंबर
Anonim
Image
Image
ESP32. के साथ PANTILT कैमरा
ESP32. के साथ PANTILT कैमरा

आज, मैं पैन टिल्ट पेश करूंगा, जो एक ऐसा उपकरण है जो कैमरे को ऊपर, नीचे और किनारों की दिशा में ले जाने में सक्षम बनाता है। मैंने खुद इस डिवाइस को दो सर्वो और ईएसपी 32 का उपयोग करके 3 डी प्रिंटेड भागों के माध्यम से बनाया है, जिससे वाईफाई के माध्यम से इस तंत्र को नियंत्रित करना संभव हो जाता है। आइए फिर हम ESP32 के AD चैनलों के साथ-साथ नियंत्रक LED_PWM का उपयोग करके एक एनालॉग ऑपरेशन का उपयोग करके रीडिंग लें। साथ ही, हम TCP/IP कनेक्शन पर नियंत्रण लागू करते हैं।

वीडियो में, आप देख सकते हैं कि मेरे पास दो पोटेंशियोमीटर के मूल्यों को पढ़ने वाला एक ESP32 है, जो दूसरे ESP32 को (वाईफाई के माध्यम से) भेजा जाता है। यह दो सर्वो मोटर्स से जुड़ा है। बर्तन के माध्यम से आपके द्वारा किए गए नियंत्रण के आधार पर, कैमरा ऊपर, नीचे या किनारे की दिशाओं में चलता है (और पैन टिल्ट से जुड़ा होता है)।

पैन टिल्ट 3डी प्रिंट डिजाइन का लिंक यहां पाया जा सकता है:

चरण 1: प्रयुक्त संसाधन

प्रयुक्त संसाधन
प्रयुक्त संसाधन

• कनेक्शन के लिए एकाधिक जंपर्स

• दो नोड MCU ESP32s

• ESP32 के लिए दो USB केबल

• नियंत्रण के लिए एक वेब कैमरा

• दो नियंत्रण बर्तन

• एक प्रोटोबार्ड

• सर्वो के लिए एक स्रोत

चरण 2: NodeMCU ESP32S - पिनआउट

NodeMCU ESP32S - पिनआउट
NodeMCU ESP32S - पिनआउट

चरण 3: ESP32 पेरिफेरल्स

ESP32 पेरिफेरल्स
ESP32 पेरिफेरल्स

PWM पेरिफेरल्स ESP32 में दो पेरिफेरल्स हैं जो PWM सिग्नल जेनरेट करने में सक्षम हैं। इनमें पावर और मोटर नियंत्रण के लिए डिज़ाइन किया गया पल्स चौड़ाई मॉड्यूलेटर (एमसीपीडब्लूएम) इंजन और एलईडी तीव्रता नियंत्रण के लिए विकसित एलईडी_पीडब्लूएम शामिल हैं। लेकिन इनका इस्तेमाल सामान्य तरीके से भी किया जा सकता है।

हम LED_PWM का उपयोग करेंगे, जो विन्यास योग्य अवधियों और कार्य चक्रों के साथ 16 स्वतंत्र PWM चैनल उत्पन्न कर सकता है। इसमें 16 बिट तक का रिज़ॉल्यूशन है।

चरण 4: सर्वो मोटर नियंत्रण PWM

सर्वो मोटर नियंत्रण पीडब्लूएम
सर्वो मोटर नियंत्रण पीडब्लूएम

सर्वो मोटर नियंत्रण विशिष्ट आवृत्ति के साथ एक वर्ग के पल्स चौड़ाई मॉडुलन को समायोजित करके किया जाता है।

इस्तेमाल किए गए सर्वो (साथ ही अधिकांश के लिए) के लिए, आवृत्ति 50 हर्ट्ज पर है। इसके अलावा, 1 से 2ms पल्स लंबाई की चौड़ाई सर्वो की कोणीय स्थिति निर्धारित करती है।

हम नियंत्रण करने के लिए इस जानकारी का उपयोग करते हुए, LED_PWM के चैनल 0 को GPIO13 और चैनल 1 को GPIO12 पर रूट करेंगे।

चरण 5: एनालॉग कैप्चर

एनालॉग कैप्चर
एनालॉग कैप्चर

डिजिटल रूपांतरण परिधीय के अनुरूप

ESP32 में एनालॉग-टू-डिजिटल कन्वर्टर्स हैं जिन्हें 18 चैनलों तक लागू किया जा सकता है, लेकिन केवल एनालॉग-सक्षम GPIO में।

लागू वोल्टेज 0 से 3V रेंज से अधिक नहीं होना चाहिए।

प्रदर्शन किया गया रूपांतरण सभी वोल्टेज के नमूने के लिए एक निरंतर त्रुटि नहीं रखता है, और यह सब कॉन्फ़िगर की गई सीमा पर निर्भर करता है। 2,450V पर 150mV की सीमा के लिए, अधिक महत्वपूर्ण अनुप्रयोगों के लिए व्यवहार जांच की आवश्यकता होती है।

कैप्चर करने के लिए, हम वोल्टेज डिवाइडर के रूप में 10k के पोटेंशियोमीटर का उपयोग करेंगे। कैप्चर चैनल ADC0 और ADC3 में किया जाएगा, जिसे GPIO36 और GPIO39 द्वारा एक्सेस किया जा सकता है।

चरण 6: सर्किट - सर्वर और क्लाइंट

सर्किट - सर्वर और क्लाइंट
सर्किट - सर्वर और क्लाइंट

चरण 7: एक्सेस प्वाइंट और सर्वर का स्रोत कोड

बयान

मैं वाईफाई पुस्तकालय शामिल करता हूं, और मैं कुछ चर परिभाषित करता हूं।

#include // inclusão da biblioteca WiFi const int freq = 50; // फ्रीक्वेंसी डू पीडब्लूएम कॉन्स्ट इंट कैनाल_ए = 0; // प्राइमिरो कैनाल डू कंट्रोलडोर LED_PWM कॉन्स्ट इंट कैनाल_बी = 1; // सेगुंडो कैनाल डू कंट्रोलडोर LED_PWM कॉन्स्ट इंट रेसोलुकाओ = 12; //Resolução usado no controlador LED_PWM const int pin_Atuacao_A = 13; // पिनो पैरा ओन्डे ओ कैनाल 0 सेरा रेडिरेसीओनाडो कॉन्स्ट int pin_Atuacao_B = 12; // पिनो पैरा ओन्डे ओ कैनाल 1 सेरा रेडिएरसीओनाडो कॉन्स्ट चार * एसएसआईडी = "ईएसपी 32एपी"; // कॉन्स्टेंट कॉम या एसएसआईडी डू वाईफाई डू पोंटो डी एसेसो ईएसपी 32 कॉन्स चार * पासवर्ड = "12345678"; // सेन्हा पैरा कन्फर्माकाओ डे कोनेक्सो नो पोंटो डे एसेसो कॉन्स्ट इंट पोर्ट = 2; // पोर्टा ना क्वाल ओ सर्विडोर रिसेबेरा as conexões int ciclo_A = 0; // वेरिआवेल क्यू रिसेबेरा ओ सिक्लो डे एटुआकाओ डो कैनाल ए इंट सिक्लो_बी = 0; // वेरिएबल क्यू रिसेबेरा ओ सिक्लो डी एटुआकाओ डो कैनाल एक वाईफाई सर्वर सर्वर (पोर्ट); //declaração do objeto servidor IPAddress myIP; //declaração da variável de IP

सेट अप ()

यहां, हम आउटपुट पिन को परिभाषित करते हैं। हम चैनलों को वांछित आवृत्ति पर सेट करते हैं और PWM मान सेट करते हैं।

शून्य सेटअप () {पिनमोड (pin_Atuacao_A, OUTPUT); // डेफिनिंडो ओ पिनो डे एटुआकाओ ए कॉमो सैदा पिनमोड (पिन_अटुआकाओ_बी, आउटपूट); // डेफिनिंडो ओ पिनो डे एटुआकाओ बी कॉमो सैदा एलईडीसेटअप (कैनल_ए, फ्रीक, रेसोलुकाओ); //Ajustando o canal 0 para frequência de 50 Hz e resolução de 12bits ledcSetup(canal_B, freq, resolucao); //Ajustando o canal 1 para frequência de 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); // पुनर्निर्देशन और नहर 1 पैरा ओ पिनो 12 एलईडीसीराइट (canal_A, ciclo_A); // डेफिनिंडो ओ वेलोर डू पीडब्लूएम पैरा 0 एलईडीसीराइट (कैनाल_बी, सिक्लो_बी); // निश्चित या वीरता पीडब्लूएम पैरा 0

हमने SSID ESP32ap और पासवर्ड के साथ सीरियल, एक्सेस प्वाइंट शुरू किया। फिर हम सर्वर का आईपी प्राप्त करते हैं और सर्वर शुरू करते हैं।

सीरियल.बेगिन (115200); //iniciando a Serial Serial.println("Iniciando ponto de acesso:" + String(ssid)); // mensagem WiFi.softAP (एसएसआईडी, पासवर्ड); //iniciando या 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 ("इनिसिएंडो सर्विडोर एम:" + स्ट्रिंग (पोर्ट)); // mensagem सर्वर। शुरू (); //iniciando या servidor }

कुंडली ()

लूप में, पहली चीज जो हम करने जा रहे हैं, वह है क्लाइंट को इंस्टेंट करना, क्लाइंट वेरिएबल से कनेक्ट और बाइंड करना। जांचें कि क्लाइंट कनेक्ट है या नहीं। यदि ऐसा है, तो हम वेरिएबल प्रारंभ करते हैं जो डेटा प्राप्त करेगा। जब तक कनेक्शन स्थापित हो जाता है, और यदि डेटा प्राप्त होता है, तो हम वेरिएबल c के लिए वर्णों को पढ़ते हैं। अंत में, हम c को डेटा वेरिएबल में जोड़ते हैं।

शून्य लूप () {वाईफाई क्लाइंट क्लाइंट = सर्वर उपलब्ध (); // से उम क्लाइंट कनेक्टर, एसोसिए ए वेरिएवल क्लाइंट अगर (क्लाइंट.कनेक्टेड ()) {//से हा उम क्लाइंट कनेक्टेडो स्ट्रिंग डैडोस = ""; //incia a variável que receberá os dados Serial.println("Cliente conectado."); // mensagem जबकि (cliente.connected ()) {//enquanto a conexão estiver estabelecida if (cliente.available ()) {//e se houver dados a receber char c = cliente.read (); // लीया ओएस कैरेक्टेरेस पैरा ए वेरिएवल सी डैडोस = डैडोस + सी; // कॉन्कैटेन सी और वेरिएवल डैडोस

यदि कोई न्यूलाइन कैरेक्टर प्राप्त होता है, तो हम डेटा में स्ट्रिंग में कैरेक्टर ',' के इंडेक्स की तलाश करते हैं। हमें अल्पविराम से ठीक पहले तक सबस्ट्रिंग मिलते हैं, और फिर हम उन्हें पूर्णांक में बदल देते हैं। हम चैनल A और B का PWM सेट करते हैं। हम वेरिएबल को क्लियर करते हैं।

if (c == '\n') {//se um caracter de nova linha for recebido int virgula = dados.indexOf(','); // प्रोक्योर पेलो इंडिस डू कैरेक्टर ',' और स्ट्रिंग एम डैडोस ciclo_A = (dados.substring(0, virgula)).toInt(); // अब एक सबस्ट्रिंग एटे एंटेस दा वर्गुला ई कन्वर्टा पैरा इंटीरो सिक्लो_बी = डैडोस.सबस्ट्रिंग (वर्गुला + 1, डैडोस.लेंथ ())। toInt ();// एक सबस्ट्रिंग एपोस ए वर्गुला और कन्वर्टा पैरा इंटीरो एलईडीसीराइट (canal_A, सिक्लो_ए); // अन्याय या पीडब्लूएम डू कैनाल ए एलईडीसीराइट (canal_B, ciclo_B); // अन्याय या पीडब्लूएम डो कैनाल बी डैडोस = ""; // लिम्पा ए वेरिअवेल } } } }

यदि क्लाइंट डिस्कनेक्ट हो जाता है, तो हम कनेक्शन के अंत की पुष्टि करते हैं। हम एक पल के लिए प्रतीक्षा करते हैं और "कोई क्लाइंट कनेक्ट नहीं है" प्रिंट करते हैं। फिर हम पुनः आरंभ करने से पहले एक और सेकंड प्रतीक्षा करते हैं।

// कासो ओ क्लाइंट से डिस्कोनेक्टे, कन्फर्म ओ फिम दा कॉन्क्सो डिले (50); // अगार्डा उम मोमेंटो क्लाइंट।स्टॉप (); Serial.println ("नेनहुम क्लाइंट कोनेक्टैडो।"); // मेनसेजम देरी (1000); // अगुआर्डा उम सेगुंडो एंटिस डी रीनिसिअर }

चरण 8: ग्राहक स्रोत कोड

बयान

हमने इस बार क्लाइंट पर वाईफाई लाइब्रेरी को फिर से शामिल किया है। इसके अलावा, हम चर को परिभाषित करते हैं।

#शामिल कास्ट चार* ssid = "ESP32ap"; //SSID do ponto de acesso ESP32 const char* password = "12345678"; // सेन्हा पैरा एसेसर ओ पोंटो डी एसेसो कॉन्स्ट uint16_t पोर्ट = 2; // पोर्टा डे एस्कुटा डो सर्विडोर कॉन्स्ट चार * होस्ट = "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; // वेरिएबल क्यू रिसेबेरा ओ वेलोर डू सिक्लो डू पीडब्लूएम ए इंट सिक्लो_बी = 0; // वेरिएबल क्यू रिसेबेरा ओ वेलोर डू सिक्लो डू पीडब्लूएम बी वाईफाई क्लाइंट क्लाइंट; //declaração do objeto cliente

सेट अप ()

हम GPIO को इनपुट के रूप में परिभाषित करते हैं, सीरियल शुरू करते हैं, और एक्सेस प्वाइंट से जुड़ते हैं।

शून्य सेटअप () {पिनमोड (pin_Leitura_A, INPUT); // GPIO कोमो एंटरडा पिनमोड को परिभाषित करें (pin_Leitura_B, INPUT); // GPIO कोमो एंटरडा Serial.begin (115200) को परिभाषित करें; //incia a comunicação सीरियल WiFi.begin(ssid, पासवर्ड); // कोनेक्टा एओ पोंटो डे एसेसो }

कुंडली ()

इस लूप में, हम सर्वर से जुड़ेंगे, जिसका अर्थ है अन्य ईएसपी।

शून्य लूप () {// से não conectado ao ponto de acesso, tanta se conectar जबकि (WiFi.status() != WL_CONNECTED) { Serial.println(String(millis()) + "- Conectando no WiFi" + ssid + "…"); // mensagem WiFi.begin (ssid, पासवर्ड); देरी (2000); } Serial.println (स्ट्रिंग (मिली ()) + "- Conectado…"); // mensagem // से não conectado ao servidor, tanta se conectar जबकि (!cliente.connect(host, port)) { Serial.println(String(millis()) + "- Conectando no Servidor" + host + ":" + पोर्ट + "…"); // मेनसेजम देरी (1000); }

इस चरण में, सर्वर से कनेक्ट होने के दौरान, हम ADC0 और ADC3 की रीडिंग को स्टोर करने के लिए वेरिएबल्स को निष्पादित करते हैं। साथ ही, हमने 500 नमूनों की रीडिंग की और रीडिंग का औसत निकाला। हमने सर्वो के नियंत्रण के लिए सही अवधि बनाने के लिए रीडिंग को मैप किया, और इसे सर्वर पर भेज दिया।

//enquanto estiver conectado ao servidor जबकि (cliente.connected()) { int leitura_A = 0; // वेरिएवल पैरा आर्मज़ेनर ए लेटुरा डू एडीसी0 इंट लिटुरा_बी = 0; // वेरिएवल पैरा आर्मजेनर ए लीटूरा डू एडीसी३ इंट एमोस्ट्रास = ५००; //número de amostras int contador = 0; // contador de amostras जबकि (contador < amostras) {//acumua várias leituras leitura_A = leitura_A + analogRead (pin_Leitura_A); leitura_B = leitura_B + AnalogRead(pin_Leitura_B); कोंटाडोर++; } leitura_A = leitura_A / amostras; // मीडिया दास लीतुरास लेटुरा_बी = लीतुरा_बी / एमोस्ट्रास; ciclo_A = नक्शा (leitura_A, 0, ४०९५, १४०, ४९०); // मैपिया ए लेइटुरा पैरा क्रिअर ए ड्यूराकाओ कोररेटा पैरा कंट्रोल डो सर्वो सिक्लो_बी = मैप (लेइटुरा_बी, 0, ४०९५, १४०, ४९०); // मैपिया ए लेइटुरा पैरा क्रिअर ए ड्यूराकाओ कोरेटा पैरा कंट्रोले डो सर्वो // कॉन्टेना ई एनविया पैरा ओ सर्विडोर क्लाइंट।प्रिंटल (स्ट्रिंग (सिकलो_ए) + "," + स्ट्रिंग (सिकलो_बी)); }

अंत में, यदि कनेक्ट नहीं है, तो हम सुनिश्चित करते हैं कि समकक्ष संदेश प्रदर्शित करके कनेक्शन समाप्त कर दिया गया है।

// से नो कोनेक्टैडो, गारंटी क्यू ए कॉन्क्सो फॉई फाइनलज़ादा क्लाइंट।स्टॉप (); Serial.println (स्ट्रिंग (मिली ()) + "- क्लाइंट डिस्कोनेक्टैडो…"); // मेनसेजम }

चरण 9: फ़ाइलें

फ़ाइलें डाउनलोड करें:

पीडीएफ

मैं नहीं

सिफारिश की: