Pages: [1] 2 3   Go Down
Author Topic: Cronografo arduino, (modificato) correzione codice  (Read 1857 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

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


« Last Edit: October 19, 2013, 01:30:51 pm by Heisenberg94 » Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7276
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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 !!!!

Logged

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

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

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

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

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

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

Altrimenti potresti offreire x euro smiley-wink
Logged

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

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7276
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova così
Code:
#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.
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

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
« Last Edit: October 20, 2013, 05:33:17 am by leo72 » Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7276
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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
« Last Edit: October 20, 2013, 05:33:45 am by leo72 » Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7276
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Controlla bene i collegamenti, che non ci siano falsi contatti.
Prova questo
Code:
#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);
}

Logged

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

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 336
Posts: 23149
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


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

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7276
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sostituisci l'ultima parte con
Code:
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.
« Last Edit: October 20, 2013, 07:26:28 am by PaoloP » Logged

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

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