Ich habe einen 4-Pin Lüfter an mein Arduino-Board nach folgendem Plan
angeschlossen: http://i.stack.imgur.com/cmwAy.jpg, der Lüfter erhält
seinen Strom von einer externen Quelle und nicht vom Arduino.
Mein Plan ist es, den Lüfter via Bluetooth fernzusteuern. Die Signale
kommen auch an, der Lüfter reagiert auch auf meine eingaben. Allerdings
scheint es, als würde ich nur zwei Geschwindigkeiten einstellen können,
schnell und langsam.
Ich habe viele verschiedene Sketches zum steuern versucht. Zwischendurch
kam ich auf die Bibliothek "SoftPWM"
(https://code.google.com/p/rogue-code/wiki/SoftPWMLibraryDocumentation),
die hat mir leider auch nicht weiterhelfen können.
Reicht es nicht aus, den gewünschten Wert an den PWM-Pin zu senden?
Mein aktueller Sketch (Ohne BT input, sondern mit Testvalues):
1
intfanPulse=0;
2
unsignedlongpulseDuration;
3
4
voidsetup()
5
{
6
Serial.begin(9600);
7
pinMode(fanPulse,INPUT);
8
digitalWrite(fanPulse,HIGH);
9
}
10
11
voidreadPulse(){
12
pulseDuration=pulseIn(fanPulse,LOW);
13
doublefrequency=1000000/pulseDuration;
14
15
Serial.print("pulse duration:");
16
Serial.println(pulseDuration);
17
18
Serial.print("time for full rev. (microsec.):");
19
Serial.println(pulseDuration*2);
20
Serial.print("freq. (Hz):");
21
Serial.println(frequency/2);
22
Serial.print("RPM:");
23
Serial.println(frequency/2*60);
24
25
}
26
27
voidloop()
28
{
29
analogWrite(12,20);
30
Serial.println(20);
31
delay(4000);
32
readPulse();
33
analogWrite(12,50);
34
Serial.println(50);
35
36
delay(4000);
37
readPulse();
38
analogWrite(12,100);
39
Serial.println(100);
40
41
delay(4000);
42
readPulse();
43
analogWrite(12,200);
44
Serial.println(200);
45
46
delay(5000);
47
readPulse();
48
analogWrite(12,255);
49
Serial.println(255);
50
51
delay(4000);
52
readPulse();
53
}
Resultat: Beschleunigen will der Lüfter erst ab einem Wert von 200, die
Erhöhung auf 255 macht keinen Unterschied)
1
20
2
pulse duration:70511
3
time for full rev. (microsec.):141022
4
freq. (Hz):7.00
5
RPM:420.00
6
50
7
pulse duration:87106
8
time for full rev. (microsec.):174212
9
freq. (Hz):5.50
10
RPM:330.00
11
100
12
pulse duration:89900
13
time for full rev. (microsec.):179800
14
freq. (Hz):5.50
15
RPM:330.00
16
200
17
pulse duration:11879
18
time for full rev. (microsec.):23758
19
freq. (Hz):42.00
20
RPM:2520.00
21
255
22
pulse duration:12229
23
time for full rev. (microsec.):24458
24
freq. (Hz):40.50
25
RPM:2430.00
26
20
27
pulse duration:68764
28
time for full rev. (microsec.):137528
29
freq. (Hz):7.00
30
RPM:420.00
31
50
32
pulse duration:88380
33
time for full rev. (microsec.):176760
34
freq. (Hz):5.50
35
RPM:330.00
Ich bin langsam am Verzweifeln... Das Netz ist voller Tutorials, die
PWM-Steuerung nach diesem Schema versprechen, aber das scheint nicht so
zuverlässig zu funktionieren. Muss ich auch auf dem Arduino mehr
berücksichtigen, als ich glaube? Wo liegt der Fehler und wie kann ich
das Problem beheben?
David
David schrieb:> Ich habe einen 4-Pin Lüfter an mein Arduino-Board nach folgendem Plan> angeschlossen: http://i.stack.imgur.com/cmwAy.jpg,
Auf dem Bild sind aber nur 3 Anschlüsse. Wie hast den 4-Pin Lüfter in
Wirklichkeit angeschlossen?
David schrieb:> pinMode(fanPulse, INPUT);> digitalWrite(fanPulse,HIGH);
Etwas stimmt hier nicht, Eingang oder Ausgang?
Die Pins habe ich natürlich nicht so wie im Plan anschließen können, es
ging mir mehr um die Stromversorgung. Der Eingang für PWM liegt auf Pin
12 und diesem sende ich auch die Signale zu.
Ich habe den Source mal krass umgeschrieben und kann jetzt wirklich
präzise steuern, wenn ich aber das Signal über Bluetooth auslese, kann
ich den Wert nicht einstellen, obwohl er korrekt ist. Ich Übergebe Werte
zwischen 0 und 999.
Experimenteller Code, mit dem ich PWM exakt steuern kann:
1
voidsetup()
2
{
3
pinMode(12,OUTPUT);
4
}
5
6
voidloop()
7
{
8
digitalWrite(12,HIGH);
9
delayMicroseconds(100);// Approximately 10% duty cycle @ 1KHz
10
digitalWrite(12,LOW);
11
delayMicroseconds(1000-100);
12
}
Muss ich hier irgenwie Nebenläufigkeit einsetzen oder wieso sollte das
über BT nicht mehr funktionieren?
Mein Code mit BT Input. Der Lüfter wird langsamer...das wars auch. Keine
Kontrolle:
David Wilms schrieb:> Die Pins habe ich natürlich nicht so wie im Plan anschließen können
aber dann bitte einen Schaltplan zeigen, der deinem Aufbau entspricht!
David Wilms schrieb:> void setpwm(){>> analogWrite(12,HIGH);> delayMicroseconds(i);> digitalWrite(12,LOW);> delayMicroseconds(1000-i);
Ja was jetzt, analogWrite() oder digitalWrite() ??
Für PWM ist analogWrite() vorgesehen.
Die Warterei mit delayMicroseconds läst keine Zeit für anderes zu...
http://arduino.cc/de/Reference/AnalogWrite
Markus schrieb:> David Wilms schrieb:>> Die Pins habe ich natürlich nicht so wie im Plan anschließen können>> aber dann bitte einen Schaltplan zeigen, der deinem Aufbau entspricht!>>> David Wilms schrieb:>> void setpwm(){>>>> analogWrite(12,HIGH);>> delayMicroseconds(i);>> digitalWrite(12,LOW);>> delayMicroseconds(1000-i);>> Ja was jetzt, analogWrite() oder digitalWrite() ??> Für PWM ist analogWrite() vorgesehen.> Die Warterei mit delayMicroseconds läst keine Zeit für anderes zu...> http://arduino.cc/de/Reference/AnalogWrite
Hoppla, da war es schon etwas später ;).
Leider funktioniert die aktualisierte Version auch nicht. Ich habe
1
i
durch einen festen Wert ersetzt, das hat auch keine Auswirkung gehabt.
Der Wert wird jedoch korrekt gesetzt, ich gebe ihn ja über die Konsole
aus. Kann das am Bluetooth-Modul liegen?
Ganz ehrlich.
Ich versteh nicht was du da mit den Micorseconds rummachst.
Ein (1!) Aufruf von analogWrite reicht, und der Pin macht seine PWM. Und
zwar ohne dein weiteres Zutun.
The Arduino's programming language makes PWM easy to use; simply call
2
analogWrite(pin, dutyCycle), where dutyCycle is a value from 0 to 255,
3
and pin is one of the PWM pins (3, 5, 6, 9, 10, or 11).
Man beachte: Pin 12 ist da nicht dabei.
Inweifern das bei bestimmten Arduino Modellen sich unterscheidet, weiß
ich nicht. Aber ich würds fürs erste einfach nicht darauf ankommen
lassen und mit dem System arbeiten anstatt gegen es.
> Kann das am Bluetooth-Modul liegen?
Kannst du selber rauskriegen.
Schmeiss Bluetooth aus deinem Programm raus, steck den Shield ab und
wenn es dann immernoch nicht geht, dann war Bluetooth wohl nicht Schuld.