Mục lục:

Máy ảnh PANTILT với ESP32: 9 bước
Máy ảnh PANTILT với ESP32: 9 bước

Video: Máy ảnh PANTILT với ESP32: 9 bước

Video: Máy ảnh PANTILT với ESP32: 9 bước
Video: [ESP32-CAM] Phần 4: Pan Tilt- WebSocket 2024, Tháng mười một
Anonim
Image
Image
Máy ảnh PANTILT với ESP32
Máy ảnh PANTILT với ESP32

Hôm nay, tôi sẽ giới thiệu PAN TILT, là một thiết bị cho phép di chuyển máy ảnh theo các hướng lên, xuống và sang hai bên. Bản thân tôi đã sản xuất thiết bị này thông qua các bộ phận được in 3D, sử dụng hai servos và ESP32, giúp điều khiển cơ chế này thông qua WiFi. Sau đó, chúng ta hãy đọc các bài đọc bằng cách sử dụng các kênh AD của ESP32, cũng như hoạt động tương tự bằng cách sử dụng bộ điều khiển LED_PWM. Ngoài ra, chúng tôi áp dụng kiểm soát kết nối TCP / IP.

Trong video, bạn có thể thấy rằng tôi có một ESP32 đọc giá trị của hai chiết áp, được gửi (qua WiFi) đến một ESP32 khác. Nó được kết nối với hai động cơ servo. Máy ảnh di chuyển (và được gắn vào PAN TILT) theo hướng lên, xuống hoặc sang ngang, tùy thuộc vào điều khiển bạn thực hiện qua các chậu.

Liên kết đến thiết kế in 3D PAN TILT có thể được tìm thấy tại đây:

Bước 1: Tài nguyên được sử dụng

Tài nguyên được sử dụng
Tài nguyên được sử dụng

• Nhiều jumper để kết nối

• Hai Node MCU ESP32s

• Hai cáp USB cho ESP32

• Một WebCam để kiểm soát

• Hai bình điều khiển

• Một tấm bảng

• Một nguồn cho các servos

Bước 2: NodeMCU ESP32S - Sơ đồ chân

NodeMCU ESP32S - Sơ đồ chân
NodeMCU ESP32S - Sơ đồ chân

Bước 3: Thiết bị ngoại vi ESP32

Thiết bị ngoại vi ESP32
Thiết bị ngoại vi ESP32

Thiết bị ngoại vi PWM ESP32 có hai thiết bị ngoại vi có khả năng tạo ra tín hiệu PWM. Chúng bao gồm động cơ Bộ điều biến độ rộng xung (MCPWM) được thiết kế để điều khiển công suất và động cơ, và LED_PWM, được phát triển để điều khiển cường độ LED. Nhưng chúng cũng có thể được sử dụng một cách chung chung.

Chúng tôi sẽ sử dụng LED_PWM, có thể tạo ra 16 kênh PWM độc lập với các khoảng thời gian và chu kỳ làm việc có thể định cấu hình. Nó có độ phân giải lên đến 16 bit.

Bước 4: Điều khiển động cơ Servo PWM

Điều khiển động cơ Servo PWM
Điều khiển động cơ Servo PWM

Điều khiển động cơ servo được thực hiện bằng cách điều chỉnh điều chế độ rộng xung của một hình vuông với tần số cụ thể.

Đối với servo được sử dụng (cũng như hầu hết), tần số là 50Hz. Ngoài ra, chiều rộng xung từ 1 đến 2ms xác định vị trí góc của servo.

Chúng tôi sẽ định tuyến kênh 0 của LED_PWM đến GPIO13 và kênh 1 đến GPIO12, sử dụng thông tin này để thực hiện điều khiển.

Bước 5: Chụp tương tự

Chụp tương tự
Chụp tương tự

Thiết bị ngoại vi chuyển đổi tương tự sang kỹ thuật số

ESP32 có bộ chuyển đổi tương tự sang kỹ thuật số có thể được áp dụng trong tối đa 18 kênh, nhưng chỉ trong các GPIO hỗ trợ tương tự.

Điện áp đặt vào không được vượt quá dải 0 đến 3V.

Quá trình chuyển đổi được thực hiện không duy trì lỗi liên tục đối với tất cả các điện áp được lấy mẫu và tất cả điều này phụ thuộc vào dải được định cấu hình. Đối với dải 150mV ở 2, 450V, cần kiểm tra hành vi đối với các ứng dụng quan trọng hơn.

Để chụp, chúng tôi sẽ sử dụng một chiết áp 10k làm bộ chia điện áp. Việc thu thập sẽ được thực hiện trong kênh ADC0 và ADC3, có thể truy cập bằng GPIO36 và GPIO39.

Bước 6: Mạch - Máy chủ và Máy khách

Mạch - Máy chủ và Máy khách
Mạch - Máy chủ và Máy khách

Bước 7: Mã nguồn của Điểm truy cập và Máy chủ

Các câu lệnh

Tôi bao gồm thư viện WiFi và tôi xác định một số biến.

#include // inclusão da biblioteca WiFi const int freq = 50; // thường xuyên làm PWM const int channel_A = 0; // kênh primeiro do controlador LED_PWM const int channel_B = 1; // kênh segundo do controlador LED_PWM const int Resolutionucao = 12; // Resolução usado không có controlador LED_PWM const int pin_Atuacao_A = 13; // Pino para onde o channel 0 será redirecionado const int pin_Atuacao_B = 12; // Pino para onde o channel 1 será redirecionado const char * ssid = "ESP32ap"; // Constante com o SSID do WiFi do ponto de acesso 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 Reberá as conexões int ciclo_A = 0; // variável que Collectberá o ciclo de atuação do kênh A int ciclo_B = 0; // variável que Collectberá o ciclo de atuação do kênh Một máy chủ WiFiServer (cổng); // khai báo do objeto servidor IPAddress myIP; // statementaração da variável de IP

Cài đặt ()

Ở đây, chúng tôi xác định các chân đầu ra. Chúng tôi đặt các kênh ở tần số mong muốn và đặt giá trị PWM.

void setup () {pinMode (pin_Atuacao_A, OUTPUT); // định nghĩa o pino de atuação A como saída pinMode (pin_Atuacao_B, OUTPUT); // định nghĩa o pino de atuação B como saída ledcSetup (channel_A, freq, Resolutionucao); // Ajustando o kênh 0 para thường xuyên sangcia de 50 Hz e Resolutionução de 12bits ledcSetup (channel_B, freq, Resolutionucao); // Ajustando o kênh 1 para thường xuyên sangcia de 50 Hz e Resolutionução de 12bits ledcAttachPin (pin_Atuacao_A, kênh_A); // redirecionando o kênh 0 para o pino 13 ledcAttachPin (pin_Atuacao_B, kênh_B); // redirecionando o kênh 1 para o pino 12 ledcWrite (kênh_A, ciclo_A); // Defndo o valor do PWM para 0 ledcWrite (channel_B, ciclo_B); // Defndo o valor do PWM para 0

Chúng tôi đã bắt đầu nối tiếp, điểm truy cập với SSID ESP32ap và mật khẩu. Sau đó chúng tôi lấy IP của máy chủ và khởi động máy chủ.

Serial.begin (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, mật khẩu); // 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}

Vòng ()

Trong Loop, điều đầu tiên chúng ta sẽ làm là khởi tạo máy khách, kết nối và ràng buộc với biến máy khách. Kiểm tra xem máy khách đã được kết nối chưa. Nếu vậy, chúng tôi bắt đầu biến sẽ nhận dữ liệu. Miễn là kết nối được thiết lập và nếu dữ liệu được nhận, chúng tôi đọc các ký tự cho biến c. Cuối cùng, chúng ta nối c trong biến dữ liệu.

void loop () {WiFiClient cliente = server.available (); // se um cliente conectar, liên kết một cliente variável if (cliente.connected ()) {// se há um cliente conectado String dados = ""; // inicia a variável que Recberá os dados Serial.println ("Cliente conectado."); // mensagem while (cliente.connected ()) {// enquanto a conexão estiver settingelecida if (cliente.available ()) {// e se houver dados a Collectber char c = cliente.read (); // leia os caracteres para a variável c dados = dados + c; // concatene c na variável dados

Nếu một ký tự dòng mới được nhận, chúng tôi tìm kiếm chỉ mục của ký tự ',' trong chuỗi trong dữ liệu. Chúng tôi nhận được các chuỗi con cho đến ngay trước dấu phẩy, và sau đó chúng tôi chuyển đổi chúng thành số nguyên. Chúng tôi đặt PWM của kênh A và B. Chúng tôi xóa biến.

if (c == '\ n') {// se um caracter de nova linha for Rebido int virgula = dados.indexOf (','); // mua pelo índice do caracter ',' na string em dados ciclo_A = (dados.substring (0, virgula)). toInt (); // obtenha một chuỗi con até antes da vírgula e convertta para inteiro ciclo_B = dados.substring (virgula + 1, dados.length ()). toInt (); // obtenha một chuỗi con após một vírgula e convertta para inteiro ledcWrite (channel_A, ciclo_A); // Ajusta o PWM do channel A ledcWrite (channel_B, ciclo_B); // Ajusta o PWM do kênh B dados = ""; // Limpa a variável}}}}

Nếu máy khách ngắt kết nối, chúng tôi xác nhận việc kết thúc kết nối. Chúng tôi đợi trong giây lát và in "Không có máy khách kết nối". Sau đó chúng tôi đợi thêm một giây trước khi khởi động lại.

// caso o cliente se desconecte, confirma o fim da conexão delay (50); // aguarda um momento cliente.stop (); Serial.println ("Nenhum cliente conectado."); // mensagem delay (1000); // aguarda um segundo antes de reiniciar}

Bước 8: Mã nguồn khách hàng

Các câu lệnh

Chúng tôi đã đưa vào thư viện WiFi một lần nữa, lần này là trên máy khách. Ngoài ra, chúng tôi xác định các biến.

#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 do ADC0 const int pin_Leitura_B = 39; // GPIO de leitura do ADC3 int ciclo_A = 0; // variável que Collectberá o valor do ciclo do PWM A int ciclo_B = 0; // Variável que Collectberá o valor do ciclo do PWM B WiFiClient cliente; // statementaração do objeto cliente

Cài đặt ()

Chúng tôi xác định các GPIO là đầu vào, bắt đầu nối tiếp và kết nối với điểm truy cập.

void setup () {pinMode (pin_Leitura_A, INPUT); // định nghĩa o GPIO como entrada pinMode (pin_Leitura_B, INPUT); // định nghĩa o GPIO como entrada Serial.begin (115200); // inicia a comunicação nối tiếp WiFi.begin (ssid, mật khẩu); // nóncta ao ponto de acesso}

Vòng ()

Trong Vòng lặp này, chúng tôi sẽ kết nối với máy chủ, nghĩa là ESP khác.

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, mật khẩu); chậm trễ (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 + ":" + cổng + "…"); // mensagem delay (1000); }

Trong bước này, trong khi kết nối với máy chủ, chúng tôi thực thi các biến để lưu trữ việc đọc ADC0 và ADC3. Ngoài ra, chúng tôi thực hiện đọc 500 mẫu và lấy trung bình các bài đọc. Chúng tôi đã ánh xạ việc đọc để tạo ra thời lượng chính xác cho việc kiểm soát các servos, đồng thời nối và gửi nó đến máy chủ.

// 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 = map (leitura_A, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para controlle do servo ciclo_B = map (leitura_B, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para controlle do servo // concatena e envia para o servidor cliente.println (String (ciclo_A) + "," + String (ciclo_B)); }

Cuối cùng, nếu không được kết nối, chúng tôi đảm bảo rằng kết nối đã bị ngắt bằng cách hiển thị thông báo tương đương.

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

Bước 9: Tập tin

Tải xuống các tệp:

PDF

NS

Đề xuất: