L293 - Motor vorwärts und Rückwärts mittels Poti ?

Hallo zusammen,

ich habe da mal eine kleine Frage an die Spezialisten hier.....
Vermutlich denke ich auch nur verkehrt.

Also, Ziel ist es, mittels eines Potis, einen Motor vorwärts und rückwärts laufen zu lassen.

Poti 0-300 dreht der Motor 0-100 rückwärts
Poti 310 - 1023 dreht der Motor 0-255 vorwärts

Quasi ein Gsapedal.

const int potigas = A0;                 // Gas-Poti an Analog 0
const int motor1vor = 6;                // Ausgang Motor 1 Vorwärts
const int motor1ruck = 5;               // Ausgang Motor 1 Rückwärts

int sensor = 0;
int pwm5 = 0;
int pwm6 = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  sensor = analogRead(potigas);
  pwm5 = map(sensor, 0, 300, 0, 100);
  analogWrite(motor1ruck, pwm5);
  pwm6 = map(sensor, 310, 1023, 0, 255);
  analogWrite(motor1vor, pwm6);



  Serial.print("Poti = ");
  Serial.print(sensor);
  Serial.print(" PWM 5 = ");
  Serial.println(pwm5);
  Serial.print(" PWM 6 = ");
  Serial.println(pwm6);

  delay(50);
}

Vielleicht könnt ihr mir helfen den Denkfehler zu finden ?

Ich hatte angenommen, daß z.b. an Pin 6 NIX ankommt, solange der Poti im Bereich 0-309 ist.
Stattdessen liefert mir auch die serielle Ausgabe am PC MINUS-Werte.

Hi

map liefert Dir einen Wert nach 3-Satz.
Was Du ggf. suchst - constrain
Das begrenzt die Zahl an den gegebenen Zahlen.

MfG

Da sind gleich zwei Denkfehler drin.

Also das mit den Werten ist in den Griff zu bekommen.

etwa so,

if PWM vorwärts, mappergebnis 0<301 dann Ausgang =0
parallel für den Rückwärtsgang wenn Ergebnis > =301, dann Wert = 0

Dann kriegst du nich mehr diese wilden Ergebnisse zurück.

Das mapping für den Rückwärtsgang sollte wahrscheinlich nicht heißen
Sensor 0,300,0,100

sondern

0,300,100,0

Sonst läuft der Motor in Poti - Mitte plötzlich wie ein Wahnsinnerger rückwärts, und wenn du weiterdrehst, wird er langsamer.

Ich denke du willst bei Poti 300 etwa den Leerlauf haben.
Anders macht das keinen Sinn.

Poti 0-300 dreht der Motor 0-100 rückwärts
Poti 310 - 1023 dreht der Motor 0-255 vorwärts

Bist Du sicher daß es so funktionieren soll? Wenn der Poty von 300 auf 320 wechselt steuerst Du den Motor von 100 Rückwerts zu 2 vorwärts also mehr als einen Vollbremsung. Du solltest Dir überlegen wie das funktionieren soll. Wennschon einen Nullstellug in der Mitte bei 300 und 300 bis 0 ein PWM von 0 bis 100 rückwerts und von 310 bis 1023 von 0 bis 255 vorwärts.

sensor = analogRead(potigas);
  pwm5 = map(sensor, 0, 300, 0, 100);
  analogWrite(motor1ruck, pwm5);
  pwm6 = map(sensor, 310, 1023, 0, 255);
  analogWrite(motor1vor, pwm6);

map() wandelt nicht nur innerhalb der angegebenen Limits sondern auch außerhalb. Also ein 400 ergibt für pwm5 ca 133.

Was sind die Pins pwm5 und pwm6? Wo sind sie am L293 angeschlossen?

Grüße Uwe

(deleted)

kommt au

Peter-CAD-HST:
Moin

überlebt der L293 sowas ?

Gruss Peter

Kommt auf den Motor an.

Grüße Uwe

skyfox60:
Das mapping für den Rückwärtsgang sollte wahrscheinlich nicht heißen
Sensor 0,300,0,100

sondern

0,300,100,0

Sonst läuft der Motor in Poti - Mitte plötzlich wie ein Wahnsinnerger rückwärts, und wenn du weiterdrehst, wird er langsamer.

Genau, der Fehler ist inzwischen behoben....

postmaster-ino:
Hi

map liefert Dir einen Wert nach 3-Satz.
Was Du ggf. suchst - constrain
Das begrenzt die Zahl an den gegebenen Zahlen.

MfG

Vielen Dank für den Tip.

Habe jetzt "oben" folgendes gemacht:
int pwm5 = constrain(pwm5 , 0, 100);
int pwm6 = constrain(pwm6 , 0, 255);

Damit SOLLTEN die Grenzen für PWM5 und 6 festgelegt sein.

Dennoch erhalte och weiter die Minus-Werte an den Ausgängen.
Muss ich im "unteren" Teil auch noch was ändern ?

Wenn Du einen Eingang der H-Brücke PMW-Ansteuerst und den anderen auf HIGH legst dann mußt Du den anderen Eingang auch ansteuern. Besser als beide Eingänge auf HIGH zu legen( HIGH und PWM), wodurch der Motor kurzgeschlossen wird, ist die PWM Steuerung über den Enable Eingang zu regeln und die Drehrichtung über die beiden Eingänge.

Grüße Uwe

wodurch der Motor kurzgeschlossen wird,

Gesteuertes Bremsen.
So bekommt man den 4 Quadranten Steller hin.

Fehlt nur noch die Rekuperation, dann ist das Portfolio für Bürstenmotore komplett.

uwefed:
kommt auKommt auf den Motor an.

Grüße Uwe

Laut Datenblatt kann der L293D am Ausgang 600mA konstant.
Der zum Test verwendete Carrera-Motor ist mit 0,15A MAX angegeben.

Sollte zum testen also reichen.

uwefed:
Wenn Du einen Eingang der H-Brücke PMW-Ansteuerst und den anderen auf HIGH legst dann mußt Du den anderen Eingang auch ansteuern. Besser als beide Eingänge auf HIGH zu legen( HIGH und PWM), wodurch der Motor kurzgeschlossen wird, ist die PWM Steuerung über den Enable Eingang zu regeln und die Drehrichtung über die beiden Eingänge.

Grüße Uwe

Danke Uwe,
DAS war die Lösung !

und mit diesem Thema habe ich mich sogar etwas in die bisher vernachlässigte IF-THEN-Thematik eingearbeitet.

Programm sieht nun so aus:

const int potigas = A0;                   // Gas-Poti an Analog 0
const int motor1vor = 4;                // Ausgang Motor 1 Vorwärts
const int motor1ruck = 2;               // Ausgang Motor 1 Rückwärts
const int drehzahl = 3;                   // Drehzahl für Motor

int sensor = 0;
int drehvor = 0;
int drehruck = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  sensor = analogRead(potigas);
  
if (sensor > 350)
{
  digitalWrite(motor1vor, HIGH);
  digitalWrite(motor1ruck, LOW);
  drehvor = map(sensor, 350, 1023, 0, 255);
  analogWrite(drehzahl, drehvor);
  Serial.print("Poti = ");
  Serial.print(sensor);
  Serial.print("  ");
  Serial.print("Vorwärts");
  Serial.print("  ");
  Serial.print("Drehzahl = ");
  Serial.println(drehvor);
}

else if (sensor < 300)
{
  digitalWrite(motor1vor, LOW);
  digitalWrite(motor1ruck, HIGH);
  drehruck = map(sensor, 0, 300, 100, 0);
  analogWrite(drehzahl, drehruck);
  Serial.print("Poti = ");
  Serial.print(sensor);
  Serial.print("  ");
  Serial.print("Rückwärts");
  Serial.print("  ");
  Serial.print("Drehzahl = ");
  Serial.println(drehruck);
}

else
{
  digitalWrite(motor1vor, LOW);
  digitalWrite(motor1ruck, LOW);
  Serial.print("Poti = ");
  Serial.print(sensor);
  Serial.print("  ");
  Serial.println("STOP");
}

  delay(10);
}

Die Ports 2 und 4 gehen beim L293 an die Input-Pins 10 und 15.
Die Drehzahl Port 3 geht beim L293 an den Enable-Pin 9

So funktioniert, was ich haben wollte.... VIELEN DANK !!

Eine kurze Frage noch.....
wie sage ich z.B.
if (sensor = ZWISCHEN 300 UND 350) bzw (sensor >300 UND <350) ??

sensor >300 && sensor <350

wie sage ich z.B.
if (sensor = ZWISCHEN 300 UND 350) bzw (sensor >300 UND <350) ??

switch(sensor)
{
  case 300 ... 350 : tuedies(); break;
  
  default: tuewasanderes();

}

Hallo,

bist Du jetzt auf Uwe´s Vorschlag eingegangen und verwenest einen PWM Ausgang für die Geschwindigkeit und zwei digitale Augänge ( vor/ zurück) für die Richtung.

Damit könntest Du einen feste Offset als Mittelstellung verwenden, z.B Deine 300. Denn ziehst Du vom eingelesen Analogwert ab. Damit bekommst Du einmal einen Positiven Wert und einmal einen negativen Wert. (-300 bis 700) Die Info benutzt Du zur Ansteuerung der Ausgänge vorwärts rückwärts. Dann bildes Du den Betrag des Sollwerten und mäppst Ihn nach Belieben für Vorwärts und Rückwärts und gibst Ihn auf den PWM Ausgang.

Ich hab das jetzt nicht probiert , ich würde aber den Ansatz jetzt mal versuchen.

Heinz