Ein selbstgebauter Roboter

Bau und Programmierung eines selbstfahrenden Roboters mit einem ESP-32

#Elektronik#C#C++#Arduino#Projekte

Im Frühjahr 2022 habe ich einen kleinen Roboter gebaut, der fahren kann, und ihn programmiert, um sich zu bewegen.

Der Roboter

Nach einiger Recherche darüber, welche Teile ich verwenden könnte, habe ich einige Dinge bei eBay bestellt und bin zu meinen Lieblings-Hardwaregeschäften gegangen. Ich habe

  • Einen ESP-32, einen kleinen Mikrocontroller, der das Gehirn meines Roboters sein soll.
  • 4 Motoren mit Rädern, die an ihnen befestigt sind, um sie an der Unterseite des Roboters zu montieren.
  • 4 Motor-Treiber, um die Geschwindigkeit und Richtung zu steuern, in die sich die Räder drehen.

Erste Ergebnisse

Zuerst habe ich versucht, anstelle der gekauften Motoren einige alte Motoren zu verwenden, von denen ich annahm, dass sie zu schwach sind. Die allgemeine Konfiguration meines Roboters funktionierte gut und ich konnte die Drehzahl und Richtung der Motoren mit etwas Code steuern, aber die Motoren waren zu schwach, um den Roboter tatsächlich zu bewegen.

Um zu testen, ob die neuen Motoren stark genug waren, habe ich den Roboter mit 2 der gekauften Räder und etwas Pappe zusammengebaut. Obwohl dies keine besonders stabile Konstruktion war, funktionierte es ziemlich gut:

Programmierung des Roboters

Der Code, den ich für dieses Projekt geschrieben habe, sind C++-Bibliotheken. Anschließend habe ich die Arduino IDE verwendet, um diese Bibliotheken einzubinden, ihren Code auszuführen und das Programm auf den ESP-32 zu übertragen.

Motor.cpp

Zum Beispiel habe ich eine Bibliothek geschrieben, um jeden der 4 verfügbaren Motoren zu steuern.

#ifndef _MYMOTOR_H #define _MYMOTOR_H #include <Arduino.h> class MyMotor { public: MyMotor(String _motorName, int _pin1, int _pin2, int _enablePin, int _pwmChannel, int _freq = 30000, int _resolution = 8); void start(); void forward(); void backwards(); void stopMotor(); void setDutyCycle(int dutyCycle); int getResolution(); //void decode(String imgTxt); void decode(std::vector<unsigned char> png); void test(); private: String motorName; int pin1; int pin2; int enablePin; //PWM: int freq; int pwmChannel; int resolution; }; #endif#include "Arduino.h" #include <MyMotor.h> #include "lodepng.h" MyMotor::MyMotor(String _motorName, int _pin1, int _pin2, int _enablePin, int _pwmChannel, int _freq, int _resolution){ motorName = _motorName; pin1 = _pin1; pin2 = _pin2; enablePin = _enablePin; //between 0 and 15: pwmChannel = _pwmChannel; //in Hertz: freq = _freq; //1-16 Bits resolution = _resolution; } void MyMotor::start(){ //Assign Pins: // sets the pins as outputs: pinMode(pin1, OUTPUT); pinMode(pin2, OUTPUT); pinMode(enablePin, OUTPUT); // configure LED PWM functionalitites ledcSetup(pwmChannel, freq, resolution); // attach the channel to the GPIO to be controlled ledcAttachPin(enablePin, pwmChannel); } void MyMotor::forward(){ Serial.println(motorName+" moving forward"); digitalWrite(pin1, LOW); digitalWrite(pin2, HIGH); if (digitalRead(pin1) == HIGH) { Serial.println("pin "+String(pin1)+" still HIGH"); } if (digitalRead(pin2) == LOW) { Serial.println("pin " + String(pin2) + " still LOW"); } } void MyMotor::backwards(){ Serial.println(motorName+" moving backwards"); digitalWrite(pin1, HIGH); digitalWrite(pin2, LOW); if (digitalRead(pin1) == LOW) { Serial.println("pin " + String(pin1) + " still LOW"); } if (digitalRead(pin2) == HIGH) { Serial.println("pin " + String(pin2) + " still HIGH"); } } void MyMotor::stopMotor(){ Serial.println(motorName+" stopped"); digitalWrite(pin1, LOW); digitalWrite(pin2, LOW); } void MyMotor::setDutyCycle(int dutyCycle){ if (dutyCycle<0 | dutyCycle>= resolution*32){ Serial.println("---ERROR: speed/dutycycle is "+String(dutyCycle) +", which is higher than dutycycle resolution ("+String(resolution)+")"); }else{ ledcWrite(pwmChannel, dutyCycle); } } int MyMotor::getResolution() { return resolution; }

Kommentare

Noch Fragen?