Ein selbstgebauter Roboter
Bau und Programmierung eines selbstfahrenden Roboters mit einem ESP-32
Im Frühjahr 2022 habe ich einen kleinen Roboter gebaut, der fahren kann, und ihn programmiert, um sich zu bewegen.
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
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:
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.
Zum Beispiel habe ich eine Bibliothek geschrieben, um jeden der 4 verfügbaren Motoren zu steuern.
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;
};
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;
}
MyMotor::Noch Fragen?