Sommario:

Controllo del servo tramite MPU6050 tra Arduino ed ESP8266 con HC-12: 6 passaggi
Controllo del servo tramite MPU6050 tra Arduino ed ESP8266 con HC-12: 6 passaggi

Video: Controllo del servo tramite MPU6050 tra Arduino ed ESP8266 con HC-12: 6 passaggi

Video: Controllo del servo tramite MPU6050 tra Arduino ed ESP8266 con HC-12: 6 passaggi
Video: 3D Tracking per Arduino, Raspberry, Windows e Mac 2024, Dicembre
Anonim
Controllo del servo tramite MPU6050 tra Arduino ed ESP8266 con HC-12
Controllo del servo tramite MPU6050 tra Arduino ed ESP8266 con HC-12

In questo progetto, stiamo controllando la posizione di un servomotore utilizzando l'mpu6050 e l'HC-12 per la comunicazione tra Arduino UNO e ESP8266 NodeMCU.

Fase 1: INFORMAZIONI SU QUESTO PROGETTO

È un altro progetto IoT basato sul modulo RF HC-12. Qui, i dati imu(mpu6050) di arduino vengono utilizzati per controllare il servomotore (collegato a Nodemcu). Qui, la visualizzazione dei dati viene eseguita anche sul lato arduino dove i dati del passo mpu6050 (rotazione sull'asse x) vengono visualizzati con uno schizzo di elaborazione (discusso in seguito). Fondamentalmente questo progetto è solo un piccolo riscaldamento per ricordare diversi aspetti del controllo Imu e Servo con Arduino e nodemcu ESP8266.

OBBIETTIVO

L'obiettivo di questo è abbastanza chiaro, stiamo controllando la posizione del servomotore usando il valore del passo di IMU. E tutti insieme questo passo e la posizione del motore sincronizzato vengono visualizzati con Processing.

Passaggio 2: hardware richiesto

Modulo Wi-Fi NodeMCU ESP8266 12E

breadboard senza saldatura

Cavo del ponticello

MPU6050 accelo+giroscopio

Moduli HC-12 RF (coppia)

Servomotore SG90

Passaggio 3: circuito e connessioni

Circuito e connessioni
Circuito e connessioni
Circuito e connessioni
Circuito e connessioni

I collegamenti sono diretti. Puoi alimentare il servo con 3.3V del tuo Nodemcu. Puoi anche usare Vin per alimentare il servo se il tuo nodemcu ha così tanta tensione su quel pin. Ma la maggior parte delle schede Lolin non ha 5V su Vin (dipende dal produttore).

Questi schemi circuitali sono realizzati utilizzando EasyADA.

Fase 4: LAVORO

LAVORANDO
LAVORANDO

Non appena lo sketch di arduino è iniziato, invierà l'angolo di beccheggio (che va da -45 a 45) al ricevitore hc12 di Nodemcu che viene mappato con la posizione del servo da 0 a 180 gradi. Qui abbiamo usato l'angolo di beccheggio da -45 a +45 gradi in modo da poterlo facilmente mappare alla posizione Servo.

Ora, stai pensando perché possiamo semplicemente usare il metodo della mappa come segue: -

int pos = map(val, -45, 45, 0, 180);

Perché l'angolo negativo inviato dal trasmettitore hc12 viene ricevuto come:

1° tempo: (T) da 0 a 45 => da 0 a 45 (R)

2° tempo: (T) da -45 a -1 => da 255 a 210 (R)

Quindi devi mapparlo da 0 a 180 come

if(val>=0 && val<=45) pos = (val*2)+90; altrimenti pos = (val-210)*2;

Sto evitando il metodo map a causa di qualche errore irrilevante. Puoi provarlo e commentare che funziona con te

if(val>=0 && val<=45) pos = map(val, 0, 45, 90, 180); else pos = map(val, 255, 210, 0, 90); // Il quarto argomento può essere 2 (puoi controllare)

MPU6050 Calcolo dell'angolo di inclinazione

Sto usando la libreria MPU6050_tockn che si basa sulla distribuzione di dati grezzi dall'IMU.

int pitchAngle = mpu6050.getAngleX()

Questo ci darà l'angolo di rotazione attorno all'asse x. Come hai visto nella figura, il mio imu è posizionato verticalmente sulla breadboard, quindi non confonderlo con pitch and roll. In realtà dovresti sempre vedere gli assi stampati sulla breakout board.

Attraverso questa libreria, non devi preoccuparti dell'elettronica interna di lettura di registri specifici per operazioni specifiche. specifichi solo il lavoro e il gioco è fatto!

A proposito, se vuoi calcolare l'angolo da solo. Puoi farlo facilmente come segue:

#includere

const int MPU6050_addr=0x68; int16_t AcX, AcY, AcZ, Temp, GyroX, GyroY, GyroZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU6050_addr); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true); Serial.begin(9600); } void loop(){ Wire.beginTransmission(MPU6050_addr); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU6050_addr, 14, true); AcX=Wire.read()<<8|Wire.read(); AcY=Wire.read()<<8|Wire.read(); AcZ=Wire.read()<<8|Wire.read(); Temp=Wire.read()<<8|Wire.read(); GyroX=Wire.read()<<8|Wire.read(); GyroY=Wire.read()<<8|Wire.read(); GyroZ=Wire.read()<<8|Wire.read();

int xAng = map(AcX, minVal, maxVal, -90, 90); int yAng = map(AcY, minVal, maxVal, -90, 90); int zAng = map(AcZ, minVal, maxVal, -90, 90); x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI); y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI); z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI); Serial.print("AngleX= "); // Pitch Serial.println(x); Serial.print("AngleY= "); //Roll Serial.println(y); Serial.print("AngleZ= "); //Yaw Serial.println(z); }

Ma non è necessario scrivere così tanto codice per ottenere l'angolo. Dovresti conoscere i fatti dietro le quinte, ma usare la libreria di altre persone è molto efficace in molti progetti. Puoi leggere su questo imu e altri approcci per ottenere più dati filtrati dal seguente link: Explore-mpu6050.

Il mio codice arduino alla fine della trasmissione ha solo 30 righe con l'aiuto della libreria MPU6050_tockn, quindi l'utilizzo di una libreria è utile a meno che non siano necessarie alcune modifiche fondamentali alla funzionalità di IMU. Una libreria chiamata I2Cdev di Jeff Rowberg è molto utile se vuoi dei dati filtrati usando il DMP (Digital motion processor) dell'IMU.

Integrazione con Processing

Qui Processing viene utilizzato per visualizzare i dati di rotazione sull'asse x dell'IMU calcolati dai dati grezzi provenienti da MPU6050. Riceviamo i dati grezzi in arrivo in SerialEvent nel modo seguente:

void serialEvent(Serial myPort) {

inString = myPort.readString(); try { // Analizza i dati //println(inString); String dataStrings = split(inString, ':'); if (dataStrings.length == 2) { if (dataStrings[0].equals("RAW")) { for (int i = 0; i < dataStrings.length - 1; i++) { raw = float(stringhe di dati[i+1]); } } else { println(inString); } } } catch (Eccezione e) { println("Eccezione rilevata"); } }

Qui puoi vedere la visualizzazione nell'immagine allegata in questo passaggio. I dati di posizione ricevuti all'estremità di nodemcu vengono visualizzati anche sul monitor seriale come mostrato nell'immagine.

Passaggio 5: CODICE

Ho allegato il repository github. Puoi clonarlo e utilizzarlo nei tuoi progetti.

mio_codice

Il repository include 2 arduino sketch per trasmettitore (arduino+IMU) e ricevitore (Nodemcu+Servo).

E uno schizzo di elaborazione. Inizia il repository se questo aiuta nel tuo progetto.

In questo istruibile, R- Ricevitore e T- Trasmettitore

Passaggio 6: DIMOSTRAZIONE VIDEO

Domani allego il video. Seguimi per essere avvisato.

Grazie a tutti!

Consigliato: