Hallo
Ich habe mir ein paar Taster gekauft, und habe in weiter ferne geplant,
mir daraus ein Codeschloss zu basteln - mit Arduino.
Nun begann ich mit den Grundlagen und es klappte auch ziemlich gut. Ich
habe 4 Taster mit einem Pullup Widerstand 22kOhm & 470kOhm gemischt da
ich keine 4 22kOhm habe^^
Nun gut, jetzt habe ich vom Steckbrett 4 Adern von den Tastern zum
Arduino gezogen und diesen mit folgender Source bespielt.
1
2
3
4
intledPin13=13;// PIN 13 = LED
5
intledPin12=12;
6
7
intinputPin1=7;// Taster auf Pin 7
8
intinputPin2=6;
9
intinputPin3=5;
10
intinputPin4=4;
11
12
intledvar1=0;// Variable für Pin (HIGH oder LOW)
13
intledvar2=0;
14
intledvar3=0;
15
intledvar4=0;
16
17
voidsetup(){
18
19
pinMode(ledPin13,OUTPUT);// LED-Pin als OUTPUT deklarieren
20
21
pinMode(inputPin1,INPUT);// Verschiedene Taster als INPUT deklarieren
digitalWrite(ledPin13,HIGH);// andernfalls LED an.
36
}
37
38
ledvar2=digitalRead(inputPin2);// Input auslesen
39
if(ledvar2==HIGH){// Wenn Input= HIGH
40
digitalWrite(ledPin12,LOW);// dann LED aus
41
}
42
else{
43
digitalWrite(ledPin12,HIGH);// andernfalls LED an.
44
}
45
46
47
ledvar3=digitalRead(inputPin3);// Input auslesen
48
if(ledvar3==HIGH){// Wenn Input= HIGH
49
digitalWrite(ledPin13,LOW);// dann LED aus
50
}
51
else{
52
digitalWrite(ledPin13,HIGH);// andernfalls LED an.
53
}
54
55
ledvar4=digitalRead(inputPin4);// Input auslesen
56
if(ledvar4==HIGH){// Wenn Input= HIGH
57
digitalWrite(ledPin13,LOW);// dann LED aus
58
}
59
else{
60
digitalWrite(ledPin13,HIGH);// andernfalls LED an.
61
62
63
64
}
65
}
Das Ergebnis soll sein, das jeder Schalter eine verschiedene LED
schaltet. Jedoch funktionierte vorher nur die erste LED also ledPin13
und nach einer vergessenen Änderung an der Source funktioniert diese
auch nicht mehr. LED´s sind garantiert richtig angesteckt. Ich weiß
natürlich, das dies ohne Arduino möglich ist und auch ein vielfaches
leichter...jedoch geht es um den Lerneffekt für das spätere Codeschloss.
Woran kann es liegen? :/
Ich bin jetzt kein Arduino Spezilist, aber das finde ich schon sehr
merkwürdig:
1
int ledPin13 = 13; // PIN 13 = LED
2
int ledPin12 = 12;
3
4
int inputPin1 = 7; // Taster auf Pin 7
5
int inputPin2 = 6;
6
int inputPin3 = 5;
7
int inputPin4 = 4;
Denn die I/O Pins des Mikrocontrollers sind zu je 8 Stück gebündelt in
einem Port. Irgendwo musst Du den Port und dann das Bit innerhalb des
Ports adressieren.
Weiterhin sind die Pull-Up Widerstände nicht unbedingt nötig, denn der
Mikrocontroller enthält schon welche, die Du per Befehl einschalten
kannst.
Die Ausgänge sind auch zu aktievieren, und zwar alle, nicht nur für eine
LED:
1
pinMode(ledPin13, OUTPUT);
2
pinMode(ledPin12, OUTPUT);
Aber auch da stimmt die Adressierung des Ports vermutlich nicht.
> Irgendwo musst Du den Port und dann das Bit innerhalb> des Ports adressieren.
Ich nehme das zurück. Diese Grundlagen verbirgt die Arduino Library
wohl.
da der Code gleich mehrere Fehler beinhaltet, tasten wir uns mal langsam
an die Probleme heran ;-)
wo wird der pinMode für Pin 12 gesetzt?
dann ist der Code mit den Taster-Auswertungen mehr als wirr. Du hast
zum Beispiel 3 IF-Then-Else, in denen Du jedesmal den gleichen Ausgang
setzt. Nun ist es aber so, dass immer einer der beiden Zweige der
If-Abfrage ausgeführt wird. Das heißt, bei jedem Durchlauf der
Main-Schleife, wird der Zustand des Ausgangs 3 mal gesetzt ... mal so
... mal so. Da dürftest Du wenn überhaupt, dann nur ein mehr oder
weniger permanentes glimmen der LED sehen, das durch das häufige
Umschalten ausgelöst wird.
Was willst Du denn eigentlich erreichen? Aus dem Code wird das nämlich
nicht ersichtlich ;-)
digitalWrite(ledPin13,HIGH);// andernfalls LED an.
9
}
10
11
...
12
ledvar4=digitalRead(inputPin4);// Input auslesen
13
if(ledvar4==HIGH){// Wenn Input= HIGH
14
digitalWrite(ledPin13,LOW);// dann LED aus
15
}
16
else{
17
digitalWrite(ledPin13,HIGH);// andernfalls LED an.
18
}
19
...
20
}
Sowoahl inputPin1 als auch inputPin4 wirken sich auf die ledPin13 aus.
Aber: sie tun das ohne voneinander zu wissen.
Drückst du auf den ersten Taster, dann schaltest du die LED aus. Aber:
ein paar Mykrosekunden später befragt das Programm den anderen Taster.
Der ist aber nicht gedrückt. Und daher wird die LED sofort wieder
eingeschaltet. Wird loop das nächste mal aufgerufen dreht sich dann
sofort alles wieder um, denn der erste Taster ist ja gedrückt und daher
wird die LED ausgeschaltet. Allerdings nicht sehr lange, denn gleich
darauf ergibt die Auswertung des inputPin4, dass die LED wieder
einzuschalten ist. etc. etc. ad infinitum.
In diesem abgespeckten Beispiel müsstest du daher beide Taster drücken,
damit sich für die LED ein stabiler Zustand ergibt und nicht die
Auswertung eines Tasters die Auswertung des anderen Tasters sofort
wieder rückgängig macht.
außerdem fürchte ich, dass sich Dein Code gar nicht fehlerfrei
compilieren läßt, da Du auch die ledvar-Variablen mehrfach deklarierst.
versuch mal (ungetestet):
Danke für eure Antworten! :)
Stefan schrieb:> Weiterhin sind die Pull-Up Widerstände nicht unbedingt nötig, denn der> Mikrocontroller enthält schon welche, die Du per Befehl einschalten> kannst.
Tatsächlich mit pinMode( pin, INPUT_PULLUP ); danke für die Info das
wusste ich nicht..:)
Digi Spark schrieb:> wo wird der pinMode für Pin 12 gesetzt?
Oh mann, den pinMode hab ich ganz vergessen ^^
Digi Spark schrieb:> Was willst Du denn eigentlich erreichen? Aus dem Code wird das nämlich> nicht ersichtlich ;-)
Das Ergebnis soll sein, das jeder Schalter eine verschiedene LED
schaltet. Weiß zwar das das viel einfacher geht aber nachher soll ein
Codeschloss entstehen daher lern ich mal die Grundlagen dachte ich.
eizi schrieb:> Das Ergebnis soll sein, das jeder Schalter eine verschiedene LED> schaltet.
OK. Schön.
Aber wo sind denn deine 'verschiedenen LED' im Code?
Bis jetzt sind das ja nur 2 (eigentlich 1 1/4) LEDs, die da im Spiel
sind. Wenn du 4 Taster hast und jeder Taster eine andere LED bearbeiten
soll, dann brauchst du auch 4 LED. Und zwar sowohl real als auch im
Programm.
Im Moment ist deine LED an Pin 13 der 'Mann in der Mitte', dem die einen
'geh nach rechts' und die anderen 'geh nach links' zurufen. Ja, was denn
nun?
Okey. Ich beginne nochmal ganz von vorne.
Ich habe jetzt die Schaltung nach diesem
(http://www.physical-computing.de/blog/2008/04/digitaler-input-einstieg/)
Tutorial nachgebaut, habe aber auf den Pullupwiderstand verzichtet
sondern dies auf dem Arduino eingestellt.
Mein Problem ist, dass bei meinem Taster wo das Signal HIGH sein sollte,
dieses LOW ist. Was läuft da verkehrt?
Seht selbst
Orginalcode:
1
intledPin=13;// choose the pin for the LED
2
intinputPin=8;// choose the input pin (for a pushbutton)
3
intval=0;// variable for reading the pin status
4
5
voidsetup(){
6
pinMode(ledPin,OUTPUT);// declare LED as output
7
pinMode(inputPin,INPUT);// declare pushbutton as input
8
}
9
10
voidloop(){
11
val=digitalRead(inputPin);// read input value
12
if(val==HIGH){// check if the input is HIGH
13
digitalWrite(ledPin,LOW);// turn LED OFF
14
}
15
else{
16
digitalWrite(ledPin,HIGH);// turn LED ON
17
}
18
}
[¢]
int ledPin = 1; // choose the pin for the LED
int inputPin = 13; // choose the input pin (for a
pushbutton)
int val = 0; // variable for reading the pin status
void setup() {
pinMode(ledPin, OUTPUT); // declare LED as output
pinMode(inputPin, INPUT_PULLUP); // declare pushbutton as input
}
void loop(){
val = digitalRead(inputPin); // read input value
if (val == LOW) { // check if the input is HIGH
digitalWrite(ledPin, LOW); // turn LED OFF
}
else {
digitalWrite(ledPin, HIGH); // turn LED ON
}
[/c]
eizi schrieb:> Mein Problem ist, dass bei meinem Taster wo das Signal HIGH sein sollte,> dieses LOW ist. Was läuft da verkehrt?
Gar nichts.
Das ist völlig normal.
Ist doch nur eine Konvention, ob ein gedrückter Taster ein High oder ein
Low liefert. Nichts, was man nicht im Programm berücksichtigen könnte.
Allerdings geht es auf einem AVR mit Bordmitteln nicht anders, weil der
nur eingebaute Pullup Widerstände hat (und keine Pulldowns). Die ziehen
einen offenen Eingang nun mal auf High (daher ja auch: Pull-Up).