فهرست مطالب:

دوربین PANTILT با ESP32: 9 مرحله
دوربین PANTILT با ESP32: 9 مرحله

تصویری: دوربین PANTILT با ESP32: 9 مرحله

تصویری: دوربین PANTILT با ESP32: 9 مرحله
تصویری: ESP32 Tutorial 9 - Using Push button to Toggle LED, Push ON, Push OFF -SunFounder ESP32 IoT kit 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 ESP32

• دو کابل 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

کنترل موتور سروو با تنظیم مدولاسیون عرض پالس یک مربع با فرکانس خاص انجام می شود.

برای سروو مورد استفاده (و همچنین بیشتر) ، فرکانس 50 هرتز است. همچنین عرض پالس 1 تا 2 میلی ثانیه موقعیت زاویه ای سروو را تعیین می کند.

با استفاده از این اطلاعات برای کنترل ، کانال 0 LED_PWM را به GPIO13 و کانال 1 را به GPIO12 هدایت می کنیم.

مرحله 5: ضبط آنالوگ

ضبط آنالوگ
ضبط آنالوگ

محیطی تبدیل آنالوگ به دیجیتال

ESP32 دارای مبدلهای آنالوگ به دیجیتال است که می تواند در حداکثر 18 کانال استفاده شود ، اما فقط در GPIO های آنالوگ فعال است.

ولتاژ اعمال شده نباید از محدوده 0 تا 3V تجاوز کند.

تبدیل انجام شده برای همه ولتاژهای نمونه خطای ثابت را حفظ نمی کند و همه اینها به محدوده پیکربندی شده بستگی دارد. برای محدوده 150mV در 2 ، 450V ، بررسی رفتار برای برنامه های کاربردی مهمتر لازم است.

برای ضبط ، از پتانسیومتر 10k به عنوان تقسیم کننده ولتاژ استفاده می کنیم. ضبط در کانال ADC0 و ADC3 انجام می شود ، که توسط GPIO36 و GPIO39 قابل دسترسی است.

مرحله 6: مدار - سرور و مشتری

مدار - سرور و مشتری
مدار - سرور و مشتری

مرحله 7: کد منبع Access Point و سرور

بیانیه

من کتابخانه WiFi را وارد می کنم و برخی از متغیرها را تعریف می کنم.

#include // inclusão da biblioteca WiFi const int freq = 50؛ // frequência do PWM const int canal_A = 0؛ // Primeiro canal controlador LED_PWM const int canal_B = 1؛ // کانال segundo do controlador LED_PWM const int resolutionucao = 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"؛ // ثابت SSID وای فای و دسترسی به ESP32 const char* password = "12345678"؛ // senha para confirmaçã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 (پورت) ؛ // اعلان سرویس دهنده IPAddress myIP؛ // deklaração da variável de IP

برپایی ()

در اینجا ، پین های خروجی را تعریف می کنیم. ما کانال ها را روی فرکانس مورد نظر تنظیم می کنیم و مقدار PWM را تعیین می کنیم.

void setup () {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، resolutionucao)؛ // Ajustando o canal 0 para frequencyência de 50 Hz e resolution 12c ledcSetup (canal_B، freq، resolutionucao)؛ // Ajustando o canal 1 para frequência de 50 Hz e resolution 12b 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 para 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:" + String (ssid))؛ // mensagem WiFi.softAP (ssid ، رمز عبور) ؛ // iniciando o ponto de acesso com SSID ESP32ap e senha 12345678 Serial.println ("IP Obtendo")؛ // 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}

حلقه ()

در حلقه ، اولین کاری که می خواهیم انجام دهیم این است که کلاینت را مثال بزنیم ، متغیر کلاینت را متصل و متصل کنیم. بررسی کنید که آیا سرویس گیرنده متصل است یا خیر. اگر چنین است ، متغیری را که داده ها را دریافت می کند ، شروع می کنیم. تا زمانی که اتصال برقرار شود و در صورت دریافت داده ها ، کاراکترهای متغیر c را می خوانیم. در نهایت ، ما c را در متغیر داده متصل می کنیم.

void loop () {WiFiClient cliente = server.available ()؛ // se um cliente conectar، associe a varyá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 receib 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 ('،')؛ // proco 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 از 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}}}}

اگر سرویس گیرنده قطع شود ، ما پایان اتصال را تأیید می کنیم. یک لحظه منتظر می مانیم و "No client connected" را چاپ می کنیم. سپس قبل از شروع مجدد ، یک ثانیه دیگر منتظر می مانیم.

// در صورت تمایل به تأخیر ، تأیید تأخیر (50) ؛ // aguarda um momento cliente.stop ()؛ Serial.println ("Nenhum cliente conectado.")؛ // تأخیر mensagem (1000) ؛ // aguarda um segundo antes de reiniciar}

مرحله 8: کد منبع مشتری

بیانیه

ما کتابخانه WiFi را دوباره وارد کرده ایم ، این بار روی سرویس گیرنده. همچنین ، ما متغیرها را تعریف می کنیم.

#inconste 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؛ // 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 WiFiCliente client؛ // Declação do objeto cliente

برپایی ()

ما GPIO ها را به عنوان ورودی تعریف می کنیم ، سریال را شروع می کنیم و به نقطه دسترسی متصل می شویم.

void setup () {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 ، رمز عبور) ؛ // conecta ao ponto de acesso}

حلقه ()

در این حلقه ، ما به سرور متصل می شویم ، یعنی ESP دیگر.

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 ، رمز عبور) ؛ تاخیر (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؛ // 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 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 servidor cliente.println (رشته (ciclo_A) + "،" + رشته (ciclo_B))؛ }

سرانجام ، اگر متصل نباشد ، با نمایش پیام معادل اطمینان می دهیم که اتصال قطع شده است.

// در صورت نیاز ، تضمین کنید که مشتری نهایی می شود. stop ()؛ Serial.println (String (millis ()) + " - cliente desconectado …")؛ // mensagem}

مرحله 9: فایل ها

دانلود فایلها:

PDF

من نه

توصیه شده: