সুচিপত্র:

ESP32 সঙ্গে PANTILT ক্যামেরা: 9 ধাপ
ESP32 সঙ্গে PANTILT ক্যামেরা: 9 ধাপ

ভিডিও: ESP32 সঙ্গে PANTILT ক্যামেরা: 9 ধাপ

ভিডিও: ESP32 সঙ্গে PANTILT ক্যামেরা: 9 ধাপ
ভিডিও: CS50 Live, Episode 009 2024, জুলাই
Anonim
Image
Image
ESP32 সহ PANTILT ক্যামেরা
ESP32 সহ PANTILT ক্যামেরা

আজ, আমি প্যান টিআইএলটি উপস্থাপন করব, যা এমন একটি ডিভাইস যা ক্যামেরার চলাচলকে উপরে, নিচে এবং পাশের দিক নির্দেশের জন্য সক্ষম করে। আমি নিজে দুটি সার্ভ এবং ESP32 ব্যবহার করে 3D মুদ্রিত অংশগুলির মাধ্যমে এই ডিভাইসটি তৈরি করেছি, যা ওয়াইফাইয়ের মাধ্যমে এই প্রক্রিয়াটি নিয়ন্ত্রণ করা সম্ভব করে তোলে। আসুন আমরা ESP32 এর AD চ্যানেল ব্যবহার করে রিডিং গ্রহণ করি, সেইসাথে LED_PWM নিয়ামক ব্যবহার করে একটি এনালগ অপারেশন। এছাড়াও, আমরা একটি টিসিপি / আইপি সংযোগের উপর নিয়ন্ত্রণ প্রয়োগ করি।

ভিডিওতে, আপনি দেখতে পাচ্ছেন যে আমার একটি ESP32 দুটি potentiometers এর মান পড়ছে, যা অন্য ESP32 তে (WiFi এর মাধ্যমে) পাঠানো হয়। এটি দুটি সার্ভো মোটরের সাথে সংযুক্ত। পাত্রের মাধ্যমে আপনি যে নিয়ন্ত্রণ করেন তার উপর নির্ভর করে ক্যামেরাটি উপরে, নিচে বা পাশের দিকে চলে (এবং প্যান টিআইএলটি -এর সাথে সংযুক্ত থাকে)।

PAN TILT 3D প্রিন্ট ডিজাইনের লিঙ্ক এখানে পাওয়া যাবে:

ধাপ 1: ব্যবহৃত সম্পদ

ব্যবহৃত সম্পদ
ব্যবহৃত সম্পদ

For সংযোগের জন্য একাধিক জাম্পার

• দুটি নোড MCU ESP32s

SP ESP32 এর জন্য দুটি USB তারের

Web নিয়ন্ত্রণের জন্য একটি ওয়েবক্যাম

Control দুটি নিয়ন্ত্রণ পাত্র

Prot একটি প্রোটোবোর্ড

Os servos জন্য একটি উৎস

ধাপ 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - পিনআউট
NodeMCU ESP32S - পিনআউট

ধাপ 3: ESP32 পেরিফেরালস

ESP32 পেরিফেরালস
ESP32 পেরিফেরালস

PWM পেরিফেরালস ESP32 এর দুটি পেরিফেরাল আছে যা PWM সিগন্যাল তৈরি করতে সক্ষম। এর মধ্যে রয়েছে বিদ্যুৎ এবং মোটর নিয়ন্ত্রণের জন্য পরিকল্পিত পালস প্রস্থ মডুলেটর (MCPWM) ইঞ্জিন এবং LED তীব্রতা নিয়ন্ত্রণের জন্য উন্নত LED_PWM। কিন্তু সেগুলি জেনেরিক উপায়েও ব্যবহার করা যেতে পারে।

আমরা LED_PWM ব্যবহার করব, যা কনফিগারযোগ্য পিরিয়ড এবং কাজের চক্র সহ 16 টি স্বতন্ত্র PWM চ্যানেল তৈরি করতে পারে। এতে 16 বিট পর্যন্ত রেজোলিউশন রয়েছে।

ধাপ 4: Servo মোটর নিয়ন্ত্রণ PWM

সার্ভো মোটর কন্ট্রোল PWM
সার্ভো মোটর কন্ট্রোল PWM

নির্দিষ্ট ফ্রিকোয়েন্সি সহ একটি বর্গের পালস প্রস্থ মডুলেশন সমন্বয় করে সার্ভো মোটর নিয়ন্ত্রণ করা হয়।

ব্যবহৃত servo (সেইসাথে অধিকাংশ জন্য) জন্য, ফ্রিকোয়েন্সি 50Hz হয়। এছাড়াও, 1 থেকে 2ms পালস দৈর্ঘ্যের একটি প্রস্থ servo এর কৌণিক অবস্থান নির্ধারণ করে।

আমরা LED_PWM- এর চ্যানেল 0 কে GPIO13, এবং চ্যানেল 1 থেকে GPIO12- এ রুট করব, এই তথ্য ব্যবহার করে নিয়ন্ত্রণ করতে।

ধাপ 5: এনালগ ক্যাপচার

এনালগ ক্যাপচার
এনালগ ক্যাপচার

ডিজিটাল রূপান্তর পেরিফেরাল থেকে এনালগ

ইএসপি 32 এর এনালগ-টু-ডিজিটাল কনভার্টার রয়েছে যা 18 টি চ্যানেলে প্রয়োগ করা যেতে পারে, তবে শুধুমাত্র এনালগ-সক্ষম GPIO- তে।

প্রয়োগ করা ভোল্টেজ 0 থেকে 3V পরিসরের বেশি হওয়া উচিত নয়।

সঞ্চালিত রূপান্তর নমুনাযুক্ত সমস্ত ভোল্টেজের জন্য একটি ধ্রুবক ত্রুটি বজায় রাখে না এবং এটি সমস্ত কনফিগার করা পরিসরের উপর নির্ভর করে। 2, 450V এ 150mV এর পরিসরের জন্য, আরো জটিল অ্যাপ্লিকেশনের জন্য একটি আচরণ পরীক্ষা প্রয়োজন।

ক্যাপচারের জন্য, আমরা ভোল্টেজ ডিভাইডার হিসাবে 10k এর একটি potentiometer ব্যবহার করব। GPIO36 এবং GPIO39 দ্বারা অ্যাক্সেসযোগ্য ADC0 এবং ADC3 চ্যানেলে ক্যাপচার করা হবে।

ধাপ 6: সার্কিট - সার্ভার এবং ক্লায়েন্ট

সার্কিট - সার্ভার এবং ক্লায়েন্ট
সার্কিট - সার্ভার এবং ক্লায়েন্ট

ধাপ 7: অ্যাক্সেস পয়েন্ট এবং সার্ভারের সোর্স কোড

বিবৃতি

আমি ওয়াইফাই লাইব্রেরি অন্তর্ভুক্ত করি, এবং আমি কিছু ভেরিয়েবল সংজ্ঞায়িত করি।

#অন্তর্ভুক্ত // inclusão da biblioteca WiFi const int freq = 50; // Frequência do PWM const int canal_A = 0; // প্রাইমিরো খাল কন্ট্রোলোডার LED_PWM const int canal_B = 1; // সেগুন্ডো খাল কন্ট্রোলোডার LED_PWM const int resolucao = 12; // রিসোলিউশন ইউস্যাডো কোন কন্ট্রোলার LED_PWM const int int_tuacao_A = 13; // পিনো প্যারা ওন্ডে ও খাল 0 সেরá রেডাইরেসিয়ানোডো কনস্ট ইন্ট পিন_আটুয়াকাও_বি = 12; // পিনো প্যারা ওন্ডে ও ক্যানাল 1 সেরá রেডাইরেসিয়োনোড কনস্ট চার* এসএসআইডি = "ইএসপি 32ap"; // ধ্রুবক com o SSID do WiFi do ponto de acesso ESP32 const char* password = "12345678"; // সেনহা প্যারা কনফার্মçãো ডি কনেক্সো নো পন্টো ডি অ্যাসেসো কনস্ট ইন্ট পোর্ট = 2; // porta na qual o servidor receberá conexões int ciclo_A = 0; // variável que receberá o ciclo de atuação do খাল A int ciclo_B = 0; // variável que receberá o ciclo de atuação do canal A WiFiServer server (port); // 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 খাল 0 para Frequência de 50 Hz e resolução de 12bits ledcSetup (canal_B, freq, resolucao); // Ajustando o খাল 1 প্যারা ফ্রিকোয়েন্সিয়া ডি 50 Hz e resolução de 12bits ledcAttachPin (pin_Atuacao_A, canal_A); // redirecionando o খাল 0 para o pino 13 ledcAttachPin (pin_Atuacao_B, canal_B); // redirecionando o খাল 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, এবং পাসওয়ার্ড দিয়ে অ্যাক্সেস পয়েন্ট। আমরা তখন সার্ভারের আইপি পাই এবং সার্ভার চালু করি।

Serial.begin (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + স্ট্রিং (ssid)); // mensagem WiFi.softAP (ssid, password); // 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:" + স্ট্রিং (পোর্ট)); // mensagem server.begin (); // iniciando o servidor}

লুপ ()

লুপে, আমরা প্রথমে যা করতে যাচ্ছি তা হল ক্লায়েন্টকে তাত্ক্ষণিক করা, ক্লায়েন্ট ভেরিয়েবলের সাথে সংযুক্ত করা এবং বাঁধাই করা। ক্লায়েন্ট সংযুক্ত আছে কিনা তা পরীক্ষা করুন। যদি তাই হয়, আমরা সেই ভেরিয়েবল শুরু করি যা ডেটা গ্রহণ করবে। যতক্ষণ পর্যন্ত সংযোগটি প্রতিষ্ঠিত হয়, এবং যদি ডেটা পাওয়া যায়, আমরা পরিবর্তনশীল c এর অক্ষরগুলি পড়ি। অবশেষে, আমরা ডেটা ভেরিয়েবলে c সংযুক্ত করি।

অকার্যকর লুপ () {WiFiClient cliente = server.available (); // se um cliente conectar, 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 establishelecida 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

যদি একটি নতুন রেখা অক্ষর পাওয়া যায়, আমরা ডেটার স্ট্রিংয়ে ',' অক্ষরের সূচকটি সন্ধান করি। আমরা কমা আগে ডান পর্যন্ত সাবস্ট্রিং পেতে, এবং তারপর আমরা তাদের পূর্ণসংখ্যা রূপান্তর। আমরা A এবং B চ্যানেলের PWM সেট করি।

যদি (c == '\ n') {// se um caracter de nova linha for recebido int virgula = dados.indexOf (','); // পেলো íন্ডিস ডু ক্যারেক্টার ',' না স্ট্রিং এম ড্যাডোস সিকলো_এ = (ডেডোস। সাবস্ট্রিং (0, ভার্জুলা))। 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 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 clientend se desconecte, confirma o fim da conexão বিলম্ব (50); // aguarda um momento cliente.stop (); Serial.println ("Nenhum cliente conectado।"); // mensagem বিলম্ব (1000); // aguarda um segundo antes de reiniciar}

ধাপ 8: গ্রাহক সোর্স কোড

বিবৃতি

আমরা আবার ওয়াইফাই লাইব্রেরি অন্তর্ভুক্ত করেছি, এবার ক্লায়েন্টের উপর। এছাড়াও, আমরা ভেরিয়েবল সংজ্ঞায়িত করি।

#অন্তর্ভুক্ত const char* ssid = "ESP32ap"; // SSID do ponto de acesso ESP32 const char* password = "12345678"; // সেনহা প্যারা অ্যাসেসার হে পন্টো ডি অ্যাসেসো কনস্ট uint16_t পোর্ট = 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 WiFiClient cliente; // declaração do objeto cliente

সেটআপ ()

আমরা জিপিআইওগুলিকে ইনপুট হিসাবে সংজ্ঞায়িত করি, সিরিয়াল শুরু করি এবং অ্যাক্সেস পয়েন্টের সাথে সংযুক্ত হই।

অকার্যকর সেটআপ () {pinMode (pin_Leitura_A, INPUT); // সংজ্ঞায়িত o GPIO como entrada pinMode (pin_Leitura_B, INPUT); // GPIO como entrada Serial.begin (115200) সংজ্ঞায়িত করুন; // inicia a comunicação সিরিয়াল WiFi.begin (ssid, password); // 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, password); বিলম্ব (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); কনটাডোর ++; } leitura_A = leitura_A / amostras; // miadia 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 = মানচিত্র (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 (String (ciclo_A) + "," + String (ciclo_B)); }

অবশেষে, যদি সংযুক্ত না হয়, আমরা নিশ্চিত করি যে সমতুল্য বার্তা প্রদর্শন করে সংযোগটি বন্ধ করা হয়েছে।

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

ধাপ 9: ফাইল

ফাইল ডাউনলোড করুন:

পিডিএফ

আইএনও

প্রস্তাবিত: