Cov txheej txheem:

PANTILT Lub Koob Yees Duab Nrog ESP32: 9 Cov Kauj Ruam
PANTILT Lub Koob Yees Duab Nrog ESP32: 9 Cov Kauj Ruam

Video: PANTILT Lub Koob Yees Duab Nrog ESP32: 9 Cov Kauj Ruam

Video: PANTILT Lub Koob Yees Duab Nrog ESP32: 9 Cov Kauj Ruam
Video: qhib lub koob yee duab ua yee tau tshaj lij ua tsheb sib nrau rau peb saib/19/9/2023 2024, Hlis ntuj nqeg
Anonim
Image
Image
PANTILT Lub Koob Yees Duab Nrog ESP32
PANTILT Lub Koob Yees Duab Nrog ESP32

Hnub no, kuv yuav nthuav qhia lub PAN TILT, uas yog lub cuab yeej uas tso cai txav lub koob yees duab rau cov lus qhia ntawm nce, nqis, thiab mus rau ob sab. Kuv tus kheej tau tsim cov cuab yeej no dhau los ntawm 3D luam tawm ntu, siv ob lub servos thiab ESP32, uas ua rau nws muaj peev xwm tswj tau cov txheej txheem no los ntawm WiFi. Cia peb tom qab nyeem ntawv siv AD raws ntawm ESP32, nrog rau kev ua haujlwm sib piv siv tus tswj LED_PWM. Tsis tas li, peb thov tswj hwm kev sib txuas TCP / IP.

Hauv cov vis dis aus, koj tuaj yeem pom tias kuv muaj ESP32 nyeem qhov tseem ceeb ntawm ob lub zog loj, uas tau xa (ntawm WiFi) mus rau lwm ESP32. Nws txuas nrog ob lub cav servo. Lub koob yees duab txav mus (thiab txuas nrog PAN TILT) hauv cov lus qhia ntawm nce, nqis, lossis ib sab, nyob ntawm qhov kev tswj hwm koj ua los ntawm lub lauj kaub.

Qhov txuas rau PAN TILT 3D luam ntawv tsim tuaj yeem pom ntawm no:

Kauj Ruam 1: Cov Khoom Siv

Cov peev txheej siv
Cov peev txheej siv

• Ntau tus dhia rau kev sib txuas

• Ob Qhov ntawm MCU ESP32s

• Ob txoj hlua USB rau ESP32

• WebCam rau kev tswj hwm

• Ob lub lauj kaub tswj

• Tus tiv thaiv kab thaiv

• Ib qhov chaw rau servos

Kauj Ruam 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Kauj Ruam 3: ESP32 Cov Khoom Siv Hluav Taws Xob

ESP32 Peripherals
ESP32 Peripherals

PWM Peripherals ESP32 muaj ob lub tshuab muaj peev xwm tsim cov cim PWM. Cov no suav nrog Pulse Width Modulator (MCPWM) lub cav tsim los rau kev tswj hwm lub zog thiab lub cev muaj zog, thiab LED_PWM, tsim los rau LED tswj kev siv. Tab sis lawv kuj tseem tuaj yeem siv rau hauv txoj kev dav.

Peb yuav siv LED_PWM, uas tuaj yeem tsim 16 txoj kev ywj pheej PWM raws nrog lub sijhawm teeb tsa thiab ua haujlwm mus los. Nws muaj txog 16 qhov kev daws teeb meem.

Kauj Ruam 4: Servo Motor Control PWM

Servo Motor Control PWM
Servo Motor Control PWM

Kev tswj hwm lub cav servo yog ua los ntawm kev kho cov mem tes dav kev hloov pauv ntawm ib lub xwmfab nrog qhov tshwj xeeb.

Rau kev siv servo (nrog rau feem ntau), zaus yog 50Hz. Tsis tas li, qhov dav ntawm 1 txog 2ms mem tes ntev txiav txim siab txoj haujlwm angular ntawm servo.

Peb yuav xa cov channel 0 ntawm LED_PWM mus rau GPIO13, thiab channel 1 mus rau GPIO12, siv cov ntaub ntawv no los ua tus tswj.

Kauj ruam 5: Analog Capture

Analog ntes
Analog ntes

Analog to digital conversion peripheral

ESP32 muaj cov hloov pauv sib piv-rau-digital uas tuaj yeem siv tau txog li 18 txoj hauv kev, tab sis tsuas yog hauv analog-enabled GPIOs.

Qhov ntsuas hluav taws xob yuav tsum tsis pub dhau 0 txog 3V ntau.

Kev hloov pauv tau ua tsis tswj hwm qhov yuam kev tas li rau txhua qhov ntsuas hluav taws xob, thiab txhua yam no nyob ntawm qhov teeb tsa ntau yam. Rau thaj tsam ntawm 150mV ntawm 2, 450V, yuav tsum tau kuaj tus cwj pwm rau cov ntawv thov tseem ceeb dua.

Rau kev ntes, peb yuav siv lub hwj chim ntawm 10k ua qhov faib hluav taws xob. Kev ntes yuav ua tiav hauv channel ADC0 thiab ADC3, nkag tau los ntawm GPIO36 thiab GPIO39.

Kauj Ruam 6: Circuit - Server thiab Client

Circuit - Server thiab Client
Circuit - Server thiab Client

Kauj Ruam 7: Tus lej Code ntawm Access Point thiab Server

Cov nqe lus

Kuv suav nrog lub tsev qiv ntawv WiFi, thiab kuv txhais qee qhov txawv.

#include // suav nrog hauv phau ntawv sau npe 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 channel do controlador LED_PWM const int resolucao = 12; // Resolução usado no controlador LED_PWM const int pin_Atuacao_A = 13; // Pino para onde o kwj dej 0 será redirecionado const int pin_Atuacao_B = 12; // Pino para onde o kwj dej 1 será redirecionado const char* ssid = "ESP32ap"; // constante com o SSID do WiFi do ponto de acesso ESP32 const char* password = "12345678"; // senha para confirmação de conexão no ponto de acesso const int chaw nres nkoj = 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 (chaw nres nkoj); // tshaj tawm objeto servidor IPAddress myIP; // tshaj tawm thiab hloov pauv IP

Teeb ()

Ntawm no, peb txhais cov pins tso tawm. Peb teeb tsa cov channel rau qhov xav tau zaus thiab teeb tsa PWM tus nqi.

teeb tsa tsis muaj dab tsi () {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 (channel_A, freq, resolucao); // Ajustando o kwj dej 0 rau zaus zaus 50 Hz e daws teeb meem de 12bits ledcSetup (channel_B, freq, resolucao); // Ajustando o kwj dej 1 rau zaus zaus 50 Hz e daws teeb meem de 12bits ledcAttachPin (pin_Atuacao_A, channel_A); // redirecionando o channel 0 para o pino 13 ledcAttachPin (pin_Atuacao_B, channel_B); // redirecionando o channel 1 para o pino 12 ledcWrite (channel_A, ciclo_A); // definindo o valor do PWM para 0 ledcWrite (channel_B, ciclo_B); // definindo o valor do PWM para 0

Peb pib ua ntu zus, nkag mus nrog SSID ESP32ap, thiab tus password. Tom qab ntawd peb tau txais tus IP ntawm tus neeg rau zaub mov thiab pib server.

Serial.begin (115200); // iniciando a Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, password); // iniciando o ponto de acesso com SSID ESP32ap e senha 12345678 Serial.println ("Obtendo IP"); // mensagem myIP = WiFi.softAPIP (); // obtendo o IP ua tus pabcuam (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 (chaw nres nkoj)); // mensagem server.begin (); // kev pabcuam lossis pabcuam}

Lub voj ()

Hauv Loop, thawj qhov peb yuav ua yog ua kom cov neeg siv tau sai, txuas thiab khi rau cov neeg siv khoom sib txawv. Txheeb xyuas yog tias tus neeg siv khoom txuas nrog. Yog tias yog, peb pib qhov sib txawv uas yuav tau txais cov ntaub ntawv. Ntev npaum li qhov kev sib txuas tau tsim, thiab yog tias tau txais cov ntaub ntawv, peb nyeem cov cim rau qhov sib txawv c. Thaum kawg, peb sib txuas c hauv cov ntaub ntawv sib txawv.

lub voj void () {WiFiClient cliente = server.available (); // se um cliente conectar, koom nrog cov neeg siv sib txawv yog ((cliente.connected ()) {// se há um cliente conectado String dados = ""; // inicia a variável que receberá os dados Serial.println ("Cliente conectado."); // mensagem thaum (cliente.connected ()) {// enquanto rau conexão estiver tsim cov khoom lag luam yog tias (cliente.available ()) {// e se houver dados tus txais char c = cliente.read (); // leia os caracteres para a variável c dados = dados + c; // concatene c na variável dados

Yog tias tau txais tus cim kab ntawv tshiab, peb nrhiav qhov ntsuas ntawm tus cim ',' hauv txoj hlua hauv cov ntaub ntawv. Peb tau txais cov ntawv me me kom txog thaum raug ua ntej tus lej, thiab tom qab ntawd peb hloov lawv mus rau cov lej. Peb teeb tsa PWM ntawm cov channel A thiab B. Peb tshem tawm qhov sib txawv.

yog (c == '\ n') {// se um caracter de nova linha rau recebido int virgula = dados.indexOf (','); // procure pelo icendice 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 (channel_A, ciclo_A); // Ajusta o PWM ua kwj dej A ledcWrite (channel_B, ciclo_B); // Ajusta o PWM do canal B dados = ""; // Limpa ib variável}}}}

Yog tias tus neeg siv txiav tawm, peb lees paub qhov kawg ntawm qhov txuas. Peb tos ib pliag thiab luam tawm "Tsis muaj tus neeg siv txuas nrog". Peb mam tos lwm thib ob ua ntej rov pib dua.

// caso o cliente se desconecte, confirma o fim da conexão ncua (50); // aguarda um momento cliente.stop (); Serial.println ("Nenhum cliente conectado."); // mensagem ncua (1000); // aguarda um segundo antes de reiniciar}

Kauj Ruam 8: Cov Neeg Siv Khoom Code

Cov nqe lus

Peb tau suav nrog lub tsev qiv ntawv WiFi dua, lub sijhawm no ntawm tus neeg siv khoom. Tsis tas li, peb txhais cov kev hloov pauv.

#include const char* ssid = "ESP32ap"; // SSID rau ponto de acesso ESP32 const char* password = "12345678"; // Senha para acessar o ponto de acesso const uint16_t chaw nres nkoj = 2; // Porta de escuta do servidor const char * host = "192.168.4.1"; // endereço IP ua 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; // tshaj tawm rau objeto tus neeg siv khoom

Teeb ()

Peb txhais cov GPIOs raws li kev tawm tswv yim, pib ua ntu zus, thiab txuas mus rau qhov chaw nkag.

teeb tsa tsis muaj dab tsi () {pinMode (pin_Leitura_A, INPUT); // txhais o GPIO como entrada pinMode (pin_Leitura_B, INPUT); // txhais o GPIO como entrada Serial.begin (115200); // inicia a comunicação serial WiFi.begin (ssid, password); // conecta ao ponto de acesso}

Lub voj ()

Hauv Loop no, peb yuav txuas rau tus neeg rau zaub mov, lub ntsiab lus lwm yam ESP.

void loop () {// se não conectado ao ponto de acesso, tenta se conectar while (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " - Conectando no WiFi" + ssid + "…"); // mensagem WiFi.begin (ssid, password); ncua (2000); } Serial.println (Txoj hlua (millis ()) + " - Conectado …"); // mensagem // se não conectado ao servidor, tenta se conectar thaum (! + chaw nres nkoj + "…"); // mensagem ncua (1000); }

Hauv cov kauj ruam no, thaum txuas nrog tus neeg rau zaub mov, peb ua qhov txawv txav los khaws qhov nyeem ntawm ADC0 thiab ADC3. Tsis tas li, peb tau ua tiav kev nyeem ntawm 500 qhov piv txwv thiab qhov nruab nrab ntawm kev nyeem. Peb teeb tsa kev nyeem ntawv los tsim lub sijhawm raug rau kev tswj hwm ntawm servos, thiab sib txuas thiab xa nws mus rau server.

// enquanto estiver conectado ao servidor thaum (cliente.connected ()) {int leitura_A = 0; // variável para armazenar leitura do ADC0 int leitura_B = 0; // variável para armazenar leitura do ADC3 int amostras = 500; // número de amostras int contador = 0; // contador de amostras thaum (contador <amostras) {// acumua várias leituras leitura_A = leitura_A + analogRead (pin_Leitura_A); leitura_B = leitura_B + analogRead (pin_Leitura_B); tus neeg sib tw ++; } leitura_A = leitura_A / amostras; // média das leituras leitura_B = leitura_B /amostras; ciclo_A = daim ntawv qhia (leitura_A, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para controle do servo ciclo_B = daim ntawv qhia (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)); }

Thaum kawg, yog tias tsis txuas nrog, peb ua kom ntseeg tau tias qhov kev sib txuas tau raug txiav tawm los ntawm kev nthuav tawm cov lus sib npaug.

// se não coonectado, garante que a conexão foi finalizada cliente.stop (); Serial.println (Txoj hlua (millis ()) + " - cov neeg siv khoom xav tau …"); // mensagem}

Kauj ruam 9: Cov ntaub ntawv

Rub tawm cov ntawv:

PDF

INO

Pom zoo: