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
Falke08
Das kann doch wohl noch nicht alles sein, oder?
Denn noch sehe ich keine Notwendigkeit, dafür einen Mikrocontroller mit Motortreiber zu verwenden, was auch ein Wipptaster DPDT erledigen könnte:
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);
}
}
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.
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:
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.
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..
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 +.
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);
}
}
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.. )