สารบัญ:

กล้อง PANTILT พร้อม ESP32: 9 ขั้นตอน
กล้อง PANTILT พร้อม ESP32: 9 ขั้นตอน

วีดีโอ: กล้อง PANTILT พร้อม ESP32: 9 ขั้นตอน

วีดีโอ: กล้อง PANTILT พร้อม ESP32: 9 ขั้นตอน
วีดีโอ: Pan Tilt Control using Servos for ESP32 Cam | WiFi Security Camera 2024, พฤศจิกายน
Anonim
Image
Image
กล้อง PANTILT พร้อม ESP32
กล้อง PANTILT พร้อม ESP32

วันนี้ผมจะมานำเสนอ PAN TILT ซึ่งเป็นอุปกรณ์ที่ช่วยให้กล้องเคลื่อนที่ไปในทิศทางขึ้น ลง และไปด้านข้างได้ ตัวฉันเองผลิตอุปกรณ์นี้ผ่านชิ้นส่วนที่พิมพ์ 3 มิติ โดยใช้เซอร์โวสองตัวและ ESP32 ซึ่งทำให้สามารถควบคุมกลไกนี้ผ่าน WiFi ได้ ให้เราอ่านค่าโดยใช้ช่อง AD ของ ESP32 เช่นเดียวกับการทำงานแบบแอนะล็อกโดยใช้คอนโทรลเลอร์ LED_PWM นอกจากนี้เรายังใช้การควบคุมผ่านการเชื่อมต่อ TCP / IP

ในวิดีโอ คุณจะเห็นว่าฉันมี ESP32 อ่านค่าของโพเทนชิโอมิเตอร์สองตัว ซึ่งส่ง (ผ่าน WiFi) ไปยัง ESP32 อีกเครื่องหนึ่ง มันเชื่อมต่อกับเซอร์โวมอเตอร์สองตัว กล้องจะเคลื่อนที่ (และติดอยู่กับ PAN TILT) ในทิศทางขึ้น ลง หรือด้านข้าง ขึ้นอยู่กับการควบคุมที่คุณทำผ่านหม้อ

ลิงค์ไปยังการออกแบบการพิมพ์ 3 มิติ PAN TILT สามารถพบได้ที่นี่:

ขั้นตอนที่ 1: ทรัพยากรที่ใช้

ทรัพยากรที่ใช้
ทรัพยากรที่ใช้

• จัมเปอร์หลายตัวสำหรับการเชื่อมต่อ

• สองโหนด MCU ESP32s

• สาย USB สองเส้นสำหรับ ESP32

• เว็บแคมสำหรับควบคุม

• หม้อควบคุม 2 ใบ

• โปรโตบอร์ด

• แหล่งที่มาของเซอร์โว

ขั้นตอนที่ 2: NodeMCU ESP32S - Pinout

NodeMCU ESP32S - Pinout
NodeMCU ESP32S - Pinout

ขั้นตอนที่ 3: อุปกรณ์ต่อพ่วง ESP32

อุปกรณ์ต่อพ่วง ESP32
อุปกรณ์ต่อพ่วง ESP32

อุปกรณ์ต่อพ่วง PWM ESP32 มีอุปกรณ์ต่อพ่วงสองตัวที่สามารถสร้างสัญญาณ PWM ได้ ซึ่งรวมถึงเครื่องยนต์ Pulse Width Modulator (MCPWM) ที่ออกแบบมาสำหรับการควบคุมกำลังและมอเตอร์ และ LED_PWM ที่พัฒนาขึ้นสำหรับการควบคุมความเข้มของ LED แต่ยังสามารถใช้ในลักษณะทั่วไปได้

เราจะใช้ LED_PWM ซึ่งสามารถสร้างช่องสัญญาณ PWM อิสระได้ 16 ช่องพร้อมช่วงเวลาที่กำหนดและรอบการทำงานได้ มีความละเอียดสูงถึง 16 บิต

ขั้นตอนที่ 4: การควบคุมเซอร์โวมอเตอร์ PWM

เซอร์โวมอเตอร์ควบคุม PWM
เซอร์โวมอเตอร์ควบคุม PWM

การควบคุมเซอร์โวมอเตอร์ทำได้โดยการปรับการมอดูเลตความกว้างพัลส์ของสี่เหลี่ยมจัตุรัสที่มีความถี่เฉพาะ

สำหรับเซอร์โวที่ใช้ (และส่วนใหญ่) ความถี่จะอยู่ที่ 50Hz นอกจากนี้ ความกว้างของความยาวพัลส์ 1 ถึง 2 มิลลิวินาทีจะกำหนดตำแหน่งเชิงมุมของเซอร์โว

เราจะกำหนดเส้นทางช่อง 0 ของ LED_PWM ไปยัง GPIO13 และช่อง 1 ไปยัง GPIO12 โดยใช้ข้อมูลนี้เพื่อดำเนินการควบคุม

ขั้นตอนที่ 5: จับภาพแบบอะนาล็อก

การจับภาพแบบอะนาล็อก
การจับภาพแบบอะนาล็อก

อุปกรณ์ต่อพ่วงการแปลงอนาล็อกเป็นดิจิตอล

ESP32 มีตัวแปลงอนาล็อกเป็นดิจิตอลที่สามารถใช้งานได้ถึง 18 ช่องสัญญาณ แต่เฉพาะใน GPIO ที่เปิดใช้งานแอนะล็อกเท่านั้น

แรงดันไฟฟ้าที่ใช้ต้องไม่เกินช่วง 0 ถึง 3V

การแปลงที่ดำเนินการไม่ได้รักษาข้อผิดพลาดคงที่สำหรับแรงดันไฟฟ้าที่สุ่มตัวอย่างทั้งหมด และทั้งหมดนี้ขึ้นอยู่กับช่วงที่กำหนดค่าไว้ สำหรับช่วง 150mV ที่ 2, 450V จำเป็นต้องมีการตรวจสอบพฤติกรรมสำหรับการใช้งานที่สำคัญกว่า

สำหรับการจับภาพ เราจะใช้โพเทนชิออมิเตอร์ 10k เป็นตัวแบ่งแรงดันไฟ การจับภาพจะทำในช่อง ADC0 และ ADC3 ซึ่งสามารถเข้าถึงได้โดย GPIO36 และ GPIO39

ขั้นตอนที่ 6: วงจร - เซิร์ฟเวอร์และไคลเอนต์

วงจร - เซิร์ฟเวอร์และไคลเอนต์
วงจร - เซิร์ฟเวอร์และไคลเอนต์

ขั้นตอนที่ 7: รหัสที่มาของจุดเข้าใช้งานและเซิร์ฟเวอร์

งบ

ฉันรวมไลบรารี WiFi และกำหนดตัวแปรบางอย่าง

#include // รวม da biblioteca WiFi const int freq = 50; //ความถี่ทำ PWM const int canal_A = 0; //primeiro canal ทำ controlador LED_PWM const int canal_B = 1; // คลอง segundo ทำ controlador LED_PWM const int resolucao = 12; //ความละเอียดไม่มีตัวควบคุม LED_PWM const int pin_Atuacao_A = 13; // Pino para onde o ช่อง 0 será redirecionado const int pin_Atuacao_B = 12; //Pino para onde o ช่อง 1 será redirecionado const char* ssid = "ESP32ap"; //constante com o SSID ทำ WiFi ทำ ponto de acesso ESP32 const char* password = "12345678"; //senha para Confirmação de conexão ไม่มี ponto de acesso const int port = 2; // porta na qual o servidor receberá เป็น 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 เซิร์ฟเวอร์ WiFiServer (พอร์ต); //declaração do objeto servidor IPAddress myIP; //declaração da variável de IP

ติดตั้ง ()

ที่นี่เรากำหนดพินเอาต์พุต เราตั้งค่าช่องสัญญาณให้เป็นความถี่ที่ต้องการและตั้งค่า PWM

การตั้งค่าเป็นโมฆะ () { 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, ความถี่, resolucao); //Ajustando o ช่อง 0 สำหรับความถี่ 50 Hz และความละเอียด 12 บิต ledcSetup(canal_B, freq, resolucao); //Ajustando หรือช่อง 1 สำหรับความถี่ 50 Hz และความละเอียด 12 บิต ledcAttachPin(pin_Atuacao_A, canal_A); //redirectionando o ช่อง 0 สำหรับ pino 13 ledcAttachPin(pin_Atuacao_B, canal_B); //redirectionando o ช่อง 1 สำหรับ pino 12 ledcWrite (canal_A, ciclo_A); //defindo o valor do PWM para 0 ledcWrite(canal_B, ciclo_B);/ //definindo o valor do PWM สำหรับ 0

เราเริ่มต้นซีเรียล จุดเข้าใช้งานด้วย SSID ESP32ap และรหัสผ่าน จากนั้นเราได้รับ IP ของเซิร์ฟเวอร์และเริ่มต้นเซิร์ฟเวอร์

Serial.begin(115200); //iniciando a Serial Serial.println("Iniciando ponto de acesso: " + สตริง (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()); // obtendo o เซิร์ฟเวอร์ IP //mensagem Serial.println("Iniciando servidor em:" + สตริง (พอร์ต)); //เซิร์ฟเวอร์ mensagem.begin(); //iniciando o servidor }

วน ()

ใน Loop สิ่งแรกที่เราจะทำคือสร้างอินสแตนซ์ไคลเอ็นต์ เชื่อมต่อและผูกกับตัวแปรไคลเอ็นต์ ตรวจสอบว่าไคลเอ็นต์เชื่อมต่ออยู่หรือไม่ ถ้าเป็นเช่นนั้น เราเริ่มต้นตัวแปรที่จะรับข้อมูล ตราบใดที่มีการสร้างการเชื่อมต่อ และหากได้รับข้อมูล เราจะอ่านอักขระสำหรับตัวแปร c สุดท้าย เราเชื่อม c ในตัวแปรข้อมูล

วงเป็นโมฆะ () { ลูกค้า WiFiClient = 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("ไคลเอนต์ conectado"); //mensagem while (cliente.connected()) { //enquanto a conexão estiver estabelecida if (cliente.available ()) { //e se houver dados a receber char c = cliente.read (); //mensagem ในขณะที่ (cliente.connected ()) //leia os caracteres สำหรับตัวแปร c dados = dados + c; // concatene กับ variável dados

หากได้รับอักขระขึ้นบรรทัดใหม่ เราจะมองหาดัชนีของอักขระ ', ' ในสตริงในข้อมูล เราได้รับสตริงย่อยจนถึงก่อนเครื่องหมายจุลภาค จากนั้นเราแปลงเป็นจำนวนเต็ม เราตั้งค่า PWM ของช่อง A และ B เราล้างตัวแปร

if (c == '\n') { //se um caracter de nova linha for recebido int virgula = dados.indexOf (', '); //จัดซื้อ pelo índice do caracter ',' กับ string em dados ciclo_A = (dados.substring(0, virgula)).toInt(); //obtenha สตริงย่อย 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 หรือ PWM ทำช่อง A ledcWrite(canal_B, ciclo_B); //Ajusta o PWM ทำช่อง B dados = ""; //ลิมปา a variável } } } }

หากไคลเอ็นต์ยกเลิกการเชื่อมต่อ เราจะยืนยันการสิ้นสุดการเชื่อมต่อ เรารอสักครู่แล้วพิมพ์ "ไม่มีการเชื่อมต่อไคลเอ็นต์" จากนั้นเรารออีกหนึ่งวินาทีก่อนที่จะเริ่มต้นใหม่

// caso o cliente se desconecte, Confirma o fim da conexão ล่าช้า (50); //aguarda อืม โมเมนโต cliente.stop(); Serial.println("Nenhum ลูกค้า conectado."); //mensagem ล่าช้า (1000); //aguarda um segundo antes de reiniciar }

ขั้นตอนที่ 8: รหัสที่มาของลูกค้า

งบ

เราได้รวมไลบรารี WiFi อีกครั้ง คราวนี้บนไคลเอนต์ นอกจากนี้เรายังกำหนดตัวแปร

#include const char* ssid = "ESP32ap"; //SSID ทำ ponto de acesso ESP32 const char* password = "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 ทำเซิร์ฟเวอร์ const int pin_Leitura_A = 36; //GPIO เดอ leitura ทำ ADC0 const int pin_Leitura_B = 39; //GPIO เดอ leitura ทำ ADC3 int ciclo_A = 0; //variável que receberá หรือ valor do ciclo do PWM A int ciclo_B = 0; //Variável que receberá หรือ valor do ciclo do PWM B WiFiClient cliente; //declaração do objeto cliente

ติดตั้ง ()

เรากำหนด GPIO เป็นอินพุต เริ่มซีเรียล และเชื่อมต่อกับจุดเชื่อมต่อ

การตั้งค่าเป็นโมฆะ () { pinMode (pin_Leitura_A, INPUT); //กำหนด o GPIO como entrada pinMode(pin_Leitura_B, INPUT); //กำหนด o 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(String(millis()) + " - Conectado…"); //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 ในขณะที่ (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 ในขณะที่ (contador < amostras) { //acumua várias leituras leitura_A = leitura_A + analogRead (pin_Leitura_A); leitura_B = leitura_B + analogRead (pin_Leitura_B); คอนทาดอร์++; } 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)); }

สุดท้าย หากไม่ได้เชื่อมต่อ เรารับรองว่าการเชื่อมต่อจะสิ้นสุดลงโดยแสดงข้อความที่เทียบเท่ากัน

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

ขั้นตอนที่ 9: ไฟล์

ดาวน์โหลดไฟล์:

ไฟล์ PDF

ฉันไม่

แนะนำ: