Përmbajtje:

Kamera PANTILT Me ESP32: 9 hapa
Kamera PANTILT Me ESP32: 9 hapa

Video: Kamera PANTILT Me ESP32: 9 hapa

Video: Kamera PANTILT Me ESP32: 9 hapa
Video: ESP32 Tutorial 9 - Using Push button to Toggle LED, Push ON, Push OFF -SunFounder ESP32 IoT kit 2024, Nëntor
Anonim
Image
Image
Kamera PANTILT Me ESP32
Kamera PANTILT Me ESP32

Sot, unë do të prezantoj PAN TILT, e cila është një pajisje që mundëson lëvizjen e një kamere për drejtimet lart, poshtë dhe anash. Unë vetë e prodhova këtë pajisje përmes pjesëve të printuara 3D, duke përdorur dy servos dhe ESP32, gjë që bën të mundur kontrollin e këtij mekanizmi përmes WiFi. Le të marrim pastaj lexime duke përdorur kanalet AD të ESP32, si dhe një operacion analog duke përdorur kontrolluesin LED_PWM. Gjithashtu, ne aplikojmë kontrollin mbi një lidhje TCP / IP.

Në video, mund të shihni që kam një ESP32 që lexon vlerat e dy potenciometrave, të cilët dërgohen (nëpërmjet WiFi) në një ESP32 tjetër. Shtë i lidhur me dy servo motorë. Kamera lëviz (dhe është e bashkangjitur në PAN TILT) në drejtimet lart, poshtë ose anash, në varësi të kontrollit që bëni përmes tenxhereve.

Lidhja me modelin e printimit PAN TILT 3D mund të gjendet këtu:

Hapi 1: Burimet e përdorura

Burimet e Përdorura
Burimet e Përdorura

• Kërcyes të shumtë për lidhje

• Dy Nyje MCU ESP32

• Dy kabllo USB për ESP32

• Një WebCam për kontroll

• Dy tenxhere kontrolli

• Një protoboard

• Një burim për servos

Hapi 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Hapi 3: Periferikësh ESP32

ESP32 Periferikësh
ESP32 Periferikësh

Periferikësh PWM ESP32 ka dy pajisje periferike të afta për të gjeneruar sinjale PWM. Këto përfshijnë motorin Pulse Width Modulator (MCPWM) i projektuar për fuqinë dhe kontrollin e motorit, dhe LED_PWM, i zhvilluar për kontrollin e intensitetit LED. Por ato gjithashtu mund të përdoren në mënyrë të përgjithshme.

Ne do të përdorim LED_PWM, e cila mund të gjenerojë 16 kanale të pavarura PWM me periudha dhe cikle pune të konfigurueshme. Ka rezolucion deri në 16 bit.

Hapi 4: Servo Motor Control PWM

Servo Motor Control PWM
Servo Motor Control PWM

Kontrolli i servo motorit kryhet duke rregulluar modulimin e gjerësisë së pulsit të një katrori me frekuencë specifike.

Për servo të përdorur (si dhe për shumicën), frekuenca është në 50Hz. Gjithashtu, një gjerësi prej 1 deri në 2ms gjatësi të pulsit përcakton pozicionin këndor të servo.

Ne do të drejtojmë kanalin 0 të LED_PWM në GPIO13 dhe kanalin 1 në GPIO12, duke përdorur këtë informacion për të kryer kontrollin.

Hapi 5: Regjistrimi analog

Regjistrimi analog
Regjistrimi analog

Periferik i konvertimit analog në dixhital

ESP32 ka konvertues analogë-dixhitalë që mund të aplikohen në deri në 18 kanale, por vetëm në GPIO të aktivizuar nga analogët.

Tensioni i aplikuar nuk duhet të kalojë intervalin 0 deri në 3V.

Konvertimi i kryer nuk mban një gabim konstant për të gjitha tensionet e marra, dhe e gjitha varet nga diapazoni i konfiguruar. Për një gamë prej 150mV në 2, 450V, kërkohet një kontroll sjelljeje për aplikime më kritike.

Për kapjen, ne do të përdorim një potenciometër prej 10k si ndarës të tensionit. Kapja do të bëhet në kanalin ADC0 dhe ADC3, të arritshme nga GPIO36 dhe GPIO39.

Hapi 6: Qarku - Server dhe Klient

Qarku - Server dhe Klient
Qarku - Server dhe Klient

Hapi 7: Kodi Burimor i Pikës së Hyrjes dhe Serverit

Deklaratat

Unë përfshij bibliotekën WiFi dhe përcaktoj disa ndryshore.

#include // inclusão da biblioteca WiFi const int freq = 50; // frekuencat e PWM const int canal_A = 0; // kanali primiro do controlador LED_PWM const int canal_B = 1; // kanali segundo do controlador LED_PWM const int resolutionucao = 12; // Zgjidhni përdorimin pa kontrollues LED_PWM const int pin_Atuacao_A = 13; // Pino para onde o canal 0 será redirecionado const int pin_Atuacao_B = 12; // Pino para kanalit 1 será redirecionado const char* ssid = "ESP32ap"; // konstante në SSID për WiFi për të kontrolluar qasjen në ESP32 const char* password = "12345678"; // senha para confirmação de conexão no ponto de acesso const int port = 2; // porta për cilësinë e shërbimit të marrësit si të lidhur në ciclo_A = 0; // variável que receberá o ciclo de atuação do canal A int ciclo_B = 0; // ndryshoni në mënyrë që të merrni një kanal A server (port) WiFiServer; // deklaro shërbimin e shërbimit të IPAdresës myIP; // deklaroj ndryshimin e IP -së

Konfigurimi ()

Këtu, ne përcaktojmë kunjat e daljes. Ne i vendosim kanalet në frekuencën e dëshiruar dhe vendosim vlerën PWM.

void setup () {pinMode (pin_Atuacao_A, OUTPUT); // përcakto 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 frekuencave të 50 Hz dhe zgjidhjes së 12bits ledcSetup (canal_B, freq, resolutionucao); // Ajustando o canal 1 para frekuencave të 50 Hz dhe zgjidhjes së 12bit ledcAttachPin (pin_Atuacao_A, canal_A); // përcjellim o kanal 0 para o pino 13 ledcAttachPin (pin_Atuacao_B, canal_B); // përcjellim kanalin 1 para ores 12 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

Ne filluam serialin, pikën e hyrjes me SSID ESP32ap dhe fjalëkalimin. Ne pastaj marrim IP -në e serverit dhe fillojmë serverin.

Serial.fillo (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, fjalëkalim); // iniciando o ponto de acesso com SSID ESP32ap dhe senha 12345678 Serial.println ("Obtendo IP"); // mensagem myIP = WiFi.softAPIP (); // obtendo o IP për servidor (nuk ka lidhje me konfigurimin e zonës mbi orarin e faqes) Serial.println ("IP:" + WiFi.localIP ()); // mensagem Serial.println ("Iniciando servidor em:" + String (port)); // mensagem server.begin (); // iniciando o servidor}

Lak ()

Në Loop, gjëja e parë që do të bëjmë është të instinktojmë klientin, duke u lidhur dhe lidhur me ndryshoren e klientit. Kontrolloni nëse klienti është i lidhur. Nëse është kështu, ne fillojmë ndryshoren që do të marrë të dhënat. Për sa kohë që lidhja është vendosur, dhe nëse merren të dhëna, ne lexojmë karakteret për ndryshoren c. Së fundi, ne bashkojmë c në ndryshoren e të dhënave.

void loop () {WiFiClient cliente = server.available (); // se um kliente conectar, asocioni një klientë të ndryshëm nëse (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 receib char c = cliente.read (); // leia os caracteres para a variável c dados = dados + c; // concatene c na variável dados

Nëse merret një karakter i ri, ne kërkojmë indeksin e karakterit ',' në vargun në të dhëna. Ne i marrim nënvargjet deri para presjes, dhe pastaj i konvertojmë në numër të plotë. Ne vendosim PWM të kanaleve A dhe B. Ne pastrojmë ndryshoren.

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

Nëse klienti shkëputet, ne konfirmojmë përfundimin e lidhjes. Ne presim për një moment dhe shtypim "Asnjë klient i lidhur". Ne pastaj presim një sekondë tjetër para se të rifillojmë.

// rasti i klientit për desconecte, konfirmimi i fim dhe vonesës (50); // aguarda um momento cliente.stop (); Serial.println ("Nenhum cliente conectado."); // vonesa e menagjemit (1000); // aguarda um segundo antes de reiniciar}

Hapi 8: Kodi Burimor i Klientit

Deklaratat

Ne kemi përfshirë përsëri bibliotekën WiFi, këtë herë tek klienti. Gjithashtu, ne përcaktojmë variablat.

#include const char* ssid = "ESP32ap"; // SSID për të kontrolluar qasjen në ESP32 const char* password = "12345678"; // Senha para acessar ose 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 leitura do ADC3 int ciclo_A = 0; // variavel 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; // deklarojão objeto cliente

Konfigurimi ()

Ne i përcaktojmë GPIO -të si hyrje, fillojmë serialin dhe lidhemi me pikën e hyrjes.

void setup () {pinMode (pin_Leitura_A, INPUT); // përcakto o GPIO como entrada pinMode (pin_Leitura_B, INPUT); // përcaktoni o GPIO como entrada Serial.begin (115200); // inicia a comunicação serial WiFi.begin (ssid, fjalëkalim); // conecta ao ponto de acesso}

Lak ()

Në këtë lak, ne do të lidhemi me serverin, që do të thotë ESP tjetër.

lak i pavlefshëm () {// se nuk mund të lidhet me një qasje, vendosni lidhjen ndërsa (WiFi.status ()! = WL_CONNECTED) {Serial.println (String (millis ()) + " - Conectando no WiFi" + ssid + "…"); // mensagem WiFi.begin (ssid, fjalëkalim); vonesa (2000); } Serial.println (String (millis ()) + " - Conectado …"); // mensagem // se nuk ka lidhje me shërbimin, ju lutem lidhni ndërsa (! cliente.connect (host, port)) {Serial.println (String (millis ()) + " - Conectando no Servidor" + host + ":" + port + "…"); // vonesa e menagjemit (1000); }

Në këtë hap, ndërsa jemi të lidhur me serverin, ne ekzekutojmë variablat për të ruajtur leximin e ADC0 dhe ADC3. Gjithashtu, ne kemi kryer leximin e 500 mostrave dhe kemi bërë mesataren e leximeve. Ne e hartuam leximin për të krijuar kohëzgjatjen e duhur për kontrollin e servos, dhe e lidhim dhe e dërgojmë atë në 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); kontador ++; } leitura_A = leitura_A / amostras; // média das leituras leitura_B = leitura_B /amostras; ciclo_A = hartë (leitura_A, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para controle do servo ciclo_B = hartë (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)); }

Së fundi, nëse nuk është e lidhur, sigurohemi që lidhja është ndërprerë duke shfaqur mesazhin ekuivalent.

// se nuk ka lidhje, ju garanton një përfundim të klientit.stop (); Serial.println (String (millis ()) + " - klienti desconectado …"); // mensagem}

Hapi 9: Skedarët

Shkarkoni skedarët:

PDF

INO

Recommended: