Სარჩევი:

PANTILT კამერა ESP32– ით: 9 ნაბიჯი
PANTILT კამერა ESP32– ით: 9 ნაბიჯი

ვიდეო: PANTILT კამერა ESP32– ით: 9 ნაბიჯი

ვიდეო: PANTILT კამერა ESP32– ით: 9 ნაბიჯი
ვიდეო: ESP32 Tutorial 5 - LED Fade, control brightness of an LED -ESP32 IoT Learnig kit 2024, ნოემბერი
Anonim
Image
Image
PANTILT კამერა ESP32– ით
PANTILT კამერა ESP32– ით

დღეს მე წარმოგიდგენთ PAN TILT- ს, რომელიც არის მოწყობილობა, რომელიც შესაძლებელს ხდის კამერის გადაადგილებას ზემოთ, ქვემოთ და გვერდის მიმართულებით. მე თვითონ ვაწარმოებდი ამ მოწყობილობას 3D ნაბეჭდი ნაწილების საშუალებით, ორი სერვისის და ESP32- ის გამოყენებით, რაც შესაძლებელს ხდის ამ მექანიზმის კონტროლს WiFi- ს საშუალებით. მოდით წავიკითხოთ ESP32– ის AD არხების გამოყენებით, ასევე ანალოგური ოპერაცია კონტროლერის LED_PWM გამოყენებით. ასევე, ჩვენ ვიყენებთ კონტროლს TCP / IP კავშირზე.

ვიდეოში ხედავთ, რომ მე მაქვს ESP32, რომელიც კითხულობს ორი პოტენომეტრის მნიშვნელობებს, რომლებიც იგზავნება (WiFi– ით) სხვა ESP32– ზე. ის დაკავშირებულია ორ სერვო ძრავთან. კამერა მოძრაობს (და თან ერთვის PAN TILT- ს) ზემოთ, ქვემოთ ან გვერდულად, ეს დამოკიდებულია იმაზე, თუ რა კონტროლს აკეთებთ ქოთნებში.

PAN TILT 3D ბეჭდვის დიზაინის ბმული შეგიძლიათ იხილოთ აქ:

ნაბიჯი 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 მმ პულსის სიგრძემდე განსაზღვრავს სერვოს კუთხის პოზიციას.

ჩვენ გავაგზავნით LED_PWM არხს 0 GPIO13– ზე და 1 არხს GPIO12– ზე, ამ ინფორმაციის გამოყენებით კონტროლის შესასრულებლად.

ნაბიჯი 5: ანალოგური გადაღება

ანალოგური გადაღება
ანალოგური გადაღება

ციფრული კონვერტაციის პერიფერიული ანალოგი

ESP32– ს აქვს ანალოგურ – ციფრულ გადამყვანები, რომელთა გამოყენება შესაძლებელია 18 – მდე არხზე, მაგრამ მხოლოდ ანალოგურ ჩართულ GPIO– ში.

გამოყენებული ძაბვა არ უნდა აღემატებოდეს 0 -დან 3V დიაპაზონს.

შესრულებული კონვერტაცია არ ინარჩუნებს მუდმივ შეცდომას შერჩეული ყველა ძაბვისთვის და ეს ყველაფერი დამოკიდებულია კონფიგურირებულ დიაპაზონზე. 150mV დიაპაზონისთვის 2, 450V, ქცევის შემოწმება საჭიროა უფრო კრიტიკული პროგრამებისთვის.

გადასაღებად ჩვენ გამოვიყენებთ 10 კ -ის პოტენომეტრს ძაბვის გამყოფად. გადაღება მოხდება არხზე ADC0 და ADC3, ხელმისაწვდომი GPIO36 და GPIO39.

ნაბიჯი 6: წრე - სერვერი და კლიენტი

წრე - სერვერი და კლიენტი
წრე - სერვერი და კლიენტი

ნაბიჯი 7: წვდომის წერტილისა და სერვერის წყაროს კოდი

განცხადებები

მე შევიტან WiFi ქსელის ბიბლიოთეკას და განვსაზღვრავ რამდენიმე ცვლადს.

#მოიცავს // მოიცავს ბიბლიოთეკას WiFi const int freq = 50; // სიხშირეები PWM const int canal_A = 0; // Primeiro canal do controlador LED_PWM const int canal_B = 1; // segundo canal do controlador LED_PWM const int resolutionucao = 12; // გადაწყვეტილების მიღება არ არის საჭირო კონტროლის 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– ით WiFi– სთან ერთად 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; // ცვლადი მიმღები არხის WiFiServer სერვერი (პორტი); // გამოაცხადოს მომსახურების IPA მისამართი myIP; // დეკლარაცია da varável de IP

Აწყობა ()

აქ ჩვენ განვსაზღვრავთ გამომავალი ქინძისთავებს. ჩვენ ვაყენებთ არხებს სასურველ სიხშირეზე და ვაყენებთ PWM მნიშვნელობას.

void setup () {pinMode (pin_Atuacao_A, OUTPUT); // განსაზღვრეთ o pino de atuação 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 126 ledc ledcSetup (canal_B, freq, resolutionucao); // Ajustando o canal 1 para frequencyência de 50 Hz e resolution 12 12bit ledcAttachPin (pin_Atuacao_A, canal_A); // გადამისამართება არხზე 0 ან პინო 13 ledcAttachPin (pin_Atuacao_B, canal_B); // გადამისამართება და არხი 1 პარა პინო 12 ledcWrite (canal_A, ciclo_A); // განსაზღვრეთ o valor do PWM para 0 ledcWrite (canal_B, ciclo_B); // definindo o valor do PWM პუნქტი 0

ჩვენ დავიწყეთ სერიალი, წვდომის წერტილი SSID ESP32ap– ით და პაროლით. ჩვენ ვიღებთ სერვერის IP მისამართს და ვიწყებთ სერვერს.

Serial.begin (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + სიმებიანი (ssid)); // mensagem WiFi.softAP (ssid, პაროლი); // ინიციატივით და წვდომის შესახებ SSID ESP32ap და 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 მონაცემთა ცვლადში.

void loop () {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 conexão estiver estabelecida if (cliente.available ()) {// e se houver dados a receiber 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 (','); // შესყიდვა 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 após a vírgula e converta para inteiro ledcWrite (canal_A, ციკლო_ა); // Ajusta o PWM do canal A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do canal B dados = ""; // Limpa a variável}}}}

თუ კლიენტი გათიშულია, ჩვენ ვადასტურებთ კავშირის დასრულებას. ჩვენ დაველოდებით ერთ წამს და ვბეჭდავთ "კლიენტი არ არის დაკავშირებული". შემდეგ ჩვენ ველოდებით კიდევ ერთ წამს, სანამ დავიწყებთ.

// კლიენტისთვის, რათა დადგინდეს, დაადასტუროს, რომ დაგვიანებულია (50); // aguarda um momento cliente.stop (); Serial.println ("Nenhum cliente conectado."); // მენეჯამის დაგვიანებით (1000); // aguarda um segundo antes de reiniciar}

ნაბიჯი 8: მომხმარებლის წყარო

განცხადებები

ჩვენ კვლავ ჩავრთეთ WiFi ბიბლიოთეკა, ამჯერად კლიენტზე. ასევე, ჩვენ განვსაზღვრავთ ცვლადებს.

#მოიცავს const char* ssid = "ESP32ap"; // SSID ponto de acesso ESP32 const char* password = "12345678"; // Senha para acessar o ponto de acesso const 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; // 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 კლიენტი; // დეკლარაციის გაკეთება objeto cliente

Აწყობა ()

ჩვენ განვსაზღვრავთ GPIO– ს, როგორც შეყვანას, ვიწყებთ სერიალს და ვუკავშირდებით წვდომის წერტილს.

void setup () {pinMode (pin_Leitura_A, INPUT); // განსაზღვრეთ GPIO como entrada pinMode (pin_Leitura_B, INPUT); // განსაზღვრა o GPIO como entrada Serial.begin (115200); // inicia 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 (სიმებიანი (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 + ":" + პორტი + "…"); // მენეჯამის დაგვიანებით (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 = რუკა (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)); }

დაბოლოს, თუ ის არ არის დაკავშირებული, ჩვენ დარწმუნებული ვართ, რომ კავშირი შეწყდა ეკვივალენტური შეტყობინების ჩვენებით.

// რომ არ გამოჩნდეს, გარანტიას მოგცემთ საბოლოო ჯამში cliente.stop (); Serial.println (სიმებიანი (millis ()) + " - კლიენტი desconectado …"); // mensagem}

ნაბიჯი 9: ფაილები

ჩამოტვირთეთ ფაილები:

PDF

ინო

გირჩევთ: