Show Posts
Pages: [1] 2
1  International / Generale / Interfacciare arduino mega con speedfan on: December 21, 2012, 11:52:31 pm
Ciao a tutti, non sono un esperto, spero non mi linciate per le eventuali fesserie che scrivo smiley-grin
Visto che le schede madri in genere permettono di gestire poche ventole e reputo speedfan un ottimo programma che fa al caso mio vorrei sapere se è possibile collegare in qualche modo l'arduino al pc e farlo trovare a speedfan.

All'avvio speedfan fa una scansione tipo questa:
I/O properly initialized
Linked ISA BUS at $0290
Linked ATI SB8x0 SMBUS at $0B00
Linked ISA BUS at $0CCB
SB7xx/8xx PM2 found on ISA at $CCB
Scanning ISA BUS at $0290...
SuperIO Chip=IT8721F
IT8721F found on ISA at $290
Scanning AtiIgp SMBus at $0B00...
Scanning ISA BUS at $0CCB...
ATK0110 (MB=M4A89GTD-PRO-USB3) found on ACPI
End of detection
Loaded 0 events


La documentazione di speedfan dice che il programma riesce ad accedere a molti bus http://www.almico.com/forumbuses.php
Quindi mi chiedevo se sfruttando i pin i2c o qualche altro sistema si possa interfacciare arduino al pc facendolo vedere come un controller che comunica con bus isa o smbus o altro.
2  International / Generale / Re: Come dividere il programma in più file on: June 18, 2011, 11:18:11 pm
http://zuccala.blogspot.com/2010/02/arduino-e-programmare-stati-finiti.html
3  International / Generale / Re: Controllare temperature e ventole pc on: June 17, 2011, 09:20:05 am
aggiungo una nuova richiesta di aiuto:
sono giorni che leggo info ed esempi sull'encoder rotativo ma non riesco ad implementarlo
in alcuni esempi sono riuscito ad incrementare e decrementare il valore ma solo se i pin da usare sono quelli pwm... è possibile usare quelli digitali tipo 40-41-42?
4  International / Generale / Re: Aiuto per quadro elettrico on: June 17, 2011, 03:18:47 am
Pilotare i relè solo con un transistor in mezzo, secondo me, non è che sia molto sicuro, semplicemente è indispensabile visto che arduino di suo non c'è la può fare. Per separare la parte relè ed arduino devi usare un foto accoppiatore
uscita arduino -> entrata foto accoppiatore - uscita foto accoppiatore -> base del transistor oppure mosfet -> bobina del relè

per quanto riguarda l'alimentazione potresti recuperare un alimentatore per hd esterni, per le mie prove su breadboard usi proprio uno di quelli... ha due uscite, una da 12 ed una da 5 volt stabilizzati
magari puoi usare dei relè bistabili in modo da non tenerli sempre eccitati quando ti serve alimentare il carico
5  International / Generale / Re: Controllare temperature e ventole pc on: June 16, 2011, 08:45:41 pm
sto modificando lo sketch usando la funzione millis() come spiegato in questa guida: http://zuccala.blogspot.com/2010/01/multitasking-arduino-millis-parte-1.html e sembra funzionare tutto correttamente

Code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(32, 30, 28, 26, 24, 22);

#define LM35_TEMP0 0 // Pin analogico 0
int TEMP0; // valore di tensione letto dal pin OUT del sensore
int letturaTEMP0;

int FANsensor0 = 48;   // fan tachometer connected to digital pin 48
int letturaFANsensor0;
unsigned long FANsignal0; // time duration between tachometer pulses
float RPM0; // fan speed in RPM

int FANsensor1 = 49;   // fan tachometer connected to digital pin 48
int letturaFANsensor1;
unsigned long FANsignal1; // time duration between tachometer pulses
float RPM1; // fan speed in RPM

unsigned long int time;
int sampletime=1; // Number of sample to average-out sampling values

void setup() {
  time=millis();
  lcd.begin(20, 2);
  digitalWrite(FANsensor0, HIGH);  // turn on pull-up resistor
  digitalWrite(FANsensor1, HIGH);  // turn on pull-up resistor
}

void loop() {
  time=millis();
 
  lcd.setCursor(0,0);
  if(time>letturaFANsensor0+1){
  lcd.print("RPM:");
  FANsignal0=0;
  for (int i = 0; i < sampletime; i++) { // Average out pulseIn time reading in microseconds
  FANsignal0 = FANsignal0+pulseIn(FANsensor0, HIGH);
  }
  RPM0=(600000000/float(FANsignal0))/40; // in RPM
  lcd.print(int(RPM0)); // displays RPM value
  }
 
  lcd.setCursor(10,0);
  if(time>letturaFANsensor1+1){
  lcd.print("RPM:");
  FANsignal1=0;
  for (int i = 0; i < sampletime; i++) { // Average out pulseIn time reading in microseconds
  FANsignal1 = FANsignal1+pulseIn(FANsensor1, HIGH);
  }
  RPM1=(600000000/float(FANsignal1))/40; // in RPM
  lcd.print(int(RPM1)); // displays RPM value
  }
 
  lcd.setCursor(0,1);
 
  if(time>letturaTEMP0+1){
  lcd.print("TEMP:");
  float TEMP0;
  TEMP0 = (float)(5.0*analogRead(LM35_TEMP0)*100.0)/1024.0;
  lcd.print(TEMP0,1);
  }
  delay(1000);
}
in questo sketch uso solo due ventole ed un sensore di temperatura perchè sono a corto di componenti

a tal proposito, visto che devo pilotare 6 ventole e 6 sensori di temperatura uno schermo 20x2 non basta di sicuro e pensavo di usare uno schermo tipo questo:
http://tigal.eu/product/1539
e dividere le schermate in 6 selezionabili con l'encoder rotativo

qualcuno di voi hai provato questi tipi di schermi? sono validi? facili da usare? consigli?
6  International / Generale / Re: Controllare temperature e ventole pc on: June 14, 2011, 10:56:52 am
ho ridotto ulteriormente il sampletime ed aumentato di conseguenza la divisione per compensare

Code:
#include <LiquidCrystal.h>

int FANsensor0 = 48;   // fan tachometer connected to digital pin 48
int FANsensor1 = 49;   // fan tachometer connected to digital pin 49
int FANsensor2 = 50;   // fan tachometer connected to digital pin 50
int FANsensor3 = 51;   // fan tachometer connected to digital pin 51
int FANsensor4 = 52;   // fan tachometer connected to digital pin 52
int FANsensor5 = 53;   // fan tachometer connected to digital pin 53
unsigned long FANsignal0; // time duration between tachometer pulses
unsigned long FANsignal1; // time duration between tachometer pulses
unsigned long FANsignal2; // time duration between tachometer pulses
unsigned long FANsignal3; // time duration between tachometer pulses
unsigned long FANsignal4; // time duration between tachometer pulses
unsigned long FANsignal5; // time duration between tachometer pulses
float RPM0; // fan speed in RPM
float RPM1; // fan speed in RPM
float RPM2; // fan speed in RPM
float RPM3; // fan speed in RPM
float RPM4; // fan speed in RPM
float RPM5; // fan speed in RPM
int sampletime0=1; // Number of sample to average-out sampling values
int sampletime1=1; // Number of sample to average-out sampling values
int sampletime2=1; // Number of sample to average-out sampling values
int sampletime3=1; // Number of sample to average-out sampling values
int sampletime4=1; // Number of sample to average-out sampling values
int sampletime5=1; // Number of sample to average-out sampling values
// initialize the LCD library routine with the numbers of the interface pins
LiquidCrystal lcd(32, 30, 28, 26, 24, 22);

void setup() {
lcd.begin(20, 2); // set up the LCD's number of rows and columns:
digitalWrite(FANsensor0, HIGH);  // turn on pull-up resistor
digitalWrite(FANsensor1, HIGH);  // turn on pull-up resistor
digitalWrite(FANsensor2, HIGH);  // turn on pull-up resistor
digitalWrite(FANsensor3, HIGH);  // turn on pull-up resistor
digitalWrite(FANsensor4, HIGH);  // turn on pull-up resistor
digitalWrite(FANsensor5, HIGH);  // turn on pull-up resistor
}

void loop() {

FANsignal0=0;
FANsignal1=0;
FANsignal2=0;
FANsignal3=0;
FANsignal4=0;
FANsignal5=0;

for (int i = 0; i < sampletime0; i++) { // Average out pulseIn time reading in microseconds
FANsignal0 = FANsignal0+pulseIn(FANsensor0, HIGH);
}

for (int i = 0; i < sampletime1; i++) { // Average out pulseIn time reading in microseconds
FANsignal1 = FANsignal1+pulseIn(FANsensor1, HIGH);
}

for (int i = 0; i < sampletime2; i++) { // Average out pulseIn time reading in microseconds
FANsignal2 = FANsignal2+pulseIn(FANsensor2, HIGH);
}

for (int i = 0; i < sampletime3; i++) { // Average out pulseIn time reading in microseconds
FANsignal3 = FANsignal3+pulseIn(FANsensor3, HIGH);
}

for (int i = 0; i < sampletime4; i++) { // Average out pulseIn time reading in microseconds
FANsignal4 = FANsignal4+pulseIn(FANsensor4, HIGH);
}

for (int i = 0; i < sampletime5; i++) { // Average out pulseIn time reading in microseconds
FANsignal5 = FANsignal5+pulseIn(FANsensor5, HIGH);
}

lcd.clear();
lcd.setCursor(0, 0); // Set for first line
lcd.print("RPM");
RPM0=(600000000/float(FANsignal0))/40; // in RPM
lcd.print(int(RPM0)); // displays RPM value
lcd.setCursor(7, 0); // Set for first line
lcd.print("RPM");
RPM1=(600000000/float(FANsignal1))/40; // in RPM
lcd.print(int(RPM1)); // displays RPM value
lcd.setCursor(14, 0); // Set for first line
lcd.print("RPM");
RPM2=(600000000/float(FANsignal2))/40; // in RPM
lcd.print(int(RPM2)); // displays RPM value
lcd.setCursor(0, 1); // Set for first line
lcd.print("RPM");
RPM3=(600000000/float(FANsignal3))/40; // in RPM
lcd.print(int(RPM3)); // displays RPM value
lcd.setCursor(7, 1); // Set for first line
lcd.print("RPM");
RPM4=(600000000/float(FANsignal4))/40; // in RPM
lcd.print(int(RPM4)); // displays RPM value
lcd.setCursor(14, 1); // Set for first line
lcd.print("RPM");
RPM5=(600000000/float(FANsignal5))/40; // in RPM
lcd.print(int(RPM5)); // displays RPM value
}

con questo codice tra un refresh e l'altro impiega circa un secondo, spero che aggiungendo piano piano il resto delle funzioni che voglio avere non rallenti troppo

se ovviamente avete consigli su come migliorare la situazione non mi dispiace affatto smiley-razz
7  International / Generale / Re: Controllare temperature e ventole pc on: June 14, 2011, 10:37:47 am
ho provato a triplicare il sistema ed ora ci mette circa 2.5 secondi... ogni volto che aggiungo una ventola il tutto rallenta un sacco
non c'è un modo per parallelizzare le rilevazioni senza complicare enormemente il codice?

Code:
#include <LiquidCrystal.h>

int FANsensor0 = 50;   // fan tachometer connected to digital pin 50
int FANsensor1 = 51;   // fan tachometer connected to digital pin 52
int FANsensor2 = 52;   // fan tachometer connected to digital pin 52
unsigned long FANsignal0; // time duration between tachometer pulses
unsigned long FANsignal1; // time duration between tachometer pulses
unsigned long FANsignal2; // time duration between tachometer pulses
float RPM0; // fan speed in RPM
float RPM1; // fan speed in RPM
float RPM2; // fan speed in RPM
int sampletime0=10; // Number of sample to average-out sampling values
int sampletime1=10; // Number of sample to average-out sampling values
int sampletime2=10; // Number of sample to average-out sampling values

// initialize the LCD library routine with the numbers of the interface pins
LiquidCrystal lcd(32, 30, 28, 26, 24, 22);

void setup() {
lcd.begin(20, 2); // set up the LCD's number of rows and columns:
digitalWrite(FANsensor0, HIGH);  // turn on pull-up resistor
digitalWrite(FANsensor1, HIGH);  // turn on pull-up resistor
digitalWrite(FANsensor2, HIGH);  // turn on pull-up resistor
}

void loop() {

FANsignal0=0;
FANsignal1=0;
FANsignal2=0;

for (int i = 0; i < sampletime0; i++) { // Average out pulseIn time reading in microseconds
FANsignal0 = FANsignal0+pulseIn(FANsensor0, HIGH);
}

for (int i = 0; i < sampletime1; i++) { // Average out pulseIn time reading in microseconds
FANsignal1 = FANsignal1+pulseIn(FANsensor1, HIGH);
}

for (int i = 0; i < sampletime1; i++) { // Average out pulseIn time reading in microseconds
FANsignal2 = FANsignal2+pulseIn(FANsensor2, HIGH);
}
       
RPM0=(600000000/float(FANsignal0))/4; // in RPM
lcd.setCursor(0, 0); // Set for first line
lcd.print(int(RPM0)); // displays RPM value
lcd.print(" RPM");
RPM1=(600000000/float(FANsignal1))/4; // in RPM
lcd.setCursor(0, 1); // Set for first line
lcd.print(int(RPM1)); // displays RPM value
lcd.print(" RPM");
RPM2=(600000000/float(FANsignal2))/4; // in RPM
lcd.setCursor(10, 0); // Set for first line
lcd.print(int(RPM2)); // displays RPM value
lcd.print(" RPM");
}
8  International / Generale / Re: Controllare temperature e ventole pc on: June 14, 2011, 09:43:57 am
ho provato a mettere
int sampletime0=10;
e compensare con una ulteriore divisione per 4
RPM0=(600000000/float(FANsignal0))/4; // in RPM
ed il valore mostrato dalla ventolina sembra lo stesso ma la velocità è molto aumentata, senza toccare altro è arrivata a circa mezzo secondo
9  International / Generale / Re: Controllare temperature e ventole pc on: June 14, 2011, 09:35:41 am
Intanto mi accorgo che per attivare la pull-up dovresti prima dichiarare un pin come INPUT e poi scriverci HIGH.
non lo fa la riga: digitalWrite(FANsensor0, HIGH);  // turn on pull-up resistor ?
Detto questo, fai 40 letture per ogni ventola: non so quanto impiega un PulseIn a leggere la ventolina (ci vorrede l'oscilloscopio di Astrobeed  smiley-wink ). Fatte le letture, spedisci all'LCD, che avrà i suoi tempi di risposta. Infine metti un delay(1000) che rallenta per 1 secondo l'esecuzione del codice.

Credo che ci potremmo essere ai 4 secondi da te rilevati.

il delay di 1000 l'ho tolto ed adesso il refresh è passato a 3.5 secondi
10  International / Generale / Re: Controllare temperature e ventole pc on: June 14, 2011, 09:04:31 am
Code:
#include <LiquidCrystal.h>

int FANsensor0 = 50;   // fan tachometer connected to digital pin 50
int FANsensor1 = 52;   // fan tachometer connected to digital pin 52
unsigned long FANsignal0; // time duration between tachometer pulses
unsigned long FANsignal1; // time duration between tachometer pulses
float RPM0; // fan speed in RPM
float RPM1; // fan speed in RPM
int sampletime=40; // Number of sample to average-out sampling values

// initialize the LCD library routine with the numbers of the interface pins
LiquidCrystal lcd(32, 30, 28, 26, 24, 22);

void setup() {
lcd.begin(20, 2); // set up the LCD's number of rows and columns:
digitalWrite(FANsensor0, HIGH);  // turn on pull-up resistor
digitalWrite(FANsensor1, HIGH);  // turn on pull-up resistor
}

void loop() {

FANsignal0=0;
FANsignal1=0;

for (int i = 0; i < sampletime; i++) { // Average out pulseIn time reading in microseconds
FANsignal0 = FANsignal0+pulseIn(FANsensor0, HIGH);
}

for (int i = 0; i < sampletime; i++) { // Average out pulseIn time reading in microseconds
FANsignal1 = FANsignal1+pulseIn(FANsensor1, HIGH);
}
       
RPM0=600000000/float(FANsignal0); // in RPM
lcd.setCursor(0, 0); // Set for first line
lcd.print(int(RPM0)); // displays RPM value
lcd.print(" RPM");
RPM1=600000000/float(FANsignal1); // in RPM
lcd.setCursor(0, 1); // Set for first line
lcd.print(int(RPM1)); // displays RPM value
lcd.print(" RPM");
delay(1000);
}

tra un refresh sull'lcd e l'altra passano 4.5 secondi circa
11  International / Generale / Re: Controllare temperature e ventole pc on: June 13, 2011, 05:43:04 pm
di seguito incollo spezzoni di codice da cui ho preso spunto, questi spezzoni si occupano di leggere il segnale tachimetrico della ventola:

Code:
int tachPin = 8;   // fan tachometer connected to digital pin 8
int sensorValue;  // variable to store the value coming from the sensor
unsigned long duration; // time duration between tachometer pulses
float rpm; // fan speed in RPM

void loop() {
duration=0;

for (int i = 0; i < sampletime; i++) { // Average out pulseIn time reading in microseconds
duration = duration+pulseIn(tachPin, HIGH);   
}
       
rpm=600000000/float(duration); // in RPM
speed=rpm/max_rpm*100; // convert to percentage
       
lcd.print(int(rpm)); // displays RPM value
}

se non ho male interpretato quello che ha scritto questo codice fa la stessa cosa di quello che mi avete proposto voi
il problema (per lo meno per quello che ho provato lavorando sul codice di Arduino Malaysia Forum) è che quando raddoppio il codice per gestire 2 ventole anzichè una soltanto rallenta tutto, la lettura al posto di farla 1 volta al secondo la fa ogni 4/5 secondi

poi aggiungo che durante le letture di vari topic mi sono imbattuto in un prouser che diceva di usare gli interrupt dato che la gestione degli lcd ed altri calcoli introduce delle latenze che falsano le letture (ed era pure piuttosto esasperato non sapendo quante volte avrebbe dovuto ancora ripeterlo smiley-razz)

purtroppo io per quanto riguarda l'hw non ho problemi (sono un sistemista junior) ma quando si tratta di lavorare sui linguaggi di programmazione non ci capisco proprio nulla... per esempio non capisco come funziona quel for e tutte le cose che ci sono dopo, insomma, mi mancano completamente le basi
12  International / Generale / Re: Controllare temperature e ventole pc on: June 12, 2011, 10:58:54 pm
dopo ore di smanettamenti e letture sono riuscito a leggere il segnale tachimetrico con questo codice:

Code:
#include <LiquidCrystal.h>

int FANsensor0 = 50;   // fan tachometer connected to digital pin 50
int FANsensor1 = 52;   // fan tachometer connected to digital pin 52
unsigned long FANsignal0; // time duration between tachometer pulses
unsigned long FANsignal1; // time duration between tachometer pulses
float RPM0; // fan speed in RPM
float RPM1; // fan speed in RPM

// initialize the LCD library routine with the numbers of the interface pins
LiquidCrystal lcd(32, 30, 28, 26, 24, 22);

void setup() {
lcd.begin(20, 2); // set up the LCD's number of rows and columns:
digitalWrite(FANsensor0, HIGH);  // turn on pull-up resistor
digitalWrite(FANsensor1, HIGH);  // turn on pull-up resistor
}

void loop() {

FANsignal0 = pulseIn(FANsensor0, HIGH);
FANsignal1 = pulseIn(FANsensor1, HIGH); 

       
RPM0=(float(FANsignal0)); // in RPM
lcd.setCursor(0, 0); // Set for first line
lcd.print(int(RPM0)); // displays RPM value
lcd.print(" RPM");
RPM1=(float(FANsignal1)); // in RPM
lcd.setCursor(0, 1); // Set for first line
lcd.print(int(RPM1)); // displays RPM value
lcd.print(" RPM");
delay(1000);
}

Il mio problema ora è che ovviamente mi scrive sul display dei valori strani del tipo che il valore diminuisce all'aumentare della velocità della ventola
dovrei risolvere "giocando" con questa parte di codice: RPMx=(float(FANsignalx) formula per calcolare il giusto valore);

qualcuno c'è già passato a può comunque aiutarmi a risolvere?
grazie


p.s. mi sono ispirato a questo lavoro: http://forum.myduino.com/viewtopic.php?f=1&t=20
13  International / Generale / Re: Controllare temperature e ventole pc on: June 12, 2011, 03:13:32 am
si, infatti mi è venuto il dubbio quando ho alimentato arduino con i +5 e si accendeva ma non faceva nulla, mi sono ricordato di sta cosa e gli ho dato +12... in fin dei conti ci alimento solo lui ed un display, il regolatore non dovrebbe soffrire troppo

il mio problema ora è il segnale tachimetrico, da quello che ho letto in giro dovrei avere sul filo giallo 2 impulsi da 12v per ogni giro ma non riesco a capire come farlo leggere ad arduino, sopratutto senza far sballare la lettura del sensore di temperatura, ogni volta che collego il filo giallo ad un'entrata analogia la lettura della temperatura varia dai 19 ai 49° mentre normalmente ne segna 24
14  International / Generale / Re: Controllare temperature e ventole pc on: June 12, 2011, 01:03:43 am
Quindi allo spinottino nero dell'arduino porto i +5 dell'alimentatore mentre a tutto quello che devo pilotare porto i +12... l'importante è che la massa sia la stessa, giusto?

EDIT: sto smanettando con il pwm ed il sensore tachimetrico... come faccio a distinguere il pin8 del pwm dal pin A8 dell'analogico?
poi, visto che presumo il segnale tachimetrico sia un'onda quadra è meglio collegarlo ad un pin analogico o ad uno digitale?
15  International / Generale / Re: Controllare temperature e ventole pc on: June 11, 2011, 03:49:23 pm
per quanto riguarda l'alimentazione io intendevo questo:
alimentatore pc 12v -> spinotto nero dell'arduino -> Vin -> positivo delle ventole
oppure
alimentatore pc 12v -> Arduino
alimentatore pc 12v -> positivo delle ventole

le ventole che voglio pilotare sono quelle classiche da pc "serie" tipo noctua, s-flex, cooler master con 3 pin che già regolo tramite pc ed il programma speedfan... non so se la scheda madre usa il pwm o semplicemente abbassa la tensione
ho giusto un IRF520 a disposizione (ho preso un Kit Workshop base con tanto di breadboard), quello che non capisco sono le resistenze che vedo mettere... non basta pin dell'arduino -> entrata optoisolatore - uscita optoisolatore -> base transistor? come faccio a sapere quali resistenze e dove?

per quanto riguarda i relè non vorrei che tenendoli eccitati per tanto tempo si rovinino le bobine, magari basta trovare dei relè bistabili (come per gli impianti di illuminazione domestica che sia per accendere le luci che per spegnerle bisogna premere il tasto)... poi c'è il solito problema di calcolare le resistenze da mettere intorno al transistor per pilotarli
Pages: [1] 2