Go Down

Topic: Problem mit Taster (Read 1 time) previous topic - next topic

elmar

Hy,

nachdem ich mir jetzt den ganzen Tag einen abgebrochen hab ohne den Fehler zu finden, hoffe ich mal das ihr mir weiterhelfen könnt.
Mein Vorhaben: Ich will 4 dc motoren an meinem duemilanove betreiben, dafür hab ich bereits 2 L293 passend mit dem Arduino verkabelt und zusätzlich am Digital Pin 1 noch einen Taster angehangen. Der Taster hängt weiterhin über einen Widerstand am GND vom Arduino und mit der anderen Seite an 5V Plus.

Wollte dafür folgenden Code verwenden:
Code: [Select]

int enableA = 6;   // Motor A, PWM-Pin - L293D, Pin 9
int enableB = 5;   // Motor B, PWM-Pin - L293D, Pin 1
int enableC = 9;   // Motor A, PWM-Pin - L293D, Pin 9
int enableD = 10;   // Motor B, PWM-Pin - L293D, Pin 1
int out1A = 7; // Motor A, Steuerleitung 1 - L293D, Pin 15
int out2A = 2; // Motor A, Steuerleitung 2 - L293D, Pin 10
int out1B = 3; // Motor B, Steuerleitung 1 - L293D, Pin 7
int out2B = 4; // Motor B, Steuerleitung 2 - L293D, Pin 2
int out1C = 8; // Motor A, Steuerleitung 1 - L293D, Pin 15
int out2C = 11; // Motor A, Steuerleitung 2 - L293D, Pin 10
int out1D = 12; // Motor A, Steuerleitung 1 - L293D, Pin 15
int out2D = 13; // Motor A, Steuerleitung 2 - L293D, Pin 10
int buttonPin = digitalRead(1);
int buttonState = 0;
int buttonPushCounter = 0;   // counter for the number of button presses
int lastButtonState = 0;  // previous state of the button

void setup() {
   Serial.begin(9600);
  pinMode(enableA, OUTPUT);
  pinMode(enableB, OUTPUT);
    pinMode(enableC, OUTPUT);
  pinMode(enableD, OUTPUT);
  pinMode (out1A, OUTPUT);
  pinMode (out2A, OUTPUT);
  pinMode (out1B, OUTPUT);
  pinMode (out2B, OUTPUT); 
    pinMode (out1C, OUTPUT);
  pinMode (out2C, OUTPUT);
  pinMode (out1D, OUTPUT);
  pinMode (out2D, OUTPUT);
  pinMode(buttonPin,INPUT);                     
int buttonPin = digitalRead(1); 
digitalWrite(buttonPin, HIGH);
    pinMode(buttonPin, INPUT);
    digitalWrite(enableA, HIGH);
    digitalWrite(enableB, HIGH);
    digitalWrite(enableC, HIGH);
    digitalWrite(enableD, HIGH);
}

void loop()
{
buttonState = digitalRead(buttonPin); // read the pushbutton input pin
  if (buttonState != lastButtonState) { // compare buttonState to previous state

  if (buttonState == 1) {     // if the current state is 1 then the button
                            // went from off to on:
    buttonPushCounter++;
    Serial.println("on");
    Serial.print("  ");
    Serial.println(buttonPushCounter, DEC);

    switch (buttonPushCounter) {

case 1:              
Serial.println("1");    
digitalWrite(out1A, LOW);   
    digitalWrite(out2A, HIGH); 
    digitalWrite(out1B, LOW);   
    digitalWrite(out2B, HIGH); 
    digitalWrite(out1C, LOW); 
    digitalWrite(out2C, HIGH); 
    digitalWrite(out1D, LOW);   
    digitalWrite(out2D, HIGH); 
   
delay (2000);
digitalWrite(out1A, LOW);   
    digitalWrite(out2A, LOW); 
       digitalWrite(out1B, LOW);   
    digitalWrite(out2B, LOW); 
    digitalWrite(out1C, LOW);   
    digitalWrite(out2C, LOW); 
    digitalWrite(out1D, LOW);   
    digitalWrite(out2D, LOW); 
   
   
        break;

case 2:              
Serial.println("2");    
digitalWrite(out1A, HIGH);   
    digitalWrite(out2A, LOW); 
    delay (2000);
digitalWrite(out1A, LOW);   
    digitalWrite(out2A, LOW); 
        break;
  }     
  }     
  } 
    }
   


Ziel von dem ganzen ist es halt, das ich durch drücken des Tasters verschiedene Positionen der Motoren ansprechen möchte. Zur Kontrolle sollte über SERIAL ein signal an den Rechner gehen und mitzählen so das man mitverfolgen kann bei welchem tasterstand man angekommen ist.

Das Problem, sobald ich den Arduino mit strom versorge spult der das Programm einmal ab, im kompletten, ohne das ich dafür den taster drücken würde, zusätzlich zählt er rasend schnell über serial hoch ohne das dafür der taster gedrückt würde, jetzt teste ich schon den ganzen tag hin und her, finde aber den Fehler einfach nicht ....

maverick1509

#1
Jul 17, 2011, 07:52 pm Last Edit: Jul 17, 2011, 07:59 pm by maverick1509 Reason: 1
Hallo,
ich habs jetzt nur übeflogen:

als erstes zählst du buttonPushCounter++ hoch,
das heißt aber dein switch wird zweimal durchlaufen case 1 und case 2.
Was ist denn beim dritten mal, wenn buttonPushCounter größer als 2 ist.

Weiter bleibt lastButtonStat immer 0, wird ja nirgends gesetzt.

elmar

oh mann danke das war auf jeden Fall schonmal ein guter Hinweis....
hab das ganze aus mehreren anderen programmen zusammenkopiert und scheinbar die zeile:

Code: [Select]
lastButtonState = buttonState;

vergessen gehabt (die war zumindest im letzten Projekt mit drinne und da lief es problemlos), meinste denn das das schon das ganze problem sein könnte ?

Quote
als erstes zählst du buttonPushCounter++ hoch,
das heißt aber dein switch wird zweimal durchlaufen case 1 und case 2.
Was ist denn beim dritten mal, wenn buttonPushCounter größer als 2 ist.


der teil ist auch noch nicht so ganz fertig da fehlt noch der abschluss der nach ner bestimmten anzahl an tastersignalen wieder auf null zurücksetzt....aber das ist halb so wild das kommt sobald ich seh das sich der rest erstmal so bewegt wie er soll.....

aber hatte auch vergessen das dazu zu schreiben.
Auf jeden Fall aber schonmal vielen Dank für deine Hilfe!!!!

elmar

So, konnte es inzwischen nochmal testen....leider ohne erfolg.Zwar zählt er nun nicht mehr von alleine, dafür reagiert er nun nicht mehr auf den tasterdruck...was mich natürlich auch nicht weiterbringt...


hab den code inzwischen wie folgt geändert gehabt:

Code: [Select]
int enableA = 6;   // Motor A, PWM-Pin - L293D, Pin 9
int enableB = 5;   // Motor B, PWM-Pin - L293D, Pin 1
int enableC = 9;   // Motor A, PWM-Pin - L293D, Pin 9
int enableD = 10;   // Motor B, PWM-Pin - L293D, Pin 1
int out1A = 7; // Motor A, Steuerleitung 1 - L293D, Pin 15
int out2A = 2; // Motor A, Steuerleitung 2 - L293D, Pin 10
int out1B = 3; // Motor B, Steuerleitung 1 - L293D, Pin 7
int out2B = 4; // Motor B, Steuerleitung 2 - L293D, Pin 2
int out1C = 8; // Motor A, Steuerleitung 1 - L293D, Pin 15
int out2C = 11; // Motor A, Steuerleitung 2 - L293D, Pin 10
int out1D = 12; // Motor A, Steuerleitung 1 - L293D, Pin 15
int out2D = 13; // Motor A, Steuerleitung 2 - L293D, Pin 10
int buttonPin = 1;
int buttonState = 0;
int buttonPushCounter = 0;   // counter for the number of button presses
int lastButtonState = 0;  // previous state of the button

void setup() {
   Serial.begin(9600);
  pinMode(enableA, OUTPUT);
  pinMode(enableB, OUTPUT);
    pinMode(enableC, OUTPUT);
  pinMode(enableD, OUTPUT);
  pinMode (out1A, OUTPUT);
  pinMode (out2A, OUTPUT);
  pinMode (out1B, OUTPUT);
  pinMode (out2B, OUTPUT); 
    pinMode (out1C, OUTPUT);
  pinMode (out2C, OUTPUT);
  pinMode (out1D, OUTPUT);
  pinMode (out2D, OUTPUT);
  pinMode(buttonPin,INPUT);                     
    digitalWrite(enableA, HIGH);
    digitalWrite(enableB, HIGH);
    digitalWrite(enableC, HIGH);
    digitalWrite(enableD, HIGH);
}

void loop()
{
buttonState = digitalRead(buttonPin); // read the pushbutton input pin
  if (buttonState != lastButtonState) { // compare buttonState to previous state
lastButtonState = buttonState;
  if (buttonState == 1) {     // if the current state is 1 then the button
                            // went from off to on:
    buttonPushCounter++;
    Serial.println("on");
    Serial.print("  ");
    Serial.println(buttonPushCounter, DEC);

    switch (buttonPushCounter) {

case 1:              
Serial.println("1");    
digitalWrite(out1A, LOW);   
    digitalWrite(out2A, HIGH); 
    digitalWrite(out1B, LOW);   
    digitalWrite(out2B, HIGH); 
    digitalWrite(out1C, LOW); 
    digitalWrite(out2C, HIGH); 
    digitalWrite(out1D, LOW);   
    digitalWrite(out2D, HIGH); 
   
delay (2000);
digitalWrite(out1A, LOW);   
    digitalWrite(out2A, LOW); 
       digitalWrite(out1B, LOW);   
    digitalWrite(out2B, LOW); 
    digitalWrite(out1C, LOW);   
    digitalWrite(out2C, LOW); 
    digitalWrite(out1D, LOW);   
    digitalWrite(out2D, LOW); 
   
   
        break;

case 2:              
Serial.println("2");    
digitalWrite(out1A, HIGH);   
    digitalWrite(out2A, LOW); 
    delay (2000);
digitalWrite(out1A, LOW);   
    digitalWrite(out2A, LOW); 
        break; ...

MaFu

Du verwendest für den Taster Pin 1.
Die Pins 0 und 1 sind die serielle Schnittstelle des ATmega. Diese sollten nicht anderweitig verwendet werden, das führt immer wieder zu Problemen (zumindest wenn gleichzeitig die serielle Schnittstelle verwendet wird).
_______
Manfred

uwefed

Du kannst die analogen Eingänge auch als digitale Ein/Ausgänge verwenden. Sie werden dann Pin 14 (A0)bis Pin 19 (A5).
Grüße Uwe

Go Up