Cuprins:

Controlul Servo-ului Utilizarea MPU6050 Între Arduino și ESP8266 Cu HC-12: 6 Pași
Controlul Servo-ului Utilizarea MPU6050 Între Arduino și ESP8266 Cu HC-12: 6 Pași

Video: Controlul Servo-ului Utilizarea MPU6050 Între Arduino și ESP8266 Cu HC-12: 6 Pași

Video: Controlul Servo-ului Utilizarea MPU6050 Între Arduino și ESP8266 Cu HC-12: 6 Pași
Video: Lesson 96: Barometric Pressure, Temperature, Approximate Altitude Sensor BMP390 with LCD 2024, Iulie
Anonim
Controlul Servo-ului Utilizarea MPU6050 Între Arduino și ESP8266 Cu HC-12
Controlul Servo-ului Utilizarea MPU6050 Între Arduino și ESP8266 Cu HC-12

În acest proiect, controlăm poziția unui servomotor utilizând mpu6050 și HC-12 pentru comunicarea între Arduino UNO și ESP8266 NodeMCU.

Pasul 1: DESPRE ACEST PROIECT

Este un alt proiect IoT bazat pe modulul RF HC-12. Aici, datele imu (mpu6050) de la arduino sunt utilizate pentru a controla servomotorul (conectat cu Nodemcu). Aici, vizualizarea datelor se efectuează și pe partea arduino, unde datele pitch pitch mpu6050 (rotație în jurul axei x) sunt vizualizate cu o schiță de procesare (discutată mai târziu). Practic, acest proiect este doar un pic de încălzire pentru amintirea diferitelor aspecte ale controlului Imu & Servo cu Arduino și ESP8266 nodemcu.

OBIECTIV

Obiectivul acestui lucru este destul de clar: controlăm poziția motorului servo folosind valoarea pitch a IMU. Și împreună, această poziție a motorului și a sincronizării este vizualizată cu Procesare.

Pasul 2: hardware necesar

NodeMCU ESP8266 12E Modul Wifi

Pană de sudură fără sudură

Sârmă jumper

MPU6050 accelo + giroscop

Module RF HC-12 (pereche)

Servomotor SG90

Pasul 3: Circuit și conexiuni

Circuit și conexiuni
Circuit și conexiuni
Circuit și conexiuni
Circuit și conexiuni

Conexiunile sunt directe. Puteți alimenta servo cu 3,3V din Nodemcu. Puteți utiliza, de asemenea, Vin pentru a alimenta servo-ul dacă nodemcu-ul dvs. are atât de multă tensiune pe acel pin. Dar majoritatea plăcilor Lolin nu au 5V la Vin (depinde de producător).

Aceste diagrame de circuit sunt realizate folosind EasyADA.

Pasul 4: LUCRU

LUCRU
LUCRU

De îndată ce schița arduino a început, va trimite unghiul de înălțime (care variază de la -45 la 45) către receptorul hc12 al Nodemcu care este mapat cu poziția Servo de la 0 la 180 de grade. Aici am folosit unghiul de înălțime de la -45 la +45 de grade, astfel încât să îl putem mapa cu ușurință în poziția Servo.

Acum vă gândiți de ce putem folosi pur și simplu metoda hărții după cum urmează: -

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

Deoarece unghiul negativ trimis de emițătorul hc12 este primit ca:

Prima jumătate: (T) 0 la 45 => 0 la 45 (R)

A doua jumătate: (T) -45 până la -1 => 255 până la 210 (R)

Deci, trebuie să o mapezi de la 0 la 180 ca

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

Evit metoda hărții din cauza unei erori irelevante. Puteți încerca și comenta că funcționează împreună cu dvs.

if (val> = 0 && val <= 45) pos = map (val, 0, 45, 90, 180); else pos = hartă (val, 255, 210, 0, 90); // al patrulea argument poate fi 2 (puteți verifica)

MPU6050 Pitch Angle Calcul

Folosesc biblioteca MPU6050_tockn care se bazează pe oferirea de date brute de la IMU.

int pitchAngle = mpu6050.getAngleX ()

Acest lucru ne va aduce unghiul de rotație în jurul axei x. După cum ați văzut în figură, imu-ul meu este așezat vertical pe panou, așa că nu vă confundați cu pitch and roll. De fapt, ar trebui să vedeți întotdeauna axa imprimată pe placa de separare.

Prin această bibliotecă, nu trebuie să vă deranjați despre electronica internă a citirii registrelor specifice pentru o funcționare specifică. specifici doar treaba și ai terminat!

Btw dacă doriți să calculați singur unghiul. Puteți face acest lucru cu ușurință după cum urmează:

#include

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 (adevărat); Serial.begin (9600); } void loop () {Wire.beginTransmission (MPU6050_addr); Wire.write (0x3B); Wire.endTransmission (fals); Wire.requestFrom (MPU6050_addr, 14, adevărat); 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 = hartă (AcX, minVal, maxVal, -90, 90); int yAng = hartă (AcY, minVal, maxVal, -90, 90); int zAng = hartă (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); }

Dar, nu este necesar să scrieți atât de mult cod pentru a obține unghiul. Ar trebui să știți faptele din spatele scenei, dar utilizarea bibliotecii altor persoane este foarte eficientă în multe proiecte. Puteți citi despre acest imu și alte aplicații pentru a obține mai multe date filtrate de pe următorul link: Explore-mpu6050.

Codul meu arduino de la capătul de transmisie are doar 30 de linii cu ajutorul bibliotecii MPU6050_tockn, astfel încât utilizarea unei biblioteci este bună, cu excepția cazului în care nu aveți nevoie de unele modificări de bază ale funcționalității IMU. O bibliotecă numită I2Cdev de Jeff Rowberg este foarte utilă dacă doriți niște date filtrate folosind DMP (procesor digital de mișcare) al IMU.

Integrare cu procesare

Aici Procesarea este utilizată pentru vizualizarea datelor de rotație despre axa x a IMU așa cum sunt calculate de datele brute provenite de la MPU6050. Primim datele brute primite în SerialEvent în modul următor:

void serialEvent (Serial myPort) {

inString = myPort.readString (); încercați {// Analizați datele // 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 (dataStrings [i + 1]); }} else {println (inString); }}} catch (Excepție e) {println ("Excepție prinsă"); }}

Aici puteți vedea vizualizarea în imaginea atașată în acest pas. Datele de poziție primite la capătul nodemcu sunt de asemenea văzute pe monitorul serial așa cum se arată în imagine.

Pasul 5: COD

Am atașat depozitul github. Puteți să-l clonați și să-l utilizați în proiectele dvs.

codul meu

Repo include 2 schițe arduino pentru emițător (arduino + IMU) și receptor (Nodemcu + Servo).

Și o schiță de procesare. Stabiliți repoarea dacă acest lucru vă ajută în proiect.

În acest instructabil, R- Receptor și T- Transmițător

Pasul 6: DEMOSTRARE VIDEO

Voi anexa videoclipul mâine. Urmăriți-mă pentru a primi o notificare.

Va multumesc tuturor!

Recomandat: