Go Down

Topic: Cronografo arduino, (modificato) correzione codice (Read 2064 times) previous topic - next topic

Heisenberg94

Le righe ora vanno bene però la Cur speed come prima fa apparire anche l' 848.0 però in più quando mi dice la velocità rilevata dalla seconda in poi appare 0.0.0
Mentre l' Avg speed è sui 360

PaoloP

Per il problema della sovrapposizione devi scrivere degli spazi vuoti prima di riscrivere il numero, naturalmente dopo scritti gli spazi devi riposizionare il cursore.
Per la media forse è da rivedere la formula.
Se tieni l'Arduino collegato al PC fai un po' di debug stampando i le velocità e il tempo trascorso, nonché il numero di spari, sulla seriale. Attraverso il Serial Monitor potrai vedere se ci sono comportamenti anomali.

Heisenberg94

#17
Oct 20, 2013, 08:03 pm Last Edit: Oct 21, 2013, 09:05 am by leo72 Reason: 1
Seguendo una guida ho provato con questo codice:

Code: [Select]

void setup()
{
 Serial.begin(9600);
}

void loop()
{

 val = analogRead(firstsensPin);
 val2 = analogRead(secondsensPin);
 while (val > 40) val = analogRead(firstsensPin);
 time = micros();
 Serial.println("primo sensore");
 while (val2 > 40) val2 = analogRead(secondsensPin);
 time2 = micros();
 Serial.println("secondo sensore");
 shots++;
 elap = time2 - time;
 mps = (float)(dist*1000)/elap;
 sumspeed += mps;
 avgspeed = (float)sumspeed/shots;
 Serial.print("Cur speed: ");
 Serial.println("corrente");
 Serial.print(mps, 1);
 Serial.print("Avg speed: ");
 Serial.println("media");
 Serial.print(avgspeed, 1);
 Serial.println("secondamedia");
}


edit by mod: per favore includi il codice usando gli appositi tag

Il funzionamento segue questo corso:
Quando copro il primo sensore appare sullo schermo "primo sensore" (senza le virgolette), quando copro il secondo appare
"secondo sensore
Cur speed: corrente
0.0Avg speed: media
0.0secondamedia"
quando poi ricopro il primo nuovamente, al posto di apparire solo "primo sensore" appare
"primo sensore
secondo sensore
Cur speed: corrente
20.2Avg speed: media
10.1secondamedia
primo sensore"

Cioè "primo sensore" all' inizio e alla fine più tutto il resto.
In totale coprendo il primo sensore, poi il secondo, poi il primo di nuovo appare tutto questo:
"primo sensore
secondo sensore
Cur speed: corrente
0.0Avg speed: media
0.0secondamedia
primo sensore
secondo sensore
Cur speed: corrente
20.2Avg speed: media
10.1secondamedia
primo sensore"

PaoloP

Forse ti serve una pull-down sul sensore per abbassare velocemente il segnale.
Però non sono molto ferrato in questo campo.
Devi aspettare che passi di qui qualcun'altro.

Heisenberg94

Ok grazie, nel frattempo che risponde qualcuno provo a fare modifiche al codice con quello che trovo su internet.

ghennet

Ti scrivo dal parchetto sperando di avere letto correttamente...

Io lo farei tramite i due Interrupt ...

Al primo colleghi il primo sensore e rilevi i micros..
Al secondo colleghi il secondo e rilevi i micros, fai la differenza  ottinieni la velocità. Allo stesso tempo riempi un array delle velocità e nel loop fai la media...
Nel secondo interrupt fai un controllo se l intervallo è troppo lungo prima che imballi il conteggio ...

ghennet

Ho riletto con calma...

Mi sfugge il perchè lo colleghi ad un ingresso Analogico, quindi più lento a convertire il dato, tanto a te interessa quanto tempo impiega a transitare dal primo al secondo sensore giusto ??

Io, come ti dicevo, lo collegherei, ai pin degli interrupt e farei fare il lavoro a loro.

Ho letto alcune cose che :
- legge cambiamenti di colore fino a 1cm.... (non ci tiri dentro al crono ??)
e lo hai collegato seguendo questo schema ?? (http://bildr.org/2011/03/various-proximity-sensors-arduino/)

Heisenberg94

Ho collegato come è fatto quì http://bildr.org/2011/03/various-proximity-sensors-arduino/
Se non faccio con gli Analog e nemmeno con gli Interrupt, come posso fare?

ghennet

Non capisco xche non vuoi usarli ??

Ti serve sapere la distanza ?? ( secondo me no)

Heisenberg94

No, la distanza tra i sensori la imposto io nel codice e la distanza tra il "proiettile" e il sensore non mi serve.
Come si inserisce il codice come fate voi?

PaoloP

Basta leggere il regolamento del forum.
Punto 7 --> http://forum.arduino.cc//index.php?topic=149082.0

ghennet


No, la distanza tra i sensori la imposto io nel codice e la distanza tra il "proiettile" e il sensore non mi serve.
Come si inserisce il codice come fate voi?



Allora xche non usare un pon digitale e quindi avere la possibilità di usare i due interrupt ??

Perche complicarsi la vita quando te la puoi cavare in maniere banale  ??

Heisenberg94

#27
Oct 22, 2013, 11:15 am Last Edit: Oct 22, 2013, 10:01 pm by Heisenberg94 Reason: 1
Come faresti il codice con gli interrupt?
Ho tolto time = micros e ho inserito startTime e elapsedTime.
Il problema è che in questo caso (cosa simile a ciò che faceva con il codice precedente) mi da i primi valori di Curspeed e Avgspeed uguali a 0.0, poi continuando mi da valori di velocità anche quando copro il primo sensore (cosa che non dovrebbe fare perchè quando copro il primo sensore inizia solo a contare i microsecondi).
Bisognerebbe resettare (o portare a 0) il tempo (tra la riga "while..." del primo sensore e startTime o alla fine del loop) in modo che quando copro il primo non mi prende anche il tempo trascorso precedentemente.
Un po' come un cronometro se non resetti il tempo non fai altro che fermare e riavviare il conteggio dei millisecondi ripartendo dall' ultimo risultato.

Ecco il codice:

Code: [Select]

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const byte firstsensPin = A4;
const byte secondsensPin = A5;
long startTime;
long elapsedTime ;
unsigned long shots = 0;
float sumspeed = 0;
float avgspeed = 0;
const int dist = 150; // sensor distance in mm.
float mps, elap;
int val;
int val2;

void setup()
{
 Serial.begin(9600);
}

void loop()
{

 val = analogRead(firstsensPin);
 val2 = analogRead(secondsensPin);
 while (val > 40) val = analogRead(firstsensPin);
 startTime = micros();
 while (val2 > 40) val2 = analogRead(secondsensPin);
 elapsedTime = micros() - startTime;
 shots++;
 mps = (float)(dist*1000)/elapsedTime;
 sumspeed += mps;
 avgspeed = (float)sumspeed/shots;
 Serial.print("Cur speed: ");
 Serial.print(mps, 1);
 Serial.print("Avg speed: ");
 Serial.print(avgspeed, 1);
}



leo72

Uppare non serve. Il codice devi scriverlo tu, al massimo possiamo correggerlo qui sul forum.
Sull'uso degli interrupt, c'è la funzione attachInterrupt e la sua documentazione da leggere:
http://arduino.cc/en/Reference/AttachInterrupt

Go Up