فهرست مطالب:
- مرحله 1: منابع مورد استفاده
- مرحله 2: NodeMCU ESP32S - Pinout
- مرحله 3: لوازم جانبی ESP32
- مرحله 4: کنترل موتور سروو PWM
- مرحله 5: ضبط آنالوگ
- مرحله 6: مدار - سرور و مشتری
- مرحله 7: کد منبع Access Point و سرور
- مرحله 8: کد منبع مشتری
- مرحله 9: فایل ها
تصویری: دوربین PANTILT با ESP32: 9 مرحله
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:56
امروز ، من 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
مرحله 3: لوازم جانبی ESP32
لوازم جانبی PWM ESP32 دارای دو دستگاه جانبی است که قادر به تولید سیگنال PWM هستند. اینها شامل موتور تعدیل کننده عرض پالس (MCPWM) است که برای کنترل قدرت و موتور طراحی شده است و LED_PWM ، که برای کنترل شدت LED توسعه یافته است. اما آنها همچنین می توانند به صورت عمومی مورد استفاده قرار گیرند.
ما از LED_PWM استفاده می کنیم ، که می تواند 16 کانال PWM مستقل با دوره های قابل تنظیم و چرخه های کاری ایجاد کند. تا 16 بیت وضوح دارد.
مرحله 4: کنترل موتور سروو 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: فایل ها
دانلود فایلها:
من نه
توصیه شده:
دوربین مدار بسته با NodeMCU + ماژول دوربین لپ تاپ قدیمی (با و بدون استفاده از Blynk): 5 مرحله
دوربین مدار بسته با NodeMCU + ماژول دوربین لپ تاپ قدیمی (با و بدون استفاده از Blynk): سلام بچه ها! در این مقاله آموزشی ، من به شما نشان می دهم که چگونه از ماژول دوربین لپ تاپ قدیمی و nodeMCU برای ساخت چیزی شبیه دوربین مداربسته استفاده کردم
دوربین پشتیبان دوربین فیلمبرداری Upcycled: 7 مرحله (همراه با تصاویر)
دوربین پشتیبان دوربین مداربسته تاچرخه دار: مطمئنم اکثر شما که این مطلب را می خوانید یک کشو یا کمد دارید جایی پر از تکنولوژی های قدیمی که خیلی قدیمی و قدیمی شده است. من قطعاً سهم خود را از فناوری قدیمی دارم و ناراحت کننده است که چنین پتانسیلی به هدر می رود. خوب ، در این راهنما ، من
دوربین UNICORN - رزبری پای Zero W NoIR دوربین 8 مگاپیکسل: 7 مرحله (همراه با تصاویر)
UNICORN CAMERA - Raspberry Pi Zero W NoIR 8MP Camera Build: Pi Zero W NoIR 8MP Camera Build این دستورالعمل برای کمک به هر کسی که می خواهد یک دوربین مادون قرمز یا یک دوربین قابل حمل واقعاً جالب یا یک دوربین رزبری پای قابل حمل داشته باشد یا فقط می خواهد سرگرم شود ، کمک می کند. به این مقرون به صرفه ترین و قابل تنظیم است
دوربین خازن فلش دوربین HACK (قدیمی اما هنوز کار می کند): 3 مرحله
CAC Flash Flash Capacitor HACK (قدیمی اما هنوز کار می کند): چگونه می توان با استفاده از خازن در یک دوربین یکبار مصرف که دارای یک لوله فلش است ، یک دستگاه شوک ساز ایجاد کرد
تثبیت کننده دوربین برای ENV2 یا سایر تلفن های دوربین: 6 مرحله
تثبیت کننده دوربین برای ENV2 یا سایر تلفن های دوربین: آیا تا به حال خواسته اید یک فیلم تهیه کنید اما فقط یک دوربین دوربین دارید؟ آیا تا به حال با دوربین دوربین فیلمبرداری کرده اید اما نمی توانید آن را ثابت نگه دارید؟ خوب ، این برای شما قابل آموزش است