Go Down

Topic: HUD per arduino (Read 6245 times) previous topic - next topic

leo72


Poi per convertire il tutto senza if puoi mettere un interrupt sul timer che lo faccia scattare ogni secondo esatto (lezione di Leo con prescaler a 64 e impostare il timer da 8 bit a partire da 6 in fondo "il timer è stupido e non si chiede chi lo ha messo, lui legge 6... Bene allora 7"  XD )

Superlol mi ha fatto morir dal ridere... ti sei ricordato di quella battutaccia fatta domenica  XD  XD XD :smiley-yell:
Cmq non avevo proposto questa idea perché non è proprio facile per chi è alle prime armi gestire un timer.

AleCune93

Allora.. perchè mai mettere un delay nella gestione degli interrupt!? Mi sembra che lo prenda lo stesso..! Alla fine l'ho abbassato a 2 ms.. mi scombina cosi tanto!?
Comunque non c'è nessun digitalWrite nel codice O_O... Al limite un digitalRead, l'ho scritto solo per dirgli di segnarmi un giro solo se durante il change il pin è LOW..
Timer..!? Cos'è sta roba!? Mai vista in arduino.. Dovrò darci un occhiata.. tenete presente che comunque sono alle primissime armi.. molto prime!! Cerco di arrangiarmi come posso  =(

Ultima cosa.. Ho scritto tutto il resto del codice, e l'ho provato su strada.. Funziona per funzionare.. Non è precisissimo, ma per l'idea che ho in mente io va più che bene.. L'unico problema, oltre a dover sistemare il codice dalle irregolarità, è che superati i 60 km/h non capisce più a che velocità sto andando e si impalla..

leo72


Allora.. perchè mai mettere un delay nella gestione degli interrupt!? Mi sembra che lo prenda lo stesso..! Alla fine l'ho abbassato a 2 ms.. mi scombina cosi tanto!?

Per un motivo fondamentale: un interrupt deve essere un codice da eseguirsi nel più breve tempo possibile. Tutto quello che metti in un interrupt di superfluo va a rallentare l'intero sistema. Durante un interrupt nient'altro può essere eseguito quindi tutto il micro è in attesa che esso termini per proseguire. Mettere un delay significa solo che a te non serve un interrupt.

Quote

Comunque non c'è nessun digitalWrite nel codice O_O... Al limite un digitalRead, l'ho scritto solo per dirgli di segnarmi un giro solo se durante il change il pin è LOW..

Sì, scusa. Volevo dire digitalRead. Ma non ti serve. Se l'interrupt lo strutturi per essere sollevato al segnale LOW sul pin di interrupt, non devi andare a controllare se il pin è low veramente.

Quote

Timer..!? Cos'è sta roba!? Mai vista in arduino.. Dovrò darci un occhiata.. tenete presente che comunque sono alle primissime armi.. molto prime!! Cerco di arrangiarmi come posso  =(

Se vai in Generale e cerchi il thread relativo all'incontro di Bassano, trovi negli ultimi post un archivio in cui ho messo una presentazione in cui spiego i timer. Non è molta roba ma è già sufficiente per avere un'infarinatura.

Quote

Ultima cosa.. Ho scritto tutto il resto del codice, e l'ho provato su strada.. Funziona per funzionare.. Non è precisissimo, ma per l'idea che ho in mente io va più che bene.. L'unico problema, oltre a dover sistemare il codice dalle irregolarità, è che superati i 60 km/h non capisce più a che velocità sto andando e si impalla..

Quindi non funziona  ;)
Riparti dall'interrupt sollevato in modalità LOW e poi vediamo di andare avanti col problema. Dicci come si comporta il circuito.

AleCune93

Ho provato a riscrivere velocemente il codice, eliminando il delay e l'if, e cambiando l'interrupt in modo che mi prenda quando da HIGH va a LOW, sperando di aver capito giusto..
Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

int giriRuota;

void setup(){
  lcd.begin(16,2);
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0, giro, FALLING);
}

void loop(){
  giriRuota=0;
 
  delay(1000);
 
  lcd.clear();
  lcd.print(giriRuota);
}

void giro(){
  giriRuota=giriRuota+1;
}

Ho tralasciato tutto il resto del codice perchè non serve adesso.. è tutta una derivazione da questo.. se non va questo, non va neanche il resto..

Comunque, il circuito è un semplice reed switch, collegato al pin 2 e al GND.. Quando la ruota fa un giro, il magnete passa sul sensore e me lo chiude.. Questo deve far capire ad arduino quando la ruota fa un giro..
Il resto del codice (che partirebbe appena dopo il delay(1000)) prevede che calcoli i km/h in base ai giri totali effettuati nel secondo, e in base alla velocità accenda determinati colori di un led..

leo72

Col FALLING dovrebbe innescarsi solo quando il segnale va Low per cui non dovresti avere problemi.

AleCune93

E invece ne ho.. Anche se do un solo tocco a volte ne prende 4/5.. È per quello che avevo messo un delay nell'interrupt..
Comunque, il delay(1000) ci può stare? O viene rallentato dall'interrupt..!? Ho letto che l'interrupt va a interrompere il codice principale, quindi interrompe anche il delay!?

leo72

Un semplice incremento di un contatore è un'operazione che porta via pochissimissimo tempo, è praticamente ininfluente su un delay.

Piuttosto, potresti provare a vedere se risolvi inserendo sulla linea del reed un piccolo antirimbalzo hardware, i contatti del sensore si comportano come un pulsante e probabilmente sparano qualche raffica di segnali. Tra le schede di Pighixxx nell'ABC elettronico (sezione Megatopic) trovi lo schemettino.

AleCune93

Ok perfetto, domani do un occhiata e vedo che riesco fare.. Grazie ;)

AleCune93

Allora.. nel topic dell'abc non ho trovato niente per l'antirimbalzo.. Cercando su google ho trovato che ci sono 2 modi, uno hardware, e uno software.. Quello hardware sinceramente non l'ho capito, perchè parla di NAND e NOR.. Ma non sono le memorie che ha la ps3!?!?  :smiley-eek-blue:
Invece quello software penso di poterlo applicare, ma mi va poi a rallentare il codice?

leo72

Non usare il debounce software.
Nelle schede ABC apri la n° 32. Non c'è altro che che una R, un C ed un diodo.

AleCune93

Oddio.. sono stupido io.. Ho letto tutto cercando la parola "antirimbalzo".. ma non ho mai pensato di cercarla in inglese  =( =(
Scusami :) comunque ti ringrazio, oggi pomeriggio ci lavoro su, e vedo che combino!

AleCune93

#26
Jul 08, 2013, 01:48 pm Last Edit: Jul 08, 2013, 02:15 pm by AleCune93 Reason: 1
Ok.. ho fatto l'antirimbalzo.. solo che ho dovuto usare un condensatore da 470nf perchè avevo solo quello in casa.. comunque funziona..
Il problema resta sempre che quando supero una determinata velocità va tutto in pappa.. Ora non so se è perchè ci sono dei calcoli sbagliati, o una procedura non corretta e quindi mi sfasa, o se è l'arduino che non riesce a leggere il sensore oltre un tot.. Devo provare a montare il display e leggere in tempo reale i giri..

EDIT: confermato.. quando supero i 20 giri/sec non legge più niente e va a 0.. Penso sia il reed sitch che non ce la fa a starmi dietro..

leo72


EDIT: confermato.. quando supero i 20 giri/sec non legge più niente e va a 0.. Penso sia il reed sitch che non ce la fa a starmi dietro..

Beh, siamo già ad un buon punto. Abbiamo individuato il problema. Non potresti comprare un contachilometri per bici e "rubargli" il sensorino? E' un reed anche quello ma credo sia abbastanza veloce, io ci ho fatto più di 90 all'ora con quei cosi e mi segnava correttamente la velocità.

AleCune93

Infatti è quello che ho fatto.. era l'unico modo per avere un reed switch, e siccome la bici ormai non la uso più, l'ho staccato da li, e messo sulla moto..

leo72

Ah... boh allora prova con un altro reed, se ce l'hai.

Go Up