Elektromotor langsam herunterregeln

Hey Community!

ich versuche einen Elektromotor über den Arduino herunter zu regeln. Ich wollte ein Elektroauto bauen das bei der Detektion eines Gegenstandes den Elektromotor langsam herunter regelt, bis er schließlich bei 5cm vor dem Gegenstand ausgeht.

Sieht einfach besser aus, als wenn es abrupt ausgeht. Gibt es dazu eine Möglichkeit den VIN Pin anzusteuern und ihm mitzuteilen je näher der Gegenstand kommt, desto weniger Leistung soll übermittel werden?

Vllt gibt es dazu eine Möglichkeit bevor ich eine Schaltung mit Verstärkern aufbauen muss.

Vielen Dank für eure Hilfe!!

Gruß

Wenn du den VIN-Pin des Arduino meinst, dann NEIN, das geht nicht.
Wenn es ein "normaler" Gleichstrommotor (Bürstenmotor) ist, dann geht es per PWM oder mit einem entsprechenden Treiberboard.

Mit einer for Schleife die PWM reduzieren.

for (byte i=255; i<=0; i--) {
  analogWrite(pin, i);
  delay (10);  
}

Wie lange delay() ist, musst Du schauen wie es am besten für dich ist.
Genauso ob man vielleicht gleich 3 oder 5 PWM Schritte runtergeht, pro for durchlauf.

Eigentlich gehört das delay () raus. Siehe blinkWithoutDelay.
Wenn ich daheim bin kann ich Dir in der Richtung noch was sagen.

Grüße,
Donny
edit: ok... jetzt hast Du zumindest ein Beispiel. :wink: Ist allerdings noch ausbaufähig.

P6UMB3RT:
Also kann ich anhand eines PWM-Signals über den Arduino den Motor verlangsamen?

Ja, wenn Du eine LED mit Vorwiderstand an den Ausgang anschließt, wird diese dunkler. Die Leistungselektronik (H-Brücke) muß natürlich schnell genug sein, um das PWM-Signal weiterleiten zu können. In diesem Beispiel gibt es die Anschlüsse LPWM und RPWM, die wären dann wohl dafür geeignet.

agmue:
... Beispiel gibt es die Anschlüsse LPWM und RPWM....

Genau! 2 Motoren, 2 PWM Signale.

Ich bastel ja auch an so nem "Roboter Auto", eine links kurve fährt man indem man die (L)PWM (L steht wahrscheinlich für left, auf jeden Fall für einen Motor) reduziert.

Wenn man das auch mit einer for Schleife macht, schaut das realistischer aus. Quasi wie "einlenken".
Die Motoren entgegengesetzt laufen lassen wobei einer schneller ist.... da dreht sich das Ding im Kreis, "fährt" allerdings vorwärts. <- Nur so als Input. :wink:

Grüße,
Donny

dony:
Wenn man das auch mit einer for Schleife macht, ...

Du hast es schon geschrieben, ich möchte es nochmal betonen: Anstelle for mit delay bitte loop mit millis verwenden, weil Du dann immer die Sensoren abfragen kannst und damit die volle Kontrolle behältst :slight_smile:

agmue:
...Anstelle for mit delay bitte loop mit millis verwenden...

Ja, unbediengt!! In einem Sketch für ein Roboter Auto hat ein delay() absolut NICHTS verloren! Du musst bedenken, dass so ein Sketch sehr schnell wachsen kann. Mehrere Movements, Sensor Daten die regelmäßig Abgefragt werden, vielleicht noch eine Bluetooth, Wlan, IR Verbindung dazu. Dann fliegt Dir jedes delay() um die Ohren, deshalb besser gleich ohne.

Du solltest das Sketch IMO wie einen Endlichen Automaten schreiben, hierzu gibt es bereits einiges im Forum. Aber schau mal das Du die Motoren ohne delay() zum laufen bekommst.

In der Nachtwächtererklärung (die momentan auf Seite 1 herumwandert) wird das wunderbar erklärt.

Ich hab hier mal das delay() durch eine milis() ersetzt, aus dem "BlinkwithoutDelay" Beispiel. Mein Beispiel wird von der Programmlogik her, so nicht funktionieren. Aber etwas arbeit solltest Du auch haben. :wink:
Wichtig ist, dass Du auch verstehst was wir Dir versuchen zu erklären.

byte interval = 10; // byte geht bis 255, sollte reichen, sonst uint16_t (oder int)
//uint16_t interval = 10; 
byte pin = 9; // PWM Pin für Motor 1
unsigned long previousMillis; // definiert die Variable die man zum zwichenspeichern der abgelaufenen Zeit braucht.

// -----------------

void loop() {
  unsigned long currentMillis = millis(); // die verstrichene Zeit
  
  for (byte i=255; i<=0; i--) {
    analogWrite(pin, i);
//    delay (10); // <- Das gehört dringend ersetzt durch:
    
    if (currentMillis - previousMillis >= interval) { // Überprüfen ob die Zeit abgelaufen ist
      previousMillis = currentMillis; // Die Zeit vom letzten loop durchgang speichern.

      // Wenn Die Zeit abgelaufen ist, kommst Du hier her.
    }
  }
}

Das Umschreiben überlasse ich Dir, (war ein anstrengender Tag). Ich schau mir aber gerne Dein Ergebniss an. :slight_smile:

Grüße,
Donny