Inhoudsopgave:

Servo besturen met MPU6050 tussen Arduino en ESP8266 met HC-12 - Ajarnpa
Servo besturen met MPU6050 tussen Arduino en ESP8266 met HC-12 - Ajarnpa

Video: Servo besturen met MPU6050 tussen Arduino en ESP8266 met HC-12 - Ajarnpa

Video: Servo besturen met MPU6050 tussen Arduino en ESP8266 met HC-12 - Ajarnpa
Video: Fun with Arduino 26 Tune a Servo with a Rotary Encoder 2024, November
Anonim
Servo besturen met MPU6050 tussen Arduino en ESP8266 met HC-12
Servo besturen met MPU6050 tussen Arduino en ESP8266 met HC-12

In dit project regelen we de positie van een servomotor met behulp van de mpu6050 en HC-12 voor communicatie tussen Arduino UNO en ESP8266 NodeMCU.

Stap 1: OVER DIT PROJECT

Het is een ander IoT-project gebaseerd op de HC-12 RF-module. Hier worden de imu (mpu6050) gegevens van arduino gebruikt om de servomotor te besturen (verbonden met Nodemcu). Hier wordt de datavisualisatie ook uitgevoerd aan de Arduino-kant, waar de mpu6050-pitchgegevens (rotatie rond de x-as) worden gevisualiseerd met een verwerkingsschets (later besproken). Eigenlijk is dit project slechts een kleine opwarmer voor het onthouden van verschillende aspecten van Imu & Servo-besturing met Arduino en ESP8266 nodemcu.

DOELSTELLING

Het doel van deze vrij duidelijk, we controleren de positie van de servomotor met behulp van de toonhoogte van IMU. En alles bij elkaar wordt deze toonhoogte en gesynchroniseerde motorpositie gevisualiseerd met Processing.

Stap 2: Hardware vereist

NodeMCU ESP8266 12E Wifi-module

Soldeerloze breadboard

Doorverbindingsdraad

MPU6050 accelo+gyro

HC-12 RF-modules (paar)

SG90 servomotor

Stap 3: Circuit en verbindingen

Circuit & Aansluitingen
Circuit & Aansluitingen
Circuit & Aansluitingen
Circuit & Aansluitingen

Verbindingen zijn rechttoe rechtaan. Je kunt de servo van stroom voorzien met 3,3V van je Nodemcu. Je kunt Vin ook gebruiken om de servo van stroom te voorzien als je nodemcu zoveel spanning op die pin heeft. Maar de meeste Lolin-boards hebben geen 5V bij Vin (afhankelijk van de fabrikant).

Deze schakelschema's zijn gemaakt met EasyADA.

Stap 4: WERKEN

WERKEN
WERKEN

Zodra de Arduino-schets is gestart, stuurt deze de pitch-hoek (die varieert van -45 tot 45) naar de hc12-ontvanger van Nodemcu die in kaart wordt gebracht met een servo-positie van 0 tot 180 graden. Hier hebben we de pitch-hoek van -45 tot +45 graden gebruikt, zodat we die gemakkelijk kunnen toewijzen aan de servo-positie.

Nu denk je waarom kunnen we de kaartmethode eenvoudig als volgt gebruiken: -

int pos = kaart(waarde, -45, 45, 0, 180);

Omdat de negatieve hoek die door de hc12-zender wordt verzonden, wordt ontvangen als:

1ste helft: (T)0 tot 45 => 0 tot 45(R)

2e helft: (T)-45 tot -1 => 255 tot 210(R)

Dus je moet het toewijzen aan 0 tot 180 als

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

Ik vermijd de kaartmethode vanwege een irrelevante fout. Je kunt dat proberen en commentaar geven dat het bij jou werkt

if(val>=0 && val<=45) pos = map(val, 0, 45, 90, 180); anders pos = kaart (val, 255, 210, 0, 90); // 4e argument kan 2 zijn (u kunt controleren)

MPU6050 Pitch Hoekberekening

Ik gebruik de MPU6050_tockn-bibliotheek die is gebaseerd op het verstrekken van onbewerkte gegevens van de IMU.

int pitchAngle = mpu6050.getAngleX()

Dit geeft ons de rotatiehoek om de x-as. Zoals je in de afbeelding kunt zien, is mijn imu verticaal op het breadboard geplaatst, dus verwar het niet met pitch and roll. Eigenlijk zou je altijd de assen op het breakout board moeten zien staan.

Via deze bibliotheek hoeft u zich geen zorgen te maken over de interne elektronica van het uitlezen van specifieke registers voor specifieke bewerkingen. je geeft alleen de klus op en je bent klaar!

Btw als je de hoek zelf wilt berekenen. Je kunt het eenvoudig als volgt doen:

#erbij betrekken

const int MPU6050_addr=0x68; int16_t AcX, AcY, AcZ, Temp, GyroX, GyroY, GyroZ; void setup(){ Wire.begin(); Wire.beginTransmission (MPU6050_addr); Draad.schrijven (0x6B); Draad.schrijven(0); Wire.endTransmission (waar); Serieel.begin(9600); } void loop(){ Wire.beginTransmission(MPU6050_addr); Draad.schrijven (0x3B); Wire.endTransmission (false); Wire.requestFrom (MPU6050_addr, 14, waar); 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 = kaart (AcX, min. waarde, max. waarde, -90, 90); int yAng = kaart (AcY, minVal, maxVal, -90, 90); int zAng = kaart (AcZ, min. waarde, max. waarde, -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="); // Toonhoogte Serial.println(x); Serial.print("AngleY="); //Roll Serial.println(y); Serial.print("AngleZ="); //Yaw Serial.println(z); }

Maar het is niet nodig dat u zoveel code schrijft om de hoek te krijgen. U zou de feiten achter de schermen moeten kennen, maar het gebruik van een bibliotheek van andere mensen is in veel projecten zeer effectief. Je kunt meer lezen over deze imu en andere benaderingen om meer gefilterde gegevens te krijgen via de volgende link: Explore-mpu6050.

Mijn Arduino-code aan de verzendende kant heeft slechts 30 regels met behulp van de MPU6050_tockn-bibliotheek, dus het gebruik van een bibliotheek is goed, tenzij je geen enkele kernwijzigingen nodig hebt in de functionaliteit van IMU. Een bibliotheek met de naam I2Cdev door Jeff Rowberg is erg handig als u wat gefilterde gegevens wilt met behulp van de DMP (Digital Motion Processor) van de IMU.

Integratie met verwerking

Hier wordt Processing gebruikt voor het visualiseren van de rotatiegegevens over de x-as van IMU, zoals berekend door de onbewerkte gegevens afkomstig van MPU6050. We ontvangen de binnenkomende onbewerkte gegevens in SerialEvent op de volgende manier:

void serialEvent (Serial myPort) {

inString = mijnPort.readString(); probeer { // Ontleed de gegevens // 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 (uitzondering e) { println("Gevangen uitzondering"); } }

Hier ziet u de visualisatie in de afbeelding die in deze stap is bijgevoegd. De positiegegevens die aan het nodemcu-uiteinde worden ontvangen, zijn ook te zien op de seriële monitor, zoals weergegeven in de afbeelding.

Stap 5: CODE

Ik heb de github-repository bijgevoegd. Je kunt het klonen & forken om in je projecten te gebruiken.

mijn_code

De repo bevat 2 arduino-schetsen voor zender (arduino + IMU) en ontvanger (Nodemcu + servo).

En een bewerkingsschets. Geef de repo een ster als dit helpt bij uw project.

In dit instructable, R-ontvanger & T-zender

Stap 6: VIDEODEMONSTRATIE

Ik zal de video morgen bijvoegen. Volg mij om op de hoogte te blijven.

Bedankt iedereen!

Aanbevolen: