Բովանդակություն:

PANTILT տեսախցիկ ESP32- ով `9 քայլ
PANTILT տեսախցիկ ESP32- ով `9 քայլ

Video: PANTILT տեսախցիկ ESP32- ով `9 քայլ

Video: PANTILT տեսախցիկ ESP32- ով `9 քայլ
Video: ESP32 Tutorial 9 - Using Push button to Toggle LED, Push ON, Push OFF -SunFounder ESP32 IoT kit 2024, Հուլիսի
Anonim
Image
Image
PANTILT տեսախցիկ ESP32- ով
PANTILT տեսախցիկ ESP32- ով

Այսօր ես կներկայացնեմ PAN TILT- ը, որը մի սարք է, որը հնարավորություն է տալիս տեսախցիկի շարժումը վեր, վար և կողմերի ուղղություններով: Ես ինքս արտադրեցի այս սարքը 3D տպված մասերի միջոցով ՝ օգտագործելով երկու սերվո և ESP32, ինչը հնարավորություն է տալիս վերահսկել այս մեխանիզմը WiFi- ի միջոցով: Եկեք ընթերցումներ կատարենք ՝ օգտագործելով ESP32- ի AD ալիքները, ինչպես նաև անալոգային գործողություն `օգտագործելով LED_PWM կարգավորիչը: Բացի այդ, մենք կիրառում ենք TCP / IP կապի վերահսկողությունը:

Տեսանյութում դուք կարող եք տեսնել, որ ես ունեմ ESP32 ընթերցում երկու պոտենցիոմետրերի արժեքները, որոնք ուղարկվում են (WiFi- ի միջոցով) մեկ այլ ESP32- ին: Այն միացված է երկու servo շարժիչներին: Տեսախցիկը շարժվում է (և կցված է PAN TILT- ին) վերև, ներքև կամ կողքի ուղղություններով ՝ կախված կաթսաների միջոցով ձեր կողմից կատարվող հսկողությունից:

PAN TILT 3D տպման դիզայնի հղումը կարող եք գտնել այստեղ ՝

Քայլ 1: Օգտագործված ռեսուրսներ

Օգտագործված ռեսուրսներ
Օգտագործված ռեսուրսներ

• Միացման համար բազմաթիվ ցատկողներ

• Երկու հանգույց MCU ESP32

• Երկու USB մալուխ ESP32- ի համար

• Վեբ -տեսախցիկ ՝ վերահսկման համար

• Երկու հսկիչ կաթսա

• նախատախտակ

• Աղբյուր սերվերի համար

Քայլ 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - պինուտ
NodeMCU ESP32S - պինուտ

Քայլ 3: ESP32 ծայրամասային սարքեր

ESP32 ipայրամասային սարքեր
ESP32 ipայրամասային սարքեր

PWM ծայրամասային սարքեր ESP32- ն ունի երկու ծայրամասային սարքավորում, որոնք ունակ են առաջացնել PWM ազդանշաններ: Դրանք ներառում են Pulse Width Modulator (MCPWM) շարժիչը, որը նախատեսված է հզորության և շարժիչի կառավարման համար, և LED_PWM, որը մշակվել է LED ինտենսիվության կառավարման համար: Բայց դրանք կարող են օգտագործվել նաև ընդհանուր ձևով:

Մենք կօգտագործենք LED_PWM- ը, որը կարող է առաջացնել 16 անկախ PWM ալիք ՝ կարգավորելի ժամանակահատվածներով և աշխատանքային ցիկլերով: Այն ունի մինչև 16 բիթ թույլատրելիություն:

Քայլ 4: Servo Motor Control PWM

Servo Motor Control PWM
Servo Motor Control PWM

Servo շարժիչի հսկողությունը կատարվում է որոշակի հաճախականությամբ քառակուսի զարկերակի լայնության մոդուլյացիայի ճշգրտմամբ:

Օգտագործված սերվոյի համար (ինչպես նաև շատերի համար) հաճախականությունը 50 Հց է: Բացի այդ, 1 -ից 2ms զարկերակի երկարության լայնությունը որոշում է սերվոյի անկյունային դիրքը:

Մենք LED_PWM- ի 0 -րդ ալիքը կուղղորդենք դեպի GPIO13, իսկ 1 -ինը ՝ GPIO12- ին ՝ օգտագործելով այս տեղեկատվությունը ՝ վերահսկողությունը կատարելու համար:

Քայլ 5: Անալոգային գրավում

Անալոգային գրավում
Անալոգային գրավում

Digitalայրամասային թվային փոխակերպման անալոգային

ESP32- ն ունի անալոգային-թվային կերպափոխիչներ, որոնք կարող են կիրառվել մինչև 18 ալիքներում, բայց միայն անալոգային հնարավորություն ունեցող GPIO- ներում:

Կիրառվող լարումը չպետք է գերազանցի 0 -ից 3 Վ միջակայքը:

Կատարված փոխակերպումը չի պահպանում մշտական սխալ նմուշառվող բոլոր լարման դեպքում, և այս ամենը կախված է կազմաձևված տիրույթից: 2 մ, 450 Վ լարման դեպքում 150 մՎ տիրույթի դեպքում վարքագծի ստուգում է պահանջվում առավել կարևոր ծրագրերի համար:

Գրավման համար մենք կօգտագործենք 10k պոտենցիոմետր ՝ որպես լարման բաժանարար: Գրավումը կիրականացվի ADC0 և ADC3 ալիքներով, որոնք հասանելի են GPIO36 և GPIO39 համարներով:

Քայլ 6: Շղթա - սերվեր և հաճախորդ

Շղթա - սերվեր և հաճախորդ
Շղթա - սերվեր և հաճախորդ

Քայլ 7: Մուտքի կետի և սերվերի աղբյուրի կոդը

Հայտարարություններ

Ես ներառում եմ WiFi գրադարանը և որոշ փոփոխականներ եմ սահմանում:

#ներառել // ներառյալ 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 resolutionucao = 12; // Չօգտագործել առանց հսկողության 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"; // մշտական SSID- ի միջոցով WiFi- ի միջոցով մուտք գործեք ESP32 const char* գաղտնաբառ = "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; // փոփոխություն, որը կարող է ստանալ WiFi A սերվերի սերվեր (նավահանգիստ); // հայտարարեք ծառայությունների մատուցման IPA հասցե myIP; // հայտարարում է տարբերվող IP- ն

Կարգավորում ()

Այստեղ մենք սահմանում ենք ելքային կապերը: Մենք ալիքները սահմանում ենք ցանկալի հաճախականությամբ և սահմանում PWM արժեքը:

void setup () {pinMode (pin_Atuacao_A, OUTPUT); // definino 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, resolutionucao); // Ajustando o canal 0 para frequência de 50 Hz e 126 ledc լուծում (canal_B, freq, resolutionucao); // Աջուստանդո կամ ջրանցք 1 հաճախականությամբ 50 Հց և լուծում 12bit ledcAttachPin (pin_Atuacao_A, canal_A); // վերահղում o ջրանցք 0 para o pino 13 ledcAttachPin (pin_Atuacao_B, canal_B); // վերահղում և ջրանցք 1 -ին կետում 12 ledcWrite (canal_A, ciclo_A); // definido o valor do PWM para 0 ledcWrite (canal_B, ciclo_B); // definindo o valor do PWM para 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 և 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:" + Լար (նավահանգիստ)); // mensagem server.begin (); // ինիցիանդո կամ սերվիդոր}

Օղակ ()

Loop- ում, առաջին բանը, որ մենք անելու ենք, հաճախորդին instantiate է ՝ միացնելով և կապելով հաճախորդի փոփոխականին: Ստուգեք, արդյոք հաճախորդը միացված է: Եթե այդպես է, մենք սկսում ենք այն փոփոխականը, որը կստանա տվյալները: Քանի դեռ կապը հաստատված է, և եթե տվյալներ են ստացվում, մենք կարդում ենք c փոփոխականի նիշերը: Վերջապես, մենք միացնում ենք գ տվյալների փոփոխականում:

void loop () {WiFiClient cliente = server.available (); // se um cliente conectar, associe a varyável cliente if (cliente.connected ()) {// se há um kliente 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 receiber char c = cliente.read (); // leia os caracteres para a variável c dados = dados + c; // concatene c na variável dados

Եթե ստացվում է նոր տողի նիշ, մենք տվյալների տողում փնտրում ենք «» բնույթի ինդեքսը: Մենք ստանում ենք ենթատողերը մինչև ստորակետից անմիջապես առաջ, այնուհետև դրանք վերածում ենք ամբողջի: Մենք սահմանում ենք A և B. ալիքների PWM- ը: Մենք մաքրում ենք փոփոխականը:

եթե (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 do canal A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do canal B dados = ""; // Limpa a variável}}}}

Եթե հաճախորդը անջատվում է, մենք հաստատում ենք կապի ավարտը: Մենք մի պահ սպասում ենք և տպում «Ոչ մի հաճախորդ կապված չէ»: Այնուհետև մենք սպասում ենք ևս մեկ վայրկյան ՝ նախքան վերսկսելը:

// հաճախորդների հետ կապ հաստատելու, հետաձգելու հաստատում (50); // aguarda um momento cliente.stop (); Serial.println ("Nenhum cliente conectado"); // mensagem ուշացում (1000); // aguarda um segundo antes de reiniciar}

Քայլ 8: Հաճախորդի կոդ

Հայտարարություններ

Մենք կրկին ներառեցինք WiFi գրադարանը, այս անգամ հաճախորդի վրա: Բացի այդ, մենք սահմանում ենք փոփոխականները:

#ներառել const char* ssid = "ESP32ap"; // SSID- ը թույլ է տալիս օգտագործել ESP32 const char* գաղտնաբառ = "12345678"; // Senha para acessar o ponto de acesso const uint16_t նավահանգիստ = 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 Receibá o o valor do ciclo do PWM B WiFiClient հաճախորդների համար; // հայտարարում հաճախորդի հաճախորդի մասին

Կարգավորում ()

Մենք GPIO- ները սահմանում ենք որպես մուտքագրում, սկսում ենք սերիան և միանում մուտքի կետին:

void setup () {pinMode (pin_Leitura_A, INPUT); // սահմանել o GPIO como entrada pinMode (pin_Leitura_B, INPUT); // սահմանել GPIO como entrada Serial.begin (115200); // inicia a comunicação սերիական WiFi.begin (ssid, գաղտնաբառ); // conecta ao ponto de acesso}

Օղակ ()

Այս հանգույցում մենք կկապվենք սերվերին, այսինքն ՝ մյուս 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, գաղտնաբառ); ուշացում (2000); } Serial.println (Լար (millis ()) + " - Կոնեկտադո …"); // mensagem // se não conectado ao servidor, tenta se conectar while (! cliente.connect (host, port)) {Serial.println (String (millis ()) + " - Conectando no Servidor" + host + ":" + նավահանգիստ + "…"); // mensagem ուշացում (1000); }

Այս քայլին, երբ միացված ենք սերվերին, մենք կատարում ենք փոփոխականները ՝ ADC0 և ADC3 ընթերցումները պահելու համար: Բացի այդ, մենք կատարեցինք 500 նմուշների ընթերցում և միջինացված ընթերցումներ: Մենք քարտեզագրեցինք ընթերցումը `սերվերի վերահսկման ճիշտ տևողությունը ստեղծելու համար և միացրեցինք և ուղարկեցինք սերվերին:

// 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 = քարտեզ (leitura_A, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para controle do servo ciclo_B = քարտեզ (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)); }

Ի վերջո, եթե միացված չէ, մենք երաշխավորում ենք, որ կապը դադարեցվել է ՝ համարժեք հաղորդագրությունը ցուցադրելով:

// եթե դա չի թույլատրվում, երաշխավորում ենք, որ հնարավոր է հաճախորդների վերջնական հաստատում: կանգ առնել (); Serial.println (Լար (millis ()) + " - հաճախորդների ապամոնտաժում …"); // menagem}

Քայլ 9: Ֆայլեր

Ներբեռնեք ֆայլերը.

PDF

ԻՆՈ

Խորհուրդ ենք տալիս: