Оглавление:

Камера PANTILT с ESP32: 9 шагов
Камера PANTILT с ESP32: 9 шагов

Видео: Камера PANTILT с ESP32: 9 шагов

Видео: Камера PANTILT с ESP32: 9 шагов
Видео: esp 32 cam. Плата ESP с камерой ov2640 Установка ESP32, подключение 2024, Июль
Anonim
Image
Image
Камера PANTILT с ESP32
Камера PANTILT с ESP32

Сегодня я представлю PAN TILT, устройство, которое позволяет перемещать камеру в направлениях вверх, вниз и в стороны. Я сам произвел это устройство из деталей, напечатанных на 3D-принтере, с использованием двух сервоприводов и ESP32, что позволяет управлять этим механизмом через Wi-Fi. Затем давайте снимем показания с использованием каналов AD ESP32, а также с помощью аналоговой операции с помощью контроллера LED_PWM. Также мы применяем контроль над соединением TCP / IP.

На видео вы можете видеть, что у меня ESP32 считывает значения двух потенциометров, которые отправляются (через Wi-Fi) на другой ESP32. Он подключен к двум серводвигателям. Камера перемещается (и прикреплена к PAN TILT) в направлениях вверх, вниз или в сторону, в зависимости от управления, которое вы осуществляете с помощью горшков.

Ссылку на дизайн 3D-печати PAN TILT можно найти здесь:

Шаг 1. Используемые ресурсы

Используемые ресурсы
Используемые ресурсы

• Несколько перемычек для подключения

• Два узла MCU ESP32

• Два USB-кабеля для ESP32

• Веб-камера для управления

• Две контрольные кастрюли

• макетная плата

• Источник для сервоприводов

Шаг 2: NodeMCU ESP32S - Распиновка

NodeMCU ESP32S - Распиновка
NodeMCU ESP32S - Распиновка

Шаг 3: Периферийные устройства ESP32

Периферийные устройства ESP32
Периферийные устройства ESP32

Периферийные устройства PWM ESP32 имеет два периферийных устройства, способных генерировать сигналы PWM. К ним относятся механизм широтно-импульсной модуляции (MCPWM), предназначенный для управления мощностью и двигателем, и LED_PWM, разработанный для управления яркостью светодиода. Но они также могут использоваться в общем виде.

Мы будем использовать LED_PWM, который может генерировать 16 независимых каналов ШИМ с настраиваемыми периодами и рабочими циклами. Он имеет разрешение до 16 бит.

Шаг 4: ШИМ управления серводвигателем

Управление серводвигателем ШИМ
Управление серводвигателем ШИМ

Управление серводвигателем осуществляется путем настройки широтно-импульсной модуляции квадрата с определенной частотой.

Для используемого сервопривода (как и для большинства) частота составляет 50 Гц. Кроме того, ширина импульса от 1 до 2 мс определяет угловое положение сервопривода.

Мы направим канал 0 LED_PWM на GPIO13 и канал 1 на GPIO12, используя эту информацию для выполнения управления.

Шаг 5: Аналоговый захват

Аналоговый захват
Аналоговый захват

Периферийное устройство для аналогово-цифрового преобразования

ESP32 имеет аналого-цифровые преобразователи, которые могут применяться до 18 каналов, но только в аналоговых GPIO.

Приложенное напряжение не должно превышать диапазон от 0 до 3 В.

Выполняемое преобразование не поддерживает постоянную ошибку для всех выбранных напряжений, и все это зависит от настроенного диапазона. Для диапазона 150 мВ при 2, 450 В требуется проверка поведения для более важных приложений.

Для захвата мы будем использовать потенциометр 10k в качестве делителя напряжения. Захват будет производиться в каналах ADC0 и ADC3, доступных через GPIO36 и GPIO39.

Шаг 6: Схема - сервер и клиент

Схема - сервер и клиент
Схема - сервер и клиент

Шаг 7: Исходный код точки доступа и сервера

Заявления

Я включаю библиотеку WiFi и определяю несколько переменных.

#include // включение библиотеки WiFi const int freq = 50; // частота ШИМ const int canal_A = 0; // примейро канал для управления LED_PWM const int canal_B = 1; // второй канал для управления LED_PWM const int resolucao = 12; // Использование без управления LED_PWM const int pin_Atuacao_A = 13; // Pino para onde o channel 0 será redirecionado const int pin_Atuacao_B = 12; // Переадресация канала 1 после перенаправления const char * ssid = "ESP32ap"; // постоянный SSID для Wi-Fi с подключением к ESP32 const char * password = "12345678"; // отправлено для подтверждения подключения без доступа к const int port = 2; // порт на качество получателя сервера как на соединения int ciclo_A = 0; // переменная, полученная при повторном цикле обращения к каналу A int ciclo_B = 0; // переменная, полученная или запущенная на канал A WiFiServer server (port); // объявить объект сервера IPAddress myIP; // объявить переменную IP

Настраивать ()

Здесь мы определяем выходные контакты. Устанавливаем каналы на нужную частоту и выставляем значение ШИМ.

void setup () {pinMode (pin_Atuacao_A, ВЫХОД); // определение пино-де-атуасана Как указать pinMode (pin_Atuacao_B, OUTPUT); // определение пино из атрибута B como saída ledcSetup (canal_A, freq, resolucao); // Настройка канала 0 на частоту 50 Гц и разрешение 12 бит ledcSetup (canal_B, freq, resolucao); // Настройка канала 1 для частоты 50 Гц и разрешения 12 бит ledcAttachPin (pin_Atuacao_A, canal_A); // перенаправление канала 0 на канал 13 ledcAttachPin (pin_Atuacao_B, canal_B); // перенаправление канала 1 пункт 12 ledcWrite (canal_A, ciclo_A); // определение достоинства ШИМ para 0 ledcWrite (canal_B, ciclo_B); // определение доблести ШИМ пункт 0

Мы запустили серийник, точку доступа с SSID ESP32ap и паролем. Затем мы получаем IP-адрес сервера и запускаем сервер.

Serial.begin (115200); // начальный серийный номер Serial.println ("Начальный элемент доступа:" + String (ssid)); // сообщение WiFi.softAP (ssid, пароль); // начальный идентификатор доступа к SSID ESP32ap e senha 12345678 Serial.println ("Obtendo IP"); // сообщение myIP = WiFi.softAPIP (); // получить IP-адрес от сервера (не может быть настроен на сервере или на заводе) Serial.println ("IP:" + WiFi.localIP ()); // сообщение Serial.println ("Iniciando servidor em:" + String (порт)); // сообщение server.begin (); // iniciando o servidor}

Петля ()

В Loop первое, что мы собираемся сделать, это создать экземпляр клиента, подключиться и привязать к переменной клиента. Проверьте, подключен ли клиент. Если это так, мы запускаем переменную, которая будет получать данные. Пока соединение установлено и если данные получены, мы читаем символы для переменной c. Наконец, мы объединяем c в переменную данных.

void loop () {WiFiClient cliente = server.available (); // с клиентом, который связан с клиентом, связать с ним разных клиентов if (cliente.connected ()) {// у него есть клиент, связанный с клиентом String dados = ""; // инициировать переменную, полученную при отправке данных Serial.println ("Conectado. клиент"); // сообщение while (cliente.connected ()) {// запрос на установление связи if (cliente.available ()) {// e se houver dados a Receber char c = cliente.read (); // leia os caracteres para a varável c dados = dados + c; // concatene c na varável dados

Если получен символ новой строки, мы ищем индекс символа ',' в строке данных. Мы получаем подстроки прямо перед запятой, а затем преобразуем их в целые числа. Устанавливаем ШИМ каналов A и B. Обнуляем переменную.

if (c == '\ n') {// это символ новой строки для recbido int virgula = dados.indexOf (','); // получить pelo índice do caracter ',' na string em dados ciclo_A = (dados.substring (0, virgula)). toInt (); // получить подстроку, которая предшествовала изменению, и преобразовать ее для целого ciclo_B = dados.substring (virgula + 1, dados.length ()). toInt (); // получить подстроку, являющуюся vírgula e converta para inteiro ledcWrite (canal_A, ciclo_A); // Настройка или ШИМ для канала A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do canal B dados = ""; // Limpa a varável}}}}

Если клиент отключается, мы подтверждаем окончание подключения. Ждем и печатаем «Нет подключенного клиента». Затем мы ждем еще секунду перед перезапуском.

// caso o cliente se desconecte, confirmma o fim da conexão delay (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 для доступа к ESP32 const char * password = "12345678"; // Отправка для доступа к подключению const uint16_t port = 2; // Выходные данные для сервера 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; // переменная, которая была получена или использована для запуска ШИМ A int ciclo_B = 0; // Вариант, который получил, сделав цикл для PWM B WiFiClient cliente; // declaração do objeto cliente

Настраивать ()

Мы определяем GPIO как вход, запускаем последовательный порт и подключаемся к точке доступа.

void setup () {pinMode (pin_Leitura_A, INPUT); // определение GPIO для входа pinMode (pin_Leitura_B, INPUT); // определение GPIO для ввода Serial.begin (115200); // подключение последовательного порта WiFi.begin (ssid, пароль); // conecta ao ponto de acesso}

Петля ()

В этом цикле мы подключимся к серверу, то есть к другому ESP.

void loop () {// не подключено к подключению, выполняется подключение while (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + "- Conectando no WiFi" + ssid + «…»); // сообщение WiFi.begin (ssid, пароль); задержка (2000); } Serial.println (String (millis ()) + "- Conectado…"); // сообщение // не подключено к сервидору, сейчас это соединение while (! cliente.connect (host, port)) {Serial.println (String (millis ()) + "- Conectando no Servidor" + host + ":" + порт + "…"); // задержка сообщения (1000); }

На этом этапе, пока мы подключены к серверу, мы выполняем переменные для хранения показаний ADC0 и ADC3. Также мы провели считывание 500 образцов и усреднили показания. Мы сопоставили показания, чтобы создать правильную продолжительность управления сервоприводами, а затем объединить и отправить их на сервер.

// добавить на сервер conectado на сервере while (cliente.connected ()) {int leitura_A = 0; // Вариант для оружия, который используется для ADC0 int leitura_B = 0; // переменная для оружия, используемая для ADC3 int amostras = 500; // число амострасов 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); // создайте новую карту, чтобы изменить срок службы для управления сервомеханизмом ciclo_B = map (leitura_B, 0, 4095, 140, 490); // создайте документ, который используется для постоянного контроля, для управления сервоприводом // объединение и преобразование для сервера-клиента.println (String (ciclo_A) + "," + String (ciclo_B)); }

Наконец, если соединение не установлено, мы гарантируем, что соединение было прервано, отображая эквивалентное сообщение.

// не работает, гарантия соединения для завершения cliente.stop (); Serial.println (String (millis ()) + "- desconectado…"); // сообщение}

Шаг 9: файлы

Загрузите файлы:

PDF

Я НЕТ

Рекомендуемые: