Съдържание:

PANTILT камера с ESP32: 9 стъпки
PANTILT камера с ESP32: 9 стъпки

Видео: PANTILT камера с ESP32: 9 стъпки

Видео: PANTILT камера с ESP32: 9 стъпки
Видео: Lesson 8: PICAR-X Robot Stares at you | Raspberry Pi Smart Robot car by SunFounder 2024, Ноември
Anonim
Image
Image
PANTILT камера с ESP32
PANTILT камера с ESP32

Днес ще представя PAN TILT, което е устройство, което позволява движението на камера за посоките нагоре, надолу и отстрани. Аз самият произведох това устройство чрез 3D отпечатани части, използвайки две серво и ESP32, което дава възможност за управление на този механизъм чрез WiFi. Нека след това вземем показания, използвайки AD каналите на ESP32, както и аналогова операция с помощта на контролера LED_PWM. Също така прилагаме контрола върху TCP / IP връзка.

Във видеото можете да видите, че имам ESP32, който отчита стойностите на двата потенциометра, които се изпращат (чрез WiFi) към друг ESP32. Той е свързан към двата серво мотора. Камерата се движи (и е прикрепена към PAN TILT) в посоката нагоре, надолу или настрани, в зависимост от контрола, който извършвате през саксиите.

Връзката към дизайна на 3D печат PAN TILT може да бъде намерена тук:

Стъпка 1: Използвани ресурси

Използвани ресурси
Използвани ресурси

• Множество джъмпери за връзка

• Два възела MCU ESP32

• Два USB кабела за ESP32

• Уеб камера за контрол

• Два контролни саксии

• Прото платка

• Източник за сервомоторите

Стъпка 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Стъпка 3: ESP32 периферни устройства

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

ШИМ периферни устройства ESP32 има две периферни устройства, способни да генерират ШИМ сигнали. Те включват двигателя с модулатор на широчината на импулса (MCPWM), предназначен за управление на мощността и двигателя, и LED_PWM, разработен за контрол на интензитета на LED. Но те могат да се използват и по общ начин.

Ще използваме LED_PWM, който може да генерира 16 независими PWM канала с конфигурируеми периоди и работни цикли. Той има до 16 бита резолюция.

Стъпка 4: ШИМ за управление на сервомотора

ШИМ за управление на серво мотора
ШИМ за управление на серво мотора

Управлението на серво мотора се извършва чрез регулиране на широчинно -импулсната модулация на квадрат със специфична честота.

За използваното серво (както и за повечето) честотата е 50Hz. Също така, дължината на импулса от 1 до 2 ms определя ъгловата позиция на серво.

Ще насочим канал 0 от LED_PWM към GPIO13 и канал 1 към GPIO12, като използваме тази информация за извършване на контрола.

Стъпка 5: Аналогово улавяне

Аналогово улавяне
Аналогово улавяне

Периферно аналогово -цифрово преобразуване

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

Приложеното напрежение не трябва да надвишава диапазона от 0 до 3V.

Извършеното преобразуване не поддържа постоянна грешка за всички избрани напрежения и всичко зависи от конфигурирания диапазон. За диапазон от 150mV при 2, 450V е необходима проверка на поведението за по -критични приложения.

За улавяне ще използваме потенциометър от 10k като делител на напрежение. Заснемането ще се извършва в канал ADC0 и ADC3, достъпен чрез GPIO36 и GPIO39.

Стъпка 6: Схема - Сървър и клиент

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

Стъпка 7: Изходен код на точката за достъп и сървъра

Изявления

Включвам WiFi библиотеката и дефинирам някои променливи.

#include // включване на библиотека WiFi const int freq = 50; // честота до PWM const int canal_A = 0; // Primeiro канал прави контролер LED_PWM const int canal_B = 1; // канал за управление до LED_PWM const int resolucao = 12; // Resolução usado без контролер 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 channel 1 será redirecionado const char* ssid = "ESP32ap"; // постоянен com o SSID за WiFi до пощенска връзка с ESP32 const char* password = "12345678"; // senha para confirmmação de conexão no ponto de acesso const int port = 2; // porta na qual o servidor receberá като conexões int ciclo_A = 0; // variável que receberá o ciclo de atuação do channel A int ciclo_B = 0; // промяна на изискванията за получаване на канал A WiFiServer сървър (порт); // деклариране на обект на сървър IP адрес Адрес myIP; // декларация за промяна на IP

Настройвам ()

Тук дефинираме изходните щифтове. Настройваме каналите на желаната честота и настройваме стойността на PWM.

void setup () {pinMode (pin_Atuacao_A, OUTPUT); // определение за pino de atuação A como saída pinMode (pin_Atuacao_B, OUTPUT); // определение за pino de atuação B como saída ledcSetup (canal_A, freq, resolucao); // Настройка на канал 0 за честота от 50 Hz и резолюция от 12 бита ledcSetup (channel_B, честота, резолюция); // Ajustando на канал 1 за честота от 50 Hz и резолюция от 12 бита ledcAttachPin (pin_Atuacao_A, channel_A); // пренасочване на канал 0 за пино 13 ledcAttachPin (pin_Atuacao_B, channel_B); // пренасочване на канал 1 пара или пино 12 ledcWrite (channel_A, ciclo_A); // определение за доблест до PWM параграф 0 ledcWrite (canal_B, ciclo_B); // определение за доблест до PWM параграф 0

Стартирахме серийната точка за достъп със SSID ESP32ap и парола. След това получаваме IP на сървъра и стартираме сървъра.

Serial.begin (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, парола); // iniciando o ponto de acesso com SSID ESP32ap e senha 12345678 Serial.println ("Obtendo IP"); // mensagem myIP = WiFi.softAPIP (); // получаване на IP до сървър (като не можете да конфигурирате deverá ser o padrão de fábrica) Serial.println ("IP:" + WiFi.localIP ()); // mensagem Serial.println ("Iniciando servidor em:" + String (порт)); // mensagem server.begin (); // iniciando o servidor}

Цикъл ()

В Loop първото нещо, което ще направим, е да създадем екземпляр на клиента, като се свържем и свържем с клиентската променлива. Проверете дали клиентът е свързан. Ако е така, стартираме променливата, която ще получи данните. Докато връзката е установена и ако се получат данни, четем знаците за променливата c. И накрая, ние свързваме c в променливата на данните.

void loop () {WiFiClient cliente = server.available (); // се свързвам с клиентите, свързваме с различна клиентка if (cliente.connected ()) {// се виждам с клиентите conectado String dados = ""; // inicia a variável que Receberá os dados Serial.println ("Cliente conectado."); // mensagem while (cliente.connected ()) {// enquanto a conexão estiver estabelecida 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

Ако се получи знак за нов ред, ние търсим индекса на знака „,“в низа в данните. Получаваме поднизовете до точно преди запетаята и след това ги преобразуваме в цяло число. Задаваме 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, ciclo_A); // Ajusta o PWM до канал A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do channel B dados = ""; // Limpa a variável}}}}

Ако клиентът се прекъсне, ние потвърждаваме края на връзката. Изчакваме за момент и отпечатваме „Няма свързан клиент“. След това изчакваме още секунда, преди да рестартираме.

// caso o cliente se desconecte, потвърждава o fim da conexão забавяне (50); // aguarda um momento cliente.stop (); Serial.println ("Nenhum cliente conectado."); // забавяне на менсасем (1000); // aguarda um segundo antes de reiniciar}

Стъпка 8: Изходен код на клиента

Изявления

Отново включихме WiFi библиотеката, този път на клиента. Също така дефинираме променливите.

#include const char* ssid = "ESP32ap"; // SSID за достъп до 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; // варира que receberá o valor do ciclo do PWM A int ciclo_B = 0; // Variável que receberá o dolor do ciclo do PWM B WiFiClient client; // деклариране на клиенти

Настройвам ()

Определяме GPIO като вход, стартираме сериала и се свързваме с точката за достъп.

void setup () {pinMode (pin_Leitura_A, INPUT); // дефинираме GPIO como entrada pinMode (pin_Leitura_B, INPUT); // дефиниране на GPIO като въвеждане на Serial.begin (115200); // inicia a comunicação сериен WiFi.begin (ssid, парола); // conecta ao ponto de acesso}

Цикъл ()

В този цикъл ще се свържем със сървъра, което означава другия ESP.

void loop () {// не се свързва с ao ponto de acesso, тента се свързва докато (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " - Conectando без WiFi" + ssid + "…"); // mensagem WiFi.begin (ssid, парола); забавяне (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 + ":" + порт + "…"); // забавяне на менсасем (1000); }

В тази стъпка, докато сме свързани със сървъра, ние изпълняваме променливите, за да съхраним показанията на ADC0 и ADC3. Също така извършихме отчитането на 500 проби и осреднихме показанията. Ние картографирахме четенето, за да създадем правилната продължителност за управление на сервомоторите, и го свързваме и изпращаме до сървъра.

// enquanto estiver conectado ao servidor while (cliente.connected ()) {int leitura_A = 0; // променлив параметър за арматура и ADC0 int leitura_B = 0; // променлив параметър за арматура и ADIC3 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); // mapeia a leitura para criar a duração correta para controle do servo ciclo_B = map (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 ()) + " - cliente desconectado …"); // mensagem}

Стъпка 9: Файлове

Изтеглете файловете:

PDF

АЗ НЕ

Препоръчано: