Continuiamo con le puntate....
Il codice scaricato dal repositori così come viene fornito non funziona per lo meno per la parte RPM, infatti: restituisce alla radio la rotazione in Hertz e necessita di un minimo di configurazione per l'utilizzo con OpenTX (2940)
devo dire che le modifiche da me apportate sono veramente minime, più che altro mi hanno consentito di capirne il funzionamento per sviluppi futuri, ad esempio per quanto riguarda il livello del carburante per utilizzare altri tipi di sensori quali flussimetri o anche con il sensore attuale tener conto della posizione del veivolo utilizzando un accelerometro.
Il codice da me modificato è contenuto nello zip allegato e la configurazione del sensore avviene mediante il file oxs_config.h
Prima di commentare il codice invece, posto uno sketch di arduino utilizzato su un altro arduino per simulare la centralina dei giri:
Poiché è presente un fotoaccoppiatore, invertente che nella configurazione utilizzata inverte il segnale, ho pensato di generare un impulso negativo molto stretto, nella considerazione che non mi è dato sapere la lunghezza dell'impulso prodotto dalle varie centraline.
Codice:
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
*/
//generatore di frequenza fissa
boolean Led = 0;
void setup(){
pinMode(13, OUTPUT);
pinMode(8, OUTPUT);
cli(); //disabilito gli interrupts
TCCR1A = 0;// setto l'intero registro TCCR1A a 0
TCCR1B = 0;// idem per TCCR1B
TCNT1 = 0;// inizializzo il valore del contatore a 0
// setto il comparatore per una frequenza di 20Hz
OCR1A = 3124;// = (16*10^6) / (20*256) - 1
// abilito il modo CTC
TCCR1B |= (1 << WGM12);
/*
Tabella del prescaler
CS12 CS11 CS10 Prescaler
0 0 0 0
0 0 1 1
0 1 0 8
0 1 1 64
1 0 0 256
1 0 1 1024
*/
// Setto CS12 per il prescaler a 256
TCCR1B |= (1 << CS12) ;
// abilito l'interrupt
TIMSK1 |= (1 << OCIE1A);
sei();//consento gli interrupt
}
ISR(TIMER1_COMPA_vect){
if (Led){
digitalWrite(13,HIGH);
Led = 0;
} else {
digitalWrite(13,LOW);
Led = 1;
}
digitalWrite(8,LOW);
for (int i=1; i<1000;i++) {} //perdo del tempo
digitalWrite(8,HIGH);
}
void loop(){
//non usato
} Il codice non è nulla di particolare, ma utilizza un interrupt sul timer uno per generare l'impulso in modo da garantire una frequenza il più precisa possibile. (20Hz)
Il led collegato in genere sul pin 13 invece lampeggia a frequenza di 10 Hz.