SAMSUNG_092022 Advertisement SAMSUNG_092022 Advertisement SAMSUNG_092022 Advertisement

Ovládanie a meranie otáčok a farebných efektov PC ventilátora Arduinom

0

Ventilátory určené pre počítačové skrine, či chladiče procesorov umožňujú ovládať výkon pomocou PWM signálu, majú snímač otáčok na magnetickom princípe a ventilátory určené pre herné počítače väčšinou majú aj farebné RGB podsvietenie. Všetky tieto funkcie môžete jednoducho ovládať pomocou Arduina, prípadne inej mikrokontrolérovej dosky

Použili sme ventilátor Silentium PC Fluctus 120 PWM ARGB

Ventilátor bez podsvietenia má jeden 4 pinový konektor. Niektoré ventilátory, ktoré nepodporujú reguláciu otáčok pomocou PWM signálu majú len trojpinový konektor

Na ovládanie RGB podsvietenia sa využíva ďalší káblik s trojpinovým konektorom-

Princíp ovládania je vysvetlený vo videu. 

Snímanie otáčok a zobrazovanie na alfanumerickom LCD displeji. Väčšina ventilátorov generuje dva impulzy počas jednej otáčky. Signál je potrebné pripojiť na vstup mikrokontrolérovej dosky cez pull up rezistor pripojený na napájacie napätie. Nakoľko ventilátor sa napája  napätím 12 V, najbezpečnejšie riešenie bude vytvoriť napäťový delič, ktorý zaručí, že úroveň signálu privedený na vstup Arduina neprekročí 5 V.  

#include  <Wire.h>                    
#include <LiquidCrystal_I2C.h>      
 
LiquidCrystal_I2C lcd(0x27,20,4);    
const int nVstupPin = 2;
int nPocitadloPreruseni, rpm;
char znak[4] = "0000";
 
void setup()
{
   delay(1000);
   lcd.init(); lcd.backlight();               
   lcd.setCursor(0,0); lcd.print("NEXTECH");
   lcd.setCursor(0,1); lcd.print("Test PC ventilatora");
   lcd.setCursor(0,3); lcd.print("RPM:");
 }
 
void loop() {
  Meraj();
}
 
void Meraj() {
  nPocitadloPreruseni = 0;
  attachInterrupt(digitalPinToInterrupt(nVstupPin), ObsluhaPrerusenia, RISING);
  delay(1000);
  detachInterrupt(digitalPinToInterrupt(nVstupPin));
  rpm = (nPocitadloPreruseni / 2) * 60;
  sprintf(znak, "%04d", rpm);
  lcd.setCursor(4,3); lcd.print(znak);
}
 
void ObsluhaPrerusenia() {
  nPocitadloPreruseni++;
}

Ovládanie otáčok PWM signálom, PWM signál sa generuje na analógovom výstupe. Technické špecifikácie udávajú frekvenciu PWM signálu 25 kHz a napätie 5V, regulácia však funguje v širokom rozsahu frekvencie. Rozsah 0 – 100 % je mapovaný na analógový výstup, ktorý má rozsah 0 – 255 takto: 0% =0; 20% = 51; 40% = 101; 60% = 153; 80% = 204; 100% = 255

Program zároveň zobrazuje na alfanumerickom displeji šírku PWM impulzu v percentách a otáčky z magnetického senzora

#include <Wire.h>                     
#include <LiquidCrystal_I2C.h>      
 
LiquidCrystal_I2C lcd(0x27,20,4);    
const int nVstupPin = 2;
const int nOvladaniePin =3;
int nPocitadloPreruseni, nRpm, nPwm, start_cas;
char znak[4] = "0000";
char znak1[4] = "0000";
 
void setup()
{
   delay(1000);
   lcd.init(); lcd.backlight();               
   lcd.setCursor(0,0); lcd.print("NEXTECH");
   lcd.setCursor(0,1); lcd.print("Test PC ventilatora");
   lcd.setCursor(0,2); lcd.print("PWM:");
   lcd.setCursor(0,3); lcd.print("RPM:");
   pinMode(nOvladaniePin, OUTPUT);  //PWM výstup
   analogWrite(nOvladaniePin,0);
   attachInterrupt(digitalPinToInterrupt(nVstupPin), ObsluhaPrerusenia, RISING);
 }
 
void loop() {
  for(int pwm = 0; pwm <= 255; pwm +=51)
  {
    analogWrite(nOvladaniePin,pwm);
    delay(5000);
    start_cas = millis();
    nPocitadloPreruseni = 0;
    while((millis() - start_cas) <1000) {}
    nRpm = nRpm = (nPocitadloPreruseni / 2) * 60;
    nPwm = map(pwm, 0,255, 0,100);
    sprintf(znak1, "%04d", nPwm);
    lcd.setCursor(4,2); lcd.print(znak1);
    sprintf(znak, "%04d", nRpm);
    lcd.setCursor(4,3); lcd.print(znak);
  }
}

 

Ovládanie otáčok PWM signálom, PWM signál sa generuje pomocou čítača. Výhodou je, že parameter procedúry setPwmDuty() môžete zadávať priamo v percentách.

const byte OC1A_PIN = 9;
const word PWM_FREQ_HZ = 25000; //25kHz
const word TCNT1_TOP = 16000000/(2*PWM_FREQ_HZ);
 
void setup() {
 
  pinMode(OC1A_PIN, OUTPUT);
 
  // vynulovanie čítača
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;
 
  TCCR1A |= (1 << COM1A1) | (1 << WGM11);
  TCCR1B |= (1 << WGM13) | (1 << CS10);
  ICR1 = TCNT1_TOP;
}
 
void loop() {
 
    setPwmDuty(25); delay(5000);
    setPwmDuty(50); delay(5000);
    setPwmDuty(75); delay(5000);
    setPwmDuty(100); delay(5000);
}
 
void setPwmDuty(byte duty) {
  OCR1A = (word) (duty*TCNT1_TOP)/100;
}

 

 

Ovládanie farebného RGB podsvietenia s využitím knižnice FastLED. Je to upravený príklad, ktorý je súčasťou knižnice

#include <FastLED.h>
 
#define DATA_PIN    3
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
#define NUM_LEDS    17
CRGB leds[NUM_LEDS];
 
#define JAS  100
#define FPS  120 //frames per second
uint8_t nFarba = 0; // init farba pre rotáciu
 
void setup() {
  delay(1000);
  FastLED.addLeds(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(JAS);
}
 
void loop()
{
 // priprav vzor
    fill_rainbow( leds, NUM_LEDS, nFarba, 7);
 //zobraz vzor
    FastLED.show(); 
  // oneskorenie
  FastLED.delay(1000/FPS);
  //periodická aktualizácia vzoru
  EVERY_N_MILLISECONDS( 20 ) { nFarba++; } // rotacia zakladnej farby
}

Zobrazit Galériu

Luboslav Lacko

Všetky autorove články
arduino pc fan ventilátor argb

Mohlo by vás zaujímať

Mohlo by vás zaujímať