Pages: [1] 2 3 ... 7   Go Down
Author Topic: HUD per arduino  (Read 5506 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 187
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti smiley finalmente ho acquistato un nuovo arduino (dopo aver bruciato quello vecchio)!!

Ma veniamo subito all'argomento del topic..
Ho girato in lungo e in largo con google ma non ho trovato niente che mi interessasse.. Esiste un display HUD (i display trasparenti) per arduino..!? smiley-confuse
Logged

Online Online
Sr. Member
****
Karma: 4
Posts: 352
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per arduino non lo so però da quello che ho visto su internet te li vendono già assemblati con il sistema di controllo quindi l'arduino non servirebbe a molto (ammesso che sia abbastanza potente per gestirne uno). Cosa ci devi fare, i tuoi google glass oppure il casco di master chief?
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 187
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nessuno dei due.. smiley-lol
Semplicemente, ogni volta che in moto voglio guardare la velocità rischio di ammazzarmi.. Quindi volevo fare una combo arduino+gps+hud per avere la velocità nella visiera, o qualcosa di simile smiley
Logged

piacenza
Offline Offline
God Member
*****
Karma: 0
Posts: 684
prima della pazzia c'è la passione
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao
tempo fa avevo affrontato il problema
http://www.google.com/search?q=hud+display&oq=hud+display&sourceid=chrome&ie=UTF-8
http://www.youtube.com/watch?feature=player_embedded&v=tpBwRX68fIY
pensando di ispirarmi ai caschi dei piloti militari ma non ho trovato una soluzione decente, anche a me piacerebbe avere delle informazioni senza distogliere lo sguardo dalla strada, le case automobilistiche fanno qualcosa che proietta le informazioni sul parabrezza ma erano troppo ingombranti

stefano
« Last Edit: July 05, 2013, 05:53:14 am by stefa24 » Logged


Offline Offline
Full Member
***
Karma: 1
Posts: 187
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok.. ho rigirato un pò  l'idea..
Semplicemente ho cercato di adattarla un pò.. Per la velocità ho pensato di usare un "reed switch" da mettere alla ruota.. ovviamente non ce l'ho, ma l'ho preso da un tachimetro che avevo sulla bici, il concetto è sempre quello, quando passa il magnete (giro di ruota) chiude il ponte e arduino lo rileva..
Ora mi sono letto un pò, e  ho trovato come calcolare la velocità grazie a questa logica..
Quote
ad ogni impulso del sensore, sai che la ruota ha percorso un giro completo, quindi hai un valore espresso in "ruota al secondo" se misuri ogni secondo il numero di impulsi hai la velocità corrente in ruote al secondo, poi per passare alla velocità in Kmh devi sostituire la circonferenza della ruota nella formula, quindi se per esempio la circonferenza fosse 1m avresti una velocità di 1m/s e quindi per passare a kmh lo moltiplichi per 3,6.
Fin qua ho capito bene o male che calcoli fare.. Quello che mi sfugge è: come faccio io a dirgli ad arduino "bon, è passato 1 secondo, smetti di contare e calcolami la velocità, poi torna a contare i giri per un altro secondo"..!? Se uso il delay mi si blocca l'esecuzione..!
« Last Edit: July 05, 2013, 04:58:53 pm by AleCune93 » Logged

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

Devi usare un interrupt agganciato al pin a cui collegherai il tuo sensore e con la relativa routine conti il numero di segnali ricevuti. Ad intervalli regolari vai a leggere il valore precedente e ti calcoli con la formuletta che hai detto la velocità istantanea.
Logged


Offline Offline
Full Member
***
Karma: 1
Posts: 187
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mmm.. Non l'ho capita smiley-lol

Comunque in qualche modo ho rattoppato su, usando la funzione millis.. Per funzionare sembra funzionare (sto testando il tutto chiudendo a caso il circuito, domani provo in moto)..
Posto il pezzo di codice, prova a dirmi se sta in piedi..

Code:
[..]
millisFine=millis()+1000;
  do{
    if(digitalRead(8)==LOW){
      giriRuota=giriRuota+1;
      delay(1);
    }
  } while (millis()<millisFine);
[..]
L'unica è adesso sistemare il valore in delay, in modo da evitare che mi legga più giri inutilmente.. (sempre che il codice sia giusto..)
Logged

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

Gli interrupt sono segnali particolari che informano il chip della necessità di "attenzione" verso qualcosa. Quando attivi un interrupt e questo arriva sul pin, il micro blocca il codice dello sketch e va ad eseguire quello che hai agganciato all'interrupt. In questo modo il conteggio dei giri diventa indipendente dal resto del programma.

http://arduino.cc/en/Reference/AttachInterrupt

Nel codice principale a te quindi non resta che leggere (e resettare) ogni tot il valore dei giri per avere la velocità.

PS:
nel tuo codice perché hai messo quel delay(1).
Logged


Offline Offline
Full Member
***
Karma: 1
Posts: 187
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, penso di aver capito l'interrupt..
Ora devo solo capire come strutturarlo dentro al codice.. Qualcosa mi invento smiley-grin

Comunque, ho messo il delay(1) per rallentare un attimo il ciclo.. Senno mi legge un centinanio di giri al secondo quando invece magari invece il magnete è passato solo una volta.. ma non funziona lo stesso, leggo sempre sballato..
Logged

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

Perché nel mentre che lo avvicini lui legge una raffica di segnali.
Prova ragionando così.
Qual'è la massima velocità permessa dalla moto? A quanti giri della ruota corrisponde? Ecco, quella è ad occhio la massima frequenza. Trovata questa, trovi il minimo intervallo fra 2 attivazioni. Se ti arrivano 2 impulsi distanziati di un tempo minore a questo intervallo, ignori il segnale perché significa che il magnete è fermo sul sensore.
Logged


Offline Offline
Full Member
***
Karma: 1
Posts: 187
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

È per quello che ho messo il delay..

Comunque ho visto che con l'interrupt posso eseguire 1 sola aggiunta ogni volta che il pin cambia stato, quindi quando da HIGH passa a LOW, anche se è davanti, ricevera sempre e solo 1 aggiunta.. Dopo torna ad HIGH e non mi segna niente..

Quello che non riesco a fare è dirgli ad arduino che deve aspettare per 1 secondo tutte le misure dal pin, e finito quel secondo mi calcola la velocità e me la manda a display..
Ho provato con un do while, gira fino a che una variabile non arriva a 1000 con un delay di 1.. Ma non penso sia a logica corretta..
Logged

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

È per quello che ho messo il delay..

Comunque ho visto che con l'interrupt posso eseguire 1 sola aggiunta ogni volta che il pin cambia stato, quindi quando da HIGH passa a LOW, anche se è davanti, ricevera sempre e solo 1 aggiunta.. Dopo torna ad HIGH e non mi segna niente..
Sì, esatto. In questo modo già filtri i multipassaggi. Il mio post precedente era riferito al tuo codice senza interrupt.

Quote
Quello che non riesco a fare è dirgli ad arduino che deve aspettare per 1 secondo tutte le misure dal pin, e finito quel secondo mi calcola la velocità e me la manda a display..
Ho provato con un do while, gira fino a che una variabile non arriva a 1000 con un delay di 1.. Ma non penso sia a logica corretta..
Nel tuo loop devi mettere un semplice if che controlla se sono passati 1000 ms, in caso affermativo entrare nel blocco dell'if, leggere i giri, azzerarli, e poi trasformarli in velocità.
Ricordati che potresti avere un tempo leggermente superiore a 1000 ms, ossia ad esempio 1100 ms, perché magari nel loop principale il codice ha tardato nell'esecuzione di qualcosa. Quindi la conversione V= s/t va fatta non con 1 secondo ma con il valore realmente trascorso.
Logged


Offline Offline
Full Member
***
Karma: 1
Posts: 187
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ora l'interrupt prende i valori a caso O_O
Io l'ho scritto cosi
Code:
void funzione(){
  if(digitalRead(2)==LOW){
    giriRuota=giriRuota+1;
  }
}
Prima se lo facevo passare a LOW mi segnava solo 1 giro, e solo se passava a LOW.. Ora quando passa a LOW mi prende una decina di giri a caso, e addirittura a volte prende anche se passa ad HIGH O_O... spiegatemela sta cosa, perchè prima andava e ora no!?!?
________________________________________________________________________________________________
EDIT: ho messo un delay(10) all'inizio della funzione.. Ora in teoria SEMBRA andare bene, senza sbalzi strani..
Posto tutto il codice, l'ho riscritto da zero.. intanto tengo solo registrati i giri, vedo prima di tutto che questo sia giusto.. Per determinare il secondo ho usato un delay(1000), cosi prima cancella i dati vecchi, aspetta 1 sec, in quel lasso di tempo prende i nuovi, poi li elabora e me li manda a display, e ricomincia.. Penso che come logica vada, no..!?

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, CHANGE);
}

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

void giro(){
  delay(10);
  if(digitalRead(2)==LOW){
    giriRuota=giriRuota+1;
  }
  else{
    //DoNothing;
  }
}
« Last Edit: July 06, 2013, 05:19:10 am by AleCune93 » Logged

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

1) MAI mettere un delay in una routine di gestione dell'interrupt. Mai.
2) perché metti un digitalWrite, scusa? L'interrupt si attiva con la modalità che gli hai detto tu. Nell'ultimo caso usi CHANGE per cui ad ogni cambio di stato si attiva, sia quindi quando passa da HIGH a LOW sia quando passa da LOW ad HIGH. Ma il sensore come chiude, a massa? Sennò va bene mettere la pull-up attiva e l'interrupt attivo in modalità LOW.
Logged


Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 8
Posts: 2246
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Potrebbe anche essere che il sensore quando chiude il circuito ha degli sbalzi (almeno così ho capito per i pulsanti) se non erro la soluzione era mettere un condensatore ma qui Leo ne saprà di più
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 )

P.s. l'hud negli aerei caccia è fatto con uno scherno ad alta luminosità relativamente piccolo che poi passa per una lente e uno specchio che Angola a 120° circa quindi il vetro è inclinato di qualche grado, la lente è studiata per non avere l'effetto parallelepipedo. Infine gli schermi per evitare il ghosting sono in genere da oltre 1,2 cm
Per vedere come generare il segnale video cerca i componenti per un osd da modellismo fpv
« Last Edit: July 06, 2013, 05:49:57 pm by superlol » Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

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