Um einen 4-PIN Lüfter mittels eines Arduinos ansteuern zu können braucht ihr folgendes Material:

 

Benötigte Bauteile:
# Bezeichnung ~Preis
1 4-PIN Lüfter, typischerweise von alten CPUs 10 €
1 10 kOhm Widerstand 0,2 €
    ~ 10 €

 

Benötigte Werkzeuge:
# 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  

#21 Ion 2017-05-04 21:03
Tolles Tutorial!

@ChrisToffa, der Widerstand sollte keine Rolle spielen. Für das Tachosignal ist nur der Impuls wichtig und nicht die Spannung. Bei einem PWM-Lüfter sollten es zwei Pulse pro Umdrehung sein.
Der Widerstand ist in dem Fall ein Pullup Widerstand, der den Tachoeingang am Arduino wieder auf den Zustand "High" "zieht". Lässt man einen Pullup-Widersta nd weg, kann es sein, dass am Eingang des Arduinos der Zustand "Low" bleibt, obwohl der Pin mit nichts verbunden ist. Jedes Kabel verhält sich nämlich wie eine Antenne oder wie eine Kapazität zu irgendwas. Mit dem Widerstand garantierst du, diese Effekt auszublenden und nur das gewünschte Signal zu messen.
Solche Widerstände findet man auch bei anderen Elementen wie Tastern.

http://playground.arduino.cc/Deutsch/Eingang

Viele Grüße
#22 ChrisToffa 2017-05-05 23:01
Danke für Deine Antwort!
Quasi verballert der Widerstand die eventuelle Restspannung im System bzw Leitung.

Danke