جدول المحتويات:

كاميرا PANTILT مزودة بـ ESP32: 9 خطوات
كاميرا PANTILT مزودة بـ ESP32: 9 خطوات

فيديو: كاميرا PANTILT مزودة بـ ESP32: 9 خطوات

فيديو: كاميرا PANTILT مزودة بـ ESP32: 9 خطوات
فيديو: Build The Most EQUIPPED Security Camera with ESP32-CAM 2024, يوليو
Anonim
Image
Image
كاميرا PANTILT مع ESP32
كاميرا PANTILT مع ESP32

اليوم ، سأقدم PAN TILT ، وهو جهاز يتيح حركة الكاميرا للاتجاهات لأعلى ولأسفل وللجوانب. أنتج هذا الجهاز بنفسي من خلال أجزاء مطبوعة ثلاثية الأبعاد ، باستخدام مؤازرتين و ESP32 ، مما يجعل من الممكن التحكم في هذه الآلية من خلال WiFi. دعونا بعد ذلك نأخذ قراءات باستخدام قنوات AD الخاصة بـ ESP32 ، بالإضافة إلى عملية تمثيلية باستخدام وحدة التحكم LED_PWM. أيضًا ، نطبق التحكم في اتصال TCP / IP.

في الفيديو ، يمكنك أن ترى أن لدي ESP32 يقرأ قيم مقياسي الجهد اللذين يتم إرسالهما (عبر WiFi) إلى ESP32 آخر. إنه متصل بمحركين مؤازرين. تتحرك الكاميرا (وهي متصلة بـ PAN TILT) في اتجاهات لأعلى أو لأسفل أو جانبية ، اعتمادًا على التحكم الذي تقوم به من خلال الأواني.

يمكن العثور على رابط تصميم الطباعة ثلاثية الأبعاد PAN TILT هنا:

الخطوة 1: الموارد المستخدمة

الموارد المستخدمة
الموارد المستخدمة

• وصلات عبور متعددة للاتصال

• اثنين من العقدة MCU ESP32s

• كبلان USB لـ ESP32

• كاميرا ويب للتحكم

• وعاءان للتحكم

• لوح حماية

• مصدر للماكينة

الخطوة 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

الخطوة 3: ملحقات ESP32

ملحقات ESP32
ملحقات ESP32

ملحقات PWM يحتوي ESP32 على اثنين من الأجهزة الطرفية القادرة على توليد إشارات PWM. يتضمن ذلك محرك Pulse Width Modulator (MCPWM) المصمم للتحكم في الطاقة والمحرك ، و LED_PWM ، الذي تم تطويره للتحكم في شدة LED. ولكن يمكن أيضًا استخدامها بطريقة عامة.

سنستخدم LED_PWM ، والتي يمكنها توليد 16 قناة PWM مستقلة بفترات ودورات عمل قابلة للتكوين. لديها دقة تصل إلى 16 بت.

الخطوة 4: التحكم في محرك سيرفو PWM

التحكم في محرك سيرفو PWM
التحكم في محرك سيرفو PWM

يتم تنفيذ التحكم في محرك سيرفو عن طريق تعديل تعديل عرض النبضة لمربع بتردد محدد.

بالنسبة إلى المؤازرة المستخدمة (وكذلك لمعظمها) ، يكون التردد عند 50 هرتز. أيضًا ، يحدد عرض من 1 إلى 2 مللي ثانية طول النبضة الموضع الزاوي للمؤازرة.

سنقوم بتوجيه القناة 0 من LED_PWM إلى GPIO13 ، والقناة 1 إلى GPIO12 ، باستخدام هذه المعلومات لإجراء التحكم.

الخطوة 5: الالتقاط التناظري

الالتقاط التناظري
الالتقاط التناظري

التناظرية إلى التحويل الرقمي المحيطي

يحتوي ESP32 على محولات تناظرية إلى رقمية يمكن تطبيقها في ما يصل إلى 18 قناة ، ولكن فقط في كائنات GPI التي تدعم التناظرية.

يجب ألا يتجاوز الجهد المطبق النطاق من 0 إلى 3 فولت.

لا يحافظ التحويل الذي يتم إجراؤه على خطأ ثابت لجميع الفولتية التي تم أخذ عينات منها ، وهذا كله يعتمد على النطاق الذي تم تكوينه. بالنسبة إلى نطاق 150mV عند 2 ، 450 فولت ، يلزم فحص السلوك للتطبيقات الأكثر أهمية.

من أجل الالتقاط ، سنستخدم مقياس جهد يبلغ 10 كيلو بايت كمقسم جهد. سيتم الالتقاط في القناة ADC0 و ADC3 ، ويمكن الوصول إليها بواسطة GPIO36 و GPIO39.

الخطوة 6: الدائرة - الخادم والعميل

الدائرة - الخادم والعميل
الدائرة - الخادم والعميل

الخطوة 7: رمز المصدر لنقطة الوصول والخادم

صياغات

أقوم بتضمين مكتبة WiFi ، وأقوم بتعريف بعض المتغيرات.

# تضمين // inclusão da biblioteca WiFi const int freq = 50 ؛ // Frequência do PWM const int canal_A = 0 ؛ // قناة premiro do controlador LED_PWM const int canal_B = 1 ؛ // segundo canal do controlador LED_PWM const int Resolution = 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 do WiFi do ponto de acesso ESP32 const char * password = "12345678" ؛ // senha parairmação de conexão no ponto de acesso const int port = 2 ؛ // porta na qual o servidor Receberá كـ conexões int ciclo_A = 0 ؛ // varável queeceberá o ciclo de atuação do canal A int ciclo_B = 0؛ // varável que فقْر الاستقبال o ciclo de atuação do canal خادم WiFiServer (منفذ) ؛ // أعلن عن الخادم IP Address myIP ؛ // أعلن عن تغيير الملكية الفكرية

اقامة ()

هنا ، نحدد دبابيس الإخراج. قمنا بتعيين القنوات على التردد المطلوب وضبط قيمة PWM.

إعداد باطل () {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، resilucao) ؛ // Ajustando o canal 0 para Frequência de 50 Hz e Resolution de 12bits ledcSetup (canal_B، freq، resilucao) ؛ // Ajustando o canal 1 para frequencyência de 50 Hz e Resolution 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) ؛ // تعريف الشجاعة هل PWM الفقرة 0 ledcWrite (canal_B ، ciclo_B) ؛ // تعريف الشجاعة PWM الفقرة 0

بدأنا التسلسلي ونقطة الوصول باستخدام SSID ESP32ap وكلمة المرور. ثم نحصل على IP الخاص بالخادم ونبدأ تشغيل الخادم.

Serial.begin (115200) ؛ // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)) ؛ // mensagem WiFi.softAP (SSID ، كلمة المرور) ؛ // iniciando o ponto de acesso com SSID ESP32ap e senha 12345678 Serial.println ("Obtendo IP") ؛ // mensagem myIP = WiFi.softAPIP () ؛ // الحصول على 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:" + سلسلة (منفذ)) ؛ // mensagem server.begin () ؛ // iniciando o servidor}

حلقة ()

في Loop ، أول شيء سنفعله هو إنشاء مثيل للعميل ، وربط متغير العميل وربطه به. تحقق مما إذا كان العميل متصلاً. إذا كان الأمر كذلك ، نبدأ المتغير الذي سيتلقى البيانات. طالما تم إنشاء الاتصال ، وإذا تم استلام البيانات ، فإننا نقرأ أحرف المتغير c. أخيرًا ، نجمع c في متغير البيانات.

حلقة باطلة () {WiFiClient cliente = server.available () ؛ // se um cliente conectar ، قم بتجميع عميل متغير if (cliente.connected ()) {// se há um cliente conectado String dados = ""؛ // inicia a variável queeceberá os dados Serial.println ("Cliente conectado.") ؛ // mensagem while (cliente.connected ()) {// enquanto a conexão estiver estabelecida if (cliente.available ()) {// e hover dados a Receber char c = cliente.read ()؛ // leia os caracteres para a variável c dados = dados + c ؛ // concatene c na variável dados

إذا تم استلام حرف سطر جديد ، فسنبحث عن فهرس الحرف "،" في السلسلة في البيانات. نحصل على السلاسل الفرعية حتى قبل الفاصلة مباشرة ، ثم نقوم بتحويلها إلى عدد صحيح. قمنا بتعيين PWM للقناتين A و B. وقمنا بمسح المتغير.

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 ()). to ()؛ // obtenha a substring após a vírgula e converta para inteiro ledcWrite (canal_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}}}}

في حالة قطع اتصال العميل ، نؤكد نهاية الاتصال. ننتظر لحظة ونطبع "لا يوجد عميل متصل". ثم ننتظر ثانية أخرى قبل إعادة التشغيل.

// caso o cliente se desconecte، Confirma o fim da conexão delay (50)؛ // aguarda um momento cliente.stop () ؛ Serial.println ("Nenhum cliente conectado.") ؛ // تأخير mensagem (1000) ؛ // aguarda um segundo antes de reiniciar}

الخطوة 8: رمز مصدر العميل

صياغات

لقد قمنا بتضمين مكتبة WiFi مرة أخرى ، هذه المرة على العميل. أيضا ، نحدد المتغيرات.

# تضمين const char * ssid = "ESP32ap" ؛ // SSID do 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 ؛ // vará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 ؛ // أعلن عن الزبون

اقامة ()

نحدد GPIOs كإدخال ، ونبدأ المسلسل ، ونتصل بنقطة الوصول.

إعداد باطل () {pinMode (pin_Leitura_A، INPUT) ؛ // تعريف o GPIO como entrada pinMode (pin_Leitura_B ، INPUT) ؛ // تعريف o GPIO como entrada Serial.begin (115200) ؛ // inicia a comunicação مسلسل WiFi.begin (ssid ، password) ؛ // conecta ao ponto de acesso}

حلقة ()

في هذه الحلقة ، سنتصل بالخادم ، أي ESP الآخر.

حلقة فارغة () {// 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 ، كلمة المرور) ؛ تأخير (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 + ":" + منفذ + "…") ؛ // تأخير mensagem (1000) ؛ }

في هذه الخطوة ، أثناء الاتصال بالخادم ، نقوم بتنفيذ المتغيرات لتخزين قراءة ADC0 و ADC3. أيضًا ، أجرينا قراءة 500 عينة وبلغنا متوسط القراءات. قمنا بتعيين القراءة لإنشاء المدة الصحيحة للتحكم في الماكينات ، وسلسلها وإرسالها إلى الخادم.

// enquanto estiver conectado ao servidor while (cliente.connected ()) {int leitura_A = 0؛ // varável para armazenar a leitura do ADC0 int leitura_B = 0 ؛ // vará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 + القراءة التناظرية (pin_Leitura_B) ؛ كونتادور ++ ؛ } leitura_A = leitura_A / amostras ؛ // média das leituras leitura_B = leitura_B / amostras ؛ ciclo_A = خريطة (leitura_A، 0، 4095، 140، 490) ؛ // mapeia a leitura para criar a duração correta para contole do servo ciclo_B = map (leitura_B، 0، 4095، 140، 490) ؛ // mapeia a leitura para criar a duração correta para criar do servo // concatena e envia para o servidor cliente.println (String (ciclo_A) + "،" + String (ciclo_B)) ؛ }

أخيرًا ، إذا لم يكن متصلاً ، فنحن نضمن إنهاء الاتصال من خلال عرض الرسالة المكافئة.

// se não coonectado، garante que a conexão foi finalizada cliente.stop () ؛ Serial.println (String (millis ()) + "- cliente desconectado…") ؛ // mensagem}

الخطوة 9: الملفات

قم بتنزيل الملفات:

بي دي إف

انا لا

موصى به: