Go Down

Topic: Conta giri a led per auto e temperatura (Read 3718 times) previous topic - next topic

luchetto19

Dec 04, 2012, 08:32 pm Last Edit: Dec 09, 2012, 10:47 pm by luchetto19 Reason: 1
Buona sera sono nuovo del forum vorrei creare con arduino un contagiri a led per auto premetto che sono proprio agli inizi e posseggo un arduino uno quindi abbiate pazienza se non capisco a primo colpo :P . allora un con un mio amico una volta abbiamo misurato il segnale e da quanto mi ricordo il segnale era un onda quadra con 12 volt picco picco e più i giri aumentavano e più il periodo diminuiva.ditemi se il ragionamento che voglio fare è giusto allora per prima cosa con un partitore di tensione bisogna abbassare i volt portandoli a 5 volt poi far leggere il segnale ad aurduino fargli calcolare il periodo e poi a con una equazione matematica (che posso rimediare) calcolare i giri motore fare una media e poi con la stringa if dirgli che i vari led si devono accendere dopo il superamento del tot di giri..il tutto trasformato in linguaggio di programmazione e li mi serve una mano  :D ...secondo voi il ragionamento che voglio fare fila ed è possibile farlo con arduino ??Grazie a tutti in anticipo per l aiuto

pelletta

Con un LM2917 e degli LM3914 (ognuno controlla 10 led e si possono mettere in cascata) puoi farne uno senza scomodare l'arduino, partitori, regolatori di tensione, ecc.
Sarebbe più comodo, ma se vuoi usare l'arduino sicuramente è un ottimo esercizio e avrai anche più flessibilità.

luchetto19

appunto io lo vorrei fare con arduino perché l anno prossimo lo dovrei usare anche a scuola per questo volevo esercitarmi

luchetto19

gentilmente mi potreste dire come calcolarmi il periodo in millisecondi .ve ne sarei grato.

PaoloP

#4
Dec 05, 2012, 03:54 pm Last Edit: Dec 05, 2012, 03:57 pm by PaoloP Reason: 1
La funzione millis() di Arduino è un contatore che viene incrementato ogni millisecondo partendo da zero all'accensione o al reset.
Devi registrare in una variabile l'inizio delle evento esempio start = millis() e poi la fine finish = millis().
Il periodo, in millisecondi, lo trovi semplicemente calcolando periodo = finish - start.
Per assegnare il valore alla variabile ti conviene appoggiarti ad un interrupt individuando la salita e la discesa del segnale.
 

pelletta

Ci sarebbe anche la funzione pulsein, magari può tornare utile

PaoloP

si, anche se a me non ha mai funzionato.  :(

luchetto19

ok mi devo studiare un po questi  interrupt che non ho capito bene cosa sia...appena ho tempo vede se riesco almeno a far carpionare il segnale ad arduino e visualizzare sul serial monitor...vediamo cosa uscirà fuori...un altra cosa secondo voi per abbassare il voltaggio del segnale basta un partitore o ci vorrebbe anche un regolatore?? perchè il segnale esce direttamente dalla ecu

PaoloP

Ma se esce dalla ECU non ti conviene utilizzare direttamente il CAN BUS e le librerie OBD?
--> http://sourceforge.net/projects/obdcon/

luchetto19

questa delle librerie obd non lo sapevo quindi sulle auto stradali sarebbe una bella soluzione...il problema si pone sulle auto da rally (possibile istallazione) dato che sono totalmente prive di questo dispositivo

PaoloP

#10
Dec 06, 2012, 02:54 pm Last Edit: Dec 06, 2012, 02:57 pm by PaoloP Reason: 1
Se utilizzano una centralina di serie dovrebbero avere il connettore da qualche parte. Se poi vengano modificate e allegerite di componentistica non necessaria non saprei dire.
Ma dubito che non abbiano predisposto una connessione per la diagnostica.

P.S. Parlo ovviamente delle nuove auto con centraline elettroniche non di una vecchia ritmo abarth.  :smiley-roll-sweat:

luchetto19

per auto da rally io mi riferisco ad auto da corsa prototipi che sono prive di ecu originale... e le ecu che sono montate sono montate hanno una diagnostica completamente diversa dalle auto stradali. a parte  questo questa e un parte dell programma che ho fatto avrei la necessità di calcolarmi la media dei valori assegnati a (duration) avete qualche suggerimento ??

Code: [Select]
const int LED1 = 1; //Led 1 collegato al pin 1
const int LED2 = 2; //Led 2 collegato al pin 2
const int LED3 = 3; //Led 3 collegato al pin 3
const int LED4 = 4; //Led 4 collegato al pin 4
const int LED5 = 5; //Led 5 collegato al pin 5
const int LED6 = 6; //Led 6 collegato al pin 6
const int LED7 = 7; //Led 7 collegato al pin 7
const int LED8 = 8; //Led 8 collegato al pin 8
const int LED9 = 9; //Led 9 collegato al pin 9
const int LED10 = 10; //Led 10 collegato al pin 10

int Impulso = 13;     //indica che il pin di input al quale arriveranno gli impulso è il 13

unsigned long duration; //indica che la durata non può assumere valori negativi, long viene usato xk ha dimensione doppia rispetto a int

void setup()
{
  pinMode(Impulso, INPUT); //configura il pin come input
  pinMode(LED1, OUTPUT); //configura il pin come output
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);
  pinMode(LED7, OUTPUT);
  pinMode(LED8, OUTPUT);
  pinMode(LED9, OUTPUT);
  pinMode(LED10, OUTPUT);


}

void loop()
{
  duration = pulseIn(Impulso, HIGH); //misura il tempo in millisecondi che trascorre tra un impulso e l'altro

PaoloP

#12
Dec 06, 2012, 07:06 pm Last Edit: Dec 06, 2012, 07:08 pm by PaoloP Reason: 1
Devi sommare duration in una variabile.
Ad ogni loop incrementi un contatore. Quando il contatore arriva ad un certo numero dividi la somma per il contatore.
Code: [Select]

sumduration += duration;
count++;
if (count >= 10) media = sumduration/count;


una cosa del genere.
Attento alla divisione intera, ma credo che non ti interessino i decimali degli rpm.  :D

P.S. Sostituisci i const int con i #define. Pare rendano il codice più veloce. <-- si sta ancora investigando sull'argomento.

luchetto19

scusate se vi rompo ancora ma su serial monitor  invece di far stampare sempre un nuovo valore e possibile solo aggiornarlo ??

PaoloP

Sul serial monitor dell'IDE no, non ha il ritorno sulla riga superiore.

Go Up