Obsah:

Kamera PANTILT s ESP32: 9 kroků
Kamera PANTILT s ESP32: 9 kroků

Video: Kamera PANTILT s ESP32: 9 kroků

Video: Kamera PANTILT s ESP32: 9 kroků
Video: Camera Car With Pan Tilt Control | ESP32Cam 2024, Červenec
Anonim
Image
Image
Kamera PANTILT s ESP32
Kamera PANTILT s ESP32

Dnes představím PAN TILT, což je zařízení, které umožňuje pohyb kamery ve směrech nahoru, dolů a do stran. Sám jsem toto zařízení vyrobil prostřednictvím 3D tištěných dílů pomocí dvou serv a ESP32, což umožňuje ovládat tento mechanismus přes WiFi. Pojďme tedy provést odečty pomocí AD kanálů ESP32, stejně jako analogové operace pomocí ovladače LED_PWM. Aplikujeme také kontrolu nad připojením TCP / IP.

Na videu vidíte, že mám ESP32, který čte hodnoty dvou potenciometrů, které jsou odesílány (přes WiFi) do jiného ESP32. Je připojen ke dvěma servomotorům. Kamera se pohybuje (a je připevněna k PAN TILT) ve směrech nahoru, dolů nebo do stran, v závislosti na ovládání, které provedete skrz hrnce.

Odkaz na 3D tiskový design PAN TILT naleznete zde:

Krok 1: Použité zdroje

Použité zdroje
Použité zdroje

• Více propojek pro připojení

• Dva uzly MCU ESP32

• Dva USB kabely pro ESP32

• Webová kamera pro ovládání

• Dva ovládací hrnce

• Protoboard

• Zdroj pro serva

Krok 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Krok 3: Periferie ESP32

Periferie ESP32
Periferie ESP32

Periferie PWM ESP32 má dvě periferie schopné generovat signály PWM. Patří mezi ně motor Pulse Width Modulator (MCPWM) určený pro řízení výkonu a motoru a LED_PWM, vyvinutý pro ovládání intenzity LED. Lze je však také použít obecným způsobem.

Použijeme LED_PWM, který může generovat 16 nezávislých PWM kanálů s konfigurovatelnými periodami a pracovními cykly. Má rozlišení až 16 bitů.

Krok 4: Řízení servomotoru PWM

Řízení servomotoru PWM
Řízení servomotoru PWM

Řízení servomotoru se provádí úpravou modulace šířky pulsu čtverce se specifickou frekvencí.

U použitého serva (stejně jako u většiny) je frekvence 50 Hz. Rovněž šířka impulzu o délce 1 až 2 ms určuje úhlovou polohu serva.

Směřujeme kanál 0 LED_PWM do GPIO13 a kanál 1 do GPIO12, pomocí těchto informací provedeme řízení.

Krok 5: Analogové snímání

Analogové snímání
Analogové snímání

Periferní zařízení pro převod analogově na digitální

ESP32 má analogově-digitální převodníky, které lze použít až v 18 kanálech, ale pouze v analogových GPIO.

Použité napětí nesmí překročit rozsah 0 až 3V.

Provedený převod neudržuje konstantní chybu pro všechna vzorkovaná napětí a vše závisí na nakonfigurovaném rozsahu. Pro rozsah 150 mV při 2, 450 V je pro kritičtější aplikace vyžadována kontrola chování.

Pro zachycení použijeme potenciometr 10k jako dělič napětí. Zachycení bude provedeno v kanálech ADC0 a ADC3, přístupných pomocí GPIO36 a GPIO39.

Krok 6: Okruh - server a klient

Okruh - server a klient
Okruh - server a klient

Krok 7: Zdrojový kód přístupového bodu a serveru

Prohlášení

Zahrnuji knihovnu WiFi a definuji některé proměnné.

#include // inclusão da biblioteca WiFi const int freq = 50; // Frequência do PWM const int canal_A = 0; // kanál Primeiro do ovládání LED_PWM const int canal_B = 1; // kanál segundo do ovládání LED_PWM const int resolucao = 12; // Resolução usado no controlador LED_PWM const int pin_Atuacao_A = 13; // Pino para onde o kanál 0 será přesměrování const int pin_Atuacao_B = 12; // Pino para onde o canal 1 sera redirecionado const char* ssid = "ESP32ap"; // konstantní spojení o SSID do WiFi do přístupového bodu ESP32 const char* heslo = "12345678"; // senha para confirmmaçã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; // variável que receberá o ciclo de atuação do canal A WiFiServer server (port); // deklarujte své služby IPAddress myIP; // deklarace adresy IP

Založit ()

Zde definujeme výstupní piny. Nastavíme kanály na požadovanou frekvenci a nastavíme hodnotu PWM.

neplatné nastavení () {pinMode (pin_Atuacao_A, VÝSTUP); // definindo o pino de atuação A como saída pinMode (pin_Atuacao_B, OUTPUT); // definindo o pino de atuação B como saída ledcSetup (canal_A, freq, resolucao); // Kanály 0 kanálů s frekvencí 50 Hz a rozlišením 12 bitů ledcSetup (kanál_B, frekvence, rozlišení); // Úroveň kanálu 1 s frekvencí 50 Hz a rozlišením 12 bitů ledcAttachPin (pin_Atuacao_A, canal_A); // redirecionando o canal 0 para o pino 13 ledcAttachPin (pin_Atuacao_B, canal_B); // redirecionando o canal 1 para o pino 12 ledcWrite (canal_A, ciclo_A); // definindo o valor do PWM para 0 ledcWrite (canal_B, ciclo_B); // definindo o valor do PWM para 0

Spustili jsme seriál, přístupový bod s SSID ESP32ap a heslo. Poté získáme IP serveru a spustíme server.

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

Smyčka ()

V Loop, první věc, kterou uděláme, je vytvoření instance klienta, připojení a vazba na klientskou proměnnou. Zkontrolujte, zda je klient připojen. Pokud ano, spustíme proměnnou, která data přijme. Dokud je navázáno spojení a pokud jsou přijímána data, čteme znaky pro proměnnou c. Nakonec zřetězíme c v datové proměnné.

void loop () {WiFiClient cliente = server.available (); // se um klientský konektor, asso 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 a conexão estiver establishmentelecida 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

Pokud je přijat znak nového řádku, hledáme v řetězci v datech index znaku ','. Získáme podřetězce těsně před čárkou a poté je převedeme na celé číslo. Nastavíme PWM kanálů A a B. Vymažeme proměnnou.

if (c == '\ n') {// se um caracter de nova linha for recebido int virgula = dados.indexOf (','); // obstarat 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 do canal A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do kanálu B dados = ""; // Limpa a variável}}}}

Pokud se klient odpojí, potvrdíme konec připojení. Chvíli počkáme a vytiskneme „Není připojen žádný klient“. Poté počkáme další sekundu, než restartujeme.

// caso o cliente se desconecte, confirmma o fim da conexão delay (50); // aguarda um momento cliente.stop (); Serial.println („Nenhum cliente conectado.“); // zpoždění mensagemu (1000); // aguarda um segundo antes de reiniciar}

Krok 8: Zdrojový kód zákazníka

Prohlášení

Znovu jsme zahrnuli knihovnu WiFi, tentokrát na straně klienta. Rovněž definujeme proměnné.

#include const char* ssid = "ESP32ap"; // SSID do přístupového bodu ESP32 const char* heslo = "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 receberá o valor do ciclo do PWM A int ciclo_B = 0; // Variável que receberá o valor do ciclo do PWM B WiFiClient cliente; // deklarujte své klienty

Založit ()

Definujeme GPIO jako vstup, spustíme sériové připojení a připojíme se k přístupovému bodu.

neplatné nastavení () {pinMode (pin_Leitura_A, INPUT); // definujte o GPIO como entrada pinMode (pin_Leitura_B, INPUT); // definujte o GPIO como entrada Serial.begin (115200); // inicia a comunicação sériový WiFi.begin (ssid, heslo); // conecta ao ponto de acesso}

Smyčka ()

V této smyčce se připojíme k serveru, což znamená další ESP.

void loop () {// se připojí a pono de acesso, tenta co conectar while (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " - Conectando no WiFi" + ssid + „…“); // mensagem WiFi.begin (ssid, heslo); zpoždění (2000); } Serial.println (String (millis ()) + " - Conectado …"); // mensagem // se připojí k servidoru, připojí se současně (! cliente.connect (host, port)) {Serial.println (String (millis ()) + " - Conectando no Servidor" + host + ":" + port + "…"); // zpoždění mensagemu (1000); }

V tomto kroku, když jsme připojeni k serveru, spustíme proměnné pro uložení čtení ADC0 a ADC3. Také jsme provedli čtení 500 vzorků a zprůměrovali jsme hodnoty. Namapovali jsme čtení, abychom vytvořili správnou dobu trvání pro ovládání serv, zřetězili a odeslali na server.

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

Nakonec, pokud není připojeno, zajistíme, že připojení bylo ukončeno zobrazením ekvivalentní zprávy.

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

Krok 9: Soubory

Stáhnout soubory:

PDF

INO

Doporučuje: