Zwei Taster für ein Motor

Wunderschönen Guten Tag,
ich bin ein Neuling im Arduino Universum. Nun habe ich mir ein Projekt überlegt.
Ich möchte mit zwei Tastern ein Motor ansteuern. Dabei soll der eine Taster den Motor vorwärts drehen und der andere rückwärts. Vielleicht sind hier ein paar Leute vom Fach die mir unter die Arme greifen können.

Hier noch ein paar Infos zur Hardware: Ich benutzte einen Arduino Uno mit Motorshield. Es soll ein DC-Motor angetrieben werden. Außerdem sollen die anderen Schalter auf einem Steckbrett befestigt werden.

Ich freue mich schon auf eine Antwort und bin dankbar für jede Hilfe :wink:
Falke08

Hallo falke08

Herzlich Willkommen im besten Arduinoforum der Welt :slight_smile:

Poste dein Programm, in Code Tags, und einen Schaltplan damit wir sehen können wie wir helfen können.

Kein Problem ich bin gerade unterwegs heute Nachmittag lade ich den Code gerne hoch vllt finden wir ja einen Lösung.
Falke08

1 Like

Das kann doch wohl noch nicht alles sein, oder? :innocent:
Denn noch sehe ich keine Notwendigkeit, dafür einen Mikrocontroller mit Motortreiber zu verwenden, was auch ein Wipptaster DPDT erledigen könnte:

Aber da noch "andere Schalter" erwähnt wurden, bin ich schon gespannt auf mehr Projekt-Details :wink:

1 Like

Hallo @falke08

herzliche willkommen im Arduino-Forum.

Motorhields gibt es verschiedene. Und dann gibt es auch noch unterschiedliche Versionen je nachdem wann das Motorshield produziert wurde.

Die Ansteuerung der Motorshields unterscheidet sich zum Teil erheblich.
Deshalb musst du da die genaue Bezeichnung des Motorshields inclusive der Versionsnummer angeben.
Also am besten Link zum Datenblatt für exakt dein Motorshield.

Wenn du die nicht weißt dann mach wenigstens ein hochauflösendes Foto von dem echten Motorshield das du hast. Irgendein Amazon-Bildchen nützt da nix weil es ja doch die falsche Version ist.

So hab mich jetzt lange nicht gemeldet, aber hier habe ich weitere Infos:
Das Motorshield ist ein L293 für Arduino. Hier habe ich mal den Code den ich bisher verwnedet habe:

#include <AFMotor.h>
AF_DCMotor motor1(1);
int tasterPin1 = 7; 
int tasterPin2 = 6; 
int tasterStatus2;  // Variable zur Aufname des Tasterstatus
int tasterStatus1;  // Variable zur Aufname des Tasterstatus
void setup(){
  pinMode(tasterPin1, INPUT); // Taster-Pin als Eingang
  pinMode(tasterPin2, INPUT); // Taster-Pin als Eingang
}

void loop(){

  tasterStatus2 = digitalRead(tasterPin2);
  tasterStatus1 = digitalRead(tasterPin1);
  
  if(tasterStatus1 == HIGH) {
    motor1.setSpeed(200);
    motor1.run(FORWARD);
    }
    else {
    motor1.run(RELEASE);
    }



  if(tasterStatus2 == HIGH) {
    motor1.setSpeed(200);
    motor1.run(BACKWARD);
    }
    else {
    motor1.run(RELEASE);
    }  


}

Das Ziel könnte gefährdet sein, wenn beide Taster

bewirken.

Generell könnte man den Code für verschiedene Zustände von tasterStatus1 und tasterStatus2 geistig durchgehen und die motor1.run() Aufrufe betrachten, ob das wohl so optimal ist.

Spoiler

Nein.

So, das mit der Drehrichtung habe ich jetzt schon mal geändert:

#include <AFMotor.h>
AF_DCMotor motor1(1);
int tasterPin1 = 7; 
int tasterPin2 = 6; 
int tasterStatus2;  // Variable zur Aufname des Tasterstatus
int tasterStatus1;  // Variable zur Aufname des Tasterstatus
void setup(){
  pinMode(tasterPin1, INPUT); // Taster-Pin als Eingang
  pinMode(tasterPin2, INPUT); // Taster-Pin als Eingang
}

void loop(){

  tasterStatus2 = digitalRead(tasterPin2);
  tasterStatus1 = digitalRead(tasterPin1);
  
  if(tasterStatus1 == HIGH) {
    motor1.setSpeed(200);
    motor1.run(FORWARD);
    }
    else {
    motor1.run(RELEASE);
    }



  if(tasterStatus2 == HIGH) {
    motor1.setSpeed(200);
    motor1.run(BACKWARD);
    }
    else {
    motor1.run(RELEASE);
    }  


}

Schön.
Und nun? Funktioniert alles? Was ist überhaupt die Frage?

Meine Frage war ob die Experten vom Forum wissen, ob eventuell Fehler im Code sind.

Zum Beispiel:
Funktioniert das mit den zwei if-Schleifen?
Sind die Pins richtig?
Wurden die richtigen Befehle gewählt?

Hier sollte auch nochmal ein Schaltplan für die Schalter sein,
da weiß ich auch nicht ob der Plan funktioniert. Den Motor konnte ich im Schaltplan nicht einfügen, da es kein Motor-Shield im Programm gab.

Kein "Experte" aber trotzdem mal schnell drübergeschaut:

  1. Laut Adafruit gibt es gar nicht soo viel freie Pins auf dem Motorshield:

What pins are not used on the motor shield?
-All 6 analog input pins are available. They can also be used as digital pins (pins #14 thru 19)
-Digital pin 2, and 13 are not used.
-The following pins are in use only if the DC/Stepper noted is in use:
Digital pin 11: DC Motor #1 / Stepper #1 (activation/speed control)
Digital pin 3: DC Motor #2 / Stepper #1 (activation/speed control)
Digital pin 5: DC Motor #3 / Stepper #2 (activation/speed control)
Digital pin 6: DC Motor #4 / Stepper #2 (activation/speed control)
-The following pins are in use if any DC/steppers are used
Digital pin 4, 7, 8 and 12 are used to drive the DC/Stepper motors via the 74HC595 serial-to-parallel latch
-The following pins are used only if that particular servo is in use:
Digitals pin 9: Servo #1 control
Digital pin 10: Servo #2 control

Also würde ich die Taster eher an zwei der Pins A0-A5 anschließen.

  1. die If-Abfragen:
    wird wohl so nicht funktionieren. Wenn du einen Taster drückst, wird in der einen Abfrage zwar motor1.run(FORWARD/BACKWARD) ausgeführt, aber in anderen Abfrage immer motor1.run(RELEASE) aufgerufen. Von zwei gleichzeitigen Tastendrücken ganz zu schweigen..

Abhilfe z.B:

if(tasterStatus1 == HIGH) {
  motor1.setSpeed(200);
  motor1.run(FORWARD);
  }
  else if (tasterStatus2 == HIGH) {
    motor1.setSpeed(200);
    motor1.run(BACKWARD);  
    }
    else {
      motor1.run(RELEASE);
      } 
  1. der externe Pulldown-Widerstand wird so auch nicht funktionieren. Du verbindest hier lediglich GND und +5V über den Widerstand.
    Der Widerstand kommt zwischen TasterPin-Anschluss (im Bild hier grün) und GND:

So sind die Taster falsch angeschlossen. Die Arduino Eingänge müssen an den Pin des Tasters wo auch der Widerstand angeschlossen ist (Spalten 16 und 26 des Breadboard). Am anderen Pin des Tasters (13 und 23) geht auf +.

Grüße Uwe

So, jetzt bin ich dank euerer Hilfe schon weiter gekommen. Ein Bild habe ich mit dem Aufbau angehängt. Die Anschlüsse sind im Moment zum ausprobieren noch provisorisch und nicht so übersichtlich. Nun funktioniert auch der Code soweit. Aber nur wenn sich der Motor bei beiden Schaltern vorwärts bewegt. Sobald ich bei dem zweiten Schalter "BACKWARD" statt "FORWARD" eingebe funktioniert der Schalter nicht mehr. Hier habe ich noch mal den neuen Code, vielleicht wisst ihr ja weiter:

#include <AFMotor.h>
AF_DCMotor motor1(1);
int tasterPin1 = 1; 
int tasterPin2 = 5; 
int tasterStatus2;  // Variable zur Aufname des Tasterstatus
int tasterStatus1;  // Variable zur Aufname des Tasterstatus
void setup(){
  pinMode(tasterPin1, INPUT); // Taster-Pin als Eingang
  pinMode(tasterPin2, INPUT); // Taster-Pin als Eingang
}

void loop(){

  tasterStatus2 = digitalRead(tasterPin2);
  tasterStatus1 = digitalRead(tasterPin1);
  
  if(tasterStatus1 == HIGH) {
    motor1.setSpeed(200);
    motor1.run(FORWARD);
    }
    else if (tasterStatus2 == HIGH) {
      motor1.setSpeed(200);
      motor1.run(BACKWARD);  
      }
      else {
        motor1.run(RELEASE);
        } 

}


Hier noch mal eine genauere Aufnahme:

Du verwendest weiterhin Pin 5 für einen Taster. Dieser ist aber auf dem Shield schon in Verwendung. Evtl. macht dir das Probleme in der Steuerung. Wie gesagt, wechsel doch zu den AnalogPins, die du auch digital verwenden kannst.

Probiere ansonsten auch einen anderen Motor-Anschluss mal aus, falls einer der MotorTreiber schon den Schaden hat (Da liegt nämlich so eine Drahtbrücke unmotiviert auf der Platine rum und wartet nur darauf, Kontakte zu schließen, die nicht geschlossen werden wollen.. :wink: )

AF_DCMotor motor2(2);   // 3(3) oder 4(4)

Link zum Motor-Shield

Bitte auch noch den Jumper bei externer Spannungsversorgung entfernen.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.