Mx5Italia
Allarmi vari temperature e pressioni - Versione stampabile

+- Mx5Italia (https://www.mx5italia.com/forum)
+-- Forum: Tecnica (https://www.mx5italia.com/forum/forum-5.html)
+--- Forum: Elettronica (https://www.mx5italia.com/forum/forum-25.html)
+--- Discussione: Allarmi vari temperature e pressioni (/thread-20853.html)

Pagine: 1 2 3 4 5 6 7 8 9 10 11 12 13 14


Allarmi vari temperature e pressioni - .SharK - 18-01-2013

Quello del connettore è il vero segnale rpm. Non so cosa sia "sin+" sinceramente. Leggendo anchr "cos+mi da l'idea di essere una sinusoide

Inviato dal mio GT-I9100 con Tapatalk 2


Allarmi vari temperature e pressioni - DNA54 - 19-01-2013

scusa se mi intrometto nella discussione senza aver letto proprio tutto
io sto usando l'arduino sulla mia zx6r, e sia il segnale giri che quello velocità li leggo con pulseIn(), settato su HIGH o LOW non cambia nulla, semplicemente su HIGH ti "dice" il duty cycle dell'acceso (e diminuisce con l'aumentare dei giri), mentre su LOW quello della parte spenta dell'onda (e aumenta con l'aumentare dei giri).
Puoi provare così, anche perché l'impulso rpm dovrebbe essere una onda quadra, non una sinusoide.
Attento a mettere un resistore da 12k se no il pin si "ciuccia" troppa corrente e rischi che lo strumento non legga più come prima


Allarmi vari temperature e pressioni - fracrist - 19-01-2013

DNA, se il segnale rpm mx-5 fosse a duty cycle variabile avrebbe senso, ma qui il duty cycle è fisso (38%) e varia la frequenza. Perciò non posso fare altro che "contare" i micros() che passano da un RISING/FALLING al successivo.


Allarmi vari temperature e pressioni - fracrist - 19-01-2013

e non ti preoccupare che non ti "intrometti", mi stai aiutando! WinkThumbup


Allarmi vari temperature e pressioni - fracrist - 19-01-2013

.SharK Ha scritto:Quello del connettore è il vero segnale rpm. Non so cosa sia "sin+" sinceramente. Leggendo anchr "cos+mi da l'idea di essere una sinusoide

Inviato dal mio GT-I9100 con Tapatalk 2

Ok. In effetti dietro ai due strumenti (km/h e rpm) ci sono 4 viti (sin+ , sin- , cos+ , cos-) e mi veniva più comodo prendere il segnale da lì che dal connettore.
Ma credo che rimarrò con la soluzione del connettore.


Allarmi vari temperature e pressioni - DNA54 - 19-01-2013

fracrist Ha scritto:DNA, se il segnale rpm mx-5 fosse a duty cycle variabile avrebbe senso, ma qui il duty cycle è fisso (38%) e varia la frequenza. Perciò non posso fare altro che "contare" i micros() che passano da un RISING/FALLING al successivo.

mmmh.. ho letto qualche giorno fa di una funzione standard che aspetta l'HIGH, fa partire un timer e lo ferma all'HIGH successivo. Restituiva il periodo (e tanto basta), il problema è che non trovo più quella funzione.. ma di sicuro è nel sito ufficiale
Altrimenti puoi prendere una libreria già sviluppata da altri con funzioni belle che pronte per calcolare una frequenza variabile con duty fisso (50%)

http://arduino.cc/forum/index.php?action=printpage;topic=80239.0

qui ci sono tutte le funzioni che include la libreria


Allarmi vari temperature e pressioni - fracrist - 20-01-2013

Grazie per i link. Smile
Rimango però restio ad utilizzare librerie esterne per fare cose semplici che posso implementare io (ammesso che non sbagli a scrivere il codice), ma ci guardo e vedo che ne posso tirare fuori.


Allarmi vari temperature e pressioni - DNA54 - 21-01-2013

trovato! e dire che l'avevo anche usato..

http://arduino.cc/en/Reference/pulseIn

a bassi giri avrai un valore abbastanza alto che decresce all'aumentare dei giri, basta usare il tipo di variabile int per avere una buona definizione


Allarmi vari temperature e pressioni - fracrist - 21-01-2013

...


Allarmi vari temperature e pressioni - fracrist - 21-01-2013

Grazie di nuovo :chessygrin:.

Ho dato un'occhiata a come usarla, ma credo che non faccia al caso mio perché non riesco a inserirla "a interrupt".
Mi spiego meglio: la rilevazione dei giri deve essere asincrona rispetto al resto del programma, perchè il task principale è quello di "accendere luci" e non posso bloccare in attesa di input.

Ecco qualche estratto (setup, loop e funzione interrupt).

[CODE]void setup() {
//Setup Seriale : per leggere via USB cosa succede
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

//Imposto ingressi e uscite
pinMode(H2O_IN, INPUT);
pinMode(OIL_IN, INPUT);
pinMode(RPM_IN, INPUT);
pinMode(FAULT, OUTPUT);
pinMode(OIL_G, OUTPUT);
pinMode(OIL_R, OUTPUT);
pinMode(RPM_Y, OUTPUT);
pinMode(RPM_R, OUTPUT);
pinMode(H2O_G, OUTPUT);
pinMode(H2O_R, OUTPUT);


//Mi assicuro che non ci sia pullup sugli ingressi analogici
digitalWrite(H2O_IN,LOW);
digitalWrite(OIL_IN,LOW);

// Attach interrupt
attachInterrupt(1, rpm_count, RISING);
}


void loop() {
resetLed(); // Tutti a LOW


H2O_TEMP = analogRead(H2O_IN); //Leggo sensore temperatura acqua
delay(50); //Per evitare Jitter sul pin di fianco
OIL_PRES = analogRead(OIL_IN); //Leggo sensore pressione olio
updateRPM(); //Aggiorno la media delle ultime 5 letture


//Accendo e spengo i led di output
updatedisplay();


delay(50);
}


void updateRPM() {
noInterrupts(); //precauzionale: così time non cambia valore durante il calcolo di RPM
if(time > 0)
{
//Medio 5 letture per normalizzare la lettura
rpm_array[0] = rpm_array[1];
rpm_array[1] = rpm_array[2];
rpm_array[2] = rpm_array[3];
rpm_array[3] = rpm_array[4];
rpm_array[4] = 60*(1000000/time); //time è il periodo in micros(): qui lo converto in frequenza e in minuti
//Media delle ultime 5 letture
RPM = (rpm_array[0] + rpm_array[1] + rpm_array[2] + rpm_array[3] + rpm_array[4]) / 5;
}
interrupts();
}



//RPM interrupt function
void rpm_count() {
time = (micros() - time_last);
time_last = micros();
}
[/CODE]

Confusedmiley: