Ciao a tutti 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..!? :~
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?
Nessuno dei due.. XD
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
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
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..
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..!
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.
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..
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.
Ok, penso di aver capito l'interrupt..
Ora devo solo capire come strutturarlo dentro al codice.. Qualcosa mi invento
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..
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.
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..
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.
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.
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..!?
MAI mettere un delay in una routine di gestione dell'interrupt. Mai.
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.
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" XD )
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
superlol:
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
Cmq non avevo proposto questa idea perché non è proprio facile per chi è alle prime armi gestire un timer.
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..
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!?
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.
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.
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.
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.
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..
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..