Sadržaj:
- Korak 1: Korišteni resursi
- Korak 2: NodeMCU ESP32S - ispis
- Korak 3: ESP32 periferne jedinice
- Korak 4: PWM za upravljanje servo motorom
- Korak 5: Analogno snimanje
- Korak 6: Krug - poslužitelj i klijent
- Korak 7: Izvorni kod pristupne točke i poslužitelja
- Korak 8: Izvorni kod korisnika
- Korak 9: Datoteke
2025 Autor: John Day | [email protected]. Zadnja promjena: 2025-01-13 06:57
Danas ću vam predstaviti PAN TILT, uređaj koji omogućuje kretanje kamere za smjerove gore, dolje i u stranu. I sam sam proizvodio ovaj uređaj putem 3D ispisanih dijelova, koristeći dva serva i ESP32, što omogućuje upravljanje ovim mehanizmom putem WiFi -a. Uzmimo tada očitanja pomoću AD kanala ESP32, kao i analognu operaciju pomoću kontrolera LED_PWM. Također, primjenjujemo kontrolu nad TCP / IP vezom.
U videu možete vidjeti da imam ESP32 koji čita vrijednosti dva potenciometra, koji se šalju (putem WiFi -a) na drugi ESP32. Spojen je na dva servo motora. Fotoaparat se pomiče (i pričvršćen je za PAN TILT) u smjeru gore, dolje ili bočno, ovisno o kontroli koju vršite kroz lonce.
Link do dizajna 3D ispisa PAN TILT možete pronaći ovdje:
Korak 1: Korišteni resursi
• Više kratkospojnika za povezivanje
• Dva NSP MCU ESP32
• Dva USB kabela za ESP32
• Web kameru za kontrolu
• Dva kontrolna lonca
• Protoboard
• Izvor za servo pogone
Korak 2: NodeMCU ESP32S - ispis
Korak 3: ESP32 periferne jedinice
PWM periferije ESP32 ima dvije periferije koje mogu generirati PWM signale. To uključuje motor s modulatorom širine impulsa (MCPWM) dizajniran za kontrolu snage i motora, te LED_PWM, razvijen za kontrolu intenziteta LED dioda. Ali mogu se koristiti i na generički način.
Koristit ćemo LED_PWM, koji može generirati 16 neovisnih PWM kanala s podesivim razdobljima i radnim ciklusima. Ima do 16 bita rezolucije.
Korak 4: PWM za upravljanje servo motorom
Upravljanje servo motorom vrši se podešavanjem širine impulsa modulacije kvadrata sa specifičnom frekvencijom.
Za korišteni servo (kao i za većinu) frekvencija je na 50Hz. Također, širina impulsa od 1 do 2 ms određuje kutni položaj serva.
Kanal 0 LED_PWM -a usmjerit ćemo na GPIO13, a kanal 1 na GPIO12, koristeći ove informacije za obavljanje kontrole.
Korak 5: Analogno snimanje
Periferija analogno -digitalne konverzije
ESP32 ima analogno-digitalne pretvarače koji se mogu primijeniti u do 18 kanala, ali samo u analognim GPIO-ovima.
Primijenjeni napon ne smije prelaziti raspon 0 do 3V.
Provedena pretvorba ne održava konstantnu pogrešku za sve uzorkovane napone, a sve ovisi o konfiguriranom rasponu. Za raspon od 150mV na 2, 450V, provjera ponašanja je potrebna za kritičnije primjene.
Za hvatanje ćemo koristiti potenciometar od 10k kao razdjelnik napona. Snimanje će se izvršiti u kanalima ADC0 i ADC3, kojima su dostupni GPIO36 i GPIO39.
Korak 6: Krug - poslužitelj i klijent
Korak 7: Izvorni kod pristupne točke i poslužitelja
Izjave
Uključujem WiFi knjižnicu i definiram neke varijable.
#include // uključuje biblioteku WiFi const int freq = 50; // frekvencija do PWM const int kanal_A = 0; // primeiro channel do controlador LED_PWM const int canal_B = 1; // segundo kanal do controlador LED_PWM const int resolucao = 12; // Resolução usado bez kontrole 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"; // konstantno povezivanje SSID -a s Wi -Fi mrežom na ESP32 const char* password = "12345678"; // senha para confirmationmaçã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; // varijaável que receberá o ciclo de atuação do kanala A int ciclo_B = 0; // variável que Receberá o ciclo de atuação do canal A WiFiServer poslužitelj (port); // deklarira da objekat poslužitelja IPAddress myIP; // deklariranje da variável de IP
Postaviti ()
Ovdje definiramo izlazne pinove. Postavili smo kanale na željenu frekvenciju i postavili vrijednost PWM.
void setup () {pinMode (pin_Atuacao_A, OUTPUT); // 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); // Ajustando o kanalu 0 za frekvencije od 50 Hz i razlučivost od 12 bita ledcSetup (kanal_B, frekvencija, razlučivost); // Ajustando o kanalu 1 za frekvencije od 50 Hz i razlučivost od 12 bita ledcAttachPin (pin_Atuacao_A, kanal_A); // redirecionando o channel 0 para o pino 13 ledcAttachPin (pin_Atuacao_B, canal_B); // redirecionando o kanalu 1 para o pino 12 ledcWrite (kanal_A, ciclo_A); // definiranje o valor do PWM para 0 ledcWrite (canal_B, ciclo_B); // definindo o valor do PWM paragraf 0
Započeli smo serijsku, pristupnu točku sa SSID -om ESP32ap i lozinkom. Zatim dobivamo IP poslužitelja i pokrećemo poslužitelj.
Serial.begin (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, lozinka); // 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}
Petlja ()
U Loopu, prvo što ćemo učiniti je instancirati klijenta, povezati ga i povezati s klijentskom varijablom. Provjerite je li klijent povezan. Ako je tako, pokrećemo varijablu koja će primati podatke. Sve dok je veza uspostavljena i ako se primaju podaci, čitamo znakove za varijablu c. Konačno, povezujemo c u varijablu podataka.
void loop () {WiFiClient cliente = server.available (); // se um cliente conectar, associe 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 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
Ako se primi znak novog retka, tražimo indeks znaka ',' u nizu u podacima. Podniz dobijamo točno ispred zareza, a zatim ih pretvaramo u cijeli broj. Postavljamo PWM kanala A i B. Brišemo varijablu.
if (c == '\ n') {// se um karaktera de nova linha za recebido int virgula = dados.indexOf (','); // nabavljamo 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 niz após a vírgula e converta para inteiro ledcWrite (channel_A, ciclo_A); // Ajusta o PWM do kanala A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do kanala B dados = ""; // Limpa a variável}}}}
Ako se klijent prekine, potvrđujemo kraj veze. Čekamo trenutak i ispisujemo "No client connected". Zatim čekamo još jednu sekundu prije ponovnog pokretanja.
// caso o cliente se desconecte, confirmma o fim da conexão delay (50); // aguarda um momento cliente.stop (); Serial.println ("Nenhum cliente conectado."); // kašnjenje mensagema (1000); // aguarda um segundo antes de reiniciar}
Korak 8: Izvorni kod korisnika
Izjave
Ponovno smo uključili WiFi biblioteku, ovaj put na klijentu. Također, definiramo varijable.
#include const char* ssid = "ESP32ap"; // SSID za pristup ESP32 const char* lozinka = "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; // deklaração do objeto cliente
Postaviti ()
Definiramo GPIO -ove kao ulaz, započinjemo serijsku vezu i povezujemo se s pristupnom točkom.
void setup () {pinMode (pin_Leitura_A, INPUT); // definiramo GPIO kao entrada pinMode (pin_Leitura_B, INPUT); // definirati o GPIO kao entrada Serial.begin (115200); // inicia a comunicação serijski WiFi.begin (ssid, lozinka); // conecta ao ponto de acesso}
Petlja ()
U ovoj petlji ćemo se povezati sa poslužiteljem, što znači drugi ESP.
void loop () {// se não conectado ao ponto de acesso, tenta se conectar while (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " - Conectando nema WiFi" + ssid + "…"); // mensagem WiFi.begin (ssid, lozinka); odgoda (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 + ":" + port + "…"); // kašnjenje mensagema (1000); }
U ovom koraku, dok smo povezani s poslužiteljem, izvršavamo varijable za spremanje očitanja ADC0 i ADC3. Također smo izvršili čitanje 500 uzoraka i prosječno očitali. Mapirali smo očitanje kako bismo stvorili ispravno trajanje za kontrolu servomotora, te ga spojili i poslali na poslužitelj.
// enquanto estiver conectado ao servidor while (cliente.connected ()) {int leitura_A = 0; // variável para armazenar a leitura do ADC0 int leitura_B = 0; // varijable 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 + analogno čitanje (pin_Leitura_B); contador ++; } leitura_A = leitura_A / amostras; // média das leituras leitura_B = leitura_B /amostras; ciclo_A = karta (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)); }
Konačno, ako nismo povezani, osiguravamo da je veza prekinuta prikazivanjem ekvivalentne poruke.
// se não coonectado, garante que a conexão foi finalizada cliente.stop (); Serial.println (String (millis ()) + " - cliente desconectado …"); // mensagem}
Korak 9: Datoteke
Preuzmite datoteke:
INO