[Résolu]comment controler la vitesse d'un ventilateur de pc?

bonjour,
je souhaite faire varier la vitesse d'un ventilateur en fonction de la temperature mesurée...
j'ai un capteur de temperature ds18b20, j'arrive a lire la temperature...pas de probleme(j'y reviendrai plus tard)
j'ai acheté un ventilo avec controle PWM inclus (noctua NF-P12 PWM)
je pensais betement pouvoir controler avec la fonction analogwrite..
il y a 4 fils...12v (rouge), masse (noire),PWM (bleu), tachometre (vert) ....j'ai relié a une alimentation externe en 12v, le fil bleu a une sortie pwm de l'arduino et le vert ...a rien...
premiere question, faut il relier ce fil (qui donne la vitesse RPM si j'ai bien compris) a quelque chose?...j'ai lu un sujet ou il me semble qu'il la reliait a une sortie digital (sans aucun composant entre la carte et le fil) url=http://forum.myduino.com/viewtopic.php?f=1&t=20 quelqu'un peut il me confirmer?
j'ai lu pas mal de sujet, avec des ventilos ayant 3 fils mais quasi rien avec ceux a 4 fils.
Avant de compliquer le code, je souhaite juste voir si j'arrive a modifier manuellement la vitesse par la commande analogwrite.
j'ai lu egalement qu'il fallait modifier le timer
je teste actuellement un petit prog trouvé Snootlab - Essai de l'Arduino i2C Power proto shield : Controlleur PWM de ventilateurs asservis à la température avec des capteurs 1Wire DS1820 - Civade.com (que j'ai un peu modifié): il ne s'agit pas d'un ventilo avec 4 fils...je n'ai pas utilisé de VN67AF

/*
 Fanduino: 2 channels DS1820 based temperature fan controller

 Fans are controlled by a PWM output connected on 
   * D3 for Fan 1 (PinA)
   * D11 for fan 2 (PinB)
   
 Onewire lib reads is values on D10
 
 Sample drive circuit for pwm outputs :
                                                +12V
                   N CHANNEL FET                 |
 D11                 (ex:VN67AF)    ------------ |
 or                   __-----------|  -fan +fan  |
 D3            Gate /    \  Drain   ------------
   ---\/\/\/---*---|      |            12V Fan
 on   120ohms  |    \    /
 arduino       \      --
               / 10K   | Source
               \       |
               /       |
               |       |
              GND     GND
 
 DS1820 wiring :
 1: GND
 2: D10 on arduino. A pull up of 4K7 MUST be wired also on pin 10.
 3: VCC (5V)
 TOP VIEW
   ---
 /     \
|       |
 -------
 1  2  3
 v1.0 creation
 V1.1 Add softstart, and stop under Tmin
 */

#include <OneWire.h>
#include <DallasTemperature.h>

int pinA = 11; // pin 3 and 11 are PWM output controled by Timer2
//int pinB = 11; // connect pinA/B to H-Bridge

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 49

// Setup a oneWire instance to communicate with any OneWire devices aa(not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature tempbacsensor(&oneWire);

  // Compute linearization constant
  // Fan1
  float Fan1Min=50;    // PWM is between 40 and 255 for that fan (8 bit pwm)
  float Fan1Max=255;
  float Temp1Min=20.0;  // relinearization will be done between 20 Celcius (pwm=Fan1Min) 
  float Temp1Max=25.0;  // to 48 celcius (pwm=Fan1Max)
/*  // Fan2
  float Fan2Min=50;
  float Fan2Max=255;
  float Temp2Min=25.0;
  float Temp2Max=50.0;
 */ 
  //  
  float K1=(Fan1Max-Fan1Min)/(Temp1Max-Temp1Min);
//  float K2=(Fan2Max-Fan2Min)/(Temp2Max-Temp2Min);
  
  //
  boolean Fan1Active=FALSE;
//  boolean Fan2Active=FALSE;
float tempbac;
void setup(){
 
  // See wxxxxxxxxxxxxxxx
  //__________________________________TIMER2_for_Motor_PWM_________________________________
  // set TIMER2 for PWM 31 kHz
  //
  // clear all prescaler bits in TCCR2B = the last 3 Bits
  // leave other bits as set by arduino init() in wiring.c
  byte mask = B11111000;
  TCCR2B &= mask; // TCCR2B is now xxxxx000
  //
  // set CS22:20 in TCCR2B see p 156 of datasheet
  TCCR2B |= (0<<CS22) | (0<<CS21) | (1<<CS20); // same as TCCR2B |= B00000001; TCCR2B is now xxxxx001

  //__pinmode
  pinMode(pinA,OUTPUT);
 // pinMode(pinB,OUTPUT);

  // start serial port
  Serial.begin(9600);
  Serial.println("Fanduino: DS1820 based temperature fan controller");

  // Start up the library
 // sensors.begin();
  tempbacsensor.begin();
}

void loop()  { 
  // call sensors.requestTemperatures() to issue a global temperature request
  //sensors.requestTemperatures(); // Send the command to get temperatures
  tempbacsensor.requestTemperatures(); 
  // read sensors values
 
 tempbac = tempbacsensor.getTempCByIndex(0);
 // float T1 = sensors.getTempCByIndex(0);
 // float T2 = sensors.getTempCByIndex(1);
  // skip conversion error

if ( tempbac>0 )
//  if ( ( T1>-127.00 ) && ( T2 > -127.0) )
    {
    // print them on serial
    Serial.print("Temp1: ");
    Serial.print(tempbac);  
   // Serial.print(" Temp2: ");
  //  Serial.print(T2);  
    boolean SoftStart=FALSE;
    // Softstart with hysterisis  0.3 degrees 
    if ( (tempbac > Temp1Min+0.3) && !Fan1Active) {
      Fan1Active=TRUE;
      SoftStart=TRUE;
      analogWrite(pinA, 200);
      }
     /*if ( (T2 > Temp2Min+0.3) && !Fan2Active) {
      Fan2Active=TRUE;
      SoftStart=TRUE;
      analogWrite(pinB, 200 );
      } */     
    if (SoftStart)
      delay (750);
    // normalize values between TempXMin and TempXMax
    if (tempbac < Temp1Min) {
      tempbac = Temp1Min;
      if (Fan1Active) {
        Fan1Active=FALSE;
        }
      }
    if (tempbac > Temp1Max) 
      tempbac = Temp1Max;
  
 /*   if (T2 < Temp2Min) {
      T2 = Temp2Min;
      if (Fan2Active) {
        Fan2Active=FALSE;
        }
      }
    if (T2 > Temp2Max) 
      T2 = Temp2Max;
   */
    // compute pwm value
    // when temp will be from TempXMin celcius to TempXMax, pwm will be from FanXMin to FanXMax 
    float Pwm1=0;
  //  float Pwm2=0;
    if (Fan1Active)
      Pwm1=((tempbac-Temp1Min)*K1)+Fan1Min;
  //  if (Fan2Active)
   //   Pwm2=((T2-Temp2Min)*K2)+Fan2Min;
   
    // print pwm values on serial for debugging
  //  Serial.print   (" PWM1: ");
 //   Serial.print   ( Pwm1 );
 //   Serial.print   (" PWM2: ");
  //  Serial.print ( Pwm2 );
 //   if (Fan1Active) Serial.print ( " 1" );
  //  if (Fan2Active) Serial.print ( " 2" );
//    Serial.println ();
    // Assign pwm
    analogWrite(pinA, Pwm1 );
 //   analogWrite(pinB, Pwm2 );
    
    // and sleep 1s until next computation
    delay (1000);
    }
}

Quelqu'un pourrait il m'aider ou m'indiquer un lien (ca me semble fou de ne pas trouver de tuto sur ce sujet) ?
merci

Salut,
Je ne m'y connais pas trop en ventilateurs de pc mais...
pour ta première question, si tu compte utiliser le tachometre (fil vert, c'est ça ?), tu dois le connecter à quelque chose :stuck_out_tongue: :

  • si il est analogique (ce qui m'étonnerai), tu dois le connecter à une entrée analogique :wink: , et pour récupérer la vitesse RPM tu lis la valeur de la broche, et tu l'applique (surement) à un tableau de proportionnalité (du style plus la tension est élevée, plus le nombre de RPM est important...)
  • si il est numérique (plus probable), soit la valeur est envoyée suivant un protocole (sous forme de bits ; par PWM ?...), soit le niveau logique de la broche passe à 1 à chaque tour effectué (par exemple) ; dans ces deux cas, une entrée numérique suffit : il faut juste trouver la manière appropriée pour récupérer la valeur.
    Ensuite, tu laisse entendre que les fonctions analogWrite() ne marchent pas pour piloter le ventilateur : en plus des connections que tu as décrites as-tu pensé à connecter la masse du ventilateur avec celle de l'Arduino (en plus de sa connection avec l'alimentation externe) ?
    Si non, je pense ce c'est là l'origine de ton problème...

Voilà, j'espère que ce post aura pu t'aider... Ah oui, j'ai trouvé ce lien qui contient des spécifications techniques :

merci macman pour ta reponse
effectivement je n'ai pas connecté la masse du ventilo a celle de l'arduino.
d'ailleurs avant de faire une betise,qu'elle est la bonne solution...utiliser juste la borne +12v de l'alim ext sur l'entrée du ventilo sans utiliser la masse de l'alim externe, mais relier la masse de l'arduino avec celle du ventilo?... ou brancher +12v et la masse de l'alim sur le ventilo et mettre un cable entre la masse de l'arduino et la masse du ventilo ?
merci...
autre question, il me semble que l'arduino peut etre alimenter avec un transfo de 7v a 12v.....puis je utiliser le +12v, pour brancher egalement le ventilo?

salut

relies tes masses! c'est la base de tout montage! pas de masse, pas de fonctionnement.

Ton fil vert est une sortie à collecteur ouvert : il te faut activer la pull-up de l'arduino (mets ta pin en entrée, puis un digitalWrite(pin, HIGH) ).

Ce fil vert envoie normalement trois impulsions par tour de ventilo, à toi de calculer...

pour le signal à envoyer pour commander le ventilo, tu trouveras dans la doc. J'imagine qu'un analogWrite devrait faire l'affaire, à confirmer.

bon courage!

pour l'alim, tu peux alimenter ton arduino en collant le +12 de l'alim externe sur la pin "VIN", tant que ça ne dépasse pas 12V...

merci,
ca marche....a priori il s'agit bien d'un probleme de masse..
j'utilise maintenant la meme alim 12v pour commander l'arduino et le ventilo....et j'arrive a controler le ventilo avec la meme pin (et le meme code) que pour le pwm de mes leds, sans jouer sur le timer....
la partie hardware etant concluante il n'y a plus qu'a relier tout ca avec un capteur de temperature...ca devrait aller
merci encore pour votre aide

Quand j'alimente un arduino avec une alim de PC, je mets 2 ou 3 diodes en série entre le +12 et le VIN.
Je sait pas si c'est indispensable, mais ca diminue un peu la tension d'alim de l'arduino, ca évite de trop faire chauffer le régulateur et ca le protège un peu des éventuels pics de tensions sur le +12V

bonjour,
comment tu l'as remarqué je suis debutant en electronique, et bidouilleur amateur, je ne suis donc pas familier avec les termes...mais j'arrive a comprendre...desfois LOL :grin:
quand tu dis que tu mets des diodes, tu parles de resistances?, la somme de ces diodes en serie fait combien, ? le calcul est il aussi simple de mettre des resistances selon la formule de base U=RI, pour avoir une tension désirée.....je me souviens avoir utilisé un LM35 (ou 37 je ne sais plus) et quelques resistances pour faire passer la tension de 12 a 10..serait plutot par la qu il faut voir les choses?
merci

Quand je parle de diodes, bah je parle de diodes.
En l'occurrence je mets des diodes de redressement type 1N4007 (ou equivalent).
Leurs fonctions habituelle est de redresser une tension, ou de bloquer le passage de courant dans un sens, mais ici je les détourne de leur usage habituel.
En effet, quelque soit le courant qui les traverse, la tension a leur bornes est de l'ordre de 0.6/0.7V
Avec 3 en série avant l'alim de mon arduino il ne reste donc plus que 12-(3*0,6)= 10,2V.
Comme ça si mon alim fait un petite surtension de 1 ou 2 volts,mon arduino reste dans sa plage de fonctionnement normal.