Mit esp32 2 DC Motoren ansteuern

Hallo Leute,

ich bin derzeit an einem Code um mit einem esp32 und einem Motordriver 2 DC Motoren zu steuern.

Folgend mein Code:

#include <Servo.h>
// Motor 1 Links
int motor1Pin1 = 27; 
int motor1Pin2 = 26; 
int enable1Pin = 14; 

// Motor 2 Rechts
int motor2Pin1 = 17; 
int motor2Pin2 = 16; 
int enable2Pin = 19; 


// Schnelligkeits Grundeinstellungen Motor 1 
const int freq1 = 30000;
const int pwmChannel1 = 0;
const int resolution1 = 8;
int dutyCycle1 = 200;  //is für geschwindigkeit Grundeinstellung darf zwischen 0 und 255 sein aber unter 200 brummt es

// Schnelligkeits Grundeinstellungen Motor 1 
const int freq2 = 30000;
const int pwmChannel2 = 0;
const int resolution2 = 8;
int dutyCycle2 = 200;  //is für geschwindigkeit Grundeinstellung darf zwischen 0 und 255 sein aber unter 200 brummt es

void setup() {
  // PINS als OUTPUT definieren
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enable1Pin, OUTPUT);
  pinMode(motor2Pin1, OUTPUT);
  pinMode(motor2Pin2, OUTPUT);
  pinMode(enable2Pin, OUTPUT);
  
  // Grundlegende Geschwindigkeitseinstellungen
  ledcSetup1(pwmChannel1, freq1, resolution1);
  ledcSetup2(pwmChannel2, freq2, resolution2);
  
  // Kanal wird zugewiesen an GPIO um diesen zu kontrollieren
  ledcAttachPin1(enable1Pin, pwmChannel1);
  ledcAttachPin2(enable2Pin, pwmChannel2);

  Serial.begin(115200);

  // testing
  Serial.print("Motor Test...");
}

void loop() {
  // Vorwärts Bewegung
  Serial.println("Vorwärts");
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, HIGH); 
  digitalWrite(motor2Pin1, LOW);
  digitalWrite(motor2Pin2, HIGH);
  delay(2000);

  // Motor Stoppen
  Serial.println("Motor stopped");
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin1, LOW);
  digitalWrite(motor2Pin2, LOW);
  delay(1000);

  // Move DC motor backwards at maximum speed
  Serial.println("Moving Backwards");
  digitalWrite(motor1Pin1, HIGH);
  digitalWrite(motor1Pin2, LOW); 
  digitalWrite(motor2Pin1, HIGH);
  digitalWrite(motor2Pin2, LOW); 
  delay(2000);

   // Motor Stoppen
  Serial.println("Motor stopped");
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin1, LOW);
  digitalWrite(motor2Pin2, LOW);
  delay(1000);

  // Move DC motor forward with increasing speed
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, HIGH); 
  digitalWrite(motor2Pin1, LOW);
  digitalWrite(motor2Pin2, HIGH);
  while (dutyCycle1 <= 255){
    ledcWrite1(pwmChannel1, dutyCycle1);   
    Serial.print("Forward with duty cycle: ");
    Serial.println(dutyCycle1);
    dutyCycle1 = dutyCycle1 + 5;
    delay(500);
  }
    while (dutyCycle2 <= 255){
    ledcWrite1(pwmChannel2, dutyCycle2);   
    Serial.print("Forward with duty cycle: ");
    Serial.println(dutyCycle2);
    dutyCycle2 = dutyCycle2 + 5;
    delay(500);
  }
  dutyCycle1 = 200;
  dutyCycle2 = 200;
}

Aber der Code funktioniert nicht.
Was habe ich falsch gemacht? die 2 und 1 einzugeben war falsch oder?

Aber wie weise ich den Motoren dann die einzelnen Geschwindigkeiten zu?
Dies will ich um links und rechts zu steuern.

Ich danke euch vielmals für eure Hilfe.
Viele Grüße
Julian :slight_smile:

Sieh dir doch einfach die Beispiele in der Library an.
Da findest du sicher eine Lösung für dein Problem.

compiliert das überhaupt?
Was macht der #include <Servo.h> und welche genau wäre das?

Das letzte mal habe ich mich ganz genau an das gehalten und da hat dann PWM super funktioniert:

https://randomnerdtutorials.com/esp32-pwm-arduino-ide/

Über die Channel:

// Motor 1 Links
const int motor1Pin1 = 27;
const int motor1Pin2 = 26;
const int enable1Pin = 14;

// Motor 2 Rechts
const int motor2Pin1 = 17;
const int motor2Pin2 = 16;
const int enable2Pin = 19;


// Schnelligkeits Grundeinstellungen Motor 1
const int freq1 = 30000;
const int pwmChannel1 = 0;
const int resolution1 = 8;
int dutyCycle1 = 200;  //is für geschwindigkeit Grundeinstellung darf zwischen 0 und 255 sein aber unter 200 brummt es

// Schnelligkeits Grundeinstellungen Motor 1
const int freq2 = 30000;
const int pwmChannel2 = 1;
const int resolution2 = 8;
int dutyCycle2 = 200;  //is für geschwindigkeit Grundeinstellung darf zwischen 0 und 255 sein aber unter 200 brummt es

void setup() {
  // PINS als OUTPUT definieren
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enable1Pin, OUTPUT);
  pinMode(motor2Pin1, OUTPUT);
  pinMode(motor2Pin2, OUTPUT);
  pinMode(enable2Pin, OUTPUT);

  // Grundlegende Geschwindigkeitseinstellungen
  ledcSetup(pwmChannel1, freq1, resolution1);
  ledcSetup(pwmChannel2, freq2, resolution2);

  // Kanal wird zugewiesen an GPIO um diesen zu kontrollieren
  ledcAttachPin(enable1Pin, pwmChannel1);
  ledcAttachPin(enable2Pin, pwmChannel2);

  Serial.begin(115200);

  // testing
  Serial.print("Motor Test...");
}

void loop() {
  // Vorwärts Bewegung
  Serial.println("Vorwärts");
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, HIGH);
  digitalWrite(motor2Pin1, LOW);
  digitalWrite(motor2Pin2, HIGH);
  ledcWrite(pwmChannel1, dutyCycle1);
  ledcWrite(pwmChannel2, dutyCycle2);
  delay(2000);

  // Motor Stoppen
  Serial.println("Motor stopped");
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin1, LOW);
  digitalWrite(motor2Pin2, LOW);
  ledcWrite(pwmChannel1, 0);
  ledcWrite(pwmChannel2, 0);
  delay(1000);

  // Move DC motor backwards at maximum speed
  Serial.println("Moving Backwards");
  digitalWrite(motor1Pin1, HIGH);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin1, HIGH);
  digitalWrite(motor2Pin2, LOW);
  ledcWrite(pwmChannel1, dutyCycle1);
  ledcWrite(pwmChannel2, dutyCycle2);
  delay(2000);

  // Motor Stoppen
  Serial.println("Motor stopped");
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin1, LOW);
  digitalWrite(motor2Pin2, LOW);
  ledcWrite(pwmChannel1, 0);
  ledcWrite(pwmChannel2, 0);
  delay(1000);

  // Move DC motor forward with increasing speed
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, HIGH);
  digitalWrite(motor2Pin1, LOW);
  digitalWrite(motor2Pin2, HIGH);
  dutyCycle1 = 0;
  while (dutyCycle1 <= 255) {
    ledcWrite(pwmChannel1, dutyCycle1);
    Serial.print("Forward with duty cycle: ");
    Serial.println(dutyCycle1);
    dutyCycle1 = dutyCycle1 + 5;
    delay(100);
  }
  dutyCycle2 = 0;
  while (dutyCycle2 <= 255) {
    ledcWrite(pwmChannel2, dutyCycle2);
    Serial.print("Forward with duty cycle: ");
    Serial.println(dutyCycle2);
    dutyCycle2 = dutyCycle2 + 5;
    delay(100);
  }
  dutyCycle1 = 200;
  dutyCycle2 = 200;
}

von welcher "2" und welcher "1" schreibst du da?
Du musst die Dinge schon präzise beschreiben.
die Konstante
const int pwmChannel1 = 0;
und
const int pwmChannel2 = 0;

haben beide den Wert null. Und benutzen den gleichen pwm-channel
noiasca hat das in seiner code-version angepasst
vgs

Ich Danke dir sehr, habe das Problem gelöst und nun ein anderes Problem

Ich meinte

const int freq2 = 30000;
const int pwmChannel2 = 1;
const int resolution2 = 8;

Die zwei bei freq2 und eben die 1 dort.
Aber auch das habe ich geschafft.

Mein derzeitiges Problem ist, dass ich ein esp32 dazu bringe, einen Empfangen Bluetooth wert weiter zu geben.
Dies klappt am angeschlossenen Laptop aber eben nicht am angeschlossenen Akku.
Der akku hat 6 Batterien je 1,5V sprich 9V.

Wenn 3 esp32 angeschlossen sind schickt der eine nichts aber eben auch nicht, wenn nur er angeschlossen ist.

An was kann dies liegen?

Vermutlich liegt es an deiner Versorgung per Akku.
Evtl. liefern die nicht genügend Strom.
Was für Akkus setzt du ein ?

sogar nur batterien bis jetzt, 9V also 6 stück mit 1,5 V...

Muss ich wenn ich mehrere anschließe also auch motoren, genau so viel spannung liefern wie sie jeweils addiert brauchen?

Das sagt nichts darüber aus, welche Kapazität die haben, also welchen Strom die liefern können.

Du müsstest einfach mal sagen was das für ein Batterie-Typ ist.

Es ist aber generell so, dass Batterien einen vergleichsweise hohen Innenwiderstand haben.
Wenn man aus einer Mignon-Batterie einen Strom vom 1A rausziehen will dann hat man schon lange keine 1,5V mehr weil der Innenwiderstand so groß ist.

Bei den ESP-modulen treten zwar sehr kurze aber hohe Stromspitzen auf. Das reicht um einen Reset auszulösen.
Diese Stromspitzen kann man mit großen Elektrolyt-Kondensatoren abfedern
Groß heißt in diesem Fall mindestens 2200µF besser 4700µF.

Noch besser ist ein Schaltnetzteil das mindestens 3A Dauerstrom liefern kann.
vgs

es ist immer das gleiche. Je präziser die Informationen desto präziser die Vorschläge.

  • Welche Spannung benötigen die Motoren ?
  • Was für einen Strom ziehen die Motoren?
  • welches Motorschield benutzt du?
  • welche Batteriegröße?

Als Fragensteller ist es da am besten den Link zu den Datenblättern oder wenigstens den Produkt-Link zum Onlineshop wo man die Sachen gekauft hat zu posten.

Bei Amazon gekauft war
1.) bei Elektronik garantiert nicht das günstigste Angebot
2.) Heißt im Nebel rumstochern weil bei Amazon zu wenig Produktdaten angegeben werden

vgs