Hallo,
ich habe auf meinen Atmega den Arduino Bootlader drauf gemacht und dann
meinen Sketch aufgespielt. Eigentlich soll nach jedem Drücken des Taster
eine andere Led erleuchten, aber irgendwie leuchtet gar keine. Insgesamt
soll ein Motor entweder mit einem Poti gesteuert werden oder per Zufall.
Hier ist mein bisheriger Code
1
constintanalogInPin=A0;// Analog input pin for potentiometer
2
constintanalogOutPin=9;// Analog output pin for motor driver
Atmega schrieb:> mode_pushed = digitalRead(button_mode);
Bin ich blind?
Oder wo genau legst du für den Pin 'button_mode' fest, dass das ein
Eingang sein soll?
Wenn du Code ein wenig übersichtlicher schreiben würdest, vielleicht
nicht alles auf einmal sondern dich in Schritten dem Ziel näheren
würdest, dann würdest du in Summe auch viel schneller zum Ziel kommen.
Hi,
naja, HIGH wird bei Arduino soweit ich weiss als "1" gespeichert.
Du nimmst analogWrite um deine LED's anzusteuern. Das würde heissen,
dein HIGH wird als
1
analogWrite(led0,1);
übersetzt.
und ein Analogwert von 1 sieht man nicht bei den LED's.
Ersetze das mal durch
1
digitalWrite(led0,HIGH);
dann klappts bestimmt auch mit dem leuchten ;-)
EDIT: Und das was kbuchegg schreibt, ist auch nicht zu verachten !
PS;
davon unabhängig erhebt sich dann auch noch die Frage, wie dein Taster
angeschlossen ist und ob du an diesem Eingangspin einen Pullup (oder
Pulldown) Widerstand brauchst.
Karl H. schrieb:> Wenn du Code ein wenig übersichtlicher schreiben würdest
Das beste, was dafür je erfunden wurde, ist Indentation.
Auf Deutsch: Einrückungen.
Marcel P. schrieb:> und ein Analogwert von 1 sieht man nicht bei den LED's.> Ersetze das mal durch
Hi,
mit digitalWrite klappt das nun bedingt. Die Led leuchtet zwar, aber
immer. Auch wenn ich den Taster gedrückt habe.
Karl H. schrieb:> PS;> davon unabhängig erhebt sich dann auch noch die Frage, wie dein Taster> angeschlossen ist und ob du an diesem Eingangspin einen Pullup (oder> Pulldown) Widerstand brauchst.
Hi,
ich habe am MC PIN den Taster und einen 10k Widerstand. Der Widerstand
ist mit GND verbunden und der andere Pol vom Taster mit +.
Karl H. schrieb:> Oder wo genau legst du für den Pin 'button_mode' fest, dass das ein> Eingang sein soll?
Habe ich vergessen, aber nun geändert. Problem besteht aber immer noch.
Atmega schrieb:> Marcel P. schrieb:>> und ein Analogwert von 1 sieht man nicht bei den LED's.>> Ersetze das mal durch>> Hi,> mit digitalWrite klappt das nun bedingt. Die Led leuchtet zwar, aber> immer. Auch wenn ich den Taster gedrückt habe.
Gut, das ist jetzt nicht weiter verwunderlich.
Ich seh in deinem Programm, wenn ich mir die analogWrite durch
entsprechende digitalWrite ersetzt denke, immer nur Stellen an denen du
die LED einschaltest, aber nichts wo du sie jemals wieder ausschalten
würdest.
Sagte ich eigentlich schon, dass es oft sehr zielführend ist, ein
Programm in Schritten aufzubauen?
> ich habe am MC PIN den Taster und einen 10k Widerstand. Der Widerstand> ist mit GND verbunden und der andere Pol vom Taster mit +.
Gut zu wissen.
Nichts desto trotz wird dein Taster noch prellen.
AUch wenn bei einem nackten AVR die Pins defaultmässig auf Input stehen,
würde ich trotzdem nicht versäumen, das in Setup noch mal entsprechend
zu wiederholen. Also, wo ist die entsprechende Einstellung für
button_mode in setup()?
Karl H. schrieb:> Nichts desto trotz wird dein Taster noch prellen.> AUch wenn bei einem nackten AVR die Pins defaultmässig auf Input stehen,> würde ich trotzdem nicht versäumen, das in Setup noch mal entsprechend> zu wiederholen. Also, wo ist
die entsprechende Einstellung für
> button_mode in setup()?
Habe ich bei mir schon hinzugefügt. Kann allerdings meinen ersten
Beitrag ja nicht mehr editieren. :-)
Karl H. schrieb:> Sagte ich eigentlich schon, dass es oft sehr zielführend ist, ein> Programm in Schritten aufzubauen?
Ja.
Karl H. schrieb:> Ich seh in deinem Programm, wenn ich mir die analogWrite durch> entsprechende digitalWrite ersetzt denke, immer nur Stellen an denen du> die LED einschaltest, aber nichts wo du sie jemals wieder ausschalten> würdest.
Wo schalte ich die dann am besten wieder aus? In den anderen cases?
Ehe wir da jetzt noch ein paar mal hin und her hampeln.
Probier das mal
1
constintbutton_mode=11;// game mode
2
constintled1=8;
3
constintled2=7;
4
constintled3=6;
5
constintled4=5;
6
7
uint8_tgamemode=0;
8
uint8_tmode_old=0;
9
uint8_tmode_pushed=0;
10
11
voidsetup(){
12
pinMode(button_mode,INPUT);
13
14
pinMode(led1,OUTPUT);
15
pinMode(led2,OUTPUT);
16
pinMode(led3,OUTPUT);
17
pinMode(led4,OUTPUT);
18
}
19
20
21
voidloop(){
22
23
mode_pushed=digitalRead(button_mode);
24
if(!mode_old&&mode_pushed)
25
{
26
gamemode++;
27
if(gamemode>4)
28
gamemode=0;
29
}
30
mode_old=mode_pushed;
31
32
if(gamemode&0x01)
33
digitalWrite(led1,HIGH);
34
else
35
digitalWrite(led1,LOW);
36
37
if(gamemode&0x02)
38
digitalWrite(led2,HIGH);
39
else
40
digitalWrite(led2,LOW);
41
42
if(gamemode&0x04)
43
digitalWrite(led3,HIGH);
44
else
45
digitalWrite(led3,LOW);
46
47
delay(10);
48
}
wenn das nicht klappt, dann lass dir mal das Ergebnis vom digitalRead
vom PinMode direkt auf eine LED ausgeben. Mglw. hast du den Taster am
falschen Pin angeschlossen (oder die LED).
Bei jedem Tastedruck sollte sich das LED Muster verändern (es stellt die
Binärzahl dar)
Karl H. schrieb:> Ehe wir da jetzt noch ein paar mal hin und her hampeln.> Probier das mal
Vielen Dank für die Mühe, aber der Code war etwas zu ungewohnt für mich
und deswegen habe ich mich noch mal selber rangesetzt.
1
constintanalogInPin=A0;// Analog input pin for potentiometer
2
constintanalogOutPin=9;// Analog output pin for motor driver
3
constintdirection1=12;// motor output 1
4
constintdirection2=13;// motor output 2
5
constintbutton_mode=11;// game mode
6
constintled1=8;
7
constintled2=7;
8
constintled3=6;
9
constintled4=5;
10
intsensorValue=0;// value read from the pot
11
intgamemode=1,mode_pushed=0;
12
longduration=0,lasttime=0,nowtime=0;
13
intmode_old=0;
14
voidsetup(){
15
pinMode(analogInPin,INPUT);
16
pinMode(button_mode,INPUT);
17
pinMode(analogOutPin,OUTPUT);
18
pinMode(direction1,OUTPUT);
19
pinMode(direction2,OUTPUT);
20
pinMode(led1,OUTPUT);
21
pinMode(led2,OUTPUT);
22
pinMode(led3,OUTPUT);
23
pinMode(led4,OUTPUT);
24
25
26
}
27
28
voidloop(){
29
30
mode_pushed=digitalRead(button_mode);
31
delay(100);
32
if(mode_old==0&&mode_pushed==1)
33
{
34
gamemode+=1;
35
duration=0;
36
if(gamemode>4)gamemode=1;
37
}
38
mode_old=mode_pushed;
39
40
switch(gamemode){
41
case1:// manual speed selection
42
sensorValue=analogRead(analogInPin)/4;
43
digitalWrite(direction1,HIGH);
44
digitalWrite(direction2,LOW);
45
analogWrite(analogOutPin,sensorValue);
46
digitalWrite(led4,LOW);
47
digitalWrite(led1,HIGH);
48
break;
49
50
case2:// random mode easy
51
nowtime=millis();
52
if(nowtime>lasttime+duration){
53
lasttime=nowtime;
54
if(random(5)>0){
55
duration=random(3000,15000);
56
digitalWrite(direction1,HIGH);
57
digitalWrite(direction2,LOW);
58
sensorValue=random(37,65);
59
}
60
else{
61
duration=random(1500,5000);
62
digitalWrite(direction2,HIGH);
63
digitalWrite(direction1,LOW);
64
sensorValue=random(42,65);
65
}
66
analogWrite(analogOutPin,sensorValue);
67
}
68
digitalWrite(led1,LOW);
69
digitalWrite(led2,HIGH);
70
break;
71
72
case3:// random mode medium
73
nowtime=millis();
74
if(nowtime>lasttime+duration){
75
lasttime=nowtime;
76
if(random(5)>0){
77
duration=random(3000,15000);
78
digitalWrite(direction1,HIGH);
79
digitalWrite(direction2,LOW);
80
sensorValue=random(40,100);
81
}
82
else{
83
duration=random(1500,5000);
84
digitalWrite(direction2,HIGH);
85
digitalWrite(direction1,LOW);
86
sensorValue=random(47,100);
87
}
88
}
89
analogWrite(analogOutPin,sensorValue);
90
digitalWrite(led2,LOW);
91
digitalWrite(led3,HIGH);
92
break;
93
94
case4:// random mode hard
95
nowtime=millis();
96
if(nowtime>lasttime+duration){
97
lasttime=nowtime;
98
if(random(5)>0){
99
duration=random(3000,15000);
100
digitalWrite(direction1,HIGH);
101
digitalWrite(direction2,LOW);
102
sensorValue=random(40,200);
103
}
104
else{
105
duration=random(1500,5000);
106
digitalWrite(direction2,HIGH);
107
digitalWrite(direction1,LOW);
108
sensorValue=random(50,150);
109
}
110
}
111
analogWrite(analogOutPin,sensorValue);
112
digitalWrite(led3,LOW);
113
digitalWrite(led4,HIGH);
114
break;
115
default:
116
delay(5);
117
}
118
}
So funktioniert es jetzt. Das delay(100) musste ich einsetzen weil sonst
oft ein Tastendruck doppelt oder zweifach gezählt wurde.
Vielleicht hilft es ja irgendjemandem.^^
Atmega schrieb:> mich noch mal selber rangesetzt
Die Formatierung hättest du aber behalten können.
> Vielleicht hilft es ja irgendjemandem.^^
Lies dir mal was zur Entprellung durch.
Cpp schrieb:>> Vielleicht hilft es ja irgendjemandem.^^
Upps, da hab ich wohl die flasche Zeile(n) Zitiert :-( Die hier sollte
es sein:
> So funktioniert es jetzt. Das delay(100) musste ich einsetzen weil sonst> oft ein Tastendruck doppelt oder zweifach gezählt wurde.