Salve a tutti, ho uno strano problema con il mio contagiri. Ho utilizzato una fotocellula ed un LCD di quelli "classici" per arduino (JHD162A). Il tutto funziona perfettamente; l'ho testato su un motorino elettrico e mi segna perfettamente i giri, l'ho testato su un banco prova con un motore elettrico da 3400rpm con un contagiri integrato montato assieme al mio e i risultati erano perfettamente uguali senza problema. Ma quando è il momento di montarlo sul banco di prova di una moto da cross questo impazzisce nonostante quante volte provi o semplifichi il codice. Quando avvio la moto l'lcd segna una o due rilevazioni giuste(se va bene) e poi manda caratteri cino/giapponesi e simboli varii. Allorchè ho pensato che fosse il numero di giri troppo elevato, ma i giri della moto sul banco di prova sono 1/5 di quelli del motore, percui al massimo 3000 giri circa. Ho pensato che fosse colpa dell'interrupt che interrompe la scrittura sull'lcd a giri troppo elevati, ma togliendolo non cambia nulla. Allora ho pensato siano le vibrazioni del banco di prova che fanno "impazzire" la fotocellula, ma provando a posizionarla con un braccio esterno mi da comunque lo stesso problema. Riprovato sul banco di prova elettrico e poi nuovamente sul banco di prova della moto per vedere se andava, ma nada, sul primo va e sul secondo non ne vuole sapere.
La fotocellula rileva i passaggi di una lametta di metallo che è inserita sull'albero del banco di prova, ho provato anche ad attaccarci del nastro isolante per prolungarlo pensando che fosse un qualche tipo di interferenza.. nada anche quello. Ho pensato che possono essere le vibrazioni sul circuito che fanno saltare le connessioni, allora l'ho appoggiato su un banchetto li vicino dove c'è il pc, dubito che le vibrazioni siano così intense da attraversare un pavimento(o forse si?).
Vi incollo qui i due programmi che uso:
Con Interrupt:
#define PMS_PIN 2
#define LED_PIN 13
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 1);
boolean counted=false;
int t1=0, t2=0;
unsigned long tt1 = 0, tt2 = 0, mil = 0, med = 0, media = 0;
float tot = 0;
volatile int i1 = 0, i2 = 0, j=0, turn = 0, vet1[100], vet2[100]; // vet[200](100) Massimo di 24.000(22.000) rpm, 200*2*60 (0,5sec)
void setup(){
pinMode(PMS_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
lcd.begin(16, 2);
lcd.print("RPM: ");
// Serial.begin(115200);
attachInterrupt(0, rpm_read, FALLING);
}
void loop(){
t2 = millis();
if(t2 >= (t1 + 750)){
t1=t2;
if(turn == 0) {
turn = 1;
// Serial.print("Indice1: ");
// Serial.println(i1);
for(j=0;j<i1;j++)
med = med + vet1[j];
med = med/i1;
i1 = 0;
} else {
turn = 0;
// Serial.print("Indice2: ");
// Serial.println(i2);
for(j=0;j<i2;j++)
med = med + vet2[j];
med = med/i2;
i2 = 0;
}
tot = (float)1000*60/med;
// lcd.clear();
lcd.setCursor(5, 0);
lcd.print(tot, 4);
// Serial.print("Turno: ");
// Serial.println(turn);
// Serial.print("RPM: ");
// Serial.println(tot, 4);
// Serial.println();
// Serial.flush();
med = 0;
}
digitalWrite(LED_PIN, digitalRead(PMS_PIN));
}
void rpm_read() {
tt2 = millis();
mil = tt2 - tt1;
tt1 = tt2;
if(turn == 0){
vet1[i1] = mil;
i1++;
} else {
vet2[i2] = mil;
i2++;
}
}
Questo codice usa due vettori, nella parte dove vedete print dell'indice mi serviva solo per controllarne il corretto funzionamento.
#define PMS_PIN 2 // Pin for signal from Photomicrosensor
#define LED_PIN 13 //Using Arduino's Internal LED; just as an indicator
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 1);
boolean counted=false;
int t1=0,t2=0;
int hits=0;
int rps=0;
void setup(){
pinMode(PMS_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
// Serial.begin(115200);
lcd.begin(16, 2);
lcd.print("RPM: ");
}
void loop(){
t2 = millis();
if(t2 >= (t1 + 1000)){
rps = hits;
hits = 0;
t1=t2;
rps=rps*60;
lcd.clear();
lcd.setCursor(5, 0);
lcd.print(rps);
// Serial.print("RPM: ");
// Serial.println(rps*60);
// Serial.flush();
}
if(digitalRead(PMS_PIN) == LOW){
if(!counted){
counted = true;
hits++;
}
} else {
counted = false;
}
digitalWrite(LED_PIN, digitalRead(PMS_PIN));
}
Questo è l'altro, semplificato quasi al minimo, senza interrupt. Funziona normalmente ma appena avvio il motore questo non senga più i giri ma dei caratteri a caso sullo schermo.
Ho scoperto che lcd assieme alla porta seriale non va, se ci sono entrambi gli output lo schermo segna caratteri cinesi e il seriale quelli giusti, percui non potrei nemmeno fare un confronto per vedere quando impazzisce lo schermo.
Dato che sto impazzendo, sapete da cosa può essere dovuto? Esiste un'altra libreria lcd per arduino che funzioni meglio(sempre se è dovuto a quello)?