Pages: 1 [2] 3 4 ... 7   Go Down
Author Topic: HUD per arduino  (Read 4665 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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"  smiley-lol )
Superlol mi ha fatto morir dal ridere... ti sei ricordato di quella battutaccia fatta domenica  smiley-lol  smiley-lol smiley-lol smiley-yell
Cmq non avevo proposto questa idea perché non è proprio facile per chi è alle prime armi gestire un timer.
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 163
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-cry

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..
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-cry
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  smiley-wink
Riparti dall'interrupt sollevato in modalità LOW e poi vediamo di andare avanti col problema. Dicci come si comporta il circuito.
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 163
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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..
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Full Member
***
Karma: 0
Posts: 163
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 163
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok perfetto, domani do un occhiata e vedo che riesco fare.. Grazie smiley-wink
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 163
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Full Member
***
Karma: 0
Posts: 163
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Full Member
***
Karma: 0
Posts: 163
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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..
« Last Edit: July 08, 2013, 07:15:44 am by AleCune93 » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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à.
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 163
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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..
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Pages: 1 [2] 3 4 ... 7   Go Up
Jump to: