Orodha ya maudhui:

Kamera ya PANTILT Na ESP32: Hatua 9
Kamera ya PANTILT Na ESP32: Hatua 9

Video: Kamera ya PANTILT Na ESP32: Hatua 9

Video: Kamera ya PANTILT Na ESP32: Hatua 9
Video: Вездеход на гусеницах на ESP-32 Cam с камерой и с управлением по Wi-fi и через интернет 2024, Novemba
Anonim
Image
Image
Kamera ya PANTILT Na ESP32
Kamera ya PANTILT Na ESP32

Leo, nitawasilisha PAN TILT, ambayo ni kifaa kinachowezesha kusonga kwa kamera kwa mwelekeo wa juu, chini, na kwa pande. Mimi mwenyewe nilitengeneza kifaa hiki kupitia sehemu zilizochapishwa za 3D, nikitumia servos mbili na ESP32, ambayo inafanya uwezekano wa kudhibiti utaratibu huu kupitia WiFi. Wacha basi tuchukue usomaji kwa kutumia njia za AD za ESP32, na pia operesheni ya analog kutumia mtawala LED_PWM. Pia, tunatumia udhibiti wa unganisho la TCP / IP.

Kwenye video, unaweza kuona kuwa nina ESP32 inayosoma maadili ya nguvu mbili, ambazo zinatumwa (kupitia WiFi) kwa ESP32 nyingine. Imeunganishwa na motors mbili za servo. Kamera hutembea (na imeshikamana na PAN TILT) kwa mwelekeo wa juu, chini, au kando, kulingana na udhibiti unaofanya kupitia sufuria.

Kiungo cha muundo wa kuchapisha wa PAN TILT 3D kinaweza kupatikana hapa:

Hatua ya 1: Rasilimali Zilizotumiwa

Rasilimali Zilizotumiwa
Rasilimali Zilizotumiwa

• Nambari nyingi za kuruka kwa unganisho

• Node mbili MCU ESP32s

• nyaya mbili za USB za ESP32

• WebCam ya kudhibiti

• Vyungu viwili vya kudhibiti

• Kitabu cha maandishi

• Chanzo cha servos

Hatua ya 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Kuandika
NodeMCU ESP32S - Kuandika

Hatua ya 3: Vipengele vya ESP32

Vipengele vya ESP32
Vipengele vya ESP32

Vipengele vya PWM ESP32 ina vifaa vya pembejeo viwili vyenye uwezo wa kutoa ishara za PWM. Hizi ni pamoja na Injini ya Pulse Width Modulator (MCPWM) iliyoundwa kwa nguvu na udhibiti wa magari, na LED_PWM, iliyoundwa kwa udhibiti wa nguvu za LED. Lakini pia zinaweza kutumika kwa njia ya generic.

Tutatumia LED_PWM, ambayo inaweza kutoa njia 16 za kujitegemea za PWM na vipindi vya kusanidi na mizunguko ya kazi. Ina hadi bits 16 za azimio.

Hatua ya 4: Udhibiti wa Magari ya Servo PWM

Udhibiti wa Magari ya Servo PWM
Udhibiti wa Magari ya Servo PWM

Udhibiti wa servo motor hufanywa kwa kurekebisha upanaji wa upana wa mraba wa mraba na masafa maalum.

Kwa servo inayotumiwa (na vile vile kwa wengi), masafa ni saa 50Hz. Pia, upana wa urefu wa mapigo 1 hadi 2ms huamua nafasi ya angular ya servo.

Tutasafirisha kituo cha 0 cha LED_PWM kwenda GPIO13, na kituo cha 1 kwenda GPIO12, tukitumia habari hii kutekeleza udhibiti.

Hatua ya 5: Kukamata Analog

Kukamata Analog
Kukamata Analog

Analog kwa pembeni ya ubadilishaji wa dijiti

ESP32 ina waongofu wa analojia-kwa-dijiti ambao unaweza kutumika kwa njia hadi 18, lakini tu kwenye GPIOs zinazowezeshwa na analog.

Voltage inayotumiwa haipaswi kuzidi upeo wa 0 hadi 3V.

Ubadilishaji uliofanywa hauhifadhi makosa ya kila wakati kwa voltages zote zilizochukuliwa, na hii yote inategemea anuwai iliyosanidiwa. Kwa anuwai ya 150mV saa 2, 450V, hundi ya tabia inahitajika kwa matumizi muhimu zaidi.

Kwa kukamata, tutatumia potentiometer ya 10k kama mgawanyiko wa voltage. Kukamata utafanywa katika kituo cha ADC0 na ADC3, kinachoweza kupatikana na GPIO36 na GPIO39.

Hatua ya 6: Mzunguko - Seva na Mteja

Mzunguko - Seva na Mteja
Mzunguko - Seva na Mteja

Hatua ya 7: Msimbo wa Chanzo wa Kituo cha Ufikiaji na Seva

Taarifa

Ninajumuisha maktaba ya WiFi, na ninafafanua anuwai kadhaa.

# pamoja na // inclusão da biblioteca WiFi const int freq = 50; // mara kwa mara kufanya 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 kufanya WiFi kufanya ponto de acesso ESP32 const char * password = "12345678"; // senha para confirmação de conexão no ponto de acesso const int bandari = 2; // porta na qual o servidor receberá as conexões int ciclo_A = 0; // Variável que receiverá o ciclo de atuação do canal A int ciclo_B = 0; // anuwai ya kupokea njia ya kufanya mfereji Seva ya WiFiServer (bandari); // Decaração do objeto servidor IPAddress myIP; // Decaração da variável de IP

Sanidi ()

Hapa, tunafafanua pini za pato. Tunaweka njia kwa masafa yanayotakiwa na kuweka thamani ya PWM.

kuanzisha batili () {pinMode (pin_Atuacao_A, OUTPUT); // definindo o pino de atuação Como saída pinMode (pin_Atuacao_B, OUTPUT); // ufafanuzi wa pino de atuação B como saída ledcSetup (canal_A, freq, resolutionucao); // Ajustando o canal 0 para frequencyência de 50 Hz na resolução de 12bits ledcSetup (canal_B, freq, resolutionucao); // Ajustando o canal 1 kwa masafa ya 50 Hz na 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 ledc Andika (canal_A, ciclo_A); // definindo o valor do PWM para 0 ledcWrite (canal_B, ciclo_B); // ufafanuzi wa nguvu hufanya PWM kwa 0

Tulianza serial, hatua ya kufikia na SSID ESP32ap, na nywila. Kisha tunapata IP ya seva na kuanza seva.

Serial. Kuanza (115200); // iniciando Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, nywila); // 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:" + Kamba (bandari)); // seva ya mensagem. anza (); // iniciando o servidor}

Kitanzi ()

Katika Kitanzi, jambo la kwanza tutafanya ni kumthibitisha mteja, akiunganisha na kumfunga kwa kutofautisha kwa mteja. Angalia ikiwa mteja ameunganishwa. Ikiwa ndivyo, tunaanza anuwai ambayo itapokea data. Kwa muda mrefu ikiwa unganisho limesimama, na ikiwa data inapokelewa, tunasoma wahusika wa ubadilishaji c. Mwishowe, tunakubaliana c katika ubadilishaji wa data.

kitanzi batili () {WiFiClient cliente = server haipatikani (); // se um cliente conectar, associé 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 wakati (cliente.connected ()) {/ // leia os caracteres para a variável c dados = baba + c; // concatene c na variável dados

Ikiwa herufi mpya inapokelewa, tunatafuta faharisi ya herufi ',' kwenye kamba kwenye data. Tunapata vifungo mpaka kulia kabla ya koma, na kisha tunawabadilisha kuwa nambari kamili. Tunaweka PWM ya vituo A na B. Tunafuta tofauti.

ikiwa (c == '\ n') {// se um caracter de nova linha kwa recebido int virgula = dados.indexOf (','); // Taratibu za manunuzi pelo Indice kufanya caracter ',' NA kamba em dados ciclo_A = (dados.substring (0, virgula)) toInt ()., // obtenha a substring até antes da vírgula na converta para inteiro ciclo_B = dados.substring (virgula + 1, dados.length ()). toInt (); ciclo_A); // Ajusta o PWM fanya mfereji A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM fanya mfereji B dados = ""; // Limpa anuwai}}}}

Ikiwa mteja atakata, tunathibitisha mwisho wa unganisho. Tunasubiri kwa muda na kuchapisha "Hakuna mteja aliyeunganishwa". Tunasubiri sekunde nyingine kabla ya kuanza tena.

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

Hatua ya 8: Nambari ya Chanzo cha Wateja

Taarifa

Tumejumuisha maktaba ya WiFi tena, wakati huu kwa mteja. Pia, tunafafanua anuwai.

# pamoja na const char * ssid = "ESP32ap"; // SSID fanya 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 kufanya servidor const int pin_Leitura_A = 36; // GPIO de leitura do ADC0 const int pin_Leitura_B = 39; // GPIO de leitura fanya ADC3 int ciclo_A = 0; // kila aina ya kipokezi cha ushujaa hufanya PWM A int ciclo_B = 0; // Varievel que à sua do do ciclo do PWM B WiFiClient cliente; // declaração do objeto cliente

Sanidi ()

Tunafafanua GPIOs kama pembejeo, anza serial, na unganisha kwenye kituo cha ufikiaji.

kuanzisha batili () {pinMode (pin_Leitura_A, INPUT); // fafanua o GPIO como entada pinMode (pin_Leitura_B, INPUT); // fafanua o GPIO como entada Serial.begin (115200); // inicia comunicação serial WiFi.begin (ssid, nywila); // conecta ao ponto de acesso}

Kitanzi ()

Katika Kitanzi hiki, tutaunganisha kwenye seva, ikimaanisha ESP nyingine.

kitanzi batili () {// 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.anza (ssid, nywila); kuchelewa (2000); } Serial.println (Kamba (millis ()) + "- Conectado…"); // mensagem // se não conectado ao servidor, tenta se conectar wakati (! cliente.connect (mwenyeji, bandari)) {Serial.println (String (millis ()) + "- Conectando no Servidor" + host + ":" + bandari + "…"); // kuchelewa kwa mensagem (1000); }

Katika hatua hii, wakati tumeunganishwa na seva, tunafanya anuwai ili kuhifadhi usomaji wa ADC0 na ADC3. Pia, tulifanya usomaji wa sampuli 500 na wastani wa usomaji. Tulichora ramani ya usomaji ili kuunda muda sahihi wa udhibiti wa servos, na kuunga na kuutuma kwa seva.

// enquanto estiver conectado ao servidor wakati (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 wakati (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 = ramani (leitura_A, 0, 4095, 140, 490); // mapeia a leitura para criar a duração correta para controle do servo ciclo_B = ramani (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)); }

Mwishowe, ikiwa haijaunganishwa, tunahakikisha kuwa unganisho umekomeshwa kwa kuonyesha ujumbe sawa.

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

Hatua ya 9: Faili

Pakua faili:

PDF

INO

Ilipendekeza: