Go Down

Topic: Contagiri e LCD, problema (Read 7671 times) previous topic - next topic

Yaro

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:
Code: [Select]
#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.

Code: [Select]
#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)?

PaoloP

Interferenze elettromagnetiche?

ratto93


Interferenze elettromagnetiche?

ci scommetterei , non sei l'unico che ha questo problema  =(
Se corri veloce come un fulmine, ti schianterai come un tuono.

Yaro


Interferenze elettromagnetiche?

Escluderei le interferenze industriali o ambientali dato che entrambi i banchi di prova si trovano nello stesso locale. L'unica interferenza elettromagnietica potrebbe essere generata dal motore quando è avviato, il che penso sia impossibile dato che è un motore a benzina.

PaoloP


dato che è un motore a benzina.

Fosse un Diesel ti darei ragione. Pensa a tutti gli impulsi che transitano sul cavo delle candela ad ogni giro del motore.

menniti

Sì, purtroppo l'alta tensione della candela, le puntine, il regolatore (se c'è) inducono tutti tremendi disturbi.
Devi provare a filtrare l'alimentazione; come alimenti il circuito? Stai usando un Arduino o un circuito stand-alone?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

ivan64

Che fotocellula usi? Deve essere piccola di diametro e assolutamente schermata, così come il cavo che va ad arduino e pure arduino stesso va schermato! Se avvicini arduino a meno di 2mt da un motore 'da cross', e leggi dai piedini input analogici, ti troverai la frequenza della candela.....con valori incostanti naturalmente!
Se devi leggere i giri del motore ti consiglio un'antenna (basta un cavo normalissimo) e un filtro.... io utilizzo un 555 in configurazione one-shot, e leggo correttamente i giri da un yamaha TTR600 e da un WR450 (con Attiny84).


menniti


Se devi leggere i giri del motore ti consiglio un'antenna (basta un cavo normalissimo) e un filtro.... io utilizzo un 555 in configurazione one-shot, e leggo correttamente i giri da un yamaha TTR600 e da un WR450 (con Attiny84).

Bellissima questa cosa XD, sono info condivisibili o top-secret? mi interesserebbe un sacco per mio fratello, che è un grande appassionato di meccanica e restauri di moto cross anni 70-80 e forse gli tornerebbe utilissimo uno strumento del genere.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

ivan64

E' condivisibile si, anche se non è uno strumento di misura, ma solo di visualizzazione, per cui la precisione non c'è proprio!
Ho 2 moto piu o meno da enduro, entrambe non hanno la batteria nè il contagiri.... ho pensato da costruirmi un piccolo 'computerino' con cui controllo:
-i giri motore, con interfaccia grafico, su una riga del lcd 16x2 'riempio' i singoli caratteri (5x8 punti) simulando appunto un contagiri
-temperatura motore/acqua e temperatura esterna
-contaore
-sul WR ho montato una ventola sul radiatore, ed oltre una certa temperatura la faccio partire
Naturalmente c'è una sezione alimentazione, munita anche di batteria tampone (nimh 160mAh), che provvede anche ad alimentare coi 5v il gps.

Sul TTR600 è montato da 2 mesi, e non per ora pare affidabile, non da problemi di funzionamento.

Per il WR ho solo fatto prove, anche se è tutto costruito e funzionante, ma visto che questo strumento dovrà sopportare bene l'acqua (succede di volare durante un guado), devo curare bene la realizzazione, impermeabilizzando in modo efficace!

Ulimamente per fortuna non faccio piu cassa integrazione, ed ho molto meno tempo da dedicare a queste cose....
Intanto allego lo schema, e appena riesco metto qualche foto dei singoli componenti.


menniti

Gran bel lavoro, complimenti! :)
La soluzione del 555 è molto interessante, può tornare utile, anche se nel caso del mio fratellone c'è bisogno di visualizzazione numerica.
Grazie!
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

ivan64

Ecco qualche foto

Alimentazione





moduletto tra antenna per rilevare gli rpm e il 555



pcb con attiny84, driver per lcd, e 555



il trimmer l'ho messo lato piste, sennò sarebbe stato impossibile regolarlo con tutto montato...pure il connettore ICSP è sotto



assiemato con il LCD



..inscatolato e acceso....





l'interruttore che si vede a fianco del LCD, è un pulsante a 2 posizioni, su, giu, e rilasciato torna in mezzo (non so se mi sono spiegato).
Realizzazione grezza, ma funziona!!!
Serve anche lo sketch?? è incasinatissimo....

ivan64


Gran bel lavoro, complimenti! :)
La soluzione del 555 è molto interessante, può tornare utile, anche se nel caso del mio fratellone c'è bisogno di visualizzazione numerica.
Grazie!


Nello sketch non ho usato pulseIn per rilevare gli rpm (avrei dovuto dedicare tutto l'AVR a questo), ma è fattibilissimo e preciso....in funzione del motore si possono variare i valori del primo condensatore e della prima resistenza appena dopo l'antenna (c10 e r19), ma credo che così vada gia bene per quasi tutti i motori... io ho avvolto per un paio di giri un cavetto attorno alla bobina della moto... provato pure sul cavo candela, ma oltre i 5-6000rpm, avevo letture molto sballate!

menniti

Bravissimo! Mi piacciono molto queste soluzioni così originali e soprattutto quando ci si prende la briga di lavorare un mobiletto, so cosa significa :smiley-sweat: :smiley-sweat: :smiley-sweat:
ma il lavoro finale non ha prezzo, sono soddisfazioni immense XD
Non ti chiedo lo sketch, come detto a mio fratello serve qualcosa di preciso; ha comprato già un scatolotto con un LCD passivo che prometteva bene, ma lui mi sembra molto insoddisfatto.
Mi aveva già coinvolto in un lavoro con una termocoppia per misurare le temperature dei gas di scarico sul collettore, un cavolo di lavoraccio per riuscire a fissare la sonda in un buco fatto proprio all'altezza dell'uscita dal cilindro; poiché gli bastava una scala a linee di 100°C ho usato una barled da 10 (7V, 2G, 1R), ma al momento di iniziare a fare prove concrete, per la taratura si è fatto prendere dalle sue migliaia di cose, ecco perché non mi metto più a progettare cose che gli servono, ma se trovo un lavoro fatto e funzionante il discorso è diverso. Nel mio caso dovevamo ancora verificare le temperture effettive, bsognava lavorarci su un paio di giorni, quando gliel'ho detto mi ha chiesto se fossi diventato matto :smiley-sad-blue:
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

garinus

il mobile sembra in ferro, collegato a massa? nel mio caso quando superavo un tot di giri le interferenze in casinavano tutto, risolto con mobile in ferro.  il sistema dell'antenna è comodo, ma secondo me è più bello prelevando la frequenza dell'alternata nessun filo che gira a raccogliere interferenze e sapendo i poli dell'alternatore basta dividere la frequenza è si è apposto

avevo pubblicato uno schemino del mio circuito che lo preleva con un 4n35 in un topic un pò di tempo fa
se può servire vado a cercarlo.

menniti


il mobile sembra in ferro, collegato a massa? nel mio caso quando superavo un tot di giri le interferenze in casinavano tutto, risolto con mobile in ferro.  il sistema dell'antenna è comodo, ma secondo me è più bello prelevando la frequenza dell'alternata nessun filo che gira a raccogliere interferenze e sapendo i poli dell'alternatore basta dividere la frequenza è si è apposto

avevo pubblicato uno schemino del mio circuito che lo preleva con un 4n35 in un topic un pò di tempo fa
se può servire vado a cercarlo.

certamente, sempre che la cosa non ti faccia perdere troppo tempo, l'idea devo averla a portata di mano, prima o poi la questione si riaprirà :)
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

Go Up