תוכן עניינים:

מצלמת PANTILT עם ESP32: 9 שלבים
מצלמת PANTILT עם ESP32: 9 שלבים

וִידֵאוֹ: מצלמת PANTILT עם ESP32: 9 שלבים

וִידֵאוֹ: מצלמת PANTILT עם ESP32: 9 שלבים
וִידֵאוֹ: How to user Makerfabs ESP32 3.5" TFT Capacitive Touch with Camera 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. אלה כוללים את מנוע אפנון רוחב הדופק (MCPWM) המיועד לבקרת הספק ומנוע, ו- LED_PWM, שפותח לבקרת עוצמת LED. אך ניתן להשתמש בהם גם באופן כללי.

נשתמש ב- LED_PWM, שיכול ליצור 16 ערוצי PWM עצמאיים עם תקופות ומחזורי עבודה הניתנים להגדרה. יש לו עד 16 סיביות של רזולוציה.

שלב 4: שליטת מנוע סרוו PWM

בקרת מנועי סרוו PWM
בקרת מנועי סרוו PWM

השליטה במנוע סרוו מתבצעת על ידי התאמת אפנון רוחב הדופק של ריבוע בתדירות ספציפית.

עבור סרוו המשמש (כמו גם עבור רוב), התדר הוא 50Hz. כמו כן, רוחב של 1 עד 2ms דופק קובע את המיקום הזוויתי של הסרוו.

ננתב את ערוץ 0 של LED_PWM ל- GPIO13, וערוץ 1 אל GPIO12, באמצעות מידע זה לביצוע הבקרה.

שלב 5: לכידת אנלוגי

לכידת אנלוגי
לכידת אנלוגי

היקפי המרה אנלוגי לדיגיטלי

ל- ESP32 יש ממירים אנלוגיים לדיגיטליים הניתנים ליישום בעד 18 ערוצים, אך רק ב- GPIO המאפשר אנלוגי.

המתח המופעל לא יעלה על טווח 0 עד 3V.

ההמרה המתבצעת אינה שומרת על שגיאה קבועה בכל המתחים שנדגמו, והכל תלוי בטווח שהוגדר. לטווח של 150mV ב -2, 450V, נדרשת בדיקת התנהגות ליישומים קריטיים יותר.

לצורך הלכידה נשתמש בפוטנציומטר של 10k כמפריד מתח. הצילום יתבצע בערוץ ADC0 ו- ADC3, הנגיש על ידי GPIO36 ו- GPIO39.

שלב 6: מעגל - שרת ולקוח

מעגל - שרת ולקוח
מעגל - שרת ולקוח

שלב 7: קוד המקור של נקודת הגישה והשרת

הצהרות

אני כולל את ספריית ה- WiFi ואני מגדיר כמה משתנים.

#include // inclusão da biblioteca WiFi const int freq = 50; // frequência לעשות PWM const int canal_A = 0; // תעלת primeiro לעשות שליטה LED_PWM const int canal_B = 1; // תעלת segundo לעשות שליטה 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 או SSID ל- WiFi ל- ponto de acesso ESP32 const char* password = "12345678"; // senha para confirmmaçã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 שרת WiFiServer (יציאה); // declaração do objeto servidor IPAddress myIP; // declaração da variável de IP

להכין ()

כאן, אנו מגדירים את סיכות הפלט. הגדרנו את הערוצים לתדר הרצוי והגדרנו את ערך ה- 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, resolucao); // 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); // redirecionando o canal 1 para o pino 12 ledcWrite (canal_A, ciclo_A); // definindo o valor do PWM for 0 ledcWrite (canal_B, ciclo_B); // definindo o valor do PWM para 0

התחלנו את נקודת הגישה הסדרתית עם SSID ESP32ap והסיסמה. לאחר מכן אנו מקבלים את ה- IP של השרת ומתחילים את השרת.

Serial.begin (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + מחרוזת (ssid)); // mensagem WiFi.softAP (ssid, סיסמא); // 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}

לולאה ()

ב- Loop, הדבר הראשון שאנחנו הולכים לעשות הוא לייצר את הלקוח, להתחבר ולהתחבר למשתנה הלקוח. בדוק אם הלקוח מחובר. אם כן, אנו מתחילים את המשתנה שיקבל את הנתונים. כל עוד החיבור נוצר, ואם מתקבלים נתונים, אנו קוראים את התווים עבור המשתנה c. לבסוף, אנו מחברים את c במשתנה הנתונים.

לולאת void () {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 se houver 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 עבור recebido int virgula = dados.indexOf (','); // לרכוש 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 (); ciclo_A); // Ajusta o PWM do channel A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do channel B dados = ""; // Limpa a variável}}}}

אם הלקוח מתנתק, אנו מאשרים את סיום החיבור. אנו ממתינים לרגע ומדפיסים "אין לקוח מחובר". לאחר מכן נחכה שנייה נוספת לפני הפעלה מחדש.

// caso o cliente se desconecte, confirmma 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, הפעם אצל הלקוח. כמו כן, אנו מגדירים את המשתנים.

#include 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 לעשות ADC0 const int pin_Leitura_B = 39; // GPIO de leitura לעשות ADC3 int ciclo_A = 0; // variável que receberá o valore do ciclo do PWM A int ciclo_B = 0; // משתנה אשר יכול לקבל ערך עבור PWM B WiFiClient cliente; // declaração do objeto cliente

להכין ()

אנו מגדירים את ה- GPIO כקלט, מתחילים את הסידרה ומחברים לנקודת הגישה.

הגדרת חלל () {pinMode (pin_Leitura_A, INPUT); // הגדר את GPIO como entrada pinMode (pin_Leitura_B, INPUT); // הגדר את GPIO como entrada Serial.begin (115200); // inicia a comunicação WiFi serial.begin (ssid, password); // conecta ao ponto de acesso}

לולאה ()

בלולאה זו, נתחבר לשרת, כלומר ה- ESP האחר.

לולאת 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, סיסמא); עיכוב (2000); } Serial.println (מחרוזת (מילי ()) + " - קונקטדו …"); // 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; // 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 = leitura_B + analogRead (pin_Leitura_B); contador ++; } 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 control do servo ciclo_B = map (leitura_B, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para control 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: קבצים

הורד את הקבצים:

PDF

INO

מוּמלָץ: