Go Down

Topic: Cronografo arduino, (modificato) correzione codice (Read 1 time) previous topic - next topic

Heisenberg94

Sep 15, 2013, 07:55 pm Last Edit: Oct 19, 2013, 08:30 pm by Heisenberg94 Reason: 1
Salve a tutti,
Ho avuto un' idea che gia era venuta in mente a qualcuno prima di me qui sul forum solo che vorrei migliorarla.
L' unico problema è che, anche se ho conoscenze nel campo dell' elettrotecnica, non ne ho nella programmazione.

Il progetto prevede la realizzazione di un cronografo da softair che si basi su arduino.
I componenti principali sono: un display 16x2 caratteri, Arduino UNO e due sensori fototransistor Fairchild QRD1114.

Dopo essere stato acceso dovrebbe fare questo:
   aspettare il primo pallino
  misurare e far apparire nella prima riga dello schermo i "metri/secondo" del primo pallino
  misurare e far apparire nella prima riga dello schermo i  "metri/secondo" del secondo pallino  
                 e così via per ogni pallino sparato...
  nella seconda riga invece dovrà apparire la media dei risultati ottenuti dei metri al secondo misurati fino a quel momento.
  Per ora trovato questo codice, se per piacere potete correggermelo...

Quote

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int firstsensPin = 4;
int secondsensPin = 5;
unsigned long time, time2;
float mps, elap;
int val;
int val2;

void setup()
{
lcd.begin(16, 2);
pinMode (firstsensPin, INPUT);
pinMode (secondsensPin, INPUT);
}
void loop()
{
lcd.println("Waiting");
val = analogRead(firstsensPin);
val2 = analogRead(secondsensPin);
while (val > 30)
{
  val = analogRead(firstsensPin);
}

while (val2 > 30)
{
  val2 = analogRead(secondsensPin);
}

while (val2 <= 30)
{
time2 = micros();
val2= analogRead(secondsensPin);
}
elap = time2 - time;

mps = x/elap; //Alla x sostituirò la distanza tra i sensori
lcd.print(mps );
}




PaoloP


Vorrei sapere se spiegandovi quali funzioni dovrebbe avere è possibile che mi postiate il codice da inserire nell' Arduino.          


No.
Funziona in questo modo: pubblichi un tuo codice che fa più o meno quello che intendi fare e noi ti aiutiamo a correggerlo e miglioralo.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

ghennet

MMMM sicuro che ne valga la pena ??? Capisco la libidine di farlo, ma lo trovi già pronto a poco ...

http://www.amazon.com/Competition-Electronics-ProChrono-Digital-Chronograph/dp/B0028MTBJ4
http://www.ebay.it/itm/Cronografo-Softair-Caccia-Arco-ProChrono-Digital-Misuratore-di-Joule-/180949200831

L'unico che calcola il PF o il fattore di potenza o come la "chiamate voi" energia in Joule è il CED Millenium, ma costa uno sproposito e risparmieresti SOLO usando una calcolatrice e facendo un X


Hai pensato ai problemi legati alla luce ?? (sole, ombra, neon ???)
Hai pensato al riflesso del colore del pallino ???
Ti chiedo questo perchè non mi sono mai posto il problema di come realizzare questo strumento, ma avendone usati parecchi spaziando da velocità basse fino a circa 1400/1500fps, ne ho visti MOLTI, TANTI, anche troppi che davano i numeri, invece il ProChrono, forse il più economico è quello che funziona meglio di tutti !!!!


ghennet

Aggiungo anche che The QRD1114 is only able to sense objects between 0 and 3cm away, quindi tu, o il tuo gruppo sareste in grado di "sparare", distanti 1metro dall'apparecchio tra 0cm e 3cm sopra le fotocellule ??

Heisenberg94

Volendo togliere i Joule e lasciare solo m/s con relativa media nella prima modalità e pallini al minuto e al secondo nella seconda modalità è possibile avere il codice?

ghennet

Ti hanno già detto... niente codice, tu posti, e noi, ti aiutiamo a capire dove sbagli ...

Altrimenti potresti offreire x euro ;)

Heisenberg94

Post aggiornato, ho inserito il codice e semplificato le funzioni del cronografo.

PaoloP

Prova così
Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const byte firstsensPin = A4;
const byte secondsensPin = A5;
unsigned long time, time2;
unsigned long shots = 0;
float sumspeed = 0;
float avgspeed = 0;
const int dist = 100; // sensor distance in mm.
float mps, elap;
int val;
int val2;

void setup()
{
  lcd.begin(16, 2);
  lcd.println("Ready!");
}

void loop()
{

  val = analogRead(firstsensPin);
  val2 = analogRead(secondsensPin);
  while (val > 30) val = analogRead(firstsensPin);
  time = micros();
  while (val2 > 30) val2 = analogRead(secondsensPin);
  time2 = micros();
  shots++;
  elap = time2 - time;
  mps = (float)(dist*1000)/elap;
  sumspeed += mps;
  avgspeed = (float)sumspeed/shots;
  lcd.setCursor(0,1);
  lcd.println(mps);
  lcd.print(avgspeed);
}


Forse c'è da fare qualche piccola correzione.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Heisenberg94

#8
Oct 20, 2013, 11:19 am Last Edit: Oct 20, 2013, 12:33 pm by leo72 Reason: 1
Quando l'avvio si vede la scritta ready e due simboli come si vede nelle foto
Ho modificato lcd.println("Ready!") in lcd.println("ready").

Provando a coprire prima un sensore e poi l'altro il display rimane uguale
Quale può essere il prblema?
http://imageshack.us/photo/my-images/837/9m8a.jpg/
http://imageshack.us/photo/my-images/513/pq8x.jpg/

edit: modificato dal mod - pagina appesantita dal caricamento delle foto

PaoloP

Io ho lasciato 30 come valore di soglia.
Sei sicuro che sia corretto?

Dovresti fare uno sketch che stampi i due valori così da essere sicuro.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Heisenberg94

#10
Oct 20, 2013, 12:11 pm Last Edit: Oct 20, 2013, 12:33 pm by leo72 Reason: 1
Ho provato inserendo come valore soglia 40 e sotto alla scritta Ready! appaiono 2 valori, ma i simboli restano comunque.
La scritta Ready! (che si trova nella prima riga) però dovrebbe sparire e al posto suo dovrebbe esserci il valore in m/s di ogni proiettile mentre nella seconda riga ci deve essere la media.
http://imageshack.us/photo/my-images/543/1hei.jpg/

edit: modificato dal mod - pagina appesantita dal caricamento delle foto

PaoloP

Controlla bene i collegamenti, che non ci siano falsi contatti.
Prova questo
Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

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

void setup()
{
  lcd.begin(16, 2);
  lcd.clear();
  lcd.print("Ready...");
}

void loop()
{

  val = analogRead(firstsensPin);
  val2 = analogRead(secondsensPin);
  while (val > 40) val = analogRead(firstsensPin);
  time = micros();
  while (val2 > 40) val2 = analogRead(secondsensPin);
  time2 = micros();
  shots++;
  elap = time2 - time;
  mps = (float)(dist*1000)/elap;
  sumspeed += mps;
  avgspeed = (float)sumspeed/shots;
  lcd.setCursor(0,0);
  lcd.print("Cur speed: ");
  lcd.println(mps,2);
  lcd.print("Avg speed: ");
  lcd.print(avgspeed,2);
}

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

leo72

@Heisenberg94:

prima di includere delle foto molto grosse, ti suggerisco di ridimensionarle oppure di mettere solo i link se hai bisogno di un elevato dettaglio. Altrimenti il caricamento della pagina risulta troppo rallentato.

Heisenberg94

Ho provato il nuovo codice, ho inserito la distanza reale che è circa 200mm.
Il valore che appare sul display è quello dell'ultimo "proiettile" e affianco al numero appare il primo dei due simboli che apparivano prima.
La media invece non appare, l' unica cosa simile alla media è un numero dell' ordine di alcune centinaia (come 840,0) che appare quando copro il primo sensore al posto della velocità rilevata (es. Cur speed: 848.0) dopo aver rilevato la prima velocità.
Inoltre i valori della velocità rilevata non sono molto diversi: vanno da 0,00 a massimo 0,02, sempre con il simbolo affianco.
Credo bisogni anche cambiare cambiare l' unità di misura e che ci sia un problema a far apparire i valori sull' lcd.
Per esempio tempo fa ho provato, con un esempio di codice del programma per PC di arduino, a scrivere sul computer per far apparire poi quello che ho scritto sullo schermo: notai che bisognava scrivere più caratteri di quanti ce ne vadano in una riga per completarla ed andare a capo.
Grazie a chi mi sta aiutando.

PaoloP

#14
Oct 20, 2013, 02:22 pm Last Edit: Oct 20, 2013, 02:26 pm by PaoloP Reason: 1
Sostituisci l'ultima parte con
Code: [Select]
lcd.setCursor(0,0);
lcd.print("Cur speed: ");
lcd.print(mps, 1);
lcd.setCursor(0,1);  
lcd.print("Avg speed: ");
lcd.print(avgspeed, 1);

riposizionando il cursore siamo sicuri che scriva nelle due righe diverse.
Il ,1 dovrebbe indicare al display di stampare un solo decimale.

A che velocità di solito viaggiano quei pallini?
Potrebbe essere necessario un approccio diverso utilizzando gli interrupt e un ingresso digitale.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Go Up