Inhoudsopgave:
- Stap 1: Gebruikte bronnen
- Stap 2: NodeMCU ESP32S - Pinout
- Stap 3: ESP32 Randapparatuur
- Stap 4: Servomotorbesturing PWM
- Stap 5: Analoge opname
- Stap 6: Circuit - Server en client
- Stap 7: Broncode van het toegangspunt en de server
- Stap 8: Broncode van de klant
- Stap 9: Bestanden
Video: PANTILT-camera met ESP32: 9 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:17
Vandaag zal ik de PAN TILT presenteren, een apparaat dat de beweging van een camera mogelijk maakt voor de richtingen omhoog, omlaag en opzij. Ik heb dit apparaat zelf geproduceerd door middel van 3D-geprinte onderdelen, met behulp van twee servo's en de ESP32, waardoor het mogelijk is om dit mechanisme via WiFi te bedienen. Laten we dan metingen uitvoeren met behulp van de AD-kanalen van de ESP32, evenals een analoge bewerking met behulp van de controller LED_PWM. Ook passen wij de besturing toe over een TCP/IP verbinding.
In de video kun je zien dat ik een ESP32 heb die de waarden uitleest van de twee potentiometers, die (via WiFi) naar een andere ESP32 worden verzonden. Het is verbonden met de twee servomotoren. De camera beweegt (en is bevestigd aan de PAN TILT) in de richtingen omhoog, omlaag of zijwaarts, afhankelijk van de controle die u door de potten maakt.
De link naar het PAN TILT 3D-printontwerp is hier te vinden:
Stap 1: Gebruikte bronnen
• Meerdere jumpers voor verbinding
• Twee Node MCU ESP32's
• Twee USB-kabels voor de ESP32
• Een webcam voor controle
• Twee controlepotten
• Een protobord
• Een bron voor de servo's
Stap 2: NodeMCU ESP32S - Pinout
Stap 3: ESP32 Randapparatuur
PWM-randapparatuur De ESP32 heeft twee randapparatuur die PWM-signalen kan genereren. Deze omvatten de Pulse Width Modulator (MCPWM)-engine die is ontworpen voor stroom- en motorbesturing, en de LED_PWM, ontwikkeld voor LED-intensiteitsregeling. Maar ze kunnen ook op een generieke manier worden gebruikt.
We zullen de LED_PWM gebruiken, die 16 onafhankelijke PWM-kanalen kan genereren met configureerbare perioden en werkcycli. Het heeft een resolutie tot 16 bits.
Stap 4: Servomotorbesturing PWM
De servomotorbesturing wordt uitgevoerd door de pulsbreedtemodulatie van een vierkant met een specifieke frequentie aan te passen.
Voor de gebruikte servo (evenals voor de meeste), is de frequentie 50 Hz. Ook bepaalt een pulslengte van 1 tot 2 ms de hoekpositie van de servo.
We zullen kanaal 0 van LED_PWM naar GPIO13 en kanaal 1 naar GPIO12 routeren, waarbij we deze informatie gebruiken om de controle uit te voeren.
Stap 5: Analoge opname
Analoog naar digitaal conversie randapparaat
De ESP32 heeft analoog-naar-digitaal-converters die in maximaal 18 kanalen kunnen worden toegepast, maar alleen in analoog-compatibele GPIO's.
De aangelegde spanning mag het bereik van 0 tot 3V niet overschrijden.
De uitgevoerde conversie handhaaft geen constante fout voor alle bemonsterde spanningen, en dit hangt allemaal af van het geconfigureerde bereik. Voor een bereik van 150mV bij 2.450V is een gedragscontrole vereist voor meer kritische toepassingen.
Voor het vastleggen gebruiken we een potentiometer van 10k als spanningsdeler. De opname zal worden gedaan in kanaal ADC0 en ADC3, toegankelijk via GPIO36 en GPIO39.
Stap 6: Circuit - Server en client
Stap 7: Broncode van het toegangspunt en de server
Verklaringen
Ik neem de WiFi-bibliotheek op en definieer enkele variabelen.
#include // inclusief biblioteca WiFi const int freq = 50; //frequência do PWM const int canal_A = 0; //primeiro canal do controlador LED_PWM const int canal_B = 1; // segundo canal do controlador LED_PWM const int resolucao = 12; // Gebruik geen controle meer 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 canal 1 será redirecionado const char* ssid = "ESP32ap"; //constante com o SSID voor WiFi met toegang tot ESP32 const char * wachtwoord = "12345678"; //senha para confirmaçã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 Een WiFiServer-server (poort); // declaração do objeto servidor IPAddress myIP; //declaração da variável de IP
Opstelling ()
Hier definiëren we de uitgangspinnen. We stellen de kanalen in op de gewenste frequentie en stellen de PWM-waarde in.
void setup(){ pinMode(pin_Atuacao_A, OUTPUT); // definieer of pino de atuação Een como saída pinMode (pin_Atuacao_B, OUTPUT); // definieer of pino de atuação B como saída ledcSetup (canal_A, freq, resolucao); //Ajustando of kanaal 0 voor frequenties van 50 Hz en resolutie van 12bits ledcSetup (canal_B, freq, resolucao); //Aanpassing van kanaal 1 voor frequentie van 50 Hz en resolutie van 12bits ledcAttachPin (pin_Atuacao_A, canal_A); //redirecionando van kanaal 0 voor pino 13 ledcAttachPin (pin_Atuacao_B, kanaal_B); // redirecionando o kanaal 1 para o pino 12 ledcWrite (canal_A, ciclo_A); // definieer o valor do PWM para 0 ledcWrite (canal_B, ciclo_B); // definieer o valor do PWM para 0
We begonnen het seriële, toegangspunt met SSID ESP32ap en wachtwoord. We krijgen dan het IP-adres van de server en starten de server.
Serieel.begin(115200); //iniciando a Serial Serial.println ("Iniciando ponto de acesso: " + String (ssid)); //mensagem WiFi.softAP (ssid, wachtwoord); //iniciando o ponto de acesso com SSID ESP32ap en senha 12345678 Serial.println ("Obtendo IP"); //mensagem mijnIP = WiFi.softAPIP (); //obtendo o IP-server (como não foi configurado deverá ser o padrão de fábrica) Serial.println("IP: " + WiFi.localIP()); //mensagem Serial.println ("Iniciando servador em: " + String (poort)); //mensagem server.begin(); //iniciando of servidor}
lus ()
In Loop is het eerste wat we gaan doen de client instantiëren, verbinden en binden aan de clientvariabele. Controleer of de client is verbonden. Als dat zo is, starten we de variabele die de gegevens zal ontvangen. Zolang de verbinding tot stand is gebracht en als er gegevens worden ontvangen, lezen we de tekens voor de variabele c. Ten slotte voegen we c samen in de gegevensvariabele.
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
Als een newline-teken wordt ontvangen, zoeken we de index van het teken ', ' in de string in de data. We krijgen de substrings tot vlak voor de komma, en dan converteren we ze naar integer. We stellen de PWM van kanalen A en B in. We wissen de variabele.
if (c == '\n') { //se um karakter van nova linha voor recebido int virgula = dados.indexOf(', '); //koop pelo índice do caracter ', ' na string em dados ciclo_A = (dados.substring(0, virgula)).toInt(); //obtenha een substring die voorafgaat aan de oorspronkelijke conversie ciclo_B = dados.substring(virgula + 1, dados.length()).toInt();//obtenha een substring met een vírgula en converta para inteiro ledcWrite(canal_A, ciclo_A); //Ajusta o PWM doen kanaal A ledcWrite (canal_B, ciclo_B); //Ajusta o PWM do kanaal B dados = ""; //Limpa en variável } } } }
Als de client de verbinding verbreekt, bevestigen we het einde van de verbinding. We wachten even en printen "No client connected". We wachten dan nog een seconde voordat we opnieuw beginnen.
// caso o cliente se desconecte, confirma of fim da conexão delay(50); //aguarda um momento cliente.stop(); Serial.println("Nenhum cliente aangesloten."); //mensagem vertraging (1000); //aguarda um segundo antes de reiniciar}
Stap 8: Broncode van de klant
Verklaringen
We hebben de WiFi-bibliotheek opnieuw opgenomen, dit keer op de client. Ook definiëren we de variabelen.
#include const char* ssid = "ESP32ap"; //SSID doe toegang tot ESP32 const char* wachtwoord = "12345678"; //Senha para acessar op ponto de acesso const uint16_t port = 2; // Porta de escuta do servidor const char * host = "192.168.4.1"; // endereço IP-server const int pin_Leitura_A = 36; //GPIO de leitura doen 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; // declaração do objeto cliente
Opstelling ()
We definiëren de GPIO's als invoer, starten de serie en maken verbinding met het toegangspunt.
void setup(){ pinMode(pin_Leitura_A, INPUT); //definieer o GPIO como entrada pinMode (pin_Leitura_B, INPUT); //definieer o GPIO como entrada Serial.begin (115200); //inicia a comunicação seriële WiFi.begin (ssid, wachtwoord); // sluit aan op ponto de acesso }
lus ()
In deze Loop zullen we verbinding maken met de server, dat wil zeggen de andere ESP.
void loop () { // geen verbinding maken met ao ponto de acesso, tenta se conectar while (WiFi.status ()! = WL_CONNECTED) { Serial.println (String (millis ()) + " - Verbinding geen wifi " + ssid + "…"); //mensagem WiFi.begin (ssid, wachtwoord); vertraging (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 + ":" + poort + "…"); //mensagem vertraging (1000); }
In deze stap voeren we, terwijl we verbonden zijn met de server, de variabelen uit om de uitlezing van ADC0 en ADC3 op te slaan. Ook hebben we de lezing van 500 monsters uitgevoerd en de metingen gemiddeld. We hebben de uitlezing in kaart gebracht om de juiste duur voor de besturing van de servo's te creëren, en samen te voegen en naar de server te sturen.
// enquanto estiver conectado en 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; // nummer van 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 = kaart(leitura_A, 0, 4095, 140, 490); //mapeia a leitura para criar en duração correta para control do servo ciclo_B = map(leitura_B, 0, 4095, 140, 490); //mapeia a leitura para criar and duração correta para control do servo //concatena en envia para o servidor cliente.println(String(ciclo_A) + ", " + String(ciclo_B)); }
Ten slotte, als er geen verbinding is, zorgen we ervoor dat de verbinding is verbroken door het equivalente bericht weer te geven.
// geen coonectado, garant voor een conexo foi finalizada cliente.stop(); Serial.println(String(millis()) + " - cliente desconectado…"); //mensage }
Stap 9: Bestanden
Download de bestanden:
INO
Aanbevolen:
Aan de slag met ESP32 - ESP32-kaarten installeren in Arduino IDE - ESP32-knippercode: 3 stappen
Aan de slag met ESP32 | ESP32-kaarten installeren in Arduino IDE | ESP32-knippercode: in deze instructie zullen we zien hoe we met esp32 kunnen werken en hoe we esp32-kaarten in Arduino IDE kunnen installeren en we zullen esp 32 programmeren om knippercode uit te voeren met behulp van arduino ide
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino - Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter - RC Helikopter - RC-vliegtuig met Arduino: 5 stappen (met afbeeldingen)
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino | Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter | RC Helikopter | Rc-vliegtuig met Arduino: een Rc-auto besturen | Quadcopter | Drone | RC vliegtuig | RC-boot, we hebben altijd een ontvanger en zender nodig, stel dat we voor RC QUADCOPTER een 6-kanaals zender en ontvanger nodig hebben en dat type TX en RX is te duur, dus we gaan er een maken op onze
Een computer demonteren met eenvoudige stappen en afbeeldingen: 13 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"
Een computer demonteren met eenvoudige stappen en afbeeldingen: dit is een instructie over het demonteren van een pc. De meeste basiscomponenten zijn modulair en gemakkelijk te verwijderen. Wel is het belangrijk dat je er goed over georganiseerd bent. Dit zal helpen voorkomen dat u onderdelen kwijtraakt, en ook bij het maken van de hermontage e
PCB-ontwerp met eenvoudige en gemakkelijke stappen: 30 stappen (met afbeeldingen)
PCB-ontwerp met eenvoudige en gemakkelijke stappen: HELLO VRIENDEN Het is een zeer nuttige en gemakkelijke tutorial voor diegenen die PCB-ontwerp willen leren, laten we beginnen
Een video met gesplitst scherm maken in vier stappen: 4 stappen (met afbeeldingen)
Een video met gesplitst scherm maken in vier stappen: we zien vaak dezelfde persoon twee keer in een scène in een tv-toneelstuk. En voor zover we weten heeft de acteur geen tweelingbroer. We hebben ook gezien dat er twee zangvideo's op één scherm worden gezet om hun zangkunsten te vergelijken. Dit is de kracht van spl