Πίνακας περιεχομένων:

Κάμερα PANTILT Με ESP32: 9 βήματα
Κάμερα PANTILT Με ESP32: 9 βήματα

Βίντεο: Κάμερα PANTILT Με ESP32: 9 βήματα

Βίντεο: Κάμερα PANTILT Με ESP32: 9 βήματα
Βίντεο: Lesson 8: PICAR-X Robot Stares at you | Raspberry Pi Smart Robot car by SunFounder 2024, Νοέμβριος
Anonim
Image
Image
Κάμερα PANTILT Με ESP32
Κάμερα PANTILT Με ESP32

Σήμερα, θα παρουσιάσω το PAN TILT, το οποίο είναι μια συσκευή που επιτρέπει την κίνηση μιας κάμερας για τις κατευθύνσεις πάνω, κάτω και στα πλάγια. Εγώ ο ίδιος παρήγαγα αυτήν τη συσκευή μέσω τρισδιάστατων τμημάτων, χρησιμοποιώντας δύο servos και το ESP32, το οποίο καθιστά δυνατό τον έλεγχο αυτού του μηχανισμού μέσω WiFi. Ας κάνουμε στη συνέχεια αναγνώσεις χρησιμοποιώντας τα κανάλια AD του ESP32, καθώς και μια αναλογική λειτουργία χρησιμοποιώντας το χειριστήριο LED_PWM. Επίσης, εφαρμόζουμε τον έλεγχο σε σύνδεση TCP / IP.

Στο βίντεο, μπορείτε να δείτε ότι έχω ένα ESP32 που διαβάζει τις τιμές των δύο ποτενσιόμετρων, τα οποία αποστέλλονται (μέσω WiFi) σε ένα άλλο ESP32. Συνδέεται με τους δύο σερβοκινητήρες. Η κάμερα κινείται (και είναι προσαρτημένη στο PAN TILT) προς τις κατευθύνσεις προς τα πάνω, προς τα κάτω ή προς τα πλάγια, ανάλογα με το χειριστήριο που κάνετε μέσα από τις γλάστρες.

Ο σύνδεσμος για το σχέδιο 3D εκτύπωσης PAN TILT μπορείτε να βρείτε εδώ:

Βήμα 1: Χρησιμοποιημένοι πόροι

Πόροι που χρησιμοποιήθηκαν
Πόροι που χρησιμοποιήθηκαν

• Πολλαπλοί άλτες για σύνδεση

• Δύο κόμβοι MCU ESP32

• Δύο καλώδια USB για το ESP32

• WebCam για έλεγχο

• Δύο δοχεία ελέγχου

• Ένα πρωτοπόρο

• Πηγή για τα servos

Βήμα 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, το οποίο μπορεί να δημιουργήσει 16 ανεξάρτητα κανάλια PWM με διαμορφώσιμες περιόδους και κύκλους εργασίας. Έχει ανάλυση έως 16 bit.

Βήμα 4: Servo Motor Control PWM

Servo Motor Control PWM
Servo Motor Control PWM

Ο έλεγχος του σερβοκινητήρα πραγματοποιείται με τη ρύθμιση της διαμόρφωσης πλάτους παλμού ενός τετραγώνου με συγκεκριμένη συχνότητα.

Για το σερβο που χρησιμοποιείται (όπως και για τα περισσότερα), η συχνότητα είναι στα 50Hz. Επίσης, ένα πλάτος από 1 έως 2ms μήκος παλμού καθορίζει τη γωνιακή θέση του σερβο.

Θα δρομολογήσουμε το κανάλι 0 του LED_PWM στο GPIO13 και το κανάλι 1 στο GPIO12, χρησιμοποιώντας αυτές τις πληροφορίες για να εκτελέσουμε τον έλεγχο.

Βήμα 5: Αναλογική λήψη

Αναλογική Λήψη
Αναλογική Λήψη

Περιφερειακή αναλογική προς ψηφιακή μετατροπή

Το ESP32 διαθέτει αναλογικούς σε ψηφιακούς μετατροπείς που μπορούν να εφαρμοστούν σε έως και 18 κανάλια, αλλά μόνο σε GPIO με αναλογική ενεργοποίηση.

Η εφαρμοζόμενη τάση δεν πρέπει να υπερβαίνει το εύρος 0 έως 3V.

Η μετατροπή που πραγματοποιείται δεν διατηρεί σταθερό σφάλμα για όλες τις τάσεις που δοκιμάστηκαν και όλα αυτά εξαρτώνται από το ρυθμισμένο εύρος. Για εύρος 150mV στα 2, 450V, απαιτείται έλεγχος συμπεριφοράς για πιο κρίσιμες εφαρμογές.

Για τη λήψη, θα χρησιμοποιήσουμε ένα ποτενσιόμετρο 10k ως διαχωριστή τάσης. Η λήψη θα γίνει στα κανάλια ADC0 και ADC3, προσβάσιμα από GPIO36 και GPIO39.

Βήμα 6: Κύκλωμα - Διακομιστής και Πελάτης

Κύκλωμα - Διακομιστής και Πελάτης
Κύκλωμα - Διακομιστής και Πελάτης

Βήμα 7: Πηγαίος κώδικας του σημείου πρόσβασης και του διακομιστή

Δηλώσεις

Περιλαμβάνω τη βιβλιοθήκη WiFi και ορίζω ορισμένες μεταβλητές.

#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 resolutionucao = 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"; // σταθερό com o SSID για WiFi για πρόσβαση σε 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; // Διαφορετικές παραλαβές για το κανάλι A διακομιστή WiFi (διακομιστής); // δηλώστε την υπηρεσία IPAddress myIP; // statementração da variável de IP

Ρύθμιση ()

Εδώ, ορίζουμε τις ακίδες εξόδου. Ρυθμίζουμε τα κανάλια στην επιθυμητή συχνότητα και ορίζουμε την τιμή PWM.

void setup () {pinMode (pin_Atuacao_A, OUTPUT); // ορισμός για το 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 frequência de 50 Hz e 126bits ledcSetup (canal_B, freq, resolutionucao); // Ajustando o canal 1 para frequência de 50 Hz e resolution with 12bits ledcAttachPin (pin_Atuacao_A, canal_A); // ανακατεύθυνση του καναλιού 0 παρά o pino 13 ledcAttachPin (pin_Atuacao_B, canal_B); // ανακατεύθυνση του καναλιού 1 παρά 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

Ξεκινήσαμε τη σειρά, το σημείο πρόσβασης με SSID ESP32ap και τον κωδικό πρόσβασης. Στη συνέχεια παίρνουμε την IP του διακομιστή και ξεκινάμε τον διακομιστή.

Serial.begin (115200); // iniciando a Serial Serial.println ("Iniciando ponto de acesso:" + String (ssid)); // mensagem WiFi.softAP (ssid, κωδικός πρόσβασης); // 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, το πρώτο πράγμα που πρόκειται να κάνουμε είναι να προωθήσουμε τον πελάτη, να συνδεθούμε και να συνδεθούμε με τη μεταβλητή πελάτη. Ελέγξτε εάν ο πελάτης είναι συνδεδεμένος. Αν ναι, ξεκινάμε τη μεταβλητή που θα λάβει τα δεδομένα. Όσο η σύνδεση είναι εγκατεστημένη και αν ληφθούν δεδομένα, διαβάζουμε τους χαρακτήρες για τη μεταβλητή c. Τέλος, συνδέουμε το c στη μεταβλητή δεδομένων.

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 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

Εάν ληφθεί ένας χαρακτήρας νέας γραμμής, αναζητούμε το ευρετήριο του χαρακτήρα ',' στη συμβολοσειρά στα δεδομένα. Παίρνουμε τα υποσύμβολα μέχρι ακριβώς πριν από το κόμμα και στη συνέχεια τα μετατρέπουμε σε ακέραιο. Ρυθμίζουμε το PWM των καναλιών Α και Β. Καθαρίζουμε τη μεταβλητή.

if (c == '\ n') {// se um caracter de nova linha for recebido int virgula = dados.indexOf (','); // προμήθεια 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 canal A ledcWrite (canal_B, ciclo_B); // Ajusta o PWM do canal B dados = ""; // Limpa a variável}}}}

Εάν ο πελάτης αποσυνδεθεί, επιβεβαιώνουμε το τέλος της σύνδεσης. Περιμένουμε μια στιγμή και εκτυπώνουμε "Δεν υπάρχει συνδεδεμένος πελάτης". Στη συνέχεια περιμένουμε ένα δευτερόλεπτο πριν ξεκινήσουμε ξανά.

// υπό την προϋπόθεση ότι έχετε καθορίσει, επιβεβαιώστε την καθυστέρηση (50). // aguarda um momento cliente.stop (); Serial.println ("Nenhum cliente conectado."); // mensagem καθυστέρηση (1000); // aguarda um segundo antes de reiniciar}

Βήμα 8: Πηγαίος κώδικας πελάτη

Δηλώσεις

Έχουμε συμπεριλάβει ξανά τη βιβλιοθήκη WiFi, αυτή τη φορά στον πελάτη. Επίσης, ορίζουμε τις μεταβλητές.

#include 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; // Δοκιμάστε την παραλαβή ή την αξία του πελάτη PWM B WiFiClient. // statementração do objeto cliente

Ρύθμιση ()

Ορίζουμε τα GPIO ως είσοδο, ξεκινάμε τη σειρά και συνδέουμε το σημείο πρόσβασης.

void setup () {pinMode (pin_Leitura_A, INPUT); // ορίστε το GPIO como entrada pinMode (pin_Leitura_B, INPUT); // ορίστε το GPIO como entrada Serial.begin (115200); // inicia a comunicação serial WiFi.begin (ssid, password); // 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 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); contador ++; } 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)); }

Τέλος, εάν δεν είναι συνδεδεμένο, διασφαλίζουμε ότι η σύνδεση έχει τερματιστεί εμφανίζοντας το αντίστοιχο μήνυμα.

// για να το κάνετε αυτό, εγγυηθείτε ότι θα βρείτε μια τελική εξυπηρέτηση cliente.stop (); Serial.println (String (millis ()) + " - cliente desconectado …"); // mensagem}

Βήμα 9: Αρχεία

Κατεβάστε τα αρχεία:

PDF

ΕΓΩ ΔΕΝ

Συνιστάται: