Inhaltsverzeichnis:

Steuern des Servos mit MPU6050 zwischen Arduino und ESP8266 mit HC-12 - Gunook
Steuern des Servos mit MPU6050 zwischen Arduino und ESP8266 mit HC-12 - Gunook

Video: Steuern des Servos mit MPU6050 zwischen Arduino und ESP8266 mit HC-12 - Gunook

Video: Steuern des Servos mit MPU6050 zwischen Arduino und ESP8266 mit HC-12 - Gunook
Video: How to control Servo Motor using ESP32 with Arduino ESP32 Servo library 2024, Juli
Anonim
Steuern des Servos mit MPU6050 zwischen Arduino und ESP8266 mit HC-12
Steuern des Servos mit MPU6050 zwischen Arduino und ESP8266 mit HC-12

In diesem Projekt steuern wir die Position eines Servomotors mit dem mpu6050 und HC-12 für die Kommunikation zwischen Arduino UNO und ESP8266 NodeMCU.

Schritt 1: ÜBER DIESES PROJEKT

Es ist ein weiteres IoT-Projekt basierend auf dem HC-12 RF-Modul. Hier werden die imu(mpu6050)-Daten von Arduino verwendet, um den Servomotor (verbunden mit Nodemcu) zu steuern. Hier wird die Datenvisualisierung auch auf der Arduino-Seite durchgeführt, wo die Mpu6050-Pitch-Daten (Rotation um die X-Achse) mit einer Verarbeitungsskizze (später diskutiert) visualisiert werden. Im Grunde ist dieses Projekt nur ein kleines Aufwärmen, um sich an verschiedene Aspekte der Imu- und Servosteuerung mit Arduino und ESP8266 nodemcu zu erinnern.

ZIELSETZUNG

Das Ziel dieses ziemlich klaren, Wir steuern die Position des Servomotors mit dem Pitch-Wert der IMU. Und insgesamt wird diese Steigung und die synchronisierte Motorposition mit Processing visualisiert.

Schritt 2: Hardware erforderlich

NodeMCU ESP8266 12E Wifi-Modul

Lötfreies Steckbrett

Überbrückungskabel

MPU6050 Beschleunigung + Kreisel

HC-12 HF-Module (Paar)

SG90 Servomotor

Schritt 3: Schaltung & Anschlüsse

Schaltung & Anschlüsse
Schaltung & Anschlüsse
Schaltung & Anschlüsse
Schaltung & Anschlüsse

Verbindungen sind direkt. Sie können das Servo mit 3.3V Ihres Nodemcu versorgen. Sie können auch Vin verwenden, um das Servo mit Strom zu versorgen, wenn Ihr Nodemcu so viel Spannung an diesem Pin hat. Aber die meisten Lolin-Boards haben keine 5V an Vin (abhängig vom Hersteller).

Diese Schaltpläne werden mit EasyADA erstellt.

Schritt 4: ARBEITEN

ARBEITEN
ARBEITEN

Sobald die Arduino-Skizze gestartet wurde, wird der Neigungswinkel (der von -45 bis 45 reicht) an den hc12-Empfänger von Nodemcu gesendet, der mit einer Servoposition von 0 bis 180 Grad abgebildet wird. Hier haben wir den Pitchwinkel von -45 bis +45 Grad verwendet, damit wir das leicht der Servoposition zuordnen können.

Jetzt denken Sie, warum wir die Kartenmethode einfach wie folgt verwenden können:

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

Weil der vom hc12-Sender gesendete negative Winkel empfangen wird als:

1. Hälfte: (T)0 bis 45 => 0 bis 45(R)

2. Hälfte: (T)-45 bis -1 => 255 bis 210(R)

Sie müssen es also auf 0 bis 180 abbilden, da

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

Ich vermeide die Kartenmethode aufgrund eines irrelevanten Fehlers. Du kannst das ausprobieren und kommentieren, dass es bei dir funktioniert

if(val>=0 && val<=45) pos = map(val, 0, 45, 90, 180); else pos = map(val, 255, 210, 0, 90); // 4. Argument kann 2 sein (können Sie überprüfen)

MPU6050 Nickwinkelberechnung

Ich verwende die MPU6050_tockn-Bibliothek, die auf der Ausgabe von Rohdaten von der IMU basiert.

int pitchAngle = mpu6050.getAngleX()

Dadurch erhalten wir den Drehwinkel um die x-Achse. Wie Sie in der Abbildung sehen können, ist mein imu vertikal auf dem Steckbrett platziert, also nicht mit Pitch and Roll verwechseln. Eigentlich sollten Sie immer die Achsen auf der Breakout-Platine aufgedruckt sehen.

Durch diese Bibliothek müssen Sie sich nicht um die interne Elektronik des Lesens bestimmter Register für bestimmte Operationen kümmern. Sie geben nur den Job an und Sie sind fertig!

Übrigens, wenn Sie den Winkel selbst berechnen möchten. Sie können dies ganz einfach wie folgt tun:

#enthalten

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); aufrechtzuerhalten. Void Schleife () { Wire.beginTransmission (MPU6050_addr); Wire.write (0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU6050_addr, 14, true); AcX=Wire.read()<<8|Wire.read(); AcY=Draht.read()<<8|Draht.read(); AcZ=Draht.read()<<8|Draht.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 ("WinkelX = "); // Pitch Serial.println (x); Serial.print ("WinkelY = "); // Roll Serial.println (y); Serial.print("WinkelZ="); // Gieren Serial.println (z); }

Es ist jedoch nicht notwendig, dass Sie so viel Code schreiben, um den Winkel zu erhalten. Sie sollten die Fakten hinter den Kulissen kennen, aber die Verwendung der Bibliothek anderer Personen ist in vielen Projekten sehr effektiv. Sie können über dieses imu und andere Ansätze lesen, um mehr gefilterte Daten über den folgenden Link zu erhalten: Explore-mpu6050.

Mein Arduino-Code auf der Sendeseite hat mit Hilfe der MPU6050_tockn-Bibliothek nur 30 Zeilen. Daher ist die Verwendung einer Bibliothek gut, es sei denn, Sie benötigen keine grundlegenden Änderungen an der Funktionalität von IMU. Eine Bibliothek namens I2Cdev von Jeff Rowberg ist sehr hilfreich, wenn Sie einige gefilterte Daten mit dem DMP (Digital Motion Processor) der IMU verwenden möchten.

Integration mit Verarbeitung

Hier wird die Verarbeitung verwendet, um die Rotationsdaten um die x-Achse der IMU zu visualisieren, wie sie durch die Rohdaten von MPU6050 berechnet werden. Wir empfangen die eingehenden Rohdaten in SerialEvent auf folgende Weise:

void serialEvent(Serial myPort) {

inString = meinPort.readString(); try { // Daten analysieren //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 (Exception e) { println("Caught Exception"); } }

Hier sehen Sie die Visualisierung in dem in diesem Schritt angehängten Bild. Die am Nodemcu-Ende empfangenen Positionsdaten werden auch auf dem seriellen Monitor angezeigt, wie im Bild gezeigt.

Schritt 5: CODE

Ich habe das Github-Repository angehängt. Sie können es klonen und forken, um es in Ihren Projekten zu verwenden.

mein_code

Das Repo enthält 2 Arduino-Skizzen für Sender (arduino + IMU) und Empfänger (Nodemcu + Servo).

Und eine Verarbeitungsskizze. Starten Sie das Repo, wenn dies in Ihrem Projekt hilft.

In diesem anweisbaren, R- Empfänger & T-Sender

Schritt 6: VIDEODEMONSTRATION

Ich werde das Video morgen anhängen. Folgen Sie mir, um benachrichtigt zu werden.

Danke euch allen!

Empfohlen: