Motor ansteuern über Taster mit L293D Motor Shield

Hallo zusammen,

ich habe eine Problem und komme einfach nicht weiter. Ich möchte gerne eine kleine Steuerung für eine Modellbahn machen. Klappt soweit auch alles prima. Ich nutze das L293D Motor Shield und einen Arduino Uno. Am ersten Ausgang habe ich den Ausgang für die Bahn dran. Über einen Poti an A0 wird hier die Geschwindigkeit geregelt. Das klappt auch prima.

An Motor2 Ausgang habe ich eine Drehscheibe dran. Diese möchte ich gerne über 2 Taster links oder rechts rum drehen lassen - solange der Taster gedrückt ist. Da ich nur noch Analog Ausgänge zur Verfügung habe, musste ich dafür A1 und A2 nutzen. Sollte ja kein Problem sein. Pullups sind aktiv und die Taster gegen Masse angeschlossen.

Wenn ich nun nur den ersten Taster abfrage, klappt das auch prima. Sobald ich den Taster drücke, dreht sich die Drehscheibe entsprechend. Frage ich danach jedoch den 2. Taster ab, spinnt das ganze. Dann funktioniert nur noch der 2. einwandfrei. Drücke ich den ersten Taster, pfeift der Motor nur.

Woran könnte das liegen ? Hat jemand von Euch vielleicht eine Idee ? Ich stehe auf dem Schlauch.

Besten Dank im Voraus !
Viele Grüße
Sven

Hier der Code:

// Feldbahnanlage Steuerung

// Potisignal an A0
// Taster Drehscheibe links = A1
// Taster Drehscheibe rechts = A2
// Motorausgang Gleis an Motor1
// Motorausgang Drehscheibe an Motor2

#include <AFMotor.h>
AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_8KHZ);
int Potieingang = A0; //Das Wort „eingang“ steht jetzt für den Wert „A0“ (Bezeichnung vom Analogport 0)
int Potiwert = 0; //Variable für den Potiwert mit 0 als Startwert
int links = A1; // Taster für Drehscheibe links herum
int rechts = A2; // Taster für Drehscheibe recht herum
int tasterstatuslinks = 0; // Das Wort "tasterstatuslinks" steht nun für 0 oder 1 des Tasters.
int tasterstatusrechts = 0; // Das Wort "tasterstatusrechts" steht nun für 0 oder 1 des Tasters.
void setup() //Hier beginnt das Setup.
{
  pinMode(links, INPUT_PULLUP); //Links(A1) als Eingang setzen
  pinMode(rechts, INPUT_PULLUP); //Rechts (A2) als Eingang setzen
}

void loop()
{
  Potiwert = analogRead(Potieingang); //Die Spannung am Drehregler wird gelesen und als Zahl zwischen 0 und 1023 ausgegeben.
  Potiwert = Potiwert / 4; // Wert durch 4 teilen
  motor1.setSpeed(Potiwert); // Wert als Geschwindigkeit ausgeben.
  motor1.run(FORWARD); // Laufrichtung vorwärts

  tasterstatuslinks = digitalRead(links);
  tasterstatusrechts = digitalRead(rechts);

  if (tasterstatuslinks == LOW)
    {
     motor2.setSpeed(250); // den Motor mit 250 Speed forwärts laufen lassen.
     motor2.run(BACKWARD);
    }

  if (tasterstatusrechts == LOW)
    {
     motor2.setSpeed(250); // den Motor mit 250 Speed forwärts laufen lassen.
     motor2.run(FORWARD);
    }

      else
      { 
        motor2.run(RELEASE); // Motor anhalten
      }
    

Das ELSE schaltet die Bewegung des Tasterlinks sofort aus.

Anstatt des ELSE brauchst Du ein weiteres IF das kontrolliert, ob beide Taster losgelassen sind und nur in diesem Fall den Motor ausschaltet.

Grüße Uwe

Super, vielen lieben Dank ! Es funktioniert. Und damit alles was davon haben, hier der funktionierende Code:

// Feldbahnanlage Steuerung

// Potisignal an A0
// Taster Drehscheibe links = A1
// Taster Drehscheibe rechts = A2
// Motorausgang Gleis an Motor1
// Motorausgang Drehscheibe an Motor2

#include <AFMotor.h>
AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_8KHZ);
int Potieingang = A0; //Das Wort „eingang“ steht jetzt für den Wert „A0“ (Bezeichnung vom Analogport 0)
int Potiwert = 0; //Variable für den Potiwert mit 0 als Startwert
int links = A1; // Taster für Drehscheibe links herum
int rechts = A2; // Taster für Drehscheibe recht herum
int tasterstatuslinks = 0; // Das Wort "tasterstatuslinks" steht nun für 0 oder 1 des Tasters.
int tasterstatusrechts = 0; // Das Wort "tasterstatusrechts" steht nun für 0 oder 1 des Tasters.
void setup() //Hier beginnt das Setup.
{
  pinMode(links, INPUT_PULLUP); //Links(A1) als Eingang setzen
  pinMode(rechts, INPUT_PULLUP); //Rechts (A2) als Eingang setzen
}

void loop()
{
  Potiwert = analogRead(Potieingang); //Die Spannung am Drehregler wird gelesen und als Zahl zwischen 0 und 1023 ausgegeben.
  Potiwert = Potiwert / 4; // Wert durch 4 teilen
  motor1.setSpeed(Potiwert); // Wert als Geschwindigkeit ausgeben.
  motor1.run(FORWARD); // Laufrichtung vorwärts

  tasterstatuslinks = digitalRead(links);
  tasterstatusrechts = digitalRead(rechts);

  if (tasterstatuslinks == LOW)
    {
     motor2.setSpeed(250); // den Motor mit 250 Speed forwärts laufen lassen.
     motor2.run(BACKWARD);
    }

  if (tasterstatusrechts == LOW)
    {
     motor2.setSpeed(250); // den Motor mit 250 Speed forwärts laufen lassen.
     motor2.run(FORWARD);
    }
  if ((tasterstatuslinks == HIGH) and (tasterstatusrechts == HIGH))
    {
     motor2.run(RELEASE);
    } 
    
 }

Hallo,
oder ein

else if (tasterstatusrechts == LOW)

Heinz

Leider jein.

Der Motor soll aus sein wenn weder rechts noch links gedrückt sind. also bleibt es bei 3 If Abfragen.

Ob das dann
if
else if
else
ist
oder
if
if
if
ist eigentlich egal.
3x if find ich überschaubarer als
2x if und 2x else.

Grüße Uwe