Pages: 1 [2] 3   Go Down
Author Topic: Cronografo arduino, (modificato) correzione codice  (Read 1823 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Seguendo una guida ho provato con questo codice:

Code:
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"
« Last Edit: October 21, 2013, 02:05:20 am by leo72 » Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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

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

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/)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Non capisco xche non vuoi usarli ??

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

Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

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

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

Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

#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);
}

« Last Edit: October 22, 2013, 03:01:45 pm by Heisenberg94 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Up
Logged

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

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
Logged


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