Оглавление:
- Шаг 1. Используемые ресурсы
- Шаг 2: NodeMCU ESP32S - Распиновка
- Шаг 3: Периферийные устройства ESP32
- Шаг 4: ШИМ управления серводвигателем
- Шаг 5: Аналоговый захват
- Шаг 6: Схема - сервер и клиент
- Шаг 7: Исходный код точки доступа и сервера
- Шаг 8: Исходный код клиента
- Шаг 9: файлы
Видео: Камера PANTILT с ESP32: 9 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:52
Сегодня я представлю 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 - Распиновка
Шаг 3: Периферийные устройства 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: файлы
Загрузите файлы:
Я НЕТ
Рекомендуемые:
Камера видеонаблюдения Raven Pi: 7 шагов (с изображениями)
Камера безопасности Raven Pi: этот пластиковый ворон наслаждается новой загробной жизнью в качестве практичной, но жуткой камеры безопасности Raven Pi. У него на животе Raspberry Pi, а в шею встроена камера Pi, которая снимает HD-видео при обнаружении движения. В то же время это
Инфракрасная игровая камера Raspberry Pi: 6 шагов
Инфракрасная игровая камера Raspberry Pi: я только начал изучать Raspberry Pi и был заинтригован модулем инфракрасной камеры Pi. Я живу в несколько удаленном районе и видел признаки того, что различные дикие твари исследуют дом по ночам. У меня была идея создать ниггера
Замедленная камера с использованием платы ESP32-CAM: 6 шагов
Замедленная камера с использованием платы ESP32-CAM: этот проект основан на предыдущем проекте цифровой камеры, и мы создаем покадровую камеру с использованием платы ESP32-CAM. Все изображения последовательно сохраняются на карту microSD, и плата переходит в спящий режим после съемки изображения, чтобы сохранить память
IP-камера с функцией распознавания лиц с использованием платы ESP32-CAM: 5 шагов
IP-камера с функцией распознавания лиц с использованием платы ESP32-CAM: этот пост отличается от других, и мы рассмотрим очень интересную плату ESP32-CAM, которая на удивление дешева (менее 9 долларов США) и проста в использовании. Мы создаем простую IP-камеру, которую можно использовать для потоковой передачи видео в реальном времени с помощью 2
Система корпуса ESP32-CAM и камера для 3D-принтера: 10 шагов (с изображениями)
Система корпуса ESP32-CAM и камера для 3D-принтера: я искал возможность заменить камеру на моем 3-D принтере чем-то маленьким, простым и функциональным … и дешевым. Несколько поисков в Google привели меня к модулю ESP32-Cam. Вы можете найти их менее чем за 10 долларов, например, намного дешевле, и они действительно хорошо работают