สารบัญ:
- ขั้นตอนที่ 1: ทรัพยากรที่ใช้
- ขั้นตอนที่ 2: NodeMCU ESP32S - Pinout
- ขั้นตอนที่ 3: อุปกรณ์ต่อพ่วง ESP32
- ขั้นตอนที่ 4: การควบคุมเซอร์โวมอเตอร์ PWM
- ขั้นตอนที่ 5: จับภาพแบบอะนาล็อก
- ขั้นตอนที่ 6: วงจร - เซิร์ฟเวอร์และไคลเอนต์
- ขั้นตอนที่ 7: รหัสที่มาของจุดเข้าใช้งานและเซิร์ฟเวอร์
- ขั้นตอนที่ 8: รหัสที่มาของลูกค้า
- ขั้นตอนที่ 9: ไฟล์
วีดีโอ: กล้อง PANTILT พร้อม ESP32: 9 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:06
วันนี้ผมจะมานำเสนอ 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
ขั้นตอนที่ 3: อุปกรณ์ต่อพ่วง ESP32
อุปกรณ์ต่อพ่วง PWM ESP32 มีอุปกรณ์ต่อพ่วงสองตัวที่สามารถสร้างสัญญาณ PWM ได้ ซึ่งรวมถึงเครื่องยนต์ Pulse Width Modulator (MCPWM) ที่ออกแบบมาสำหรับการควบคุมกำลังและมอเตอร์ และ LED_PWM ที่พัฒนาขึ้นสำหรับการควบคุมความเข้มของ LED แต่ยังสามารถใช้ในลักษณะทั่วไปได้
เราจะใช้ LED_PWM ซึ่งสามารถสร้างช่องสัญญาณ PWM อิสระได้ 16 ช่องพร้อมช่วงเวลาที่กำหนดและรอบการทำงานได้ มีความละเอียดสูงถึง 16 บิต
ขั้นตอนที่ 4: การควบคุมเซอร์โวมอเตอร์ 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
ฉันไม่
แนะนำ:
กลอง Arduino MIDI: 6 ขั้นตอน
กลอง Arduino MIDI: เคยสงสัยที่จะเรียนรู้กลอง แต่คุณไม่สามารถซื้อชุดกลองหรือไม่มีพื้นที่เพียงพอในการจัดเก็บชุดกลอง ทำชุดกลอง MIDI ที่บ้านได้ง่ายๆ โดยใช้ Arduino ในราคาไม่เกิน ₹800 (10 เหรียญ)
กล้อง IP พร้อมการตรวจจับใบหน้าโดยใช้บอร์ด ESP32-CAM: 5 ขั้นตอน
กล้อง IP พร้อมการตรวจจับใบหน้าโดยใช้บอร์ด ESP32-CAM: โพสต์นี้แตกต่างจากที่อื่น และเรามาดูบอร์ด ESP32-CAM ที่น่าสนใจซึ่งมีราคาถูกอย่างน่าประหลาดใจ (น้อยกว่า $9) และใช้งานง่าย เราสร้างกล้อง IP แบบง่ายที่สามารถใช้เพื่อสตรีมวิดีโอสดโดยใช้ 2
All Band Receiver พร้อม SI4732 / SI4735 (FM / RDS, AM และ SSB) พร้อม Arduino: 3 ขั้นตอน
All Band Receiver พร้อม SI4732 / SI4735 (FM / RDS, AM และ SSB) พร้อม Arduino: เป็นโปรเจ็กต์เครื่องรับย่านความถี่ทั้งหมด ใช้ห้องสมุด Arduino Si4734 ห้องสมุดนี้มีตัวอย่างมากกว่า 20 ตัวอย่าง คุณสามารถฟัง FM ด้วย RDS สถานี AM (MW) ในพื้นที่ SW และสถานีวิทยุสมัครเล่น (SSB) เอกสารทั้งหมดที่นี่
อินเทอร์เฟซ ESP32 พร้อม SSD1306 Oled พร้อม MicroPython: 5 ขั้นตอน
อินเทอร์เฟซ ESP32 พร้อม SSD1306 Oled พร้อม MicroPython: Micropython เป็นการเพิ่มประสิทธิภาพของ python และมีขนาดเล็กของ python ซึ่งหมายถึงการสร้างสำหรับอุปกรณ์ฝังตัวซึ่งมีข้อจำกัดด้านหน่วยความจำและใช้พลังงานต่ำ Micropython สามารถใช้ได้กับคอนโทรลเลอร์หลายตระกูล ซึ่งรวมถึง ESP8266, ESP32, Ardui
PWM พร้อม ESP32 - Dimming LED พร้อม PWM บน ESP 32 พร้อม Arduino IDE: 6 ขั้นตอน
PWM พร้อม ESP32 | Dimming LED พร้อม PWM บน ESP 32 พร้อม Arduino IDE: ในคำแนะนำนี้เราจะดูวิธีสร้างสัญญาณ PWM ด้วย ESP32 โดยใช้ Arduino IDE & โดยทั่วไปแล้ว PWM จะใช้เพื่อสร้างเอาต์พุตแอนะล็อกจาก MCU ใดๆ และเอาต์พุตแอนะล็อกนั้นอาจเป็นอะไรก็ได้ระหว่าง 0V ถึง 3.3V (ในกรณีของ esp32) & จาก