Talaan ng mga Nilalaman:

PANTILT Camera Na May ESP32: 9 Mga Hakbang
PANTILT Camera Na May ESP32: 9 Mga Hakbang

Video: PANTILT Camera Na May ESP32: 9 Mga Hakbang

Video: PANTILT Camera Na May ESP32: 9 Mga Hakbang
Video: Camera Car With Pan Tilt Control | ESP32Cam 2024, Hulyo
Anonim
Image
Image
PANTILT Camera Na May ESP32
PANTILT Camera Na May ESP32

Ngayon, ipapakita ko ang PAN TILT, na isang aparato na nagbibigay-daan sa paggalaw ng isang camera para sa mga direksyon ng pataas, pababa, at sa mga gilid. Ako mismo ang gumawa ng aparatong ito sa pamamagitan ng mga naka-print na bahagi ng 3D, gamit ang dalawang servos at ang ESP32, na ginagawang posible upang makontrol ang mekanismong ito sa pamamagitan ng WiFi. Pagkatapos ay kumuha tayo ng mga pagbabasa gamit ang mga AD channel ng ESP32, pati na rin ang isang analog na operasyon gamit ang LED_PWM ng controller. Gayundin, inilalapat namin ang kontrol sa isang koneksyon sa TCP / IP.

Sa video, makikita mo na mayroon akong isang ESP32 na nagbabasa ng mga halaga ng dalawang potentiometers, na ipinadala (sa pamamagitan ng WiFi) sa isa pang ESP32. Ito ay konektado sa dalawang servo motor. Gumagalaw ang camera (at nakakabit sa PAN TILT) sa mga direksyon ng pataas, pababa, o patagilid, depende sa kontrol na iyong ginagawa sa mga kaldero.

Ang link sa disenyo ng print na PAN TILT 3D ay matatagpuan dito:

Hakbang 1: Ginamit na Mga Mapagkukunan

Ginamit na Mga Mapagkukunan
Ginamit na Mga Mapagkukunan

• Maramihang mga jumper para sa koneksyon

• Dalawang Node MCU ESP32s

• Dalawang mga USB cable para sa ESP32

• Isang WebCam para sa kontrol

• Dalawang mga palayok na kontrol

• Isang protoboard

• Isang mapagkukunan para sa mga servo

Hakbang 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

Hakbang 3: ESP32 Peripherals

ESP32 Mga Peripheral
ESP32 Mga Peripheral

PWM Peripherals Ang ESP32 ay may dalawang mga peripheral na may kakayahang bumuo ng mga signal ng PWM. Kasama rito ang makina ng Pulse Width Modulator (MCPWM) na dinisenyo para sa kontrol ng kuryente at motor, at ang LED_PWM, na binuo para sa kontrol ng intensidad ng LED. Ngunit maaari din silang magamit sa isang generic na paraan.

Gagamitin namin ang LED_PWM, na maaaring makabuo ng 16 mga independiyenteng PWM channel na may mga configure na panahon at mga cycle ng trabaho. Mayroon itong hanggang sa 16 piraso ng resolusyon.

Hakbang 4: Servo Motor Control PWM

Servo Motor Control PWM
Servo Motor Control PWM

Ang kontrol ng servo motor ay ginaganap sa pamamagitan ng pag-aayos ng pulso lapad na modulasyon ng isang parisukat na may tiyak na dalas.

Para sa ginamit na servo (pati na rin para sa karamihan), ang dalas ay nasa 50Hz. Gayundin, ang isang lapad ng 1 hanggang 2ms haba ng pulso ay tumutukoy sa angular na posisyon ng servo.

Ire-ruta namin ang channel 0 ng LED_PWM sa GPIO13, at ang channel 1 sa GPIO12, gamit ang impormasyong ito upang maisagawa ang kontrol.

Hakbang 5: Makuha ng Analog

Kunan ng Analog
Kunan ng Analog

Analog sa digital conversion peripheral

Ang ESP32 ay may mga analogue-to-digital converter na maaaring mailapat hanggang sa 18 mga channel, ngunit sa mga GPIO na pinapagana ng analog.

Ang inilapat na boltahe ay hindi dapat lumagpas sa saklaw na 0 hanggang 3V.

Ang ginawang conversion ay hindi nagpapanatili ng isang pare-pareho na error para sa lahat ng mga voltages na naka-sample, at ang lahat ay nakasalalay sa naka-configure na saklaw. Para sa isang saklaw na 150mV sa 2, 450V, kinakailangan ng isang tseke sa pag-uugali para sa mas kritikal na mga aplikasyon.

Para sa pagkuha, gagamit kami ng potentiometer na 10k bilang isang divider ng boltahe. Ang pagkuha ay magagawa sa channel ADC0 at ADC3, maa-access ng GPIO36 at GPIO39.

Hakbang 6: Circuit - Server at Client

Circuit - Server at Client
Circuit - Server at Client

Hakbang 7: Source Code ng Access Point at Server

Mga Pahayag

Isinasama ko ang WiFi library, at tinutukoy ko ang ilang mga variable.

#include // inclusão da 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; // Resolução usado no controlador 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 do WiFi do ponto de acesso ESP32 const char * password = "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 Isang WiFiServer server (port); // declaração do objeto servidor IPAddress myIP; // declaração da variável de IP

Pag-setup ()

Dito, tinutukoy namin ang mga output pin. Itinakda namin ang mga channel sa nais na dalas at itinakda ang halagang 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 canal 0 para sa mga oras ng 50 Hz e resolução de 12bits ledcSetup (canal_B, freq, resolucao); // Ajustando o canal 1 para frequência de 50 Hz e resolução de 12bits ledcAttachPin (pin_Atuacao_A, canal_A); // redirecionando o canal 0 para o pino 13 ledcAttachPin (pin_Atuacao_B, canal_B); // redirecionando o canal 1 para o pino 12 ledcWrite (canal_A, ciclo_A); // definindo o valor do PWM para 0 ledcWrite (canal_B, ciclo_B); // definindo o valor do PWM para 0

Sinimulan namin ang serial, access point gamit ang SSID ESP32ap, at password. Pagkatapos makuha namin ang IP ng server at simulan ang server.

Serial.begin (115200); // iniciando a Serial 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 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}

Loop ()

Sa Loop, ang unang bagay na gagawin namin ay i-instantiate ang client, kumokonekta at nagbubuklod sa variable ng client. Suriin kung nakakonekta ang kliyente. Kung gayon, sinisimulan namin ang variable na makakatanggap ng data. Hangga't ang koneksyon ay itinatag, at kung ang data ay natanggap, binabasa namin ang mga character para sa variable c. Panghuli, pinagsama namin ang c sa variable ng data.

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 habang (cliente.connected ()) {// enquanto a conexão estiver establelecida if (cliente.available ()) {// e se houver maging a receber char c = cliente.read (); // leia os caracteres para a variável c dados = dados + c; // concatene c na variável dados

Kung natanggap ang isang bagong character na character, hahanapin namin ang index ng character na ',' sa string sa data. Nakukuha namin ang mga substring hanggang sa kanan bago ang kuwit, at pagkatapos ay i-convert namin ang mga ito sa integer. Itinakda namin ang PWM ng mga channel A at B. Nilinaw namin ang variable.

kung (c == '\ n') {// se um caracter de nova linha for recebido int virgula = dados.indexOf (','); // procure pelo índice do caracter ',' na string em dados ciclo_A = (dados.substring (0, virgula)). toInt (); // obtenha a substring até antes da vírgula e convertta para inteiro ciclo_B = dados.substring (virgula + 1, dijadikan.length ()). toInt (); // obtenha a substring após a vírgula e convertta para inteiro ledcWrite (canal_A, ciclo_A); // Ajusta o PWM gawin ang kanal A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do canal B dados = ""; // Limpa a variável}}}}

Kung magdiskonekta ang kliyente, kumpirmahin namin ang pagtatapos ng koneksyon. Naghihintay kami para sa isang sandali at i-print ang "Walang client na konektado". Naghihintay kami pagkatapos ng isa pang segundo bago muling simulan.

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

Hakbang 8: Code ng Pinagmulan ng Customer

Mga Pahayag

Isinama namin muli ang library ng WiFi, sa oras na ito sa client. Gayundin, tinutukoy namin ang mga variable.

# isama ang const char * ssid = "ESP32ap"; // SSID do ponto de acesso ESP32 const char * password = "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; // declaração do objeto cliente

Pag-setup ()

Tinutukoy namin ang mga GPIO bilang input, simulan ang serial, at kumonekta sa access point.

void setup () {pinMode (pin_Leitura_A, INPUT); // tukuyin o GPIO como entrada pinMode (pin_Leitura_B, INPUT); // tukuyin o GPIO como entrada Serial.begin (115200); // inicia isang comunicação serial WiFi.begin (ssid, password); // conecta ao ponto de acesso}

Loop ()

Sa Loop na ito, kumokonekta kami sa server, nangangahulugang ang iba pang ESP.

void loop () {// se não conectado ao ponto de acesso, tenta se conectar habang (WiFi.status ()! = WL_CONNected) {Serial.println (String (millis ()) + "- Conectando no WiFi" + ssid + "…"); // mensagem WiFi.begin (ssid, password); pagkaantala (2000); } Serial.println (String (millis ()) + "- Conectado…"); // mensagem // se não conectado ao servidor, tenta se conectar habang (! cliente.connect (host, port)) {Serial.println (String (millis ()) + "- Conectando no Servidor" + host + ":" + port + "…"); // pagkaantala ng mensagem (1000); }

Sa hakbang na ito, habang nakakonekta sa server, isinasagawa namin ang mga variable upang maimbak ang pagbabasa ng ADC0 at ADC3. Gayundin, gumanap kami ng pagbabasa ng 500 mga sample at na-average ang mga pagbasa. Na-map namin ang pagbabasa upang lumikha ng tamang tagal para sa kontrol ng mga servo, at pagsamahin at ipadala ito sa server.

// enquanto estiver conectado ao servidor habang (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 habang (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 = mapa (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)); }

Panghuli, kung hindi nakakonekta, tinitiyak namin na ang koneksyon ay natapos sa pamamagitan ng pagpapakita ng katumbas na mensahe.

// se não coonectado, garante que a conexão foi finalizada cliente.stop (); Serial.println (String (millis ()) + "- cliente desconectado…"); // mensagem}

Hakbang 9: Mga File

I-download ang mga file:

PDF

INO

Inirerekumendang: