Um einen 4-PIN Lüfter mittels eines Arduinos ansteuern zu können braucht ihr folgendes Material:
# | Bezeichnung | ~Preis |
1 | 4-PIN Lüfter, typischerweise von alten CPUs | 10 € |
1 | 10 kOhm Widerstand | 0,2 € |
~ 10 € |
# | Bezeichnung |
1 | Breadboard und Steckverbinder oder Lötkolben und Lochrasterplatine |
1 | 12V Spannungsversorgung (für den Lüfter) |
1 |
5V Spannungsversorgung (für den Arduino). Alternativ auch mittels eines L7805CV. |
Die Pinbelegung des Connectors sieht so aus:
1. Als erstes verbindet ihr den GND der Stromquelle vom Arduino mit dem des 12V Netzteils und dem Lüfter-Stecker (Schwarzer Draht)
2. Ihr legt 12V vom Netzteil an den roten Draht des Lüfters an.
3. Den gelben Draht des Lüfters schließt ihr an einem Interrupt PIN (in diesem Fall PIN2) des Arduinos an.
4. Mit dem 10 kOhm Widerstand verbindet ihr den gelben Draht mit 5V.
5. Schließt den blauen Draht des Lüfters an PIN6 des Arduinos an.
Insgesamt sieht die Schaltung etwa so aus:
Und so auf einem Breadboard:
Der folgende Code ermöglicht die Steuerung der Lüftergeschwindigkeit über eine serielle Verbindung und gibt die aktuelle Drehzahl aus:
/* ------------------------------------------- /* CPU-Lüfter Steuern und messen /* www.frag-duino.de /* ------------------------------------------- /* Befehle: /* 0-10 --> Länge des HIGH-Signals in ms*10 /* Langsam nach schnell: 1,2,3,4,5,6,7,8,9 /* 0 fuer STOP ------------------------------------------- */ // PINs #define PIN_BLAU 6 #define PIN_YELLOW 2 #define INTERRUPT_GELB 0 // Interrupt 0 == Pin 2 #define UPDATE_ZYKLUS 1000 // Jede Sekunde 1 ms Ausgabe der Geschwindigkeit. const int ANZAHL_INTERRUPTS = 1; // Anzahl der Interrupts pro Umdrehung (1 oder 2) // Variablen int counter_rpm = 0; int rpm = 0; unsigned long letzte_ausgabe = 0; char eingabe; int dauer_low = 1; int dauer_high = 9; int baseTime = 10; // Insgesamt 10 ms void setup() { // Initialisieren Serial.begin(9600); pinMode(PIN_BLAU, OUTPUT); pinMode(PIN_YELLOW, INPUT); digitalWrite(PIN_YELLOW, HIGH); attachInterrupt(INTERRUPT_GELB, rpm_fan, FALLING); } void loop(){ if(dauer_low * 10 != 0){ digitalWrite(PIN_BLAU, LOW); delayMicroseconds(dauer_low * 10); } if(dauer_high * 10 != 0){ digitalWrite(PIN_BLAU, HIGH); delayMicroseconds(dauer_high * 10); } if (Serial.available()){ eingabe = Serial.read() - 48; // ASCII 0-9 lesen if(eingabe == 0) eingabe = 10; else eingabe = 10 - eingabe; dauer_low = eingabe; dauer_high = baseTime - eingabe; Serial.print("Dauer des HIGH: "); Serial.println(dauer_high); } if (millis() - letzte_ausgabe >= UPDATE_ZYKLUS){ // Interrupt deaktivieren um das rechnen nicht zu unterbrechen. detachInterrupt(0); // RPM errechnen und ausgeben: rpm = counter_rpm * (60 / ANZAHL_INTERRUPTS); Serial.print("RPM: "); Serial.println(rpm); // Counter zuruecksetzen counter_rpm = 0; // Zeitpunkt setzen letzte_ausgabe = millis(); // Interrupt wieder aktivieren attachInterrupt(0, rpm_fan, FALLING); } } // Interrupt zaehlt den RPM-Counter hoch void rpm_fan(){ counter_rpm++; }
Hier gibt es ihn auch als ino-Datei.
Über die serielle Verbindung könnt ihr dem Lüfter nun die Geschwindigkeit von 1-9 angeben. 0 bedeutet aus. Wichtig ist, dass ihr kein Zeilenende mitschickt:
Kommentare
Code funktioniert super, habe keine 5V+ und auch kein Wiederstand benötigt. Einfach direkt verbunden (in meinem Fall Lüfter "Gelb" auf Pin 6 und Lüfter Blau auf Pin 2). Ground natürlich auch...