Arduino Forum

International => Italiano => Software => Topic started by: vince59 on May 15, 2018, 11:53 pm

Title: CRONOGRAFO BALISTICO
Post by: vince59 on May 15, 2018, 11:53 pm
chiedo scusa ma non riesco a trovare un mio thread relativo a quanto in argomento che dovrei aver pubblicato tempo fa.
Non ricordo quanto si fosse andati avanti ma è un idea sulla quale sono ritornato.
Ben accette indicazioni, sia per la parte HW che SW, per avviare il progetto.
Intento cerco qualcosa anche in inglese.
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on May 15, 2018, 11:56 pm
questo è un codice che intendo studiare...

Code: [Select]
/*
Tomado de http://aeroquad.com/showthread.php?845-How-do-I-make-a-tachometer-with-my-spare-arduino-board-and-IR-LED-and-RECEIVER
Modificado por Pablo Andrade Mejía http://www.arduinolab.wordpress.com

05 de Noviembre de 2012

Se le añadió la función de enviar la velocidad en metros por segundo y pies por segundo al monitor serial
lo que quita la necesidad de tener una pantalla de cristal líquido

Aquellos que tengan dudas acerca de cómo se debe conectar los sensores para que funcione correctamente
hagan click aquí http://www.instructables.com/id/Arduino-Based-Optical-Tachometer/step3/IR-Detector-Circuit/

Los fotodiodos o fototransistores son nombrados como attachInterrupt(0, front, CHANGE); Éste está relacionado
con el pin digital 2, y, el attachInterrupt(1, rear, CHANGE); Éste está relacionado con el pin digital 3

Quienes quieran probarlo pueden conectar dos botones a los pines 2 y 3

Los fotodiodos deben tener una resistencia entre 10k y 100kohm conectados al colector (pin, o pata larga) y esta al pin digital
para asegurarnos que cuando el haz de luz sea interrumpido el voltaje llegue a 0 o tierra
*/

#include <LiquidCrystal.h>
 
#define MPS2FPSCOEFF 3.28084
#define LENGTH 0.159             
#define MICRO2SEKCOEFF 1000000

LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

volatile int stateFront = HIGH;
volatile int stateRear = HIGH;

int led1 = 12;                             
int led2 = 13;                             
int startChrono;
unsigned long startTime, stopTime, elapsed;
double fpsSpeed, mpsSpeed; //double tiene la misma función que float, así que no hay que preocuparse
 
void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Super Chrono");
  Serial.print("Cronografo");
  lcd.setCursor(0, 1);
  lcd.print("by Honk");
  delay(700);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Initializing...");
  Serial.println("Inicializando"); 
  delay(700);
  lcd.clear();
 
  startChrono = 0;
  elapsed = 0;
  fpsSpeed = mpsSpeed = 0;
 
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  /*
  Sí los resultados no son los esperados donde dice CHANGE cambien por RISING o LOW
  tanto como en attachInterrupt(0, front, "      "); como en attachInterrup(1, rear, "     ");
 
  Sí todo resulta bien simplemente no hagan nada
  */
  attachInterrupt(0, front, CHANGE); //0 (on digital pin 2) kanske falling/rising/low
  attachInterrupt(1, rear, CHANGE);  //1 (on digital pin 3)
 
  lcd.setCursor(0, 0);
  lcd.print("Take a shot!");
  Serial.println("Preparado para disparar?");
}
 
void loop()
{
  //Start counting when interrupted
  if(stateFront == LOW && startChrono == 0)
  {
    startTime = micros();  // Count microseconds since start
    startChrono = 1;       // Set Chrono flag
    digitalWrite(led1, HIGH);
  }
 
  // Stop counting and calculate speed
  if(stateRear == LOW && startChrono == 1)
  {
    stopTime = micros();  // Count microseconds since start
    startChrono = 0;      // Clear Chrono flag
    elapsed = stopTime - startTime;  // Calculate elapsed time (in us)
 
    digitalWrite(led2, HIGH);
    mpsSpeed = (LENGTH*(MICRO2SEKCOEFF)) / elapsed;            // s = v * t, v = s / t
    fpsSpeed = mpsSpeed * MPS2FPSCOEFF;

    lcd.clear();
    lcd.print("Fps: ");
    lcd.print(fpsSpeed);
    Serial.println("PPS(Pies por segundo) ");
    Serial.print(fpsSpeed);
    lcd.setCursor(0, 1);
    lcd.print("m/s: ");
    lcd.print(mpsSpeed);
    Serial.println("Metros por segundo ");
    Serial.print(mpsSpeed);
   
    startChrono = 0;
   
    delay(500);
    digitalWrite(led2, LOW);
    digitalWrite(led1, LOW); 
   
  }
 
}

void front()
{
  stateFront = !stateFront;
}

void rear()
{
  stateRear = !stateRear;
}
Title: Re: CRONOGRAFO BALISTICO
Post by: fabpolli on May 16, 2018, 08:59 am
Non so se sia il medesimo caso ma questo (https://forum.arduino.cc/index.php?topic=407095.0) thread dovrebbe chiarire un po' di cose credo... prova a guardalo e valita se è il medesimo progetto che vuoi relaizzare tu
Title: Re: CRONOGRAFO BALISTICO
Post by: Standardoil on May 16, 2018, 09:41 am
Cosa che è cronografo balistico?
Io conoscevo galvanometri balistici, e da questi i corrispondenti voltmetri, amperometri wattmetri etc etc
Ma uno strumento registratore (....grafo) non credo possa essere balistico
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on May 16, 2018, 12:18 pm
chiamano in quel modo i cronometri a traguardi che servono per misurare la velocita' di frecce e proiettili in genere (magari se ha una stampantina termica incorporata, questo giustifica il "grafo", non so ... ;))
Title: Re: CRONOGRAFO BALISTICO
Post by: Standardoil on May 16, 2018, 02:05 pm
Ok, grazie
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on May 16, 2018, 05:31 pm
Credo pero' che il problema maggiore sia far leggere gli ingressi pi piu velocemente possibile ... per il poco che mi ricordo, le "digitalRead" sono relativamente lente ... c'e' un modo per rilevare lo stato di due pin il piu velocemente possibile ? ... magari usando gli interrupt ?

Se si, allora forse si puo mettere in una variabile il valore di micros all'attivazione del primo, quello di micros all'attivazione del secondo, poi si sottrae e si calcola la velocita' (con lo scarto della precisione intrinseca della MCU, ovviamente, ma dovrebbe essere possibile ... magari usando due cicli bloccanti per fare in modo che il micro non perda tempo a fare nient'altro mentre aspetta di leggere gli ingressi)

Secondo problema che mi viene in mente, la lettura del proiettile ... i sistemi "commerciali" usano dei sensori di immagine relativamente primitivi (due fotodiodi tagliati a triangolo ed uniti a formare un rettangolo, con una lente semicilindrica che mette a fuoco una striscia di materiale bianco illuminata in modo uniforme con infrarossi ... formano una specie di "sensore differenziale", in cui in realta' non viene letta una vera e propria "immagine" anche se li chiamano sensori di immagine, ma quella configurazione causa una variazione dell'uscita quando un'oggetto attraversa la zona messa a fuoco, anche se non e' perfettamente centrato, cosa che invece sarebbe necessaria con un solo fotodiodo o con un traguardo ottico, ed il circuito si limita a produrre un'impulso qualsiasi sia la variazione), sensori che pero' purtroppo e' abbastanza difficile trovare in vendita ... se uno ha pazienza e manualita', ci si puo costruire due supporti su cui fissare delle striscie di specchio superficiale (recuperabili da vecchi scanner o stampanti multifunzione rottamati) in modo che si fronteggino, un lato fisso e l'altro regolabile con una vitina ... poi si prendono due modulini laser da pochi Euro, si fissano in fondo rivolti verso uno degli specchi, e si regola quello mobile perche' produca un tracciato a zigzag fra gli specchi, mettendo il fotodiodo in alto dal lato opposto del "pannello" di linee luminose (in questo modo il raggio lo si interrompe in qualsiasi punto si faccia passare l'oggetto ... non troppo semplice da realizzare, ma neppure impossibile) ... l'altro sistema che mi viene in mente cosi al volo sarebbe costruire due "camere a riga", l'equivalente di un sensore a fori stenopeici, pero' con delle fessure al posto dei fori ... ma non so se si possano trovare dei fotodiodi abbastanza sensibili per poterli usare in quel modo ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on May 16, 2018, 09:28 pm
Bsera, confermo che il cronografo/cronometro di cui si parla serve per misurare la velocità del pallino di una carabina ad aria compressa. La velocità di uscita dovrebbe essere sui 160/170 m/s ed inserendo il peso del pallino è anche possibile stabilire i joule di potenza dell'arma. Quest'ultima parte attiene all'algoritmo di calcolo che al momento è la cosa più semplice. Ho cercato solo ieri sera e verificato che esiste più di qualche progetto autocostruito con Arduino ed intendevo fare la stessa cosa. Ignoro, al momento, quale sia la parte hardware impiegata per leggere il passaggio del pallino. ...studio un pò è vi faccio sapere.

date un occhiata qui:

https://www.youtube.com/watch?v=jZOJLJD3aNU
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on May 17, 2018, 10:24 am
...
https://www.youtube.com/watch?v=jZOJLJD3aNU
... ha traforato il terminale della carabina per inserirci i sensori ... ASSASSINO !!!

Oltretutto il principio e' sbagliato, e puo causare errori ... non ultimo quello dovuto al fronte di compressione dell'aria di fronte al pallino all'interno della canna (l'aria ha una sua densita', e comprimendola la si cambia, cambiando anche il suo indice di rifrazione ... se il fronte di compressione e' costretto all'interno della canna, potrebbe generare di fronte al pallino una zona in cui il raggio dei sensori viene spostato "prima" che il pallino vero e proprio arrivi sul sensore ... vero che sarebbe valido per entrambi, ma non e' "predicibile" di quanto possa essere la rifrazione, per cui puo essere fonte di errori) ... se poi usa un qualche lubrificante, i residui potrebbero accumularsi sui sensori con il tempo, e voglio vederlo a smontare tutto ogni volta che li deve pulire :D

Non dico che non funzioni, si puo anche realizzare un sistema con il tubo, ed alcuni apparati economici di fascia bassa usano proprio quel sistema, ma "STACCATO" dell'arma, mai integrato nel terminale di volata ...

Se vuoi fare qualche esperimento, c'erano dei fotodiodi PIN differenziali di fascia abbastanza economica, SFH221 (https://media.osram.info/media/resource/hires/osram-dam-2495920/SFH%20221.pdf), che incorporano due fotodiodi affiancati nello stesso case, non sono dei veri e propri diodi a quadratura o dei sensori a triangoli, ma costano molto meno (sugli 8 Euro, 20 volte di meno del piu "straccio" sensore ad immagine o diodo a quadratura), e con una lente semicilindrica o astigmatica (o forse addirittura solo una fenditura, e' da provare) dovrebbe essere possibile fare in modo che "mettano a fuoco" una striscia bianca al centro dei due fotodiodi, come fanno in questo tipo di apparecchi (http://www.shootingchrony.com/images/master2000.jpg) ... poi dovrebbe bastare leggere i diodi in modo differenziale e generare un'impulso nel momento in cui la variazione passa da uno all'altro dei diodi (quando l'ombra del pallino passa da uno all'altro dei due chip, uno aumenta e l'altro diminuisce il segnale) ... certo difficilmente si otterranno risultati uguali a quelli di un'apparato da 250 Euro, ed e' tutta roba da sperimentare ... ma in fondo il bello dell'hobby non e' proprio sperimentare ? ... ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on May 17, 2018, 05:20 pm
@ etemenanki. E' probabile che il tizio abbia tagliato uno stabilizzatore ed applicato sul vivo di volata. Escludo che sia stato così folle da tagliare quello proprio dell'arma.

Come hai ountualizzato è il concetto che fai-da-te che è devastante.
Non sono ferrato come te....tfatico a comprendere quale sia la difficoltà tecnica della lettura dell'interruzione di un fascio....se utilizzassi due di quei puntatori laser a batteria?
l'idea è prendo due di quei puntatori laser e li sparo verso qualcosa che legge e rilevo il momento in cui il fascio viene interrotto. Preciso che il pallino ha un diametro di 4,5 mm.
Il problema del codice al momento non l'ho affrontato perchè si tratta di rilevare velocità elevate dell'ordine di 160/170 m/s e non so ancora quale "algoritmo" utilizzare.
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on May 17, 2018, 05:54 pm
Il problema del codice al momento non l'ho affrontato perchè si tratta di rilevare velocità elevate dell'ordine di 160/170 m/s e non so ancora quale "algoritmo" utilizzare.
Quello non mi sembra un grosso problema .. su una distanza di 1mt (distanza sulla quale non credo che, in prossimità dell'uscita del pallino ci sia calo apprezzabile) a 170mt/sec si ha un tempo di passaggio di quasi 6 msec. ... tempo facilmente misurabile con un paio di interrupt (primo pasaggio e secondo passaggio) e l'utilizzo di micros().

Il problema è semmai la scelta di due fotosensori che rispondano a quella velocità ::) ... e anche l'allineamento del tutto.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on May 17, 2018, 06:36 pm
> vince59: il problema piu che altro e' dovuto al fatt oche il pallino ha, appunto, "solo" 4.5mm di diametro, e la zona di lettura (se vuoi realizzare qualcosa tipo il chrony) e' larga, quindi non puoi usare un solo raggio, a meno che la tua mira non sia talmente precisa da consentirti di interrompere con sicurezza due raggi del diametro di circa 1mm a distanze diverse dal vivo di volata (cosa che probabilmente, neppure il campione mondiale di tiro a segno riuscirebbe a fare ;))

Quel video funziona (piu o meno) proprio perche' ha messo i due traguardi nello stabilizzatore di volata (e si, spero anch'io che non abbia massacrato quello originale dell'arma), per cui il pallino e' costretto a passarci davanti per forza ... ma se appena appena usi un qualche lubrificante (e li usano tutti), dopo poche decine di colpi avrai probabilmente i sensori coperti di sporco, residui di polvere impastata con olio, residui di piombo, pelumini dei feltrini di pulizia ... e non e' certo una soluzione facile, smontare tutto ogni poco tempo ...

si possono usare due laser, nessun problema in quello ... solo che bisogna fare una cosa di questo tipo https://www.youtube.com/watch?v=HwInYFFdCsg (magari fatta un tantino meglio di quella del video, che fa un po pena, ma e' il principio che conta, quello della "tenda" di raggi a zigzag) ... sara' un po un casino settare gli specchi, ma per funzionare funziona ... oppure, come il chrony, si prendono un paio di semicerchi di plastica bianca, li si illuminano con qualche led IR, e li si "leggono" con due fotodiodi differenziali in cui l'immagine della striscia e' "messa a fuoco" al centro dei due diodi ...

Perche',uno si potrebbe chiedere, proprio stramaledetti (:P) fotodiodi differenziali ? ... per evitare false letture ... se si usase un singolo fotodiodo, o anche un'array lineare, una variazione improvvisa di luminosita' potrebbe essere letta come start o stop, falsando la lettura ... usando invece un fotodiodo differenziale, si genera l'impulso solo quando l'ombra del pallino passa da un diodo all'altro (in pratica, l'unico momento in cui il segnale di uno sale di colpo e contemporaneamente il segnale dell'altro scende di colpo), ignorando tutti gli altri tipi di variazione luminosa ... gestendo i segnali in modo differente, si puo perfino misurare la velocita' di frecce o altri tipi di proiettili piu lunghi ...

trovando una lente astigmatica decente ed un paio di fotodiodi SMD abbastanza piccoli come dimensioni, si potrebbero anche saldare il piu vicino possibile  senza dover per forza usare un componente piu difficile da reperire in vendita ... o magari usando piu diodi SMD affiancati e disposti su due linee parallele, il piu vicini possibile, si puo costruire una piu semplice camera a fenditura ... ma li serve fare qualche esperimento ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on May 22, 2018, 12:06 pm
bgiorno Guglielmo ed Etemenanki.

Guglielmo ti sarei grato se, come al solito, mi potessi dare un indicazione su come metter su il codice. Tieni conoto però che la distanza del misuratore e sul vivo di volata o nelle immediate prossimità ovvero in 10/20 cm.

Etemanki. Ti seguo nel ragionamento generale ma mi perdo quando si va nel tecnicismo della lettura.
Ipotizzando di montare sul vivo di volata un tubo di diametro pari alla canna, il problema della precisione e relativa interruzione dei due fasci dovrebbe essere superato. Ancora meglio riducendo il diametro...è sufficente 6mm e già hai 1,5 mm in più rispetto al pallino. Non ho idea però di quanto il fascio si a largo anche perchè non mi è chiaro ancora quale sia il sensore ottimale.
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on May 22, 2018, 12:22 pm
Ma tu vuoi costruire un sistema da integrare in una singola arma (termine improprio per le aria compressa, lo so, ma chiamiamola "arma" per convenzione), oppure uno che possa essere usato per qualsiasi arma in modo libero da vincoli ? ... perche' le due cose sono molto diverse ...
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on May 22, 2018, 01:04 pm
Guglielmo ti sarei grato se, come al solito, mi potessi dare un indicazione su come metter su il codice. Tieni conoto però che la distanza del misuratore e sul vivo di volata o nelle immediate prossimità ovvero in 10/20 cm.
A 170 mt/sec abbiamo 17000 cm/sec il che significa che i tuoi 10 cm vengono percorsi 588 μsec. La risoluzione della funzione micros() è di 4 μsec quindi ... comunque la misura dovrebbe essere possibile.

Usi due interrupt, uno attivato al primo passaggio, uno attivato al secondo. Entrambi, l'unica cosa che fanno è salvare il valore di micros() ciascuno in una sua variabile dopo di che si tratta banalmente di fare una sottrazione e calcolare la differenza di μsec tra i due passaggi.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on May 22, 2018, 03:39 pm
Grazie Gugliemo.
Etemenanki...intendo utilizzarla per una sola carabina. Non integrata in maniera fissa ma da utilizzare per verifiche solo dopo la manutenzione o per testare pallini diversi.
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on May 22, 2018, 04:43 pm
Che modello di carabina hai, se posso chiedertelo ? ... e lo stabilizzatore di volata e' rimuovibile con facilita' ?

Te lo chiedo perche' realizzare un sistema del genere con un tubo di piccolo diametro non e' una buona idea, anche se di diametro maggiore del pallino ... in uscita dal vivo di volata, anche se di solito non si nota ad occhio, hai piu che il semplice pallino ed un po di aria ... ci sono microscopici frammenti di piombo, c'e' una piccola parte di lubrificante vaporizzata, se l'aria e' umida probabilmente anche nebbia dovuta all'espansione rapida dell'aria che la raffredda ... poca roba, ma sul medio-lungo periodo, abbastanza da sporcarti i sensori e rendere inaffidabili le misure ... inoltre considera che il tutto prendera' una discreta "botta" ad ogni colpo, dovuta al rinculo dell'arma ...

A quel punto, se non vuoi realizzare un sistema usabile "a distanza" dall'arma, la soluzione migliore potrebbe essere l'uso di due piccoli diodi laser (quelli economici e "stupidi" tipo questi (https://www.ebay.com/itm/10-Pcs-650nm-6mm-3-3V-5mW-Red-Laser-Dot-Diode-Module-Copper-Head-for-Arduino/312024295693), con l'accortezza di chiudere bene la parte posteriore con del termorestringente, perche' sono dei "bare-chip" e si fa presto a rovinarli, e di sottoalimentarli intorno ai 4V perche' tanto non devono certo essere visibili a metri, ma solo riuscire ad eccitare il fotodiodo a pochi mm) ed un paio di fotodiodi PIN (piu veloci dei normali fotodiodi, tempi di risposta medi di 5nS), infilati in un tubo largo abbastanza da essere assemblato sopra il tuo stabilizzatore (per questo chiedevo quale carabina e', perche' ogni modello ha di solito uno stabilizzatore diverso) ... una battuta interna garantirebbe l'allineamento, e magari una fascetta sulla parte terminale verso lo stabilizzatore garantirebbe la stabilita' ... a quel punto, si allineano i laser ed i fotodiodi in modo che siano in asse con l'asse della canna, con i fotodiodi montati in fori da 3mm rientrati e con almeno 10 o 15 mm di spazio fra l'asse della canna e le pareti interne del tubo ... questo consentirebbe di ridurre il materiale che si puo depositare sui sensori (si potrebbero perfino prevedere alcuni dischetti forati prima dei sensori per fermare il piu possibile le particelle di sporco) mantenendo comunque una buona sicurezza sul fatto che il pallino interrompa i raggi (cerchero' di tirare in piedi un disegno per spiegarmi meglio)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on May 22, 2018, 04:56 pm
...questa idea comincia a piacermi.

PS: Weihrauch HW 977 libera vendita
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on May 22, 2018, 05:11 pm
La 997 ha piu di un modello ... se e' questa a canna corta (https://admin.abc.sm/upload/2365/catalogodinamico/prodotti/img_293737_150000380035.jpg) con il fermo dell'asta di caricamento quasi a filo con il vivo di volata, potrebbe volerci un po piu di lavoro meccanico per realizzare un'attacco decente e stabile, mentre se e' questa a canna lunga (http://www.bignami.it/files/BwFilesProdotti/300/300090/300090_a.jpg) con lo stabilizzatore prolungato, la cosa diventa molto piu facile ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on May 22, 2018, 05:20 pm
...la canna lunga è per la full ...se non vado errato. Cmq no problem per l'adattamento allo smorzatore una volta realizzato posso anche fissarlo con fascette per il tempo strettamente necessario
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on May 24, 2018, 12:07 pm
Ho provato a buttare giu uno schizzo, fa un po pena perche' Eagle non e' un cad grafico, ma dovrebbe servire a spiegare almeno a grandi linee cosa intendevo ...

(https://forum.arduino.cc/index.php?action=dlattach;topic=547693.0;attach=259144)

il tubo dovrebbe avere almeno tre diversi diametri all'interno, cosa non facile se non si ha un tornio, ma probabilmente si puo realizzare qualcosa di simile incollando tre pezzi di tubo uno dentro l'altro ... la prima variazione di diametro la si userebbe come battuta sul piano di volata, per garantire l'allineamento, insieme alla lunghezza della parte che calza sopra lo stabilizzatore ... il secondo gradino si potrebbe anche ignorare se non si mette il dischetto forato, che insieme ai fori laterali serve solo per scaricare il piu possibile i residui prima che raggiungano la zona dei sensori, aumentandone la durata, o comunque riducendo lo sporco che si accumulera' con il tempo ... laser e fotodiodi dovrebbero affacciarsi all'interno del tubo attraverso forellini da un paio di mm, perpendicolari all'asse della canna, in modo che il pallino interrompa il raggio per forza, anche con un diametro della parte terminale del tubo di 10 o piu mm ... non dovrebbe essere troppo difficile realizzarlo, avendo l'accesso a qualche strumento di lavoro (potendo utilizzare frese o CNC, potrebbe anche non essere un tubo ma un quadrato o un'esagono o quello che si trova in cui realizzare il foro principale a piu diametri ed i fori laterali, risulterebbe anche piu robusto, ma senza CNC o fresa, bisogna ripiegare sui tubi)

I fotodiodi andrebbero protetti esternamente una volta posizionati, per evitare che luce esterna li influenzi ... bisognerebbe anche testare il materiale dei tubi per essere sicuri che sia opaco alla lunghezza d'onda del laser (lo dico perche' una volta mi e' successo, avevo realizzato un sensore per diverse lunghezze d'onda, dagli UV agli IR, e l'avevo messo in una di quelle scatole grigie della Gewiss, ma il sensore degli IR dava sempre dati assurdi, poi provando ho scoperto che anche se la plastica era opaca al visibile ed all'UV, lasciava invece passare gli IR come se fosse stato vetro sabbiato :P :D)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on May 29, 2018, 09:43 am
Bgiorno a tutti,

dunque ritorno alla carica per portare avanti qualche tentativo grazie anche alle utili informazioni fornite nel thread. Ho una manciata di fotodiodi, diodi ir e normali. Vorrei fare qualche prova pratica sia sul codice sia sul funzionamento del rilevatore di velocità.
Il codice è quello di cui al post #1 che riporto di seguito per comodità. Lo sto studiando ma, vista la mia ancora scarsa preparazione a riguardo vi chiedo gentilmente di fornirmi un vostro parere.
Pr la parte hardware cme detto al momento ho solo diodi e fotodiodi...sono questi in in grado ri rilevare velocità di 160/170 metri x secondo?

Code: [Select]
/*
Tomado de http://aeroquad.com/showthread.php?845-How-do-I-make-a-tachometer-with-my-spare-arduino-board-and-IR-LED-and-RECEIVER
Modificado por Pablo Andrade Mejía http://www.arduinolab.wordpress.com

05 de Noviembre de 2012

Se le añadió la función de enviar la velocidad en metros por segundo y pies por segundo al monitor serial
lo que quita la necesidad de tener una pantalla de cristal líquido

Aquellos que tengan dudas acerca de cómo se debe conectar los sensores para que funcione correctamente
hagan click aquí http://www.instructables.com/id/Arduino-Based-Optical-Tachometer/step3/IR-Detector-Circuit/

Los fotodiodos o fototransistores son nombrados como attachInterrupt(0, front, CHANGE); Éste está relacionado
con el pin digital 2, y, el attachInterrupt(1, rear, CHANGE); Éste está relacionado con el pin digital 3

Quienes quieran probarlo pueden conectar dos botones a los pines 2 y 3

Los fotodiodos deben tener una resistencia entre 10k y 100kohm conectados al colector (pin, o pata larga) y esta al pin digital
para asegurarnos que cuando el haz de luz sea interrumpido el voltaje llegue a 0 o tierra
*/

#include <LiquidCrystal.h>
 
#define MPS2FPSCOEFF 3.28084
#define LENGTH 0.159             
#define MICRO2SEKCOEFF 1000000

LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

volatile int stateFront = HIGH;
volatile int stateRear = HIGH;

int led1 = 12;                             
int led2 = 13;                             
int startChrono;
unsigned long startTime, stopTime, elapsed;
double fpsSpeed, mpsSpeed; //double tiene la misma función que float, así que no hay que preocuparse
 
void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Super Chrono");
  Serial.print("Cronografo");
  lcd.setCursor(0, 1);
  lcd.print("by Honk");
  delay(700);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Initializing...");
  Serial.println("Inicializando");
  delay(700);
  lcd.clear();
 
  startChrono = 0;
  elapsed = 0;
  fpsSpeed = mpsSpeed = 0;
 
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  /*
  Sí los resultados no son los esperados donde dice CHANGE cambien por RISING o LOW
  tanto como en attachInterrupt(0, front, "      "); como en attachInterrup(1, rear, "     ");
 
  Sí todo resulta bien simplemente no hagan nada
  */
  attachInterrupt(0, front, CHANGE); //0 (on digital pin 2) kanske falling/rising/low
  attachInterrupt(1, rear, CHANGE);  //1 (on digital pin 3)
 
  lcd.setCursor(0, 0);
  lcd.print("Take a shot!");
  Serial.println("Preparado para disparar?");
}
 
void loop()
{
  //Start counting when interrupted
  if(stateFront == LOW && startChrono == 0)
  {
    startTime = micros();  // Count microseconds since start
    startChrono = 1;       // Set Chrono flag
    digitalWrite(led1, HIGH);
  }
 
  // Stop counting and calculate speed
  if(stateRear == LOW && startChrono == 1)
  {
    stopTime = micros();  // Count microseconds since start
    startChrono = 0;      // Clear Chrono flag
    elapsed = stopTime - startTime;  // Calculate elapsed time (in us)
 
    digitalWrite(led2, HIGH);
    mpsSpeed = (LENGTH*(MICRO2SEKCOEFF)) / elapsed;            // s = v * t, v = s / t
    fpsSpeed = mpsSpeed * MPS2FPSCOEFF;

    lcd.clear();
    lcd.print("Fps: ");
    lcd.print(fpsSpeed);
    Serial.println("PPS(Pies por segundo) ");
    Serial.print(fpsSpeed);
    lcd.setCursor(0, 1);
    lcd.print("m/s: ");
    lcd.print(mpsSpeed);
    Serial.println("Metros por segundo ");
    Serial.print(mpsSpeed);
   
    startChrono = 0;
   
    delay(500);
    digitalWrite(led2, LOW);
    digitalWrite(led1, LOW);
   
  }
 
}

void front()
{
  stateFront = !stateFront;
}

void rear()
{
  stateRear = !stateRear;
}
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on May 29, 2018, 04:34 pm
... fotodiodi...sono questi in in grado ri rilevare velocità di 160/170 metri x secondo?
...
Dipende da che fotodiodi sono, se ci dai la sigla ti diamo informazioni piu precise ...

Comunque, indicativamente, i normali fotodiodi (moderni) hanno un tempo di risposta intorno agli 0.5 microsecondi, alcuni necessitano di 1uS ... i fotodiodi PIN sono in genere intorno ai 5/8 nanosecondi (ma alcuni modelli arrivano a 2nS) ... il pallino e' lungo in genere dai 4 ai 6 mm, secondo i modelli, consideriamo il caso peggiore di 4mm ed 1uS ... 170m/S sono 170mm per millisecondo, o 0.17mm (170 millesimi di mm) ogni microsecondo ... un pallino lungo 4mm che passa davanti ad un diodo a 170m/s, se non ho sbagliato a calcolare, lo dovrebbe oscurare per almeno 23 microsecondi, quindi in teoria piu che sufficenti per far scattare anche fotodiodi di tipo vecchio, che avevano in media da 5 a 20 microsecondi di tempo di risposta ...

Se poi i tuoi sono fotodiodi PIN da 5nS, il problema non si pone neppure ... intanto che il pallino gli transita davanti, non solo lo rilevano, ma fanno in tempo anche a scendere al bar a far colazione e rientrare prima che abbia finito di passare :D
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 09, 2018, 09:53 pm
...e sono di nuovo qui. Devo riuscire a fare anche sto "coso"...

Vorrei utilizzare questi

https://www.ebay.it/itm/10X-LED-3mm-INFRAROSSO-EMETTITORE-RICEVITORE-940-nM-fotodiodo-ricevente-diodi/262583996447?hash=item3d2339d01f:g:oG0AAOSweW5VeCkj

oppure farlo con due testine laser (link) e cercare di realizzare una barriera zigzag con gli specchi

https://www.ebay.it/itm/A75-LASER-650nm-5mW-6MM-PUNTATORE-ROSSO-ARDUINO-3V-diodo/232728144012?hash=item362fada88c:g:4AwAAOSwdPtay35F
Title: Re: CRONOGRAFO BALISTICO
Post by: gianlucaf on Oct 11, 2018, 09:04 am
guarda QUI (https://www.ebay.it/itm/Combro-cb-625-MK4-Chronograph-Mesure-MPS-FPS-Velocity/332403456923?hash=item4d64ca3b9b:m:mpnLZFhhBoM6HuY3O10LpZQ:rk:2:pf:0) che bello già pronto e fatto :D

scherzo ovviamente, seguo con interesse perchè l'argomento mi interessa.
anch'io ho una  977 ma quelle sopra i 7.5J  :)
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 11, 2018, 10:08 am
...
oppure farlo con due testine laser (link) e cercare di realizzare una barriera zigzag con gli specchi
...
Se parli di quello da fissare sulla canna, la barriera a zig-zag non serve, basta usare dei normali fotodiodi e mettere sia il led che il fotodiodo in cavita' che si affacciano verso l'interno tramite dei forellini da 2.5 / 3 mm allineati con l'asse della canna ... il pallino interrompera' per forza i raggi, in quelle condizioni, perche' sono vincolati alla canna e piu stretti del pallino stesso ... ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 12, 2018, 11:17 am
@ gianlucaf ...che gusto c'è a comprarlo già fatto? La 977 è bellissima ....sono tentato di fare un upgrade :smiley-evil:  :smiley-evil:  :smiley-evil:  :smiley-evil:  :smiley-evil:

@ etemenanki. Dunque sto smanettando ora con diodi IR e relativi ricevitori TSOP 34838 ma mi sembrano lenti nelle risposta. Ho fatto delle prove moooolto elementari sulla basetta millefori ma mi sembra che l'interruzione del fascio IR da parte di un oggetto molto piccolo e molto veloce non venga rilevata.
Ho ordinato nel frattempo laser e riceventi. Concordo che a questo punto ne bastano due messi in un tubo allineato longitudinalmenmte con la canna. Il piombino di sicuro interromperà il fascio.
Leggendo i tuoi post ho compreso che la risposta del ricevitore deve essere molto veloce - sto studiando - ma non mi è chiaro se il TSOP 34838 essendo un diodo PIN anche se a IR possa andare bene come caratteristiche.
In attesa di ricevere il materiale voglio provare a mettera a punto il codice e provare con gli IR.
Consigli ben accetti.
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 12, 2018, 12:19 pm
Ehm, no, la serie TSOP sono moduli ricevitori, non hanno nulla a che fare con i diodi pin (hanno piu o meno la stessa proporzione di velocita' che c'e' fra una lamborghini ed una ford "model A" :D)

Ora sto uscendo, oggi te ne cerco qualcuno sui datasheet, di diodi PIN o fotodiodi veloci "veri" ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 12, 2018, 04:15 pm
Guglielmo, aiutami sennò spacco il PC co na capocciata!!!!

Sono due giorni che sbatto la capoccia co sti caxxo di interrupt ma non riesco proprio a capire come lavorarci per creare il codice. Potresti, come hai già fatto per i millis, guidarmi un pò per come impostare il codice e soprattutto com egestire gli interrupts?
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 12, 2018, 04:30 pm
BPV10NF ... TEFD4300F ... SFH229FA ... QSD2030F ... I piu comuni che mi sono capitati a tiro, non SMD, dovrebbero essere tutti sotto l'euro l'uno ... questi sono PIN, quindi veloci, tempi di risposta medi 10nS ... SFH229FA e TEFD4300F sono da 3mm di diametro, quindi anche poco ingombranti ...

I TSOP essendo ricevitori per telecomandi, contengono anche l'AGC e l'elettronica di decodifica a volte, e sono progettati per frequenza di modulazione di 38KHz ... il loro diodo viaggia a microsecondi, a volte anche millisecondi , non si possono usare come normali diodi per applicazioni veloci ... ovviamente per leggere i normali fotodiodi devi fargli un minimo di circuito, ma e' una cosa piuttosto semplice da fare ...

Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 12, 2018, 04:46 pm
Grazie Etemenanki,
prima o poi li trovo ora sono fuori roma con difficoltà logistiche.
Sto cominciando a ragionare sul codice ma non mi entrano in testa questi interrupts. Hoscaricato qualche esempio e sto provando a studiare.
Vorrei abbozzare l'ahardware ed il codice.
Per l'HW non ho problemi mi sembra di capire che:
- i diodi IR vadano semplicemente alimetati mediante resistenza (già sto smanettando con gli IR ed i TSOP);
- i diodi PIN (in packag T1) come andranno cablati?..immagino sui pin D2 e D3 visto che sono gli unici che lavorano con gli interrupt. Giusto? ...se si con quale polarizzazione?
Per il codice cerco di arrivarci da solo...


Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 12, 2018, 05:57 pm
Diodi IR: resistenza in serie, se usi i 5V di arduino, 680 ohm dovrebbero essere sufficenti (sono vicini ai fotodiodi e non devono servire come illuminatori, quindi dargli pochi mA dovrebbe bastare, al massimo si abbassano le resistenze a 470 ohm se si vede che non basta la corrente)

Fotodiodi: di solito si usano gli operazionali, ma anche un semplice paio di transistor BC337 dovrebbe bastare per un'applicazione simile ... tecnicamente, sarebbe possibile anche farne a meno ed usare un semplice paio di resistenze da 22K o valori simili, collegandoli polarizzati inversamente (catodi dei diodi al +5V, anodi ai pin di arduino, resistenze fra i pin e massa come pull-down e per polarizare inversamente il diodo), dato che gli ingressi di arduino sono ad alta impedenza, quindi anche l'uscita diretta del fotodiodo in teoria dovrebbe bastare a fargli cambiare stato ... e' comunque da provare, se non basta, si mettono anche i transistor ...

Nel fare i test, occhio che gli IR presenti nell'ambiente possono falsarti facilmente le letture ... usa dei tubetti di cartoncino o metallo (non plastica, a meno che tu non sia sicuro che e' opaca agli IR, perche' molte plastiche che alla luce visibile risultano nere o comunque opache, sono trasparenti o lasciano passare quasi tutta la banda IR) per schermare completamente i fotodiodi, anche dietro (senza mandarli in corto se usi il metallo) ... per lo stesso motivo, poi, il tubo finale andrebbe costruito in metallo, alluminio, ottone, quello che trovi piu facile da lavorare, e non in plastica, sempre se non hai plastica che sei sicuro sia completamente opaca agli IR ...
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 12, 2018, 07:00 pm
Guglielmo, aiutami sennò spacco il PC co na capocciata!!!!
... prova a studiare QUI (http://www.gammon.com.au/interrupts) ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 12, 2018, 08:47 pm
...dunque utilizzando il codice che segue ho fatto dei test cablando come segue:
- TSOP34838: gnd, +v5, out ai pin 2(int 0) per il sensore front e pin 3(int 1) per il sensore posteriore;
- diodo IR emettitore tramite R 100ohm al +v5 e gnd;
Le barriere sono posizionate a 6 cm di distanza giusto per vedere se legge. Interrompendo il flusso n direzione ant-->post il monitor seriale visualizza dei lavori ma, ritengo pe ril cablaggio su millefori, le letture ogni tanto non avvengono.
Ora passo al codice. L'ho trovato in rete e studiato. Non mi è del tutto chiaro però. L'architettura l'ho capita ni senso generale peroò non capisco quei led1 e led2 sui pin 12 e 13.
Che ne pensate?
Ovviamente il codice dovrà essere utilizzato con i componenti che devo ancora reperire laser e ricevitore laser e/o IR e fotodiodi PIN

Code: [Select]

/*
Fotodiodi o fototransistor sono nominati come attachInterrupt (0, front, CHANGE) collegato
con il pin digitale 2, e, attachInterrupt (1, posteriore, CHANGE) collegato al pin digitale 3
Coloro che vogliono provarlo possono collegare due pulsanti ai pin 2 e 3
I fotodiodi devono avere una resistenza tra 10k e 100kohm collegati al collettore (pin o gamba lunga) e questo al pin digitale
per assicurarsi che quando il raggio di luce viene interrotto, la tensione raggiunga 0 o massa
*/

// #include <LiquidCrystal.h>
 
#define MPS2FPSCOEFF 3.28084
#define LENGTH 0.159             
#define MICRO2SEKCOEFF 1000000

//LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

volatile int stateFront = HIGH;
volatile int stateRear = HIGH;

int led1 = 12;                             
int led2 = 13;                             
int startChrono;
unsigned long startTime, stopTime, elapsed;
double fpsSpeed, mpsSpeed;
 
void setup()
{
  Serial.begin(9600);
  //lcd.begin(16, 2);
  //lcd.setCursor(0, 0);
  //lcd.print("Super Chrono");
  Serial.print("Cronografo");
  //lcd.setCursor(0, 1);
  //lcd.print("by nv");
  delay(700);
  //lcd.clear();
  //lcd.setCursor(0, 0);
  //lcd.print("Initializing...");
  Serial.println("Inizializando");
  delay(700);
 // lcd.clear();
 
  startChrono = 0;
  elapsed = 0;
  fpsSpeed = mpsSpeed = 0;
 
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  /*
  Se tutto ok non cambiare nulla. Diversamente provare a cambiare CHANGE in RISING o LOW in
  attachInterrupt(0, front, "      ") ed in attachInterrup(1, rear, "     ");
  */
  attachInterrupt(0, front, CHANGE); //0 (on digital pin 2) kanske falling/rising/low
  attachInterrupt(1, rear, CHANGE);  //1 (on digital pin 3)
//  attachInterrupt(0, front, RISING); //0 (on digital pin 2) kanske falling/rising/low
//  attachInterrupt(1, rear, RISING);  //1 (on digital pin 3)
  //lcd.setCursor(0, 0);
  //lcd.print("Take a shot!");
  Serial.println("Pronto per sparare?");
}
 
void loop()
{
  //Start counting when interrupted
  if(stateFront == LOW && startChrono == 0)
  {
    startTime = micros();  // Count microseconds since start
    startChrono = 1;       // Set Chrono flag
    digitalWrite(led1, HIGH);
  }
 
  // Stop counting and calculate speed
  if(stateRear == LOW && startChrono == 1)
  {
    stopTime = micros();  // Count microseconds since start
    startChrono = 0;      // Clear Chrono flag
    elapsed = stopTime - startTime;  // Calculate elapsed time (in micros)
 
    digitalWrite(led2, HIGH); // pin 13
    mpsSpeed = (LENGTH*(MICRO2SEKCOEFF)) / elapsed;            // s = v * t, v = s / t
   // fpsSpeed = mpsSpeed * MPS2FPSCOEFF;

    //lcd.clear();
    //lcd.print("Fps: ");
    //lcd.print(fpsSpeed);
    Serial.println("PPS(Piedi al secondo) ");
    Serial.print(fpsSpeed);
    //lcd.setCursor(0, 1);
    //lcd.print("m/s: ");
    //lcd.print(mpsSpeed);
    Serial.println("Metri al secondo ");
    Serial.print(mpsSpeed);
   
    startChrono = 0;
   
    delay(500);
    digitalWrite(led2, LOW);
    digitalWrite(led1, LOW);
   
  }
 
}

void front()
{
  stateFront = !stateFront;
}

void rear()
{
  stateRear = !stateRear;
}
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 13, 2018, 09:30 am
Non sono un programmatore, ma non mi sembra cosi complessa ... in pratica cambia lo stato di due variabili nelle due ISR, e poi le usa per definire nel loop l'inizio e la fine del conteggio in microsecondi (o per essere precisi, di 4 in 4 microsecondi, dato che se non ricordo male, la massima risoluzione di micros e' 4) ... mi chiedo se non sarebbe piu semplice e veloce impostare invece direttamente tali valori nelle ISR, cioe' usare due variabili volatile unsigned long e fare variabile = micros direttamente nella ISR, evitando cosi tutto il "giro" di controlli nel loop (ma qui serve qualcuno che se ne intende, uno a caso, tipo ad esempio Guglielmo :D che ci dica quale delle due e' la piu veloce) ... led1 e led2 mi sembra che li usa semplicemente per accendere i due led quando premi il pulsante per fare la lettura e li spegne subito dopo, probabilmente solo per risparmiare batteria ...il resto, da controllare, sono solo calcoli per convertire i microsecondi in tempo e velocita', conoscendo ovviamente la distanza fra i due fotodiodi ... ed in energia conoscendo il peso del pallino ...

Anche gli interrupt io personalmente userei rising o falling, quello che viene letto meglio, e non change, perche' tecnicamente e' scorretto usare change ... con change ogni pallino viene letto due volte da ciascun fotodiodo, quando interrompe il raggio e quando lo libera, e se il pallino e' sufficentemente lento questo introduce un'ulteriore errore, cambiando due volte lo stato della variabile ... in pratica rischi di invertirla due volte, riportandola allo stato iniziale e bloccando il tutto ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 13, 2018, 01:58 pm
Grazie dei preziosi consigli. In effetti anche a me non sembra complessa; dopo averla studiata l'ho compresa ma mi manca la capacità di realizzarla autonomamente. Sentiamo i consigli di qualche esperto di programmazione.
Un istruzione che non mi è chiara è la condizione LOW di questo rigo.

Code: [Select]
if(stateFront == LOW && startChrono == 0)

O meglio l'ho compresa ma ho dubbi sul reale stato LOW.

Le prove fatte con i TSOP non sono soddisfacenti. Le letture non coerenti e si stranmisce e genera letture a caso.
Vorrei provare con due fotodiodi a due piedini visto che il TSOP ne ha tre...come collego il fotodiodo?
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 13, 2018, 04:36 pm
... uno a caso, tipo ad esempio Guglielmo ...
Io collegherei i due fotodiodi a due pin INT facendo si, come hai detto, che scatti solo su uno dei due fronti (se normalmente il segnale è HIGH e va LOW al passaggio del pallino, lo farei sul fronte di discesa, in caso contrario sul fronte di salita).

In entrambe la ISR farei solo l'assegnazione di una variabile volatile (intendo una diversa variabile per ogni ISR) al valore di micros() al momento dello scatto dell'interrupt.

Nel loop() se trovo entrambe le variabili diverse da zero, faccio la differenza per calcolare il tempo e le azzero di nuovo in attesa della nuova misura.

La parte software è molto semplice, quella più delicata è quella hardware ... ::)

Guglielmo

P.S.: Convermo che su un AVR a 16MHz la risoluzione di micros() è 4 μsec.
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 13, 2018, 05:18 pm
> Guglielmo: quindi mi confermi anche tu che, come da mia impressione, sarebbe meglio fare direttamente le assegnazioni nelle ISR, invece che come in quel programma ? ... a me dava l'idea di una complicazione inutile fatta cosi, ma non ero sicuro se fosse stato fatto perche' assegnare il valore di micros ad una unsigned long richiedesse piu tempo che invertire uno stato di una byte, o per chissa' quale altra ragione ...

Pensavo, come hai detto anche tu, che si puo far fare al loop solo il confronto finale ... magari come "finezza" e per risparmiare batterie, ci si potrebbe aggiungere un pulsante che azzera le due variabili ed accende i led, come "start" per la lettura ... tipo, nel setup le definisci entrambe a valore 1 (valore che sara' molto improbabile abbiano mai in seguito), per cui il micro puo stampare il messaggio iniziale, o la richiesta di premere start, eccetera, quando le trova cosi ... quando premi start, le azzeri, accendi i due led, aspetti un mezzo secondo, dai la conferma dello start (magari si aggiunge anche un buzzer piezo per i vari bip) ed inizia un conteggio di, mettiamo, 30 o 60 secondi ... se nulla succede entro quel tempo, resetti tutto al valore iniziale e spegni i led (cosi risparmia anche batteria), se invece passa il pallino, quando non valgono piu zero entrambe il loop puo spegnere i led, fare i calcoli e visualizzarli, e mettersi in attesa di un'altra pressione del pulsante per la successiva lettura ... ci sta ?
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 13, 2018, 05:20 pm
...
Le prove fatte con i TSOP non sono soddisfacenti...
Non lo saranno mai ... i TSOP non sono fotodiodi, ma ricevitori integrati con anche altra elettronica dentro ... sono tipo 10000 volte piu "lenti" di un vero fotodiodo, se usati in quel modo ...
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 13, 2018, 05:36 pm
... ci sta ?
... se si ha necessità di alimentare il tutto a batterie e di risparmiare corrente, sicuramente si può fare una cosa come quella che dici :)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 13, 2018, 05:43 pm
Ho immaginato di si, perche' in fondo parla di un'oggetto da collegare alla volata della carabina, probabilmente in poligono o su un campo di tiro sportivo, dove non e' che ti mettano a disposizione tante prese di corrente ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 13, 2018, 07:02 pm
Io collegherei i due fotodiodi a due pin INT facendo si, come hai detto, che scatti solo su uno dei due fronti (se normalmente il segnale è HIGH e va LOW al passaggio del pallino, lo farei sul fronte di discesa, in caso contrario sul fronte di salita).



La parte software è molto semplice, quella più delicata è quella hardware ... ::)

Guglielmo

P.S.: Convermo che su un AVR a 16MHz la risoluzione di micros() è 4 μsec.
Comincerei a stabilire qualche punto fermo:
HARDWARE:
utilizzare due led IR e due fotodiodi PIN (int 0 ed int 1). A livello elettrico i led IR alimentati continuamente magari con una resistenza verso il positivo per limitare l'assorbimento..diciamo 100ohm.
Per i fotodiodi posso provare il collegamento a polarizzazione inversa suggerito da etemenanki ((catodi dei diodi al +5V, anodi ai pin di arduino, resistenze fra i pin e massa come pull-down e per polarizzare inversamente il diodo). Io credo che il segnale sia sufficente altrimenti amplifico con un BC337 o simile.
Ricordate che sono cmq in attesa di ricevere i laser tx e rx. Provo a buttare giù uno schema elettrico

SOFTWARE:
qui vi chiedo di farmi comprendere le vostre osservazioni perchè non mi sono del tutto chiare laddove Guglielmo recita:

In entrambe la ISR farei solo l'assegnazione di una variabile volatile (intendo una diversa variabile per ogni ISR) al valore di micros() al momento dello scatto dell'interrupt.

Nel loop() se trovo entrambe le variabili diverse da zero, faccio la differenza per calcolare il tempo e le azzero di nuovo in attesa della nuova misura.
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 13, 2018, 09:08 pm
SOFTWARE:
qui vi chiedo di farmi comprendere le vostre osservazioni perchè non mi sono del tutto chiare ...
... cosa non ti è chiaro ? ? ?

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 13, 2018, 10:09 pm
il discorso dell'ISR:

in entrambe la ISR farei solo l'assegnazione di una variabile volatile (intendo una diversa variabile per ogni ISR)
qual'è l'ISR :-(
e il concetto successivo:
Nel loop() se trovo entrambe le variabili diverse da zero, faccio la differenza per calcolare il tempo e le azzero di nuovo in attesa della nuova misura.

PS: sto provando il codice con due tastini o facendo variare lo stato degli interrupt ma funziona strano...il primo valore è un valore coerente poi salta ad un numero a 8 cifre come se si stranisse
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 14, 2018, 09:30 am
Molto grossolanamente, giusto per dare un'idea:

Code: [Select]

volatile unsigned long t1, t2;
unsigned long deltaT;
...
...
void ISR1(void) {
   t1 = micros();
}

void ISR2(void) {
   t2 = micros();
}
...
...
void setup () {
...
...
t1 = 0;
t2 = 0;
...
...
}

void loop() {
   ...
   ...
   if ((t1 != 0) && (t2 != 0)) {
      deltaT = t2 - t1;
      t1 = 0;
      t2 = 0;
   }
   ...
   ...
}

Nel caso di uso di pulsanti, per provare, DEVI necessariamente prevdere un debounce hardware (rete R/C in ingresso) o non funzionerà mai.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 14, 2018, 05:25 pm
Ok grazie Guglielmo come al solito cercherò di decriptare le tue informazioni ed integrarle nel codice.

SI avevo pensato al debounce...mi tocca farlo.
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 14, 2018, 05:41 pm
Lato hardware ... 100 ohm sono troppi per i led ... calcola la resistenza per i led in modo da dargli circa 5mA, e sei a posto ... ricorda che sono a pochi millimetri dai fotodiodi, non serve che illuminino la stanza ;) ... VCC, meno la VF del led, diviso 0.005 ... se usi una batteria da 9V, ad esempio, 7.7/0.005=1540 ohm, il valore piu vicino e' 1500 (1k5), che va bene lo stesso ... ;)

Per il debounce (che pero' con i fotodiodi NON dovrai usare, solo con i pulsanti nei test), metti 100n fra il pin e la massa, ed una resistenza da 100 ohm in serie ai pulsanti, e sei a posto ... quanto al numero alto, ricordati che stai lavorando con micros(), non con millis() ... significa un milione al secondo, non mille ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 14, 2018, 06:12 pm
Ok grazie Guglielmo come al solito cercherò di decriptare le tue informazioni ed integrarle nel codice.
Lo scopo dei miei post è esattamente quello ... REGOLAMENTO (http://forum.arduino.cc/index.php?topic=149082.0), punto 16.13   :D

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 14, 2018, 08:53 pm
Gugliemo...ti odio lo sai...semmai tu dovessi avere bisogno delle mie competenze saranno volatili per diabetici  :smiley-twist:  :smiley-twist:  :smiley-twist:  :smiley-twist:  :smiley-twist:  :smiley-twist:

...cmq ho già messo il debounce e funziona. Devo solo variare un pò il menù e cercare di aggiungere qualcosina oltre che implemetare la variante Guglielmo-uno.
Appena arrivano gli SFH ed i laser passo a prove pratiche
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 14, 2018, 09:00 pm
Gugliemo...ti odio lo sai...semmai tu dovessi avere bisogno delle mie competenze saranno volatili per diabetici  :smiley-twist:  :smiley-twist:  :smiley-twist:  :smiley-twist:  :smiley-twist:  :smiley-twist:
(http://www.nikonland.eu/forum/public/style_emoticons/default/post-42-1201873916.gif)

Guglielmo

P.S.: Di che ti occupi esattamente? ... non lo hai messo nella presentazione  ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 14, 2018, 09:38 pm
 :smiley-cool:

tra le tante cose ..so usare molto bene gli esplosivi.
Non mi distrarre che sto studiando...ed ho tante domande cui rispondere
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 15, 2018, 03:30 pm
Gugliemo ed Etemenanki se potete dare un occhiata...l'ho ripulito un pò e cercato di implementare quanto suggerito da Guglielmo. Devo verificare però sia la sequenza codice che gli algoritimi di calcolo che sono i valori sono incoerenti".

PS: ho sostituito il post precedente
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 15, 2018, 03:37 pm
Perché non fai le cose per passi piccoli ? ? ?

Perché cercare già di implementare tutta la parte LCD e di calcolo senza sapere prima se funziona bene la parte delle ISR e la rilevazione dei dati ? ? ?

Limitati al mometo alla gestione delle due ISR e alla visualizzazione dei risultati sulla seriale e poi, mano mano, implementi tutto il resto che servirà ... verdai che farai qualche cosa di più modulare e semplice. :)

Detto questo, intanto ... 

1. perché deltaT l'hai messa tra le volatili (https://www.arduino.cc/reference/en/language/variables/variable-scope--qualifiers/volatile/) ? Non viene mica aggiornata/usata in una ISR ...
2. perché continui a fare l'attachInterrupt sul CHANGE ?

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 15, 2018, 03:40 pm
...sono alto 1,85 faccio passi lunghi. Battute a parte grazie e sono al momento contento.
Prendo atto delle tue obiezioni.
deltaT: L'avevo messa nelle volatile per raggruppare le variabili...magari non ha senso farlo.
CHANGE mi sembrava più flessibile. Ora sto provando con pulsanti (debounced) ed anche con FALLING gira bene.
Si le ISR non mi sono chiare concettualmente.
Vi aggiorno.
Potresti farmi comprendere la differenze (miglioramnti) tra i due codici? ---il mio primo e quest'ultimo?
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 15, 2018, 03:54 pm
Se guardi il perché si usa la parolina "volatile" (ti ho messo apposta il link) scopri perchè, per deltaT, non serve ;)

Con CHANGE hai due interrupt per ogni LED per ogni passaggio, invece a te ne serve uno, quindi, verifica in condiziioni di riposo come è il segnale e scegli quello opportuno che indica la variazione del segnale.

ISR sono funzioni che vengono automaticamente richiamate, interrompendo qualsiasi cosa la MCU stia facendo, allo scatenarsi di un certo evento. Al termine della ISR il controllo ritorna al programma nel punto in cui era stato interrotto. Servono per "servire" eventi che richiedo immediata attenzione senza aspettare che il programma vada a verificare (nel loop()) se un certo pin è in un modo o in un altro.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 15, 2018, 08:47 pm
...nella struttura del codice è importante la posizione del blocco ISR?...questo:

}
void ISR1(void) {
  t1 = micros();
}
void ISR2(void) {
  t2 = micros();
}
void loop()
{

...ho provato a spostarlo prima e dopo il void setup e sembra nulla cambi.
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 15, 2018, 09:05 pm
No, nell'IDE di Arduino NON ha importanza, tanto poi lui fa come gli pare :D :D :D

Nella pratica è buona norma dichiare le funzioni prima di usarle (... o, quantomeno, dichiarare i loro "prototipi").
Le ISR sono poi dei casi particolari ed è buona cosa, metterle sempre in testa la codice, prima del programma vero e prioprio (se tu scrivessi fuori dell'IDE, in 'C', ti direi che è bene metterle prima del main(), nel caso del IDE, se le metti prima del setup(), in testa, va benone).

Guglielmo

P.S.: Nota che le ISR sono solo delle funzioni che vengono richiamate in un modo particolare, ma sempre come funzioni le devi pensare.
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 15, 2018, 11:13 pm
Guglielmo ed Etemenanki grazie per i consigli che seguirò.
Attendo ora alcuni componenti hardware per vedere se tutto funzionerà come pensato.
Se tutto andrà bene vorrei inserire una lettura media dopo 10 tiri...immagino dovrò lavorare di array in cui immagazzinare i valori da mediare;
Un menu per inserire il peso del piombino...qui diventa più complessa

Attendo vostre indicazioni per procedere.
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 16, 2018, 09:10 am
Se tutto andrà bene vorrei inserire una lettura media dopo 10 tiri...immagino dovrò lavorare di array in cui immagazzinare i valori da mediare
Perchè? Salvo che non ti interessi avere i singoli valori separati, puoi semplicemente sommare le 10 letture ed alla fine dividere per 10. Ovviamnete la somma deve rientrare in un unsigned long, ma non credo che con 10 misure valide ci siano problemi ;)

Un menu per inserire il peso del piombino...qui diventa più complessa
Prevederei una serie di valori fissi e permetterei solo la selezione tra quelli previsti.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 16, 2018, 04:03 pm
...provo ad aggiornare il codice.
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 16, 2018, 05:01 pm
... sommare le 10 letture ed alla fine dividere per 10...
Presumo che micros() vada il overflow e ricominci da zero con lo stesso valore di millis(), quello della unsigned long ... solo, 1000 volte piu velocemente, essendo microsecondi ... che tu sappia, micros puo essere "azzerato"  alla partenza di ogni misura, senza causare problemi al funzionamento di tutto il resto ? ... so che azzerare millis() sarebbe da non fare mai, ma non mi ricordo se vale anche per micros() ...

Altrimenti bisogna probabilmente prevedere un controllo anche per il caso (molto improbabile, ma non impossibile), che le due letture accadano una prima ed una dopo l'overflow, il che porterebbe ad un valore 1 molto superiore al valore 2 ... anche se si puo comunque risolvere, o si scarta la lettura come errore, o si calcola il valore tenendo conto dell'overflow ...

Una cosa, molto brutalmente, tipo ad esempio:

Code: [Select]

...
if(t1<t2)
  {
  tempo=t2-t1;
  }
else
  {
  tempo=t2+(4294967296-t1)
  }
...


cosi dovrebbe sempre dare il risultato corretto ... voglio dire, mettiamo che la misura sia 100, per semplicita' ... l'overflow capita a 4294967295 ... se mi capitasse di fare una lettura "in mezzo" all'azzeramento, potrei ritrovarmi con T1 = 4294967245, e dopo 100 mcrosecondi, con T2=49 (partendo da zero, 50 diventa 49) ... se cosi fosse, l'else mi darebbe 49+(4294967296-4294967245), cioe' 49+51, che fa comunque 100, alla faccia dell'overflow ... o sbaglio ?
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 16, 2018, 05:14 pm
azz...

Nel frattempo sono arrivati i fotodiodi PIN SFH203 ora monto il circuito.
Etemenanki...immagino un piedino vada verso il PIN interrupt...l'altro va a GND o +Vcc?
Ci va qualche resistenza?
Catodo al +Vcc ed anodo al PIN o serve altro? resistenze pullup/down
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 16, 2018, 05:17 pm
Etem, per micros() valgono le stesse regole di millis(), sempre degl interi, NON segnati a 32 bit sono, per cui vale sempre quanto Leo spiegava molto bene  QUI (http://www.leonardomiliani.com/2012/come-gestire-loverflow-di-millis/).

Ovviamente, la somma per fare la media, si intende la somma dei deltaT e quindi il discorso non ha nulla a che vedere ...

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 16, 2018, 05:20 pm
la somma dei deltaT o della velocità rilevata (mpsSpeed) ?
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 16, 2018, 05:28 pm
Io, per minimizzare l'errore, sommerei i deltaT di 10 prove e dividerei per 10 così da avere il tempo di attraversamento delle due mire mediato e su cui fare poi tutti i calcoli ... ::)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 16, 2018, 05:29 pm
Ci provo...io stavo lavorando sulle velocità
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 16, 2018, 05:35 pm
... ricorda sempre che un unsigned long arriva a 4294967295 che, nel caso di microsecondi, sono circa 4295 secondi (71.5 minuti circa). 

Dubito fortemente che la somma di 10 misure possa superare tale valore, ma se una misura andasse male ... e fosse decisamente impossibile, meglio scartarla per non alterare la media e creare possibili condizioni di errore.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 16, 2018, 06:05 pm
catodo al vcc, al massimo con una resistenza da 100 ohm per sicurezza in serie, ma non dovrebbe servire ... anodo al pin ... resistenza di pull-down da definire, prova con 10K, fra pin e massa, che serve anche per polarizzare inversamente il fotodiodo ... da usare solo i pin con interrupt, D2 e D3, ovviamente ... i fori per i diodi ed i led, con gli assi ad una decina di cm l'uno dall'altro, dovrebbero essere piu che sufficenti ... 
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 16, 2018, 06:31 pm
Più tardi scendo in garage a sferruzzare
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 16, 2018, 08:34 pm
....qualcosa non va nell'hardware...credo che il segnale sia troppo basso per essere rilevato da arduino. Dovrò aggiungere un transistor o un chip dual amp tipo LM 358
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 17, 2018, 09:07 am
bgiorno userò un lm358 da une della due seguentio configurazioni:
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 17, 2018, 09:36 am
La prima, in teoria, dovrebbe essere un po piu stabile e reagire un po piu velocemente ... la seconda amplifica molto, quindi potrebbe amplificare di piu anche eventuali disturbi ... entrambe comunque funzionano (e nella prima, se devi aumentare l'amplificazione, basta aumentare la resistenza da 180K, oppure metterci direttamente in serie un trimmer da 470K in modo da poterla regolare a piacere)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 17, 2018, 10:12 am
..ho un 348 nei cassetti. Provo con questo usando solo due degli amplificatori
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 17, 2018, 10:43 am
Male che vada, giusto per non lasciarli inutilizzati, puoi usare gli altri due come buffer di corrente (segnale nell'ingresso non invertente, ingresso invertente collegato direttamente all'uscita) ... oppure farci un comparatore per migliorare il fronte di commutazione (il circuito con singolo operazionale ti da un'uscita analogica proporzionale alla quantita' di luce, con un comparatore avresti l'uscita on-off come un circuito digitale)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 17, 2018, 12:13 pm
Qui la cosa diventa seria...provo prima con due amp e poi con il comparatore ma ho bisogno dello schema elettrico
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 17, 2018, 04:30 pm
c'è qualcosa che non va. Ho provato con lm348 configurato con due amp ma non funge.
Io sto alimentando LM348 con i 5 Vcc ...ma non vorrei che non fossero sufficenti....
Etemenanki che mi suggerisci?
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 17, 2018, 04:31 pm
... intanto metti lo schema esatto dei collegamenti che hai fatto, così si può dare un'occhiata ;)

Guglielmo

P.S.: Basta anche un disegno ben fatto ... :)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 17, 2018, 04:37 pm
eccolo è quello delpost precedente, ovviamente quello con l'amplificatore solo che invece del 358 ho il 348 dove ho sfruttato solo due amp e l'ho alimentato con i 5vcc
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 17, 2018, 04:45 pm
... la resistenza da 1MΩ mi sembra troppo altra ... ma aspettiamo Etem ...

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 17, 2018, 04:55 pm
Occhio che il 348 non e' un "quadruplo 358", e' un quadruplo 741, e quelli con la singola alimentazione non e' che vadano molto bene ... dovresti usare un paio di 358, uno per diodo ...

EDIT: dimenticavo, inoltre NON e' un rail-to-rail, per cui alimentato a 5V l'uscita potrebbe rimanere anche a circa 2V, invece di andare a zero ... e 5V per il "vecchio" 741, se non ricordo male, sono proprio il minimo ...

In cosa non ti funziona, comunque ... resta sempre ad 1, sempre a 0, oscilla ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 17, 2018, 05:11 pm
...CHEPPPPPPPPPALLL...................mi tocca cercare i 358
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 17, 2018, 05:32 pm
heh ... sono le "gioie" dell'hobbysta elettronico ... :D
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 17, 2018, 06:52 pm
Intanto, gia che c'ero, ti ho buttato giu al volo un possibile schema con i due operazionali ... primo stadio, la stessa configurazione del tuo circuito, solo con l'amplificazione variabile, secondo stadio, comparatore non invertente con soglia regolabile ed isteresi minima per evitare oscillazioni ... non posso provarlo perche' non ho i tuoi fotodiodi, potrebbe essere necessario modificare il valore della R di polarizzazione del diodo, quella da 820K, magari funziona anche cosi, ma si puo sostituire con una R da 100K con in serie un trimmer da 1M, per avere la possibilita' di provare piu comodamente diversi valori ...

(https://forum.arduino.cc/index.php?action=dlattach;topic=547693.0;attach=278276)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 17, 2018, 07:21 pm
ci provo ma mi sa che sulla breadboard non ce la faccio...domani prendo i 348
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Oct 17, 2018, 08:38 pm
...CHEPPPPPPPPPALLL...................mi tocca cercare i 358
ci provo ma mi sa che sulla breadboard non ce la faccio...domani prendo i 348
:smiley-mr-green:  :smiley-mr-green:  :smiley-mr-green:
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 17, 2018, 09:39 pm
:smiley-mr-green:  :smiley-mr-green:  :smiley-mr-green:
me so ncasinato co li numeri :-)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 18, 2018, 09:30 am
Bgiorno al forum...

Etemenanki...oggi dovrei avere i 358. Confermi il collegamento come dallo schema1 del post precedente o  ritieni che si debba variare qualcosa?

Nel frattempo se ce la faccio provo il tuo schema per il 348.

Grazie  (speriamo che funzioni)
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 18, 2018, 09:58 am
Il mio schema e' per i 358 ... c'e' anche scritto ... ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 18, 2018, 02:18 pm
...sorry....  :smiley-confuse:
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 19, 2018, 03:39 pm
...c'è qualcosa che non va a livello hw evidentemente il segnale è basso. Ho provato varie combinazioni di valori resistivi per la polarizzazione del fotodiodo ma non viene letto alcun valore.
Boh....
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 19, 2018, 03:44 pm
... non è che per caso l'hai montato la contrario ? ? ?

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 19, 2018, 04:04 pm
...c'è qualcosa che non va a livello hw evidentemente il segnale è basso. Ho provato varie combinazioni di valori resistivi per la polarizzazione del fotodiodo ma non viene letto alcun valore.
Boh....
Scusa, cosa intendi esattamente con "il segnale e' basso" ? ... che non commuta da luce a buio e viceversa, oppure che il segnale e' a LOW quando dovrebbe essere a HIGH ?
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 19, 2018, 05:40 pm
Grazie per le risposte Gugliemo ed Etemenanki...dunque ad oggi ho effettuato prove di vario genere sia ocn il 348 che con il 358 (montato quest'ultimo sia uno per diodo che uno per entrambi i diodi). Lo schema  elettrico è quello che ho condiviso che riflette anche quello suggerito da Etemenanki. Non ho ancora provato quello "full" di Etemenanki perchè per quello vorrei NOn usare la breadboard.
I led IR funzionano i fotodiodi sono nuovi e ne ho provati ben 4.
I collegamenti sono talmente semplici che ormai li ho imparati a memoria.
L'alimentazione viene dai 5vcc di Arduinio con fonte esterna, non la USB del PC.
Il chip ho provato sia ad alimentarlo che a NON alimentarlo, era giusto una prova in quanto nel circuito da me postato l'alimentazione non era presente mentre lo era in quella di Etemenanki.
I fotodiodi funzionano perchè in un applicazione per leggere gli ostacoli (rifrazione IR) funzionano anche se effettivamente ocn valori letti da Arduino più bassi di quelli citati nell'esempio.
Quindi, oscurando in maniera diversa i sensori - azione che simulata con tastini funziona - non viene rilevata alcuna lettura. Ovviamente ho variato anche la condizione CHANGE/RISING/FALLING/LOW
Ho provato anche a variare il valori delle resistenze per ottenere un guadagno maggiore....nisba!
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 19, 2018, 05:50 pm
Ma quindi le ISR NON scattano ...
... sicuro sia un problema HW e non un codice errato? Scrivi un programma minimo, come ti avevo già detto, con le SOLE ISR e una stampa dei valori su seriale.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 19, 2018, 05:59 pm
Gugliemlo, a mio parere, le ISR scattano perchè simulando HIGH/LOW con un tastino (debounced) ho lettura sia sulla seriale che su LCD.
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 19, 2018, 06:01 pm
Hai un oscilloscopio? Collegalo sugli ingressi e vedi l'ampiezza del segnale ...

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 19, 2018, 06:24 pm
Non ce l'ho...ne avevo uno piccolino venduto!!!
Cmq ho appena riprovato e con il pulsante va benissimo. Debounce come da foto

(https://preview.ibb.co/jAqto0/debounce.png) (https://ibb.co/iOX680)
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 19, 2018, 06:30 pm
... naturalmente per il segnale dai fotodiodi il debounce hw lo hai eliminato vero ?

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 19, 2018, 06:36 pm
si certo Guglielmo. Non so che fare. Ora ho ordinato anche dei moduli amplificatori con i 358 onboard che hanno amplificazione regolabile...ma devono arrivare dalla cina.
Strana sta cosa però Tutti i vari sketch e circuiti provati siora con gli IR e fotodiodi vanno (ovviamnet non mi riferisco a sensori velocità)
guarda cool tastino simulando
(https://preview.ibb.co/cdohFf/index.jpg) (https://ibb.co/fMZdo0)
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 19, 2018, 06:55 pm
... per far scattare l'interrupt, su un Arduino alimentato a 5V, il segnale deve andare o sopra i 3.3V (HIGH) o sotto i 0.7V (LOW) altriemnti è facile che l'interrupt non venga attivato.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 19, 2018, 07:04 pm
appunto devo verificare i valori con il multimetro ed eventualmente amplificare maggiormente perchè credo che ora sia basso il segnale...vediamo se riesco
Title: Re: CRONOGRAFO BALISTICO
Post by: zoomx on Oct 19, 2018, 09:39 pm
si certo Guglielmo. Non so che fare. Ora ho ordinato anche dei moduli amplificatori con i 358 onboard che hanno amplificazione regolabile...ma devono arrivare dalla cina.
Se sono quelli che ho preso io hanno un condensatore in ingresso per eliminare la continua. Non so se vanno bene lo stesso.
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 20, 2018, 03:42 pm
@ZOOMIX: grazie ri saprò dire.

Ho fatto delle letture con il multimetro. Se NON alimento il chip ottengo valori falling da 440mV a 250mV
Se alimento il chip i valori scendono sulle decine.
Cè qualcosa che non va nell'amplificazione...è troppo debole.Cmq l'accoppiata diodo IR e fotodiodo funziona in quanto la lettura varia all'interruzione del fascio. Ho provato anche a fare un alettura analogica ed effettivamente mi da quei valori
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 20, 2018, 04:24 pm
... Se NON alimento il chip
... il circuito non funzionera' mai ;)

Di certo ci saranno valori da provare e modificare (vedro' se recupero un fotodiodo da qualche parte), ma senza l'alimentazione, un'opto di sicuro non lavora, ne bene ne male ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 20, 2018, 08:49 pm
... il circuito non funzionera' mai ;)

Di certo ci saranno valori da provare e modificare (vedro' se recupero un fotodiodo da qualche parte), ma senza l'alimentazione, un'opto di sicuro non lavora, ne bene ne male ;)
...si sono consapevolissimo era giusto una nota tecnica. Come mia però se alimento il chip il voltaggio in uscita sta sulle decine mentre se NON lo alimento sta sulle centinaia??????

senza alimentare il chip arriva 0,59 con fascio integro...0.270 con fascio interrotto
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 21, 2018, 10:00 am
...bgiorno...ho provato anche questa configurazione anche se per un fotodiodo diverso

(https://image.ibb.co/iyO1BL/LM358-circuito-amplificatore-da-provare.png) (https://imgbb.com/)

ed ora provo questa:

(https://image.ibb.co/mcq1d0/test-amp.jpg) (https://imgbb.com/)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 21, 2018, 11:54 pm
funziona con questo, il led in uscita mi serviva solo a scopo tester:

(https://preview.ibb.co/d5oHLf/circuito-ok.jpg) (https://ibb.co/kXL8RL)
Title: Re: CRONOGRAFO BALISTICO
Post by: zoomx on Oct 22, 2018, 09:41 am
Questo è lo schema del modulo che ho preso io, che credo sia identico a quello preso da te.
Non so se possa andare bene anche eliminando il condensatore.
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 22, 2018, 10:23 am
funziona con questo, il led in uscita mi serviva solo a scopo tester:
...
E' la parte comparatore diretta, quella ... se il segnale del fotodiodo riesce a farlo commutare, allora va benissimo anche cosi senza l'altro operazionale per amplificarlo ;)

Se da instabilita' o tende ad oscillare al passaggio dell'oggetto, dovrebbe bastare aggiungere una resistenza (1M o simile) fra il pin di uscita e l'ingresso positivo ... feedback positivo, aggiunge isteresi ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 22, 2018, 10:41 am
bgiorno a tutti.
Etemenanki riesco a seguirti poco nelle spiegazioni tecniche...tuttavia ora se il fascio viene interrotto (lascio cadere i piombini a mano) legge ed infatti i led (ne ho messi due per prova) commutano(da accessi passano a spenti) ed ho sia velocità che joule. Sto utilzzando l'interrupt su HIGH.
Però facendo delle prove di tiro non "vede" il piombino. Oggi faccio qualche prova sia con la pistola che con la carabina allineando meglio l'insieme. Se non vedesse il piombino vorrei mettere un altro led IR accanto a quello che c'è per allargare il fascio. Secondo te lascio un solo ricevitore?
Cmq aspetto anche i laser TX/RX x vedere conme reagisce.
PS: che differenza c'è trai due circuiti in parole povere?...altrimenti dovrò ricorrere all'ngegnere elettronico di casa per farmelo spiegare :-)
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 22, 2018, 11:32 am
Il circuito con i due operazionali, ha solo che il primo amplifica il segnale ed il secondo fa da comparatore ... con il solo comparatore, se il fotodiodo riesce a farlo scattare lo stesso, va bene lo stesso, il primo sarebbe servito solo se il segnale non era sufficente a farlo scattare ...

Per il fatto che non li legga sparando, non credo serva allargare il raggio, sembra piu un problema di velocita' di lettura ... servirebbe vedere con un'oscilloscopio che segnale hai quando passa il piombino, perche' se per qualche motivo non e' abbastanza veloce a commutare, poi il comparatore non ti da segnale in uscita ... ma qui purtroppo senza oscilloscopio si fa poco ... puoi provare a mettere al posto della resistenza da 100K una da 10K con un trimmer da 100K in serie, per cambiare la corrente di polarizzazione, ma ripeto, servirebbe vedere il segnale in uscita dal diodo ... non conosci nessuno che ti possa prestare un'oscilloscopio o aiutare a fare i test ?
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 23, 2018, 08:11 am
Non ho l'oscilloscopio....avevo quello piccolino il DSO138 ma l'ho regalato :-(
Cmq ho trovato in rete anche un altro sketch e l'ho adattato al mio circuito: funziona anche quello.
Unica cosa questa poca sensibilità al passaggio del piombino. Devo verificare bene l'allineamento.
Vi farò sapere.
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 23, 2018, 08:13 pm
Gugliemo eed Etemenanki....intanto grazie per il supporto e per avermi fatto imparare nuove cose.
Sono soddisfatto degli sketch che ho provato e della parte elettronica che risponde bene.
Devo solo fare un aprova in attesa dei moduli laser. Allargare il fascio IR...quindi vorrei montare due fotodiodi e/o due Diodi IR...domanda tecnica...come vanno inseriti?...parallelo o serie????...o meglio ne metto un altro blocco sfruttando il secondo ampli?...ovvero con ogni LM mi piloto due coppie IR/fotodiodi.
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 24, 2018, 09:28 pm
funziona...ecco i test. Piombino da 0.49 e 0.52 rispettivamente

(https://preview.ibb.co/gCpxtA/test-shot-1.jpg) (https://ibb.co/feDOYA)


(https://preview.ibb.co/kuRtYA/test-shot-2.jpg) (https://ibb.co/bYtJ0q)
jab deep jale aana song (https://poetandpoem.com/meaning-of-jab-deep-jaley-aana-by-ravinder-jain)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 24, 2018, 09:36 pm
Gugliemo, Etemenanki devo ora inserire un blocco per l'inserimento del peso piombino e reset...mi date una mano...vero?
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 24, 2018, 09:40 pm
Gugliemo, Etemenanki devo ora inserire un blocco per l'inserimento del peso piombino e reset...mi date una mano...vero?
Tu comincia ad impostare la cosa (separatamente in un programmino a parte che poi integri quando funziona) e quando hai difficoltà chiedi ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 24, 2018, 09:49 pm
in un programmino a parte completo di setup e loop?

solo una cosa Guglielmo...il blocco per il reset lo inserirei nel loop alla fine mentre l'impostazione peso nel set up...ci sono?

E grazie :-)
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 24, 2018, 09:55 pm
Cosa intendi per blocco per il "reset" ? ? ? :o :o :o

Una volta avviato cosa vuoi resettare? Al limte dovrai chiedere se si vogliono cambiare impostazioni e accettare una nuova configurazione via menu ...

Parti, configuri, controlli se ci sono pressioni di tasti per il menu, controlli se T1 e T2 sono != da zero, fai quello che devi fare e continui a girare. Se premo dei tasti per il menu, presenti le scelte e mi fai scegliere ... e torni a girare.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 24, 2018, 10:21 pm
...te pare facile.

 
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 25, 2018, 10:04 am
Allargare il fascio IR...quindi vorrei montare due fotodiodi e/o due Diodi IR...
Scusami, ma non c'e' necessita' di farlo, con la tua configurazione, anzi, semmai l'opposto ...

Ho visto che ora ti funziona, ma lasciami spiegare lo stesso, che puo essere utile anche per altri che volessero fare la stessa cosa ... se mai tu volessi in futuro realizzare un traguardo portatile NON montato sulla carabina, allora si, dovrai trovare il modo di leggere il pallino in una "zona" anziche' in un punto come ora ... ma adesso stai usando un sistema che rimane solidale con la canna, in cui la traiettoria del pallino puo essere una sola ... al massimo, potrebbe portarti qualche vantaggio lo STRINGERE il raggio, per essere sicuro che il pallino lo interrompa completamente, e non allargarlo ... nelle tue condizioni, anzi, allargarlo vorrebbe probabilmente dire crearsi piu problemi, magari mancate letture perche' il fascio IR piu largo, passando parzialmente di fianco al pallino mantiene illuminato il fotodiodo un po troppo quando passa il pallino, o roba simile ... ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 25, 2018, 06:04 pm
Ete grazie per i chiarimenti. Cmq non ho allargato la sezione ma aggiunto sullo stesso piano (stessa fetta per intenderci) una ulteriore cella ortogonale a quella esistente.
Poi giocando con le resistenze ho verificato che con quella da 10k c'è un bel delta nel voltaggio e quindi il processore legge bene e veloce; con quella da 100k il delta era molto minore e non lavorava bene.
Mi rimane da comparare il cronografo con un altro per verificare l'attendibilità delle letture.
Cmq sia le letture sono identiche anche se effettuate con altro sketch con architettura diversa dal mio.
Test ancora in corso con affinamento del codice per inserimento peso piombino dal menù.
Grazie ancora. 
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 25, 2018, 11:21 pm
Gugliemo...ci sto sbattendo la testa da due giorni, ieri sono andato a ninna a l'una e oggi non sono nemmeno andato in palestra.,.ho incubi, mangio poco ed il pistolino non si alza  :smiley-mad:  :smiley-cry:  :smiley-cry:  :smiley-cry: ma non riesco a costruire il codice per inserire il peso...dammi un indicazione per partire  8) please
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Oct 25, 2018, 11:49 pm
scusa ma da dove lo vuoi inserire il peso?
potresti farlo con due pulsanti cha aumentano e diminuiscono una variabile (che è il tuo peso) ad ogni pressione e ad ogni variazione lo stampi sull'lcd, così verifichi quanto vale poi o con un terzo pulsante che fa da conferma o semplicemente attendendo che non vi siano più variazioni del valore per diciamo 5 secondi, accetti il peso inserito
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 26, 2018, 08:55 am
Ma le leggi le cose che ti scrivo ?

Il setup() viene eseguito UNA sola volta all'inizio, quindi ... che ci fai ?

Hai il loop() che gira sempre, quindi nel loop hai un IF che verifica se sia T1 che T2 sono diversi da zero e quindi significa che c'è stata una misura ... ed in tal caso sai già cosa fare;  nel tempo restante che il loop() gira a vuoto senza fare nulla (se non verificare di nuovo quel IF che sarà soddisfatto SOLO ad ogni misura poichà altrimenti uno dei due o entrambi T1 e T2 saranno a zero), non fai altro che leggere un paio di bottoni e vedere se voglio aumentare o calare il peso ...

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 26, 2018, 11:07 am
... dai, è banale, due bottoni su due pin (mi raccomando il debouncing fatto hardware), lettura dei due pin nel loop(), se uno dei due è premuto incrementi un indice , se è premuto l'altro decermenti un indice , se sono premuti entrambi ... fai una "pernacchia" perché non è ammesso :D :D :D ... dopo 5 secondi dall'ultima pressione, consideri buono il valore e, con l'indice, vai in un array che avrai costruito all'inizio e selezionerai quale è il peso.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 27, 2018, 11:03 am
Giusto come idea ... dato che in genere il peso dei piombini per tiro con aria compressa e' compreso in un certo intervallo ed e' composto da un certo numero di pesi standard (per cui non e' "libero", ma ogni marchio ha determinati pesi, e molti sono identici fra diversi marchi ... dalle vecchie tabelle che ho io, i 4.5mm dovrebbero andare dal minimo di 0,30 grammi dei Gamo Platinum, fino al massimo di 0,87 grammi dei JSB Monster, se nel frattempo non ne hanno buttati fuori altri ancora), non sarebbe piu facile "preconfezionare" un'array che contenga tutti questi pesi "standard", e poi selezionarli semplicemente incrementando o decrementando una variabile da usare come indice dell'array ? ... ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 27, 2018, 02:26 pm
Ciao Ete si può fare senza dubbio. Io per imparare vorrei provare prima ad impostare l'utlizzo dei pulsanti facendo scorrere dei valori che poi andrebbero immagazzinati nella variabile e utilizzati dall'algoritmo.
La difficoltà che ho al momento è quella di integrare i due programmi (il codice che rileva e quello che fa scorrere i numeri). Purtroppo mi mancano alcuni fondamenti per cui non so se sia preferibile fare un unico programma o un programma con sottoprogrammi...ed ancora litigo con le array.
Quindi devo capire:
- come si imposta un tempo dall'ultima pressione di un tasto;
- come si immagazzine e preleva un certo valore (quello determinato dall'ultima pressione del tasto) per utilizzarlo nell'algortimo.

Per la parte HW le prove sinora condotte sono soddisfacenti anche se mi sembra di aver notato delle letture con dei delta eccessivi tra un tiro e l'altro.
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Oct 27, 2018, 04:41 pm
Premetto sempre che non sono un programmatore (per cui potrei sbagliare) ... ma, per incrementare e decrementare una variabile, ti basta farlo negli if che leggono i pulsanti ... usando ovviamente delle istruzioni per evitare che i pulsanti ti vengano letti "a raffica" dato che il loop viene eseguito in continuazione in modo ciclico, per cui se non usi una flag per evitarlo, in tutto il tempo che il pulsante rimane premuto ad ogni ciclo del loop lui lo legge come se avessi premuto di nuovo ... ad esempio (ma solo come esempio di massima, da controllare e modificare per il tuo sketch) ...

Code: [Select]


... resto del codice ...

if((p1 || p2) <> 0) &&(stato == 0)) //pulsante premuto, supponendo che chiudano a VCC
   {
    if p1 {
      var++;
      stato=1;
   }
   else {
      var--;
      stato=1;
   }
}
if((p1 && p2) == 0) &&(stato == 1)) //pulsante rilasciato
   {
   stato=0;
   }


Questo dovrebbe, in teoria ;), incrementare var di 1 ogni volta che premi p1 e decrementarlo di 1 ogni volta che premi p2, evitando la lettura a raffica ... in pratica, controlli se uno o l'altro dei pulsanti e' diverso da zero (la logica dell'esempio e' per dei pulsanti con la pull-down che chiudono a VCC, se i tuoi li hai collegati con le pull-up che chiudono a massa, basta invertire gli stati), e contemporaneamente se la flag stato e' a zero (che vuol dire che prima i pulsanti non erano premuti), se si, entra nell'if e controlla quale dei due e' diverso da zero, incrementa o decrementa secondo il caso, e mette la flag ad 1 (in modo che il loop non riesegua piu l'if principale finche' il pulsante non viene rilasciato) ... l'ultimo if non fa altro che rimettere stato a zero quando entrambi i pulsanti sono aperti, per permettere di rileggere una successiva pressione ... poi bisognera' ovviamente inserire un controllo anche per i limiti inferiore e superiore, per evitare di andare fuori scala, ma basta modificare gli if, per ora inizia da qui e vedi se riesci a modificarlo con le tue variabili ed inserirlo nel tuo sketch ...

Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 28, 2018, 06:30 pm
complice il cattivo tempo ed onde alte tre metri guardo il mare dalla finestra e studio...
Sono arrivato ad un codice che si avvicina a quello che vorrei almeno nel layout.
Accendo e visualizza ciò che "vorrei vedere" anche se non esattamente nella logica che vorrei... e sto cercando di comprenderlo.
Non riesco a capire però come "bloccare" il loop e far fermare il ciclo "weight"

Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 28, 2018, 06:39 pm
... il loop() NON si blocca, gira sempre ... sei tu che devi valutare le varie condizioni (es. bottoni premuti o meno, variabili a zero o meno, ecc.) e determinare quindi cosa fare o cosa non fare.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 28, 2018, 08:44 pm
Guglielmo, si ho compreso che il loop gira sempre. Forse mi sono espresso male....non riesco a definire (posizionare) la condizione per FERMARE quella parte di codice.
La logica che vorrei applicare è che SE il pulsante NON viene premuto il codice esegua la parte relativa agli interrupt.
Se invece VIENE premuto mi esegue il void weight()  ovvero inserimento peso per poi andare di nuovo a seguire gli interrupt.
Però onestamente non so proprio dove e ocme iniziare. Non so gestire alcui alcuni elementi.
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Oct 28, 2018, 09:00 pm
void loop
  se pulsantePiuPremuto
     disabilito interrupt
     while pulsantePiuPremuto // oppure lo fai una volta sola senza while
        eseguo incrementoPeso
      fine while
      abilito interrupts
   fine se
  se pulsanteMenoPremuto
     disabilito interrupt
     while pulsanteMenoPremuto // oppure lo fai una volta sola senza while
        eseguo decrementoPeso
      fine while
      abilito interrupts
   fine se
  esegui resto del programma
fine loop

qualche cosa di simile...

meglio ancora

void loop
  se pulsantePiuPremuto or pulsanteMeno premuto
     disabilito interrupt
     if pulsantePiuPremuto
        eseguo incrementoPeso
      fine se
      se pulsanteMenoPremuto
          eseguo decrementoPeso
      fine se
      abilito interrupts
   fine se
  esegui resto del programma
fine loop

Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 28, 2018, 09:48 pm
Grazie Patrick...studio, ci dormo su e domani provo  :smiley-confuse:
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Oct 30, 2018, 04:28 pm
solo per semplificare...
Code: [Select]

  // ------------- prova ciclo if
  weightStat = digitalRead (weightbtn);
  if  (weightStat == HIGH)
  {
    weightins();
  }


risparmi una variabile se lo scrivi così
Code: [Select]

  // ------------- prova ciclo if
  // weightStat = digitalRead (weightbtn);
  if  (digitalRead (weightbtn))
  {
    weightins();
  }

idem qui
Code: [Select]

void weightins()
{
  statoWeightUp = digitalRead (wUp);
  if ( statoWeightUp == HIGH)
  {
    weight++;
  }
  statoWeightDown = digitalRead (wDown);
  if ( statoWeightDown == HIGH)
  {
    weight--;
  }
  lcd.setCursor(0, 0);
  lcd.print("weight :");
  lcd.setCursor(9, 0);
  lcd.print(weight / 100);
}

che diventa
Code: [Select]

void weightins()
{
  if ( digitalRead (wUp))
  {
    weight++;
  }
  if ( digitalRead (wDown))
  {
    weight--;
  }
  lcd.setCursor(0, 0);
  lcd.print("weight :");
  lcd.setCursor(9, 0);
  lcd.print(weight / 100);
}


per il resto mi pare che funzioni.... al limite devi implementare dei tempi entro i quali ripetere la pressione dei pulsanti su e giù per non far uscire  il dalla funzione weightins() il controllo.
Ovviamente avrai fatto i debounce hardware sui pulsanti... ;)

Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 30, 2018, 11:33 pm
...mettendo a frutto le ricerche fatte ed i consigli avuti sono riuscito a mettere su il codice.
Riesco a misurare il tiro, visualizzare il weight e far aumentare/diminuire il valore. Ora questo valore DEVE essere utilizzato dall'algortimo di calcolo...come faccio?  :smiley-confuse:  :smiley-confuse:
Qualche aggiustamento cosmetico ancora devo sistemarlo...ad esempio la cifra del weight...è tremolante ed ho aggiunto un delay..ma non credo sia la soluzione giusta.


Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Oct 30, 2018, 11:49 pm
non ho capito la tua domanda....
Code: [Select]

 joule = ((mpsSpeed * mpsSpeed * weight / 2 ) / 1000);


questa riga utilizza la variabile weight nel calcolo.....
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 31, 2018, 07:11 am
... sul LCD devi scrivere SOLO quando c'è veramente la necessità di scrivere (es. cambi peso o hai fatto la misura), tutto il resto del tempo è inutile che continui a scriverci ... ottieni solo un immagine disturbata dai continui refresh.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 31, 2018, 08:37 am
bgiorno a tutti...in particolare a chi ha la pazienza di seguirmi.
@ Patrick: al momento il "weight" (peso del piombino) è ancora un valore fisso che viene utilizzato nella formula da te evidenziata e fin qui tutto bene. Lo scopo è ora quello di poter VARIARE weight in quanto i piombini hanno appunto un peso diverso. Ora sono riuscito ad elaborare il codice ch emi fa impostare il valore (dovrò fissare solo dei limiti inf/sup) ma ancora devo riuscire a far si che il NUOVO valore venga utilzzato nella formula una volta impostato.

@ Guglielmo: si Guglielmo sono consapevole di ciò che dici ed infatti nella parte di codice in cui vario il peso il display mi fa refresh continuo....non ho capito dove sbaglio...come hai visto il blocco di codice che scrive sul display è alla fine del void dedicato all avariazione peso...

UN altra cosa che ho notato è che sparando dopo aver chiamato la funzione weight il valore joule risulta un pò anomalo.  :smiley-confuse:   
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Oct 31, 2018, 09:17 am
... nella parte in cui cambi il peso, aggiorna l'LCD SOLO se è cambiato il peso (peso precedente != peso impostato) e NON in continuazione ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 31, 2018, 09:39 am
... nella parte in cui cambi il peso, aggiorna l'LCD SOLO se è cambiato il peso (peso precedente != peso impostato) e NON in continuazione ;)

Guglielmo
thanks...ci provo
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Oct 31, 2018, 11:44 am
per chè dici che weight è fisso?
io trovo
Code: [Select]

//#define weight 0.49

poi più avanti
Code: [Select]

double fpsSpeed, mpsSpeed, joule, weight; // double = float

poi nella funzione weightIns()
Code: [Select]

    if (upBtnState == HIGH)
    {
      weight += 10;
    }
   
 if ( lastDownBtnState == HIGH)
    {
      weight -= 10; // = weight - 0.01;
    }


e infine il calcolo
Code: [Select]
joule = ((mpsSpeed * mpsSpeed * weight / 2 ) / 1000)
mi pare che ci sia gia tutto...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Oct 31, 2018, 02:59 pm
...Caro Patrick cerco di essere il più chiaro possibile. Come avrai capito mi mancano le basi scolastiche della programmazione per cui cerco di imparare sbagliando e magari esempi e termini posso essere fuorvianti e le soluzioni da me adottate sicuramente migliorabili.

Nel codice iniziale ho impostato il weight come una variabile FISSA con valore 0.49 (grammi dei piombini utilizzati).
Ora ho invece bisogno di avere una variabile...variabile (perdona il gioco di parole) ovvero vorrei poter impostare un weight diverso in funzione dei diversi piombini utilizzati.
IN realtà avrei bisongo di un range 0.30 - 0.70 con variazione 0.01.
La variabile weight è un parametro della formula di calcolo della potenza (joule).
Il codice che vedi è "inquinato da diversi passaggi".
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 01, 2018, 05:54 pm
...bsera a tutti. Sono quasi arrivato alla fine del prototipo.
Ho al momento due problemi che non riesco a risolvere:
- avvio il programma ed alla pressione del tasto entro nel menù impostazione peso. Con i tasti up/down vario il peso ma NON so come poi uscire da questo menù ovvero chiudere questo passaggio;
- se dal menù peso vado direttamente a sparare parte la misurazione ma l'output video si accavalla.
Mi aiutate a risolvere?

Code: [Select]
#include <Wire.h>  // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

#define MPS2FPSCOEFF 3.28084         // coefficente trasformazione metri x sec --> foot x sec
//#define LENGHT 0.12                  // 12 cm distanza
#define MICRO2SEKCOEFF 1000000       // coefficente trasformazione microsecondi

//#define weight 0.49

float weight = 300; // variabile in cui immagazzinare il valore selzionato

volatile unsigned long t1, t2;
unsigned long deltaT;

// --------- costanti

const int wUp = 6;
const int wDown = 7;
const int weightBtn = 8;

// ---------- variabili
//int statoWeightUp = 0;
//int statoWeightDown = 0;
int upBtnState = 0;
int downBtnState = 0;

//int btnWeightPushCounter = 0;
int weightBtnState = 0;
int lastWeightBtnState = 0;

int lastUpBtnState = 0;
int lastDownBtnState = 0;

int countBtn = 0;

double fpsSpeed, mpsSpeed, joule, newWeight; // double = float

void ISR1(void) {
  t1 = micros();
}
void ISR2(void) {
  t2 = micros();
}
void setup()
{
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Cronografo by NV");
  delay(2500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("set weight:");
  //Serial.println("Cronografo by NV");
  lcd.setCursor(0,12);
  lcd.print(weight/1000);
  delay(1500);
  lcd.clear();

  pinMode(weightBtn, INPUT);

  // ----------- inizializza pin pulsanti input:

  Serial.begin(9600);

  t1 = 0;
  t2 = 0;
  deltaT = 0;
  fpsSpeed = mpsSpeed = 0;

  //  lcd.print("...spara!");

  attachInterrupt(digitalPinToInterrupt(2), ISR1, HIGH);     // 0 sul pin digitale 2
  attachInterrupt(digitalPinToInterrupt(3), ISR2, HIGH);     // 1 sul pin digitale 3

}
void loop()
{
  // ---------- ciclo premi pulsante test 1 -------------------

  weightBtnState = digitalRead(weightBtn);
  if (weightBtnState != lastWeightBtnState)
  {
    if (weightBtnState == HIGH)
    {
      lastWeightBtnState = weightBtnState;
    }

 // ----------- ciclo aumenta/diminuisce -------------------------
    if (digitalRead(wUp))
    {
      newWeight = weight += 10;
    }
    if (digitalRead(wDown))
    {
      newWeight = weight -= 10; // = weight - 0.01;
    }
    weight = newWeight;
    Serial.println(newWeight);
   
    lcd.setCursor(0, 0);
    lcd.print("weight :");
    lcd.setCursor(9, 0);
    lcd.print(weight / 1000);
    // delay (1500);
    // lcd.clear();
  }
   if ((t1 != 0) && (t2 != 0))
  {
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;

    mpsSpeed = (0.120 * (MICRO2SEKCOEFF)) / deltaT;  // s = v * t, v = s / t ; MICRO2SEKCOEFF COEE
    //  mpsSpeed = (LENGHT / (elapsed*MICRO2SEKCOEFF));    // s = v * t, v = s / t ; MICRO2SEKCOEFF COEE
    joule = ((mpsSpeed * mpsSpeed * weight / 2 ) / 1000); //

    //---------------------- stampa serial/LCD ---------------------
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("m/s : ");
    lcd.print(mpsSpeed, 1);
    lcd.setCursor(0, 1);
    lcd.print("Joule : ");
    lcd.print(joule);
    Serial.println("metri al secondo:  " + String(mpsSpeed));  //Serial.println("Variabile= " + String(variabile) + " eccola qui");
    Serial.println("Joule:  " + String(joule));
  }
  // ------------------------------
}

Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 01, 2018, 06:02 pm
Ma hai messo solo due bottoni ? ... o ne metti un terzo, come "OK" che ti riporti nel main (se sei in modifica peso), o che ti faccia partire il ciclo di lettura (se sei gia nel main, tipo un "pronto a sparare), oppure potresti fare una specie di timeout con millis ed una variabile da controllare nella parte che modifica il peso ... tipo, ogni volta che premi un qualsiasi tasto, oltre al resto, metti anche la variabile uguale a millis, e nel frattempo mentre sei nella modifica del peso, continui anche a controllare se sono passati, tipo, 4 o 5 secondi usando proprio quella variabile ... se passati, esci e torni nel main (ed ovviamente, dato che ogni volta che premi un pulsante metti la variabile al valore di millis, se prima che sia passato il tempo premi, non esci) ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 01, 2018, 07:28 pm
ciao Ete...si il concetto ci sta sia quello di un tasto di inserimento o di un timing.
Mi manca il "modo" per tornare al main....non so se mi sono spiegato.
Nella prima versione avevo messo un void dedicato al weight ma in questa versione ho messo tutto di fila nel main loop. Forse è meglio usare un if/else o simile...ditemi voi
(Patrick per ora sono dovuto tornare all'utilizzo elementare delle variabili che mi è più chiaro).
PS i bottoni sono tre. up/down e weight
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 02, 2018, 11:00 am
Uhm ... dovrei pensarci meglio, ma se hai gia tre tasti, non potresti usare il tasto weight anche per uscire, oltre che per entrare nel ciclo weight ? ... voglio dire, usa un'altra flag byte anche lei associata all'uso del tasto weight (in fondo di flag ne puoi usare quante ne vuoi) ... se quando lo premi, questa flag e' a zero, la metti ad uno ed entri nel tuo ciclo di impostazione del peso, se poi lo ripremi e la flag e' ad uno, la rimetti a zero ed esci dall'impostazione peso ritornando nel main ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 02, 2018, 12:46 pm
Grazie Ete...ci provo ..un altra piccola sfida...mo ci macavano pure ste flag!!!
Ho cercato un pò ma non ho trovato grabnchè sull'utilizzo delle flag
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 02, 2018, 02:58 pm
le "flag" :) sono un po come il nodo al fazzoletto... sono variabili "promemoria" che ti ricordano cosa hai fatto e quindi come devi procedere
quindi che ne sò, quando accendi un led imposti a vero la variabile ledAcceso e quando lo spegni (ovviamente) devi ricordarti di resettare anche la variabile
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 02, 2018, 03:37 pm
Grazie Patrick...ci sti provando. Guglielmo mi dai un indicazione....dove devo studiare sta volta?
Trovi corretta l'architettura del mio codice o secondo te è megli oin ciclo if/qualcos'altro?

come diamine esco dal weight e torno alla misurazione ?  :smiley-roll-blue:  :smiley-roll-blue:  :smiley-roll-blue:  :smiley-roll-blue:  :smiley-sad-blue:  :smiley-sad-blue:  :smiley-sad-blue:  :smiley-sad-blue:
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 02, 2018, 03:48 pm
... come diamine esco dal weight e torno alla misurazione ?  :smiley-roll-blue:  :smiley-roll-blue:  :smiley-roll-blue:  :smiley-roll-blue:  :smiley-sad-blue:  :smiley-sad-blue:  :smiley-sad-blue:  :smiley-sad-blue:
... esattamnete come ti hanno suggerito ... premi il tasto "weight" ed entri nella funzione di incremento/decremento peso, lo premi di nuovo e ne esci.

Normalmente, i "menu" più semplici su LCD si fanno proprio con tre bottoni ... SU, GIU, ENTER con l'entre entri nelle varie funzioni, una delle quali è esci dal menu, con SU e GIU ti sposti nei vari menu ... un po' quello che devi fare tu, solo che tu non hai la complessità di manu a cascata, ma solo entrare -> correggere peso -> uscire.

Altro modo, è usare una variabile che contiene il "tempo" (millis()) dell'ultima volta che si è premuto un bottone, se passano, che so io, 5 secondi senza nessuna nuova pressione, si accetta il valore e si esce.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 02, 2018, 04:11 pm
Guglielmo mi manca il concetto dell'uscire dal weight e tornare alla misurazione... mi aiuti a capire?
Ovvero se sono istruzioni sequenziali come fa ad uscire e tornare alla misurazione.
Io pigio il pulsante una volta e si apre la variazione peso poi dopo averlo impostato rimane a mostrare il valore e NON capisco come sifaccia a farlo tornare alla misurazione.
NOn so se riesco a spiegare la mia difficoltà di comprensione.
se costruisco l'istruzione per uscire con un ulteriore pressione...da dove riparte?...come gli dico parti da qui?
porca trota non ci arrivo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 02, 2018, 04:20 pm
... mah ... per me hai sbagliato la logica!  Te lo avevo pure detto all'inizio, ma tu hai voluto aggiungere un inutile bottone, quando bastava SU e GIU.

Sei nel loop() che gira sempre e puoi avere solo tre casi:

1. ((t1 != 0) && (t2 != 0)) ... è passato un pallino e devi fare i calcoli
2. SU premuto, devi incrementare il peso
3. GIU premuto devi decrementare il peso

... a che serve tutto il resto ? ? ?

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 02, 2018, 04:32 pm
Gugliemo io seguo i tuoi consigli...ed infatti hio chiesto se la logica fosse quella appropriata.
Ho messo un terzo in quanto non riuscivo a lavorare con due. Ora ho preso un pò di dimestichezza - anche con la gestione pulsanti -  e le idee sono un pò più chiare..fino ad un certo punto.
Purtroppo non ho le conoscenze per metabolizzare immediatamente ciò che voi che già sapete mi dite.
Visto che il tempo è brutto ora smonto tutto il codice e lo rimonto.
Mi rimane però - ora con i tre pulsanti e cmq mi servirà dopo - il non aver capito  come far uscire il codice alla fine della variazione peso...
Non riesco ad arrivarci...imposto il peso e poi come caxx... esco da quella videata per tornare alla videata di misurazione???....mannaggia la miseriaaaaaaaaaaaaaaaaaa.
PS: dove abiti che vengo a casa tua. Altrimenti vieni a trovarmi  ;D  ;D  :D
...provo a fare un diagramma di flusso!
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 02, 2018, 04:43 pm
NON DEVI USCIRE DA NULLA ... sei nel loop() e quello gira sempre ... rileggi il mio post precedente e ragionaci !

Guglielmo

P.S.: NON deve esistere una "videata del peso" ed una di "misurazione", è un'unica schermata con il peso (l'ultimo cambiato) e, nel momento delo sparo, la misurazione (l'ultima effettuata).
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 02, 2018, 04:49 pm
1. leggo bottone SU
1.1 è premuto? Se si 1.2 altrimenti 2.
1.2 incremeto valore peso, aggiorno LCD ed aspetto che il bottone venga rilasciato, poi 2.

2. leggo bottone GIU
2.1 è premuto? Se si 2.2 altrimenti 3.
2.2 decremento valore peso, aggiorno LCD ed aspetto che il bottone venga rilasciato, poi 3..

3. ((t1 != 0) && (t2 != 0)) ? Se si, 3.1 se no 1.
3.1 faccio i calcoli, aggiorno LCD, azzero t1 e t2, torno a 1.

... cosa non è chiaro ? ? ?

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 02, 2018, 04:52 pm
...ti aggiorno!!!!!!!!!!!!!!!!!!!!
Cazz...però è bello complicare le cose sennò staresti sempre davanti la tv
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 02, 2018, 05:02 pm
.... sennò staresti sempre davanti la tv
... tv che rende "stupidi", quindi da evitare, meglio complicarsi la vita e tenere in allenamento la "massa grigia"  :smiley-mr-green:

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 02, 2018, 05:16 pm
Ho dato un'occhiata al volo al codice che hai postato (oggi sto rimbalzando qui e la e non capisco piu nulla), ed anche se non sono un programmatore, direi che il suggerimento di Guglielmo e' forse il piu semplice ... visto che non hai creato funzioni diverse per i diversi stati (come invece credevo volessi fare), puoi lasciare tutto quanto "in attesa di sparo", limitandoti a cambiare il peso "al volo" senza avere diverse schermate ... questa ovviamente e' la procedura piu semplice di funzionamento, e ti da solo la possibilita' di leggere la velocita' dopo ogni spro e quella di cambiare il peso, niente start, niente funzioni avanzate, niente memoria delle letture precedenti, ma anche meno roba da fare nel programma ... e comunque, una volta che il tutto funziona, il resto lo potrai sempre aggiungere in seguito ...

quindi di base, subito dopo il setup, con delle semplici if nel loop non fai altro che controllare se uno dei pulsanti e' premuto, se t1 e t2 sono entrambi diversi da zero, ed aggiornare il display solo se cambia qualcosa ... senza entrare in alcuna schermata per il peso ... ad esempio, ora il peso e' 0.5, premi il pulsante (up o down non importa), aggiorni la variabile di conseguenza ed il display al volo ... se spari, trovando t1 e t2 diversi entrambi da 0, calcoli, li azzeri, aggiorni il display al volo ... senza la necessita' di diversi cicli o funzioni ...

Ovviamente questo comportera' il decidere come e dove stampare i dati ... puoi ad esempio stampare il peso semplicemente come "g 0.xx" sempre nello stesso punto del display, ad esempio in fondo all'ultima riga ... con due righe da 16 caratteri, non c'e' molto spazio da scialare, serve ottimizzare ... oppure si prende un 4 righe (https://www.ebay.com/itm/Yellow-Green-Serial-IIC-I2C-TWI-2004-LCD-20X4-Character-LCD-Module-For-Arduino/222649153272), volendo ...

EDIT: ecco, ho dovuto riavviare firefox, e Guglielmo mi ha preceduto :D
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 02, 2018, 06:23 pm
azz...funziona.

Pulisco il codice e ti faccio leggere.

GRAZIE DAVVERO A TUTTI!!!...birra pagata...Gug, Ete, Patrick e tutti quelli che hanno avuto la pazienza

PS: non è finita qui  8)  ;D  :D  :D voglio il pulsante che aggiorna a step e NON di continuo  >:(  >:(

Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 02, 2018, 06:38 pm
Eravate tutti d'accordo...è un disegno criminoso x farmi studiare
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 02, 2018, 08:35 pm
:D
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 03, 2018, 09:48 am
E' "colpa" di Guglielmo ... e' lui che insiste sempre per far studiare tutti ... viene quasi da pensare che gestisca di nascosto un negozio di articoli per la pesca :P ... (dai un pesce ad un'uomo ... :D)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 03, 2018, 02:57 pm
ma poi esisterà questo Gugliemoo sarà uno dei tanti assistenti virtuali?  :smiley-eek-blue:


Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 03, 2018, 05:21 pm
ma poi esisterà questo Gugliemoo sarà uno dei tanti assistenti virtuali?  :smiley-eek-blue:
... certo che esisto, toh ... per dimostratelo metto qui sotto una mia foto:

(https://cc-media-foxit.fichub.com/image/floptv/bacf1528-3c1c-4984-8b18-92ffe8cdafe6/mb9t74kppmu1uortbtlz-maxw-650.jpg)


Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 03, 2018, 05:31 pm
:smiley-yell:
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 03, 2018, 09:51 pm
 :smiley-mr-green:
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 04, 2018, 09:29 am
Bgiorno, ormai la programmazioen non ha più segreti per me... :smiley-mr-green:  :smiley-cool:
Dunque nel bell'esercizio del cronografo ho visto ch eun programma relativamente semplice occupa presto una buona parte della memoria del processore e mi sono chiesto il perchè.
Da una rapida ricerca ho capitoche alcune istruzioni e tipi di variabili occupano molto spazio e vi è la  manipolazione diretta delle porte logiche e cosi via.
Prima di avventurarmi nella manipolazione diretta vorrei qualche consiglio pratico del tipo...
"dos and donts"...cosa fare e cosa NON fare.
Le istruzioni per il display pesano molto?
Le librerie?
I vari void aggiuntivi?
Grazie come al solito.
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 04, 2018, 09:41 am
... ovviamente, saltando il framework "wiring" (tutte le funzioni che trovi nel reference relative ad Arduino) e facendo in 'C' puro la manipolazione dei registri della MCU, ottieni un codice più compatto e più veloce, ma ... c'è il rovescio della medaglia: complessità nella scrittura del codice, scarsa leggiblità, difficile manutenzione e scarsa, se non sulla, trasportabilità da una MCU ad un'altra.

La cosa va affrontata caso per caso:  dove c'è veramente una necessità di codice altamente efficiente, di velocità e di compattezza, ok, negli altri casi ... non ne vale assolutamente la pena.

Guglielmo

P.S.: Però, a quel punto, conviene anche passare ad altri ambienti di sviluppo dedicati a questo tipo di programmazione ... CodeVision AVR (http://www.hpinfotech.ro/index.html),  IAR (https://www.iar.com/)  e, tra poco, finita la fase di "beta testing" MPLAB X (https://www.microchip.com/mplab/mplab-x-ide) di Microchip :)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 04, 2018, 09:45 am
Grazie Gug, ora provo ad inserire lettura di dieci tiri e media...mi dai un indicazione prima che sbaglio di nuovo logica?

Grazzzzieeeeee
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 04, 2018, 09:51 am
... usi un contatore ed una variabile dedicata alla somma, quando parti le azzeri, ogni volta che ((ti != 0) && (t2 != 0)) sommi il deltaT nella variable dedicata alla somma, incrementi il contatore e verifichi che sei arrivato ad accumulare il numero di test voluto;   se SI, dividi la somma per il numero dei campioni che hai fatto (... ovvero calcoli la media), effettui i calcoli del peso e visualizzi, riazzeri il tutto e ... il ciclo si ripete.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 04, 2018, 06:07 pm
Gug,

ho inserito un ciclo media però mi da dei valori non coerenti (sto provando ora direttamente con la velocità) e sulla seriale mi stanmpa due volte il valore
Dov'è che sbaglio?


Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 04, 2018, 08:00 pm
dalla parte precedente del programma arriviamo qui dopo lo sparo con (supponiamo)
mpsSpeed=100.

Code: [Select]

      for (int i = 0; i < 5; i++)
      {
        valori[i] = mpsSpeed;
      }


mannaggia!!!!! :D

ma secondo te, seguendo col ditino il flusso di quelle 4 righe
al primo giro i vale 0
e quindi valori[0] =100
e al secondo giro, quando i vale 1
quanto vale mpsSpeed? ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 04, 2018, 08:38 pm
... ma lo hai letto il mio post #170 ? ? ? :o  ... ma perché ti vuoi sempre complicare la vita ? ? ? :o ... ma chi diavolo ha parlato di array ? ? ? :o ... ma non sapete fare la MEDIA accumulando i valori in un unica variabile e poi dividendo per il numero dei valori accumulati ? :o   Se un domani vuoi fare la media di N valori e NON hai SRAM per il vettore che fai ? ? ? Mah ...

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 04, 2018, 08:45 pm
 :'(  :'(  :'(  :'(  :'(  :'(  :'(  :'(  :'(  :'(  :'(

Patrick se semo beccati sta cazziata che ce basta fino a Natale!!!!
..domani non vengo a scuola :-(


Gug, ci sto provando ma non ci riesco :-(
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 04, 2018, 09:51 pm
Gug, ci sto provando ma non ci riesco :-(
... prova a rileggere con attenzione il post #170 ... ti descrive esattamente quello che devi fare ;)

In pratica, ora quando spari visualizzi subito, dopo, quando spari, sommi il valore in una variabile, incrementi un contatore e, solo quando arrivi a N spari, fai la media, visualizzi e riazzeri il tutto.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 04, 2018, 11:03 pm
:'(  :'(  :'(  :'(  :'(  :'(  :'(  :'(  :'(  :'(  :'(

Patrick se semo beccati sta cazziata che ce basta fino a Natale!!!!
..domani non vengo a scuola :-(


Gug, ci sto provando ma non ci riesco :-(
eee no! non mi appiccicare quello che non ho fatto :D :D

io ti ho mostrato solo perchè non funziona il tuo if ;)

comunque ai fini del calcolo non cambia nulla.... è il discorso che se vuoi 5 valori devi appunto fare 5 spari e non uno e poi prendere il valore 5 volte :)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 04, 2018, 11:44 pm
niente non riesco a fare sta cax.. di  media  :smiley-evil:  :smiley-mad:  :smiley-mad:  :smiley-mad:  :smiley-mad:  :smiley-mad: ma ndo cax sbagliooooo

Code: [Select]
#include <Wire.h>  // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address

#define MPS2FPSCOEFF 3.28084         // coefficente trasformazione metri x sec --> foot x sec
#define LENGHT 0.12                    // 12 cm distanza
#define MICRO2SEKCOEFF 1000000       // coefficente trasformazione microsecondi
#define weight 0.49

// ---------- media -------

float mpsSpeedMedia = 0; // valore della tensione di riferimento medio
int cont;

// ------------------------

volatile unsigned long t1, t2;
unsigned long deltaT;

double fpsSpeed, mpsSpeed, joule; // double = float

void ISR1(void) {
  t1 = micros();
}
void ISR2(void) {
  t2 = micros();
}
void setup()
{
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();

  // -------------- avvio video/serial --------------------

  //lcd.backlight(); // finish with backlight on
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SuperCrono by NV");
  delay(1500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("peso impostato:");
  lcd.setCursor(0, 1);
  lcd.print("grammi:  " + String(weight));
  //Serial.println("Cronografo by NV");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Take a shot!...");

  // -----------------------------------------------------

  t1 = 0;
  t2 = 0;
  deltaT = 0;
  fpsSpeed = mpsSpeed = 0;

  attachInterrupt(digitalPinToInterrupt(2), ISR1, HIGH);     // 0 sul pin digitale 2 - CHANGE/FALLING/RISING/LOW
  attachInterrupt(digitalPinToInterrupt(3), ISR2, HIGH);     // 1 sul pin digitale 3
}

void loop()
{

  //------------- conteggio ----------------------

  if ((t1 != 0) && (t2 != 0))
  {
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;

  // ------------ calcolo velocità ------------------------------------

    mpsSpeed = (LENGHT * (MICRO2SEKCOEFF)) / deltaT;  // s = v * t, v = s / t ; MICRO2SEKCOEFF COEE
    joule = ((mpsSpeed * mpsSpeed * weight) / 2) / 1000; //


  // ---------------------------------

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("m/sec : ");
    lcd.print(mpsSpeed, 1);
    lcd.setCursor(0, 1);
    lcd.print("Joule : ");
    lcd.print(joule);
 
  // ------------- MEDIA
{
    for (cont = 0; cont < 5; cont++)       // somma valori per poi farne la media
    {
      mpsSpeedMedia += mpsSpeed;   // sommatoria dei valori
    }
    if (cont == 5)           // quando ho sommato i valori campionati si esegue
    {
      cont = 0;
      mpsSpeedMedia = mpsSpeedMedia / 5;

      Serial.println("Speed avg :");
      Serial.println(mpsSpeedMedia); // prima di un successiva acquisizione e media azzerare
      mpsSpeedMedia = 0;
    }
  }
}
}
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 05, 2018, 06:45 am
... e nulla, vuoi fare come ti pare invece di seguire quanto ho scritto nel post #170 ... e allora fai come ti pare ... ::)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 07:23 am
... usi un contatore ed una variabile dedicata alla somma, quando parti le azzeri, ogni volta che ((ti != 0) && (t2 != 0)) sommi il deltaT nella variable dedicata alla somma, incrementi il contatore e verifichi che sei arrivato ad accumulare il numero di test voluto;   se SI, dividi la somma per il numero dei campioni che hai fatto (... ovvero calcoli la media), effettui i calcoli del peso e visualizzi, riazzeri il tutto e ... il ciclo si ripete.

- la condizione if : ho sfruttato quella esistente (devo attivarla di nuovo?)
- utlizzo contatore:  credo di averlo fatto con il for(cont...
- variabile somma:   per me è questa: mpsSpeedMedia. )ineffetti questa NON mi è del tutto chiara)
- incremento il contatore: sempre il ciclo cont...(no?) che conta 5 tiri;
- condizione SI per il numero di tiri sempre nel for;
- faccio la media. La media ho provato a farla direttamete ocn la mpsSpeed e NON con il delta T.

Dov'è che mi perdo?

Con il code sottostante vedo un risultato ma è la media del singolo tiro. Cioè vedo il valore del tiro diviso 5. Ancora non riesco a metabolizzare sta cosa...


Code: [Select]


#include <Wire.h>  // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address

#define MPS2FPSCOEFF 3.28084         // coefficente trasformazione metri x sec --> foot x sec
#define LENGHT 0.12                    // 12 cm distanza
#define MICRO2SEKCOEFF 1000000       // coefficente trasformazione microsecondi
#define weight 0.49

// ---------- media -------

float mpsSpeedMedia; // valore della tensione di riferimento medio
int cont;

// ------------------------

volatile unsigned long t1, t2;
unsigned long deltaT;

double fpsSpeed, mpsSpeed, joule; // double = float

void ISR1(void) {
  t1 = micros();
}
void ISR2(void) {
  t2 = micros();
}
void setup()
{
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();

  // -------------- avvio video/serial --------------------

  //lcd.backlight(); // finish with backlight on
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SuperCrono by NV");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("peso impostato:");
  lcd.setCursor(0, 1);
  lcd.print("grammi:  " + String(weight));
  //Serial.println("Cronografo by NV");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Take a shot!...");

  // -----------------------------------------------------

  t1 = 0;
  t2 = 0;
  deltaT = 0;
  fpsSpeed = mpsSpeed = 0;

  attachInterrupt(digitalPinToInterrupt(2), ISR1, HIGH);     // 0 sul pin digitale 2 - CHANGE/FALLING/RISING/LOW
  attachInterrupt(digitalPinToInterrupt(3), ISR2, HIGH);     // 1 sul pin digitale 3
}

void loop()
{
  //------------- conteggio ----------------------

  if ((t1 != 0) && (t2 != 0))
  {
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;

    // ------------ calcolo velocità ------------------------------------

    mpsSpeed = (LENGHT * (MICRO2SEKCOEFF)) / deltaT;  // s = v * t, v = s / t ; MICRO2SEKCOEFF COEE
    joule = ((mpsSpeed * mpsSpeed * weight) / 2) / 1000; //

    // ---------------------------------

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("m/sec : ");
    lcd.print(mpsSpeed, 1);
    lcd.setCursor(0, 1);
    lcd.print("Joule : ");
    lcd.print(joule);

    // ------------- MEDIA

    // float mpsSpeedMedia = 0;
    for (int i = 0; i < 5; i++)
    {
      mpsSpeedMedia = mpsSpeedMedia + mpsSpeed;
    }
    mpsSpeedMedia = mpsSpeedMedia / 5;
    //mpsSpeedMedia = 0;
    // ----------------------
    Serial.println("Speed avg :");
    Serial.println(mpsSpeedMedia);

  }
}


Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 05, 2018, 09:27 am
... NON si fa la media dei calcoli già fatti con tutti gli infiniti errori di arrotondamento dei float ... si fa la media dei deltaT e, solo alla fine, con il valor medio, si fanno i calcoli e si visualizza ... e si che c'è chiaramente scritto !!!

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 05, 2018, 09:44 am
ragioniamo:
sparo
faccio il calcolo della velocità... e degli joule
sommo/memorizzo velocità e joule in variabile
incremento contatore
se contatore =5
  divido variabili per 5
  stampo su lcd
  azzero contatore
fine se
ricomincio

oppure ancora meglio come ha appena scritto Guglielmo direttamente sul deltaT
così ne memorizzi uno solo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 09:45 am
 Gug, Patrick il concetto mi è più che chiaro cosi come il flow...ma non riesco a tramutarlo in codice.

- sparo (variano t1 e t2)
- calcolo DT
- uso DT per calcolo velocità

- imposto contatore (variabili predisposte)
- faccio somma DT
- contatore arriva a x
- faccio media DT
- faccio nuovo calcolo con media DT
- azzero variabili
- stampo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 05, 2018, 09:46 am
Dalla situazione di prima:

3. ((t1 != 0) && (t2 != 0)) ? Se si, 3.1 se no 1.
3.1 faccio i calcoli, aggiorno LCD, azzero t1 e t2, torno a 1.

... devi ...

3. ((t1 != 0) && (t2 != 0)) ? Se si, 3.1 se no 1.
3.1 sommo la differenza (deltaT) in una variabile somma ed incremento il contatore
3.2 il contatore ha raggiunto il valore voluto? Se si 3.3, se no azzero t1 e t2 e torno a 1.
3.3 divido la variabile somma per il valore del contatore ed uso il risultato come deltaT medio
3.3 faccio i calcoli, aggiorno LCD, azzero t1 e t2, azzero variabile somma, azzero contatore e torno a 1.

... non mi sembra difficile, è un IF in più ... ::)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 09:51 am
forse non scrivobene il codice per incremento variabile e contatore

contatore
for (int cont = 0; cont < 5; cont++)...giusto?
variabile:

sommaDT = sommaDT + deltaT;..giusto?
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 05, 2018, 10:04 am
no, non devi usare nessuna for
Code: [Select]



#include <Wire.h>  // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address

#define MPS2FPSCOEFF 3.28084         // coefficente trasformazione metri x sec --> foot x sec
#define LENGHT 0.12                    // 12 cm distanza
#define MICRO2SEKCOEFF 1000000       // coefficente trasformazione microsecondi
#define weight 0.49

// ---------- media -------

float deltaTMedia; // valore della tensione di riferimento medio
byte contaspari;

// ------------------------

volatile unsigned long t1, t2;
unsigned long deltaT;

double fpsSpeed, mpsSpeed, joule; // double = float

void ISR1(void) {
  t1 = micros();
}
void ISR2(void) {
  t2 = micros();
}
void setup()
{
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();

  // -------------- avvio video/serial --------------------

  //lcd.backlight(); // finish with backlight on
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SuperCrono by NV");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("peso impostato:");
  lcd.setCursor(0, 1);
  lcd.print("grammi:  " + String(weight));
  //Serial.println("Cronografo by NV");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Take a shot!...");

  // -----------------------------------------------------

  t1 = 0;
  t2 = 0;
  deltaT = 0;
  fpsSpeed = mpsSpeed = 0;

  attachInterrupt(digitalPinToInterrupt(2), ISR1, HIGH);     // 0 sul pin digitale 2 - CHANGE/FALLING/RISING/LOW
  attachInterrupt(digitalPinToInterrupt(3), ISR2, HIGH);     // 1 sul pin digitale 3
}

void loop() {
  //------------- conteggio ----------------------

  if ((t1 != 0) && (t2 != 0))  {
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;

    //qui sommi il delta
    deltaTmedia += deltaT
    contaSpari ++ ;
    //qui controlli se contaSpari è= 5
    if (contaSpari == 5) {
       //ora o modifichi la formula oppure fai
       deltaT= deltaTmedia/5;
       contaSpari=0;
       // ------------ calcolo velocità ------------------------------------

       mpsSpeed = (LENGHT * (MICRO2SEKCOEFF)) / deltaT;  // s = v * t, v = s / t ; MICRO2SEKCOEFF COEE
       joule = ((mpsSpeed * mpsSpeed * weight) / 2) / 1000; //

       // ---------------------------------

       lcd.clear();
       lcd.setCursor(0, 0);
       lcd.print("m/sec : ");
       lcd.print(mpsSpeed, 1);
       lcd.setCursor(0, 1);
       lcd.print("Joule : ");
       lcd.print(joule);
    }
  }
}
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 05, 2018, 10:08 am
forse non scrivobene il codice per incremento variabile e contatore
... mi hai mai visto parlare di cicli FOR ? ? ? :o :o :o

Eppure il mio post #183 è veramente passo passo ... ::)

Guglielmo

P.S.: ... e Patrick te lo ha esplicitato ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 10:11 am
ragazzi purtroppo mi mancano alcuni elementi basilari che CERCO di apprendere strada facendo. Il contatore (codice)...come diamine si fa?

Io ho capito le vostre indicazioni ma NON riesco a tramutarle in codice
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 05, 2018, 10:18 am
 :o
non l'hai visto?
ti ho messo il programma nel post #185...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 10:21 am
scusa asp..
:o
non l'hai visto?
ti ho messo il programma nel post #185...
visto...provato...non va. Credetemi ci ero arrivato al contatore come da Patrick...
La seriale mi da questo e sto facendo girare solo la porzione del codice media:

Speed avg :
0.00
Speed avg :
0.00
Speed avg :
inf

dopo ogni tre tiri. c'è qualcosa che non va.
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 05, 2018, 10:54 am
... seriale ? ? ? Non la vedo
... tre spari ? ? ? Vedo la media su 5

De che stamo a parla' ? ? ?

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 11:19 am
ho mandato l'output sul monitor seriale...scusa.
Visualizzando si vede ilprimo 0.00 dopo tre tiri
il secondo dopo tre tiri
ed il terzo risultato - inf -  dopo due tiri
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 11:37 am
meglio di così... :smiley-confuse:



Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 05, 2018, 11:39 am
Non mi sembra possibile con il codice di Patrick, credo che hai sbagliato tu qualche cosa nel metterci le mani ... metti il codice che stai provando ...

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 11:58 am
asp..
Code: [Select]



#include <Wire.h>  // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address

#define MPS2FPSCOEFF 3.28084         // coefficente trasformazione metri x sec --> foot x sec
#define LENGHT 0.12                    // 12 cm distanza
#define MICRO2SEKCOEFF 1000000       // coefficente trasformazione microsecondi
#define weight 0.49

// ---------- media -------

float deltaTMedia;
byte contaSpari;

// ------------------------

volatile unsigned long t1, t2;
unsigned long deltaT;

double fpsSpeed, mpsSpeed, joule; // double = float

void ISR1(void) {
  t1 = micros();
}
void ISR2(void) {
  t2 = micros();
}
void setup()
{
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();

  // -------------- avvio video/serial --------------------

  //lcd.backlight(); // finish with backlight on
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SuperCrono by NV");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("peso impostato:");
  lcd.setCursor(0, 1);
  lcd.print("grammi:  " + String(weight));
  //Serial.println("Cronografo by NV");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Take a shot!...");

  // -----------------------------------------------------

  t1 = 0;
  t2 = 0;
  deltaT = 0;
  fpsSpeed = mpsSpeed = 0;

  attachInterrupt(digitalPinToInterrupt(2), ISR1, HIGH);     // 0 sul pin digitale 2 - CHANGE/FALLING/RISING/LOW
  attachInterrupt(digitalPinToInterrupt(3), ISR2, HIGH);     // 1 sul pin digitale 3
}

void loop() {
  //------------- conteggio ----------------------

  if ((t1 != 0) && (t2 != 0))  {
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;

    //qui sommi il delta
    deltaTMedia += deltaT;
    contaSpari ++ ;
    //qui controlli se contaSpari è= 5
    if (contaSpari == 5) {
       //ora o modifichi la formula oppure fai
       deltaT= deltaTMedia/5;
       contaSpari=0;
       // ------------ calcolo velocità ------------------------------------

         mpsSpeed = (LENGHT * (MICRO2SEKCOEFF)) / deltaT;  // s = v * t, v = s / t ; MICRO2SEKCOEFF COEE
  //     joule = ((mpsSpeed * mpsSpeed * weight) / 2) / 1000; //

       // ---------------------------------

       lcd.clear();
       lcd.setCursor(0, 0);
       lcd.print("m/sec : ");
       lcd.print(mpsSpeed, 1);
       lcd.setCursor(0, 1);
    //   lcd.print("Joule : ");
    //   lcd.print(joule);
    }
  }
}
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 05, 2018, 12:27 pm
... che ne dici, all'inizio, prima di partire, per sicurezza, di azzerare anche deltaTMedia e contaSpari ?

E deltaTMedia DEVE essere un unsigned long ... stai accumumaldo differenze di millisecondi !!!

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 12:37 pm
ci provo...per l'unsigned long ci ero arrivato.
nulla tutto come prima

0.00
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 05, 2018, 12:43 pm
ma dove leggi 0.00 ? ? ?  E dopo quanti spari ?

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 05, 2018, 12:50 pm
... che ne dici, all'inizio, prima di partire, per sicurezza, di azzerare anche deltaTMedia e contaSpari ?

E deltaTMedia DEVE essere un unsigned long ... stai accumumaldo differenze di millisecondi !!!

Guglielmo
si, errore mio :)
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 05, 2018, 12:57 pm
al limite puoi aggiungere questo:
Code: [Select]

    //qui sommi il delta
    deltaTMedia += deltaT;
    contaSpari ++ ;
    //aggiunta
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("ancora: ");
    lcd.print(5 - contaSpari);
    lcd.print(" spari");
    //qui controlli se contaSpari è= 5
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 02:07 pm
Agli errori ci ero arrivato credo fossero solo errori di battitura. Anche all'azzeramento delle variabili.  I risultati del codice li vedo su output LCD o monitor seriale.
Appaiono dopo 3 tiri se metto 5 e cdopo 7 se metto 10
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 05, 2018, 02:21 pm
:D
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 02:32 pm
...il contatore da i numeri....a caxxo  :smiley-confuse: anche se metto solo una delle condizioni (oovero t1 !=0 oppure t2)
Decrementa 2 per volta ed a volte a caxxo.
c'è qualcosa che non va
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 07:11 pm
signori avete qualche idea x capire come mai sta media non va?
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 05, 2018, 07:24 pm
non è che particelle di polvere o residui dello sparo possano dare problemi?

proverei a fare un detachInterrupt appena entrato nella isr corrispondente...
per riabilitarli dopo all'uscita del primo if
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 05, 2018, 08:00 pm
... anche secondo me è un problema che riceve più letture da un singolo sparo ... ::)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 08:23 pm
Gug, Patrick la misurazione funziona bene, normalmente legge tutti gli spari ed ora io non lo sto testando con tiri reali ma facendo cadere un piombino nel tubo sensori.
Ho provato anche interrompendo manualmente il fascio. Il contaspari salta subito a 3 e po a 1.
Quindi ora è uno sparo come dire...puilitissimo ed a bassa velocità.
E' stranissimo. A me sembra un problema di codice...vi assicuro che ho fatto molti tentativi e con molta attenzione arrivando anche io ad alcune delle soluzioni da voi suggerite.
Ho provato anche ad utilizzare singolarmente i due t1 e t2...nada.
sempre 0.00 visualizzato dopo tre letture, poi altre tre sempre con  0.00, e poi dopo due la scritta "inf".
Ho usato, per la media, parametri diversi ottenendo sempre ste letture anomale e doppie. se riesco posto un video.
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 05, 2018, 09:11 pm
evidentemente il passaggio del pallino allora è troppo lento :D
prova a modificare così
Code: [Select]

void ISR1(void) {
  detachInterrupt(0);
  t1 = micros();
}
void ISR2(void) {
  detachInterrupt(1);
  t2 = micros();
}

e qui:
Code: [Select]

  if ((t1 != 0) && (t2 != 0))  {
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;
    attachInterrupt(digitalPinToInterrupt(2), ISR1, HIGH);
    attachInterrupt(digitalPinToInterrupt(3), ISR2, HIGH);
    //qui sommi il delta
    deltaTMedia += deltaT;
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 09:40 pm
provo subito tieni però conto che lasciando cadere il pallino cmq mi da la lettura della velocità ed è anche molto costante. Quindi non credo sia lì il problema.
Il tempo di aggiornare il codice e ti dico
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 05, 2018, 09:45 pm
ok, se non funge....per favore posta il programma che stai usando (completo) ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 10:12 pm
La parte relativa alla misurazione che funziona è tra /* */ come testo.
Se la attivo funziona una volta sola e poi si blocca. Questo dopo l'intrevento sugli interrupt (detach/attach).
Le letture della media - sul  monitor seriale - sono come prima incoerenti.
Il contaspari salta

Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 05, 2018, 10:57 pm
diciamo che la parte ora commentata va eliminata ed  i calcoli integrati nell'if (contaSpari==5) altimenti ovviamente non funziona...

non capisco perchè la variabile debba saltare

ti ho aggiunto dei serial.print per seguire un po l'andamento, magari salvalo con un altro nome e provalo

Code: [Select]
#include <Wire.h>  // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address

#define MPS2FPSCOEFF 3.28084         // coefficente trasformazione metri x sec --> foot x sec
#define LENGHT 0.12                    // 12 cm distanza
#define MICRO2SEKCOEFF 1000000       // coefficente trasformazione microsecondi
#define weight 0.49

// ---------- media -------

float deltaTMedia;
byte contaSpari;

// ------------------------

volatile unsigned long t1, t2;
unsigned long deltaT;

double fpsSpeed, mpsSpeed, joule; // double = float

void ISR1(void) {
  detachInterrupt(0);
  t1 = micros();
}
void ISR2(void) {
  detachInterrupt(1);
  t2 = micros();
}
void setup()
{
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();

  // -------------- avvio video/serial --------------------

  //lcd.backlight(); // finish with backlight on
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SuperCrono by NV");
  delay(500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("peso impostato:");
  lcd.setCursor(0, 1);
  lcd.print("grammi:  " + String(weight));
  //Serial.println("Cronografo by NV");
  delay(500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Take a shot!...");

  // -----------------------------------------------------

  t1 = 0;
  t2 = 0;
  deltaT = 0;
  fpsSpeed = mpsSpeed = 0;
  attachInterrupt(digitalPinToInterrupt(2), ISR1, HIGH);     // 0 sul pin digitale 2 - CHANGE/FALLING/RISING/LOW
  attachInterrupt(digitalPinToInterrupt(3), ISR2, HIGH);     // 1 sul pin digitale 3
}

void loop() {
  // ------------- MEDIA
  if ((t1 != 0) && (t2 != 0)) {
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;
    //qui sommi il delta
    deltaTMedia += deltaT;

    //aggiungiamo un po di debug :-)
    Serial.print("spari ");
    Serial.print(contaSpari);
    Serial.print("\t");
    Serial.print("deltaT ");
    Serial.print(deltaT);
    Serial.print("\t");
    Serial.print("deltaTMedia ");
    Serial.println(deltaTMedia);
    Serial.print("\t");
    Serial.print("Media attuale  ");
    Serial.println(deltaTMedia/contaSpari);
   
    contaSpari ++ ;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("ancora: ");
    lcd.print(5 - contaSpari);
    lcd.print(" spari");

    if (contaSpari == 5) {   //qui controlli se contaSpari è= 5
      contaSpari = 0;
     
      //il risultato è un numero con la virgola quindi creo un float locale
      float fDeltaT = deltaTMedia / 5.0; //ora o modifichi la formula oppure fai
      mpsSpeed = (LENGHT * (MICRO2SEKCOEFF)) / fDeltaT;
      joule = ((mpsSpeed * mpsSpeed * weight) / 2) / 1000; //

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("m/sec : ");
      lcd.print(mpsSpeed, 1);
      lcd.setCursor(0, 1);
      lcd.print("Joule : ");
      lcd.print(joule);
      Serial.println("Speed avg :");
      Serial.println(mpsSpeed);
    }
    attachInterrupt(digitalPinToInterrupt(2), ISR1, HIGH);
    attachInterrupt(digitalPinToInterrupt(3), ISR2, HIGH);
  }
}
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 05, 2018, 11:37 pm
..faccio qualche test...doesn't make so much sense for me!!!
Tre tiri ecco l'output debug (monitor seriale)

spari 0 deltaT 162968 deltaTMedia 162968.00
Media attuale  inf
spari 1 deltaT 12 deltaTMedia 162980.00
Media attuale  162980.00
spari 2 deltaT 152396 deltaTMedia 315376.00
Media attuale  157688.00
spari 3 deltaT 12 deltaTMedia 315388.00
Media attuale  105129.34
spari 4 deltaT 114052 deltaTMedia 429440.00
Media attuale  107360.00
Speed avg :
1.40
spari 0 deltaT 12 deltaTMedia 429452.00
Media attuale  inf
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 12:40 am
...perchè non proviamo con un array e 10 valori?
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 08:54 am
...perchè non proviamo con un array e 10 valori?
perché è una sciocchezza ! DEVE assolutamnete funzionare con quel sistema altrimenti il problema è altrove ...

Aggiungete tra le Serial.print() la stampa del valore di (t2 - t1) per ogni sparo ... voglio vedere quanto è costante ...

Quindi, per ogni singolo sparo, stampare in sequenza i valori di:

1. (t2 - t1)
2. deltaTMedia (dopo la somma)
3. contatore (dopo l'incremento)
4. (deltaTMedia/contatore)

Guglielmo

P.S.: E togliete quell'inutile disabilitazione/abilitazione degli interrupt ... che NON serve, anzi ... ::)
P.P.S: Inoltre nel codice vedo una IF ripetuta ... perché ? ? ? :o ... la IF dello sparo deve essere unica !
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 09:40 am
In pratica ...

Code: [Select]
if ((t1 != 0) && (t2 != 0))  {
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;
    Serial.print("Differenza tempi: "); Serial.println(deltaT);

    deltaTmedia += deltaT
    Serial.print("Valore accumulato: "); Serial.println(deltaTmedia);

    contaSpari ++ ;
    Serial.print("Valore del contatore: "); Serial.print(contaSpari);

    Serial.print("Media attuale : "); Serial.println(deltaTmedia/contaSpari);

    //qui controlli se contaSpari è= 5
    if (contaSpari == 5) {
       //ora o modifichi la formula oppure fai
       deltaT= deltaTmedia/5;
       contaSpari=0;
       // ------------ calcolo velocità ------------------------------------

       mpsSpeed = (LENGHT * (MICRO2SEKCOEFF)) / deltaT;  // s = v * t, v = s / t ; MICRO2SEKCOEFF COEE
       joule = ((mpsSpeed * mpsSpeed * weight) / 2) / 1000; //

       // ---------------------------------

       lcd.clear();
       lcd.setCursor(0, 0);
       lcd.print("m/sec : ");
       lcd.print(mpsSpeed, 1);
       lcd.setCursor(0, 1);
       lcd.print("Joule : ");
       lcd.print(joule);
    }
}

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 06, 2018, 09:52 am
P.S.: E togliete quell'inutile disabilitazione/abilitazione degli interrupt ... che NON serve, anzi ... ::)
P.P.S: Inoltre nel codice vedo una IF ripetuta ... perché ? ? ? :o ... la IF dello sparo deve essere unica !
appurato che non è un problema  di problemi nel passaggio si, si può togliere l'attach/detach degli interrupts

scusa ma, dove la vedi la if ripetuta?

si vede comunque che i tiri 1 e 3  e il nuovo 0 hanno un deltaT = 12 microsecondi e sono uguali oltre che falsi (quindi i tiri "pari")


p.s.
ma le resistenze di pul-down sui pin 2 e 3 ci sono?
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 10:00 am
scusa ma, dove la vedi la if ripetuta?
... non dicevo a te ;)

Parlavo del codice al post #210, ma effettivamente mi era sfuggito che la prima è commentata :D ... quindi, si, non ci sono IF ripetute.

Vediamo i risultati delle Serial.print() che gli ho indicato, perché ... continuo a sospettare false letture ... ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 06, 2018, 10:13 am
... io e' un po che ho un dubbio diverso, ma non credo c'entri con il malfunzionamento ... comunque ... perche' stai definendo delle variabili con dei valori che non cambieranno mai, per usarle poi all'interno dei calcoli come variabili, invece di limitarti ad usare direttamente i loro valori finali ? ... voglio dire ...

Code: [Select]

  mpsSpeed = (LENGHT * (MICRO2SEKCOEFF)) / deltaT;  // s = v * t, v = s / t ; MICRO2SEKCOEFF COEE
       joule = ((mpsSpeed * mpsSpeed * weight) / 2) / 1000; //


sembra un pezzo di programma che viene da qualche altra parte, con della roba che a te non serve ... nel senso ... "lenght" e' la distanza fra i fotodiodi, non puo cambiare ... micro2sekcoeff e' costante, non puo cambiare ... nel calcolo li devi per forza usare in quel modo e non puoi ne devi cambiarli ... quindi dato che lenght e' 0.12 sempre, e micro2sekcoeff e' 1000000 sempre, e che 0.12*1000000 fara' sempre e comunque 120000, perche' non fai semplicemente " mpsSpeed = 120000 / deltaT " ? ... e per la riga sotto, non e' piu semplice " joule = (mpsSpeed^2 * weight) / 2000 " ? ... solo come esempio, ci sono altri punti simili in quel programma, che a leggerli mi sembrano "leggermente strani", ma non essendo un programmatore, magari e' solo una mia impressione ...

Poi, Guglielmo mi ha di nuovo preceduto mentre scrivevo, ma anche a me era venuta la tentazione di chiederti di scrivere sempre anche le due variabili t1 e t2 ... per controllare se magari i malfunzionamenti potessero dipendere da false letture del sistema ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 10:57 am
ecco fatto:

il codice come da poi suggerito è un pò sporco di altro che c'era prima ma commentato. Ho tolto anche le variabili nella formula ed ho messo i valori fissi.



Code: [Select]
#include <Wire.h>  // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address

//#define MPS2FPSCOEFF 3.28084         // coefficente trasformazione metri x sec --> foot x sec
//#define LENGHT 0.12                    // 12 cm distanza
//#define MICRO2SEKCOEFF 1000000       // coefficente trasformazione microsecondi
#define weight 0.49

// ---------- media -------

float deltaTMedia;
byte contaSpari;

// ------------------------

volatile unsigned long t1, t2;
unsigned long deltaT;

double fpsSpeed, mpsSpeed, joule; // double = float

void ISR1(void) {
  //detachInterrupt(0);
  t1 = micros();
}
void ISR2(void) {
  //detachInterrupt(1);
  t2 = micros();
}
void setup()
{
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();

  // -------------- avvio video/serial --------------------

  //lcd.backlight(); // finish with backlight on
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SuperCrono by NV");
  delay(500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("peso impostato:");
  lcd.setCursor(0, 1);
  lcd.print("grammi:  " + String(weight));
  //Serial.println("Cronografo by NV");
  delay(500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Take a shot!...");

  // -----------------------------------------------------

  t1 = 0;
  t2 = 0;
  deltaT = 0;
  fpsSpeed = mpsSpeed = 0;
  
  attachInterrupt(digitalPinToInterrupt(2), ISR1, HIGH);     // 0 sul pin digitale 2 - CHANGE/FALLING/RISING/LOW
  attachInterrupt(digitalPinToInterrupt(3), ISR2, HIGH);     // 1 sul pin digitale 3
}

void loop() {
  // ------------- MEDIA
  if ((t1 != 0) && (t2 != 0)) {
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;
// -----------------------

 Serial.print("Differenza tempi: ");
 Serial.println(deltaT);

    deltaTMedia += deltaT;
    Serial.print("Valore accumulato: ");
    Serial.println(deltaTMedia);

    Serial.print("Media attuale : ");
    Serial.println(deltaTMedia/contaSpari);
// ----------------------
    
    
    
    //qui sommi il delta
    deltaTMedia += deltaT;

    //aggiungiamo un po di debug :-)
    /*
    Serial.print("\t");
    Serial.print("t2-t1 ");
    Serial.println(t2-t1);
    Serial.print("\t");
    Serial.print("deltaTMedia ");
    Serial.println(deltaTMedia);
    Serial.print("\t");
    Serial.print("contaSpari ");
    Serial.println(contaSpari);
    Serial.print("\t");
    Serial.print("Media attuale  ");
    Serial.println(deltaTMedia/contaSpari);
    */
    
    contaSpari ++ ;
    Serial.print("Valore del contatore dopo: ");
    Serial.println(contaSpari);

    //Serial.print("Media attuale : "); Serial.println(deltaTmedia/contaSpari);
  
   // Serial.print("\t");
   // Serial.print("contaSpari dopo ");
   // Serial.println(contaSpari);
    
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("ancora: ");
    lcd.print(5 - contaSpari);
    lcd.print(" spari");

    if (contaSpari == 5) {   //qui controlli se contaSpari è= 5
      contaSpari = 0;
    
      //il risultato è un numero con la virgola quindi creo un float locale
      float fDeltaT = deltaTMedia / 5.0; //ora o modifichi la formula oppure fai
      mpsSpeed = (0.12 * 1000000) / fDeltaT;
      joule = ((mpsSpeed * mpsSpeed * weight) / 2) / 1000; //

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("m/sec : ");
      lcd.print(mpsSpeed, 1);
      lcd.setCursor(0, 1);
      lcd.print("Joule : ");
      lcd.print(joule);
      //Serial.println("Speed avg :");
      //Serial.println(mpsSpeed);

  }
}
}



e la strusciata su 5 tiri simulati con piombino lasciato cadere. Il numero dei tiri salta. ATTENZIONE però: ho visto che ANCHE nella misurazione normale i tiri vanno a gruppi di 2. (la prima strusciata che segue è la SOLA lettura con altro codice PULITO).

Code: [Select]

metri al secondo:  0.75
Joule:  0.00
metri al secondo:  0.00
Joule:  0.00
metri al secondo:  0.59
Joule:  0.00
metri al secondo:  0.00
Joule:  0.00
metri al secondo:  1.10
Joule:  0.00
metri al secondo:  0.00
Joule:  0.00
metri al secondo:  1.20
Joule:  0.00



Code: [Select]


Differenza tempi: 98796
Valore accumulato: 98796.00
Media attuale : inf
Valore del contatore dopo: 1
Differenza tempi: 4292266520
Valore accumulato: 4292464128.00
Media attuale : 4292464128.00
Valore del contatore dopo: 2
Differenza tempi: 105740
Valore accumulato: ovf
Media attuale : 4292418304.00
Valore del contatore dopo: 3
Differenza tempi: 4291487952
Valore accumulato: ovf
Media attuale : 4292143360.00
Valore del contatore dopo: 4
Differenza tempi: 146440
Valore accumulato: ovf
Media attuale : 4292016128.00
Valore del contatore dopo: 5
Differenza tempi: 4292563868
Valore accumulato: ovf
Media attuale : inf
Valore del contatore dopo: 1
Differenza tempi: 114012
Valore accumulato: ovf
Media attuale : ovf
Valore del contatore dopo: 2
Differenza tempi: 4291146900
Valore accumulato: ovf
Media attuale : ovf
Valore del contatore dopo: 3
Differenza tempi: 123876
Valore accumulato: ovf
Media attuale : ovf
Valore del contatore dopo: 4
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 06, 2018, 11:14 am
... con piombino lasciato cadere...
Ehm ... il piombino lasciato cadere, sei sicuro che passa SEMPRE perfettamente in asse con i fotodiodi ? ... perche' non e' la stessa cosa, lasciarlo cadere a mano e spararlo ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 11:21 am
O Piombino fatto cadere o interruzione del fascio a mano l' effetto è preciso anche perché il rilevamento funziona.  Poi la doppia lettura non è randomica ma sistematica. Si ripete con regolarità... una vuota una no. E se ce n'è una falsa da doppia lettura a 0.00.
Vorrei fare una prova... staccare uno dei fotodiodi dato che ogni barriera ha due IR e due fotodiodi
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 11:38 am
E' più che evidente che, in alcuni casi, legge un primo passaggio (start) e NON legge il secondo (stop) e ... va in overflow (4292266520) alterando tutte le letture.

La soluzione potrebbe essere scartare le letture "impossibili" e mantenere solo quelle valide ... oltre a ricercare la causa della falsa lettura.

Guglielmo

Edit: No, la prima affermazione è errata, se non legge il secondo passaggio NON abbiamo t2 che rimane a 0 ... ::) e quindi NON dovrebbe fare i calcoli ... quindi, qualche cosa legge, ma una delle due letture è errata e vengono fuori numeri vicini al limite di 232 ovvero il massimo di unsigned long ... ::)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 12:22 pm
Ok. Provo a modificare il sensore barriere ed inoltre provo il codice media in un altro codice strutturato diversamente. Appena a casa lo posto.
Gug possibile che la falsa lettura sia così... regolare? Mi sembra strano
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 06, 2018, 12:24 pm
Quote
e per la riga sotto, non e' piu semplice " joule = (mpsSpeed^2 * weight) / 2000 "
solo una precisazione

il carattere ^ qui è = xor
per elevare al quadrato si deve usare sq(mpsSpeed) ;)

cosa vuol dire che ogni barriera ha 2tx e 2 rx?

sono entrambi sullo stesso pin?

Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 06, 2018, 12:30 pm
Quote
Generally, an ISR should be as short and fast as possible. If your sketch uses multiple ISRs, only one can run at a time, other interrupts will be executed after the current one finishes in an order that depends on the priority they have. millis() relies on interrupts to count, so it will never increment inside an ISR. Since delay() requires interrupts to work, it will not work if called inside an ISR. micros() works initially, but will start behaving erratically after 1-2 ms. delayMicroseconds() does not use any counter, so it will work as normal.
questo è ancora valido?
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 01:02 pm
Torniamo un'attimo indietro ... all'inizio l'OP ha parlato di velocità di circa 160 mt/sec ... ora, se ho ben capito, sta facendo le misure su una distanza di 0.12 mt, quindi il tempo (t2 - t1) che ci dobbiamo aspettare è di circa 750 μsec ... già se non si ottiene questo vuol dire che c'è qualche cosa che NON va o nell'HW o nel SW.

Io ripartirei da capo, con un programma senza tanti "fronzoli" che fa SOLO ED ESCLUSIVAMNETE la misura di (t2 - t1) e, solo dopo che con questo si ottiene una misura valida, si può andare avati, ogni altra prova NON ha senso.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 01:17 pm
Una cosa così dovrebbe bastare per iniziare a vedere se tutto funziona e/o per diagnosticare il problema ...

Code: [Select]
volatile unsigned long t1, t2;
unsigned long deltaT;

void ISR1(void) {
  t1 = micros();
}

void ISR2(void) {
  t2 = micros();
}
void setup() {
  t1 = 0;
  t2 = 0;
  Serial.begin(9600);
  //
  EIFR = bit (INTF0);
  EIFR = bit (INTF1);
  //
  attachInterrupt(digitalPinToInterrupt(2), ISR1, HIGH);    
  attachInterrupt(digitalPinToInterrupt(3), ISR2, HIGH);
}

void loop() {
  if ((t1 != 0) && (t2 != 0))
  {
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;
    Serial.print("Tempo misurato : ");
    Serial.print(deltaT);
    Serial.println(" μsec.");
  }
}

... usando esattamente questo codice, esegui uno per volta una serie di VERI spari (no le cadute di pallino che hanno tempi del tutto differenti e quindi insignificative per vedere i veri problemi).

Guglielmo

P.S.: L'ho scritto al volo, quindi, cortesemente, controllate eventuali errori di battitura e altro ...
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 06, 2018, 02:07 pm
se non sbaglio un pallino lasciato cadere per un'altezza di 0,12 metri dovrebbe metterci circa 156 millisecondi, quindi circa 200 volte di più
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 02:17 pm
Se fa 160 m. al sec. che sono 16000 cm al sec. ... calcola il tempo per fare 12 cm. ... ::)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 06, 2018, 02:30 pm
Se fa 160 m. al sec. che sono 16000 cm al sec. ... calcola il tempo per fare 12 cm. ... ::)

Guglielmo
sisi, sparato....
ma se ho capito tutto il discorso l'OP non è pronto per eseguire lo sparo.

quindi se lasciato cadere a mano ci mette circa 200 volte di più
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 02:53 pm
Allora cerco di ricapitolare.
Un dato certo che vi posso dare è la COERENZA delle misurazioni negli spari in quanto - fatte salve le poche false letture per qualsivolgia motivo - sono credibili. Il misuratore legge valri tra 175/180 m/sec che è la velocità appropriata per l'arma e che ci da valori joule intorno ai 7.5...come previsto dalla legge.
Da qui la ocnsiderazione che la lettura del pallino lasciato cadere "dovrebbe" essere ugualmente coerente infatti da valori costanti intorno ai 0.9/1,3 m/s e joule irrilevante.
Per la parte HW il circuito e quello ppstato che allego di nuovo.
Viene usato UN solo chip dato che ha 2 ampli interni, però volendo potri provare due chip separati. Uno per barriera.
Le barrire sono costituite OGNUNA da 2 coppie di IR e relativo fotodiodo. Ogni coppia va - ovviamente - ad un piedino (quelli dedicati agli interrupt).
Ora faccio qualche prova con il codice di Gug.

(https://preview.ibb.co/cJ38dV/circuito-ok.jpg) (https://ibb.co/ktJwXq)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 03:07 pm
ecco la strusciata del codice Gug
a 680 micro V = 176,47  ed a 664 V = 180. Misure assolutamente attendibili
.
Il pallino lasciato cadere sembra indurre false letture.

Code: [Select]

4 piombini lasciati cadere:

Tempo misurato : 93984 μsec.
Tempo misurato : 4291737568 μsec.
Tempo misurato : 92244 μsec.
Tempo misurato : 4289374004 μsec.
Tempo misurato : 90816 μsec.
Tempo misurato : 4292129892 μsec.
Tempo misurato : 90104 μsec.
Tempo misurato : 4267003588 μsec.

3 colpi sparati:

Tempo misurato : 680 μsec.
Tempo misurato : 664 μsec.
Tempo misurato : 4278622228 μsec.
Tempo misurato : 680 μsec.

Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 06, 2018, 03:23 pm
la seconda lettura è evidentemente una sottrazione tra t1 e t2 dove t1 > t2
quindi t2 rimane sporco... non so perchè :o
e ... se provi ad azzerare t2 quando entri in isr1

oppure cambiare questo
Code: [Select]

 if ((t1 != 0) && (t2 != 0))

con
Code: [Select]
if ((t1 != 0) && (t2 >t1))
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 03:34 pm
caz....
Patrick ecco la tua strusciata!!!!..pallino fatto cadere

Code: [Select]


Tempo misurato : 103496 μsec.
Tempo misurato : 92964 μsec.
Tempo misurato : 92392 μsec.
Tempo misurato : 101460 μsec.
Tempo misurato : 91336 μsec.
Tempo misurato : 90208 μsec.


ed u naltra fatta pure in fretta

Code: [Select]

Tempo misurato : 91632 microsec.
Tempo misurato : 101968 microsec.
Tempo misurato : 91024 microsec.
Tempo misurato : 106468 microsec.
Tempo misurato : 122296 microsec.
Tempo misurato : 94592 microsec.
Tempo misurato : 189068 microsec.
Tempo misurato : 161404 microsec.
Tempo misurato : 118528 microsec.

 ed ecco anche 3 tiri. NOTO dei tempi leggermente minori quindi V salita... :smiley-roll-blue:


Code: [Select]

Tempo misurato : 628 microsec.
Tempo misurato : 636 microsec.
Tempo misurato : 648 microsec.
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 06, 2018, 04:23 pm
... tempi leggermente minori ...
... 600 vs 120000 ... hai uno strano concetto del termine "leggermente" ... :P (scherzo :D)
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 04:28 pm
Arrrrgggg ... fermi tutti ... e ovvio l'errore ... pensateci, è banale ... appena rientro ve lo dico :D :D :D

Guglielmo

P.S.: Quello che gli ha fatto fare Patrick dovrebbe illuminarvi ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 04:33 pm
Ete...parlavo dei tiri veri....

Grande Patrick!!!

Gug...svelaci l'arcano.

Ora sembra funzionare anche il codice media.

Faccio qualche test
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 04:44 pm
Ora sembra funzionare anche il codice media.
NO sta funzionando male e stai scartando delle misure che invece NON vanno scartate, sono solo calcolate male ... :D

L'IF è deve rimanere per t1 e t2 diversi da a zero !

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 04:49 pm
NO sta funzionando male e stai scartando delle misure che invece NON vanno scartate, sono solo calcolate male ... :D

L'IF è deve rimanere per t1 e t2 diversi da a zero !

Guglielmo
Solo per la parte media o per tutto il codice?
Volendo potrei gestire con 2 if.
E quindi c'ammafà?
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 04:53 pm
Ammazza oh ... sete de coccio ... ma nun ve viene in mente che anche micros() va in overflow e che quindi t1 potrebbe essere maggiore di t2 ? ? ? ... e quindi?  ... vediamo chi tira fuori la formuletta magica ... :D :D :D

Subito dopo:

Code: [Select]
if ((t1 != 0) && (t2 != 0)) {
... occorre fare un altra cosa ... mo v'ho detto tutto ...
 
Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 04:58 pm
...ma porcaccia miseria.
Vediamo...
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 06, 2018, 05:01 pm
hai perfettamente ragione Guglielmo :) ma deve succedere dopo 71 minuti non uno sparo si e l'altro no... è questo che mi lascia perplesso
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 05:06 pm
hai perfettamente ragione Guglielmo :) ma deve succedere dopo 71 minuti non uno sparo si e l'altro no... è questo che mi lascia perplesso
... questo pure è vero ... (http://www.nikonland.eu/forum/public/style_emoticons/default/GrattaTesta.gif) ... in ogni caso è una cosa di cui tenere conto. Cominciamo con risolvere il caso dell'overflow e vediamo come va, poi ragioniamo sul resto ...

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 06, 2018, 05:09 pm
io ho paura che sia il doppio sensore sullo stesso ic...
e non so ancora se sono presenti le resistenze di pul-down sui pin 2 e 3 ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 05:14 pm
Patrick lo schema è al post # 231.
Dal punto di vista schematico non so dirti se quella configurazione è coerente con ciò che suggerisci.

sul piedino 2 c'è un pot da 10k tra 5vcc e gnd quindi direi di si
sul piedino 3 c'è quella da 10k in serie ai fotodiodi direi che anche qui una sorta di pull c'è...o sbaglio?

Ovviamente replicato sull'altro amp dello stesso chip
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 06, 2018, 05:24 pm
scusami, non parlo dei pin dell'lm358 ma dei pin di arduino cioè dal contatto digital al pin 2 e 3 di arduino non c'è nulla?

p.s.
poi magari con questo circuito non serve.... sono ignorante a tal proposito :)
Title: Re: CRONOGRAFO BALISTICO
Post by: Sulimarco on Nov 06, 2018, 05:40 pm
Secondo me dovete configurare gli interrupt su fronte di salita


Code: [Select]
  attachInterrupt(digitalPinToInterrupt(2), ISR1, RISING);     
  attachInterrupt(digitalPinToInterrupt(3), ISR2, RISING);



e non su livello alto

Code: [Select]
  attachInterrupt(digitalPinToInterrupt(2), ISR1, HIGH);     
  attachInterrupt(digitalPinToInterrupt(3), ISR2, HIGH);



Marco
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 05:46 pm
... mi sa che "ho fatto i conti senza l'oste" ... mi sto incasiando pure io :smiley-eek: , ma mi viene il dubbio che la formuletta che abbiamo messo funzioni anche in caso di overflow, difatti, come nel caso di millis(), se sottraggo dal più piccolo il più grande ho un numero negativo, ma dato che parliamo di unsigned, usando le parole di Leo:

Quote
un unsigned long non può trattare numeri negativi per cui il risultato è in realtà dato dal massimo valore contenibile,  ossia 4.294.967.296, meno la differenza calcolata
... e quindi, dovrebbe funzionare comunque ... :smiley-mr-green:

Il problema è altrove ...

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 06, 2018, 05:47 pm
> Sulimarco: Gli avevo detto lo stesso all'inizio, ma ho visto che ha tenuto HIGH e pensavo che con RISING non gli funzionasse ... per cui non l'ho piu ripetuto ... pero' non so se potrebbe creare quel tipo di errore ... al massimo avrebbe l'errore dovuto alla lunghezza del pallino ...



> Patrick: non so perche' abbia messo il doppio sensore, in teoria dovrebbe funzionare anche con uno solo ... potrebbe dargli errore, ma solo se non fossero sullo stesso piano (intendo, se li ha messi "a croce" ma sono sullo stesso piano rispetto all'asse del cilindro, non dovrebbero causare problemi, se invece sono anche su piani diversi, allora si, avrebbe un'errore, ma non dovrebbe essere un'errore casuale, ma errore di misura sempre uguale)

EDIT: complicandosi leggermente la vita (e se ci fossero disponibili altri due interrupt), si potrebbero usare due coppie di sensori su due piani diversi per rilevare gli errori di lettura ... ma questo e' un'altro discorso, e richiede comunque altri due interrupt ...

RIEDIT: e comunque resto convinto che mi piacerebbe vedere i segnali in uscita da quel sistema con un'oscilloscopio ... e' leggermente frustrante cercare un possibile errore software senza prima aver potuto escludere con sicurezza eventuali problemi hardware ...
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 05:50 pm
Grazie Sulimarco, in effetti non lo avevo notato, quello è un vero e proprio errore !

Dal reference:

Quote
The Due, Zero and MKR1000 boards allows also:
HIGH to trigger the interrupt whenever the pin is high.
... non so nemmeno perché gli funzioni, in ogni caso NON è una modalità supportata !!!

Giusto invece far scattare l'interrupt sul fronte di salita del segnale, quindi RISING.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 05:55 pm
Torniamo a bomba, vince59 prova questo codice (senza modificarlo) e riporta:

Code: [Select]
volatile unsigned long t1, t2;
unsigned long deltaT;

void ISR1(void) {
  t1 = micros();
}

void ISR2(void) {
  t2 = micros();
}

void setup() {
  t1 = 0;
  t2 = 0;
  Serial.begin(9600);
  //
  EIFR = bit (INTF0);
  EIFR = bit (INTF1);
  //
  attachInterrupt(digitalPinToInterrupt(2), ISR1, RISING);     
  attachInterrupt(digitalPinToInterrupt(3), ISR2, RISING);
}

void loop() {
  if ((t1 != 0) && (t2 != 0))
  {
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;
    Serial.print("Tempo misurato : ");
    Serial.println(deltaT);
    Serial.println(" microsec.");
  }
}

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 06, 2018, 05:59 pm
Guglielmo, scrivi troppo veloce, uno non riesce neppure ad editare un post, che l'hai gia seminato per strada :D

Comunque, giusto per curiosita', c'e' la possibilita' di avere altri due pin con interrupt sul 328 ? ... o ci si deve limitare a quei due fisici e basta ?
Title: Re: CRONOGRAFO BALISTICO
Post by: Sulimarco on Nov 06, 2018, 06:00 pm
Quote
> Sulimarco: Gli avevo detto lo stesso all'inizio, ma ho visto che ha tenuto HIGH e pensavo che con RISING non gli funzionasse ... per cui non l'ho piu ripetuto ... pero' non so se potrebbe creare quel tipo di errore ... al massimo avrebbe l'errore dovuto alla lunghezza del pallino ...
Al di la del fatto che HIGH sia supportato o no dalla piastra, e' un errore perche' l'interrupt scatta di nuovo fino a quando permane il livello alto.

Marco
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 06:06 pm
Al di la del fatto che HIGH sia supportato o no dalla piastra, e' un errore perche ...
Esattissimo anche questo !!!

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 06:06 pm
provvedo Capo!

Intanto  col RISING cambia nulla.... prima di usare HIGH ho verificato ed ho letto da qualche parte che è supportata. Cmq ora è su RISING

@ Ete: doppio sensore perchè volevo una barriera "consistente"; sono messi a croce.

@ Patrick: il digital viene sparato (per rimanere in tema) direttamente in Arduino. Se vuoi provo una pull.
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 06:08 pm
Comunque, giusto per curiosita', c'e' la possibilita' di avere altri due pin con interrupt sul 328 ? ... o ci si deve limitare a quei due fisici e basta ?
No, si può avere un "particolare" interrupt su tutti i pin, si chiama "pin change interrupt", ma per carità ... è ancora più incasinato da gestire, tocca usare un'apposita libreria o fare del lavoro a basso livello e ... NON mi sembra porprio il caso.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 06:09 pm
10 pallini lasciati cadere

Code: [Select]


Tempo misurato : 109368
 microsec.
Tempo misurato : 4292328856
 microsec.
Tempo misurato : 4292792220
 microsec.
Tempo misurato : 4292163488
 microsec.
Tempo misurato : 4292228868
 microsec.
Tempo misurato : 4291854756
 microsec.
Tempo misurato : 4290927076
 microsec.
Tempo misurato : 4292710764
 microsec.
Tempo misurato : 4292782096
 microsec.
Tempo misurato : 4293022532
 microsec.
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 06:16 pm
Intanto  col RISING cambia nulla.... prima di usare HIGH ho verificato ed ho letto da qualche parte che è supportata.
... tu puoi leggere qualsiasi bojata su internet, sta di fatto che il datasheet del ATmega328P indica che nel registro EICRA ci son DUE bit per selezionare come far scattare l'interrupt:

Code: [Select]
00 - The low level of INTx generates an interrupt request.
01 - Any logical change on INTx generates an interrupt request.
10 - The falling edge of INTx generates an interrupt request.
11 - The rising edge of INTx generates an interrupt request.

... e, come vedi, posto per HIGH non ce n'è.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 06:20 pm
soRRY about that...in effetti NON parlava della 1!...però ci ho provato avendo verifivcato col tester cosa accadeva. Poi visto che girava l'ho lasciato.
Cmq ora la versione full del codice, con inserimento peso e media display dopo 5 tiri sembra girare bene. Più tardi provo con i tiri.
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 06, 2018, 06:21 pm
... è ancora più incasinato da gestire...
Allora nulla ... mi era venuta l'idea di gestire l'errore in automatico, ma senza altri due interrupt viene troppo incasinato ...


... e, come vedi, posto per HIGH non ce n'è.
Il che mi fa venire un'altro dubbio, e qui serve l'esperto (indovina chi e' :D) ... se non e' supportato, nella compilazione non dovrebbe dargli un'errore ? ... o non e' che nell'ide hanno accrocchiato qualcosa per trasformare un "high" non supportato in un "rising" in automatico ? ...
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 06:23 pm
10 pallini lasciati cadere ....
Incomprensibile ... di overflow non si tratta, dato che, come dice giustamente Patrick, ok una volta, ma la volta successiva è 70 minuti dopo, le variabili vengono pulite ... mmm ... proviamo a fare un'ulteriore piccola modifica ... durante i calcoli disabilitiamo i due pin di interrupt e riabilitiamoli alla fine di tutto ... e, se non funziona nenache così torniamo all'idea di Patrick di disabiltarli subito dopo lo scatto e riabilitarli alla fine di tutto (... cosa che però ha senso solo se c'è un problema sull'HW che genera gli interrupt) ... altre cose, in mente, non mi vengono ... ::)

Code: [Select]
volatile unsigned long t1, t2;
unsigned long deltaT;

void ISR1(void) {
  t1 = micros();
}

void ISR2(void) {
  t2 = micros();
}

void setup() {
  t1 = 0;
  t2 = 0;
  Serial.begin(9600);
  //
  EIFR = bit (INTF0);
  EIFR = bit (INTF1);
  //
  attachInterrupt(digitalPinToInterrupt(2), ISR1, RISING);    
  attachInterrupt(digitalPinToInterrupt(3), ISR2, RISING);
}

void loop() {
  if ((t1 != 0) && (t2 != 0))
  {
    //
    detachInterrupt(digitalPinToInterrupt(2));
    detachInterrupt(digitalPinToInterrupt(3));
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;
    Serial.print("Tempo misurato : ");
    Serial.println(deltaT);
    Serial.println(" microsec.");
    //
    EIFR = bit (INTF0);
    EIFR = bit (INTF1);
    attachInterrupt(digitalPinToInterrupt(2), ISR1, RISING);    
    attachInterrupt(digitalPinToInterrupt(3), ISR2, RISING);
  }
}

... fammi sapere ...

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 06:33 pm
Il che mi fa venire un'altro dubbio, e qui serve l'esperto (indovina chi e' :D) ... se non e' supportato, nella compilazione non dovrebbe dargli un'errore ? ... o non e' che nell'ide hanno accrocchiato qualcosa per trasformare un "high" non supportato in un "rising" in automatico ? ...
Ahahahahahahah ... scoperto l'arcano ... HIGH e LOW sono due costanti ...
Code: [Select]
#define HIGH 0x1
#define LOW  0x0

... per gli interrupts sono invece definite le seguenti costanti:
Code: [Select]
#define CHANGE 1
#define FALLING 2
#define RISING 3

... notate nulla ? :D :D :D

In pratica ... HIGH <---> CHANGE :D :D :D

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 06, 2018, 06:43 pm
... per cui in pratica, scrivere HIGH o scrivere CHANGE, diventa la stessa cosa ... :D

Visto quindi che quello non puo essere, mi rimane il dubbio del segnale generato ...

> vince59: non conosci proprio nessuno che potrebbe prestarti un'oscilloscopio o da cui andare per fare qualche test hardware ? ... cosi almeno potremmo escludere l'errore hardware, cosa che adesso non possiamo fare ...
Title: Re: CRONOGRAFO BALISTICO
Post by: Sulimarco on Nov 06, 2018, 06:58 pm
Quote
... per cui in pratica, scrivere HIGH o scrivere CHANGE, diventa la stessa cosa ... :D
Nel senso che non va bene ne' uno ne' l'altro perche' generano 2 interrupt per ogni impulso (fronte di salita e fronte di discesa)


2 interrupt sempre che i fronti siano puliti, ed un comparatore senza isteresi ha delle ottime probabilita' di generare dei fronti sporchi e quindi interrupt multipli.


Marco
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 06:59 pm
Visto quindi che quello non puo essere, mi rimane il dubbio del segnale generato ...
... è dall'inizio che sto chiedendo un oscilloscopio con memoria per vedere che diavolo esce da quel circuito, ma qui, come sempre, "facciamo le nozze coi fichi secchi" ... :D :D :D

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 07:03 pm
 :) ne avevo uno piccolino saismart...regalato.
Fatemi vedere cosa posso inventarmi. Tra poco vi aggiorno
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 06, 2018, 07:50 pm
boni i fichi secchi!! :D
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 06, 2018, 07:53 pm
ma ora tranne il primo tutti i valori erano altissimi.... sensori invertiti? :D



mmm no, ci sono più o meno 2 secondi dal valore riportato allo 0
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 08:05 pm
:) ne avevo uno piccolino saismart...regalato.
Non ti dico di comprare chissà che, ma un piccolo PicoScope 2000 (https://www.picotech.com/oscilloscope/2000/picoscope-2000-overview) con una banda passante di almeno 50 MHz ... mettitelo in casa ... ::)

Se poi vuoi avere un bello strumento senza svenarti ... un Rigol serie 1000 (https://www.rigolna.com/products/digital-oscilloscopes/1000/) è sicuramente meglio (es. DS1102D) :)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 09:58 pm
Gug, ecco la strusciata del codice di cui al post # 261.
10 pallini lasciati cadere. La lettura più alta di 100mila è prchè il pallino urta.

Quali sono i cambiamenti fatti?...nel senso software intendo.

Code: [Select]

Tempo misurato : 102024
 microsec.
Tempo misurato : 100340
 microsec.
Tempo misurato : 97260
 microsec.
Tempo misurato : 92732
 microsec.
Tempo misurato : 96100
 microsec.
Tempo misurato : 96100
 microsec.
Tempo misurato : 108492
 microsec.
Tempo misurato : 98528
 microsec.
Tempo misurato : 113928
 microsec.
Tempo misurato : 108500
 microsec.



questi invece alcuni tiri reali ma i piombini fanno schifo. Sui tiri reali al momento non ho il perfetto accoppiamento ocn la carabina

Code: [Select]

Tempo misurato : 668
 microsec.
Tempo misurato : 660
 microsec.
Tempo misurato : 720
 microsec.
Tempo misurato : 700
 microsec.
Tempo misurato : 712
 microsec.



Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 06, 2018, 10:19 pm
Gug, ecco la strusciata del codice di cui al post # 261.
10 pallini lasciati cadere. La lettura più alta di 100mila è prchè il pallino urta.
... mi sembra che più o meno ci siamo ... il problema è evidentemente nell'HW che genera "più interrupt" quando ne dovrebbe generare uno solo e, mentre uno sta facendo i calcoli, l'interrupt modifica "al volo" i valori delle variabili t1 e/o t2 mandando a "donnine di facili costumi" il tutto.

La modifica che ho fatto è:  appena si entra in quel IF, disabilitare gli interrupts su quei due pin (così da non sentire interrupts succesivi) e riabilitarli alla fine dei calcoli così da potre ripartire con un nuovo test.

Però ripeto, questa cosa, con un HW che funziona correttamente, NON dovrebbe essere necessaria, quindi ... è praticamente obbligatorio un oscilloscopio serio che ci mostri cosa accade veramente sulle singole linee di interrupt.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 06, 2018, 10:29 pm
ok vedo di organizzarmi e vedo di fare qualche esperimento con un tubo sensori diverso. Proverò un diametro maggiore (anche per comodità di innesto sulla canna della carabina) e una coppia sola di IR/fotodiodo per barriera.
Al momento sono soddisfatto. Ho messo il codice su un atmega stand-alone e praticamente la parte HW, tubo a parte, viene meno di una scatola di fiammiferi.
Se utilizzo un piccolo OLED è graziosissimo ma troppo piccolo...ma con un LCD 20x4 ci si sfizia con più informazioni.
Il codice lo sto pulendo un pò e domani farò prove di tiro x con il tubo stabilmente montato sulla carabina visto che finora lo tenevo con una mano mentre sparavo.
Bel lavoro. Grazie a tutti ho imparato molte cose.
Ma ....non finisce qui :)
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 06, 2018, 11:14 pm
 :smiley-mr-green:  :smiley-mr-green:
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 07, 2018, 01:03 am
buonanotte..


(https://preview.ibb.co/eEOJxq/20180915-154722.jpg) (https://ibb.co/bHv93V)
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 07, 2018, 03:44 am
... la notte porta consiglio ... :D :D :D

Ripensando a quanto scrive Sulimarco nel post #264 e riguardando lo schema messo da vince59 nel post #231, effettivamnete si vede che quello schema, salvo mio errore (Etem cortesemente conferma), è un comparatore SENZA isteresi (non vedo infatti nessuna resistenza che porta il segnale dall'uscita all'ingresso creando una retroazione) il che significa che effettivamente, in funzione di come vengono oscurati i fotodiodi, più che un unico fronte di salita ed un unico fronte di discesa (un impulso pulito), abbiamo magari un "treno" di impulsi ravvicinati, con le conseguenze del caso.

Per cui, intanto, si potrebbe pensare all'aggiunta di una resistenza di retroazione che crei un'isteresi o comunque un qualche sistema per evitare quanto sopra descritto ... Etem suggerimenti ? ? ? :)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 07, 2018, 04:06 am
Se utilizzo un piccolo OLED è graziosissimo ma troppo piccolo...
... e prendi un OLED o da 2.4" o da 2.8" ... costano un po' di più ma sono veramente belli   :)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 07, 2018, 09:12 am
Bgiorno. Si credo metterò un oled.

Rimango in attesa di indicazioni su come e se modificare il circuito. Vedo anche se riesco a sentire l' ingegnere elettronico di casa ma mi abita lontano
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 07, 2018, 09:48 am
io ho paura che sia il doppio sensore sullo stesso ic...
e non so ancora se sono presenti le resistenze di pul-down sui pin 2 e 3 ;)
scusami, non parlo dei pin dell'lm358 ma dei pin di arduino cioè dal contatto digital al pin 2 e 3 di arduino non c'è nulla?

p.s.
poi magari con questo circuito non serve.... sono ignorante a tal proposito :)

:(
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 07, 2018, 09:49 am
Quote
Re: CRONOGRAFO BALISTICO
#276
Today at 04:06 am Last Edit: Today at 04:06 am by gpb01
azz.... ma non dormi mai? :D
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 07, 2018, 09:54 am
proverò a mettere una resistenza sull'uscita digitale che ora va diretta sul pin di arduino e utilizzare una sola coppia ir/fotodiodo per barriera.
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 07, 2018, 10:02 am
no, aspetta che qualcuno confermi che serve.... :D
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 07, 2018, 10:13 am
no, aspetta che qualcuno confermi che serve.... :D
... non credo dovrebbe servire, quell operazionale dovrebbe dare o il livello GND o il livello +5V, ma non credo che entri in alta impedenza ... ::)

Il problema potrebbe essere simile a questo:

(http://www.itipacinotti.gov.it/pag_formazione/elettronica/Trigger/immagini/diag_rumore-1.jpg)

... dove la prima risultante, che genera più impulsi, è con un operazionale senza isteresi, la seconda, che genera il segnale corretto, è un operazionale con isteresi ::)

Ma aspettiamo Etem che, in questo campo (analogico), ne sa molto più di me ... :)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 07, 2018, 10:15 am
azz.... ma non dormi mai? :D
... per che fare? Perdere tempo ?  :smiley-yell: :smiley-yell: :smiley-yell:

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 07, 2018, 10:51 am
si avevo compreso di cosa stessimo parlando. Posso provare sia una pullup che down ho tutto ancora su breadboard.

Sto diamine di oscilloscopio. Non dovrebbe mancarne uno in ogni famiglia seria!!!..cosi come una saldatrice inverter, un compressore, un trapano a colonna, una stazione dissaldante, diversi saldatori, uan decina di tester e tutte le altre cosine belle ed utili,  8) altro che argenteria  :smiley-mr-green:  :smiley-mr-green:  :smiley-mr-green:  :smiley-mr-green:
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 07, 2018, 10:54 am
... Etem suggerimenti ? ? ? :)
Lo stesso che hai detto tu, mettere due resistenze, una fra uscita ed ingresso ed una fra ingresso e fotodiodo (come nella parte finale comparatore dello schema al post 82), in modo da creare un minimo di controreazione positiva, e quindi di isteresi, proprio per evitare il problema dell'oscillazione dell'uscita ... altro da provare potrebbe essere il trimmer al posto della resistenza di polarizzazione da 10K (1K fisso piu 10K trimmer in serie), in modo da poter variare a piacere la polarizzazione ... e se proprio si vuole esagerare in prudenza (anche se non dovrebbe servire in teoria), un condensatorino da 100n fra l'ingresso negativo collegato al centrale del trimmer di soglia sull'ingresso negativo e la massa ... pero' per vedere il segnale di uscita, serve comunque un'oscilloscopio, non si possono fare tante prove di funzionamento senza neppure sapere quale segnale esce ...



... finora lo tenevo con una mano mentre sparavo...
E qui abbiamo un'altro problema ... tenerlo con la mano, cosa che puo disallinearlo, ed averlo fissato alla canna, con gli assi dei fotodiodi sempre perpendicolari all'asse della canna, sono due cose molto diverse ... qui stiamo usando dei sensori che richiedono allineamento sicuro e stabile, non dei sensori a riga o ad immagine che possono funzionare anche disallineati ... per quel motivo all'inizio ti avevo chiesto se lo volevi usare fissato alla carabina o per spararci semplicemente attraverso, perche' le due cose richiedono per forza tipi di sensori differenti, per funzionare in modo corretto ... purtroppo non e' un'opzione, e' una necessita' ...
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 07, 2018, 10:55 am
proverò a mettere una resistenza sull'uscita digitale che ora va diretta sul pin di arduino e utilizzare una sola coppia ir/fotodiodo per barriera.
Servirebbe solo se usassi un comparatore "puro", perche' quelli hanno l'uscita a collettore aperto ... per gli operazionali non serve ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 07, 2018, 12:12 pm
Vi aggiorno
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 07, 2018, 12:14 pm
si avevo compreso di cosa stessimo parlando. Posso provare sia una pullup che down ho tutto ancora su breadboard.

Sto diamine di oscilloscopio. Non dovrebbe mancarne uno in ogni famiglia seria!!!..cosi come una saldatrice inverter, un compressore, un trapano a colonna, una stazione dissaldante, diversi saldatori, uan decina di tester e tutte le altre cosine belle ed utili,  8) altro che argenteria  :smiley-mr-green:  :smiley-mr-green:  :smiley-mr-green:  :smiley-mr-green:
hai dimenticato tornio da ferro e  tornio da legno... :D :D


Servirebbe solo se usassi un comparatore "puro", perche' quelli hanno l'uscita a collettore aperto ... per gli operazionali non serve ...
ecco appunto ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: MightyPegas on Nov 07, 2018, 12:49 pm
Salve,

In una pausa riflessiva ho dato un'occhiata in giro e mi ha incuriosito il titolo del thread :)

Se l'ipotesi di Guglielmo esposta sul post #282 è esatta, si potrebbe risolvere anche via sw...
Basterebbe che l'interrupt disabiliti se stesso…

Code: [Select]

volatile unsigned long t1, t2;
unsigned long deltaT;

void ISR1(void) {
  t1 = micros();
  detachInterrupt(digitalPinToInterrupt(2));
// oppure
//  EIMSK &= ~(1<<INT0);
}

void ISR2(void) {
  t2 = micros();
  detachInterrupt(digitalPinToInterrupt(3));
// oppure
//  EIMSK &= ~(1<<INT1);
}

void setup() {
  t1 = 0;
  t2 = 0;
  Serial.begin(9600);
  //

// ?????????????
//  EIFR = bit (INTF0);
//  EIFR = bit (INTF1);

  EIFR &= ~(1<<INTF0);
  EIFR &= ~(1<<INTF1);
  //
  attachInterrupt(digitalPinToInterrupt(2), ISR1, RISING);     
  attachInterrupt(digitalPinToInterrupt(3), ISR2, RISING);
}

void loop() {
  if ((t1 != 0) && (t2 != 0))
  {
    //
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;
    Serial.print("Tempo misurato : ");
    Serial.println(deltaT);
    Serial.println(" microsec.");
    //
    attachInterrupt(digitalPinToInterrupt(2), ISR1, RISING);     
    attachInterrupt(digitalPinToInterrupt(3), ISR2, RISING);
  }
}


In questa maniera gli interrupt si disabilitano da soli e non avrai altre interruzioni finchè non li riabiliti nel loop...

Poi... se con
EIFR = bit (INTF0);
EIFR = bit (INTF1);
l'intenzione era azzerare il flag degli interrupt, allora è sbagliato.
L'istruzione bit ritorna il valore del bit specificato
bit() (https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bit/)
"Computes the value of the specified bit (bit 0 is 1, bit 1 is 2, bit 2 is 4, etc.)."
per cui il risultato è:
EIFR = 1;
EIFR = 2;
L'istruzione corretta per azzerare quei bit è:
EIFR &= ~(1<<INTF0);
EIFR &= ~(1<<INTF1);

Massimo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 07, 2018, 01:02 pm
... premesso che proprio adesso stavo valutando una soluzione che potesse evitare la modifica dell'HW e che fosse la più veloce possibile :D, ti consigio di riguardati come si resetta la flag di Interrupt ... la si resetta scrivendoci ... '1' ;)

 cap. 17.2.3 del datasheet:

Quote
The flag is cleared when the interrupt routine is executed. Alternatively, the flag can be cleared by writing '1' to it.
... quindil 'istruzione  EIFR = bit (INTFx); funziona correttamente (... non per nulla è la stessa che usa Nick Gammon in tutti i suoi esempi sulla manipolazione degli Interrupts).

Detto questo, ho ottimizato il codice per evitare il più possibile l'uso di "wiring" e velocizzare al massimo (rendendo ancora più precise le misure) e, solo per leggibilità, ho usato la forma più classica per il set dei bit ;) ... vince59, fai una prova con questo codice (che a me funziona anche generando gli interrupt con un filaccio infilato a mano nel pin :D) e dimmi come va ...

Code: [Select]
volatile unsigned long t1, t2;
unsigned long deltaT;

// INT0 ISR
void ISR0(void) {
  t1 = micros();
  EIMSK &= ~(bit(INT0));
}

// INT1 ISR
void ISR1(void) {
  t2 = micros();
  EIMSK &= ~(bit(INT1));
}

void setup() {
  t1 = 0;
  t2 = 0;
  Serial.begin(9600);
  //
  EIFR |= bit(INTF0);
  EIFR |= bit(INTF1);
  //
  attachInterrupt(digitalPinToInterrupt(2), ISR0, RISING);     
  attachInterrupt(digitalPinToInterrupt(3), ISR1, RISING);
}

void loop() {
  if ((t1 != 0) && (t2 != 0))
  {   
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;
    Serial.print("Tempo misurato : ");
    Serial.println(deltaT);
    Serial.println(" microsec.");
    //
    delay(100);
    EIFR |= bit(INTF0);
    EIFR |= bit(INTF1);
    EIMSK |= bit(INT0);
    EIMSK |= bit(INT1);
  }
}

Guglielmo

P.S.: Il delay(100) probabilmente può anche essere ridotto ... ma tanto 1 decimo di secondo di ritardo tra uno sparo e l'altro non crea problemi (i tempi "umani" sono più lunghi :D) e assicura che ormai i due fototransistor siano tornati sicuramente a riposo ... ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: MightyPegas on Nov 07, 2018, 01:13 pm
Hai ragione Guglielmo, chiedo venia :)
Sono andato a memoria e l'EIFR mi ha fregato con la sua logica inversa...

Massimo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 07, 2018, 01:16 pm
Hai ragione Guglielmo, chiedo venia :)
Sono andato a memoria e l'EIFR mi ha fregato con la sua logica inversa...
... nessun problema :), sapessi quante volte a fregato me :D :D :D ... e, ogni tanto, passando da MCU AVR a PIC ed ad ARM ... se non faccio attenzione, mi ci rifrega ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 07, 2018, 01:25 pm
Guglielmo non esiste. È un Androide creato da Asimov molto tempo fa
Title: Re: CRONOGRAFO BALISTICO
Post by: MightyPegas on Nov 07, 2018, 01:56 pm
... nessun problema :), sapessi quante volte a fregato me :D :D :D ... e, ogni tanto, passando da MCU AVR a PIC ed ad ARM ... se non faccio attenzione, mi ci rifrega ;)
Ti dirò di più... per il post ero andato a cercare un pezzo di source (purtroppo cancellato) dove avevo fatto lo stesso giochino con l'interrupt, ma per un pulsante che doveva risvegliare la MCU dallo sleep...
Mi sa tanto che quel pezzo mi dava problemi perché avevo commesso lo stesso errore :D

Comunque se funziona occorrerà aggiungere dei controlli per scongiurare attivazioni fasulle dell'interrupt dovute a disturbi o altro.
Tipo: se si attiva INT0 e entro tot mS non parte INT1 allora si annulla, mentre se parte INT1 senza che si sia verificato INT0 allora si ignora...

Massimo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 07, 2018, 02:39 pm
Comunque se funziona occorrerà aggiungere dei controlli per scongiurare attivazioni fasulle dell'interrupt dovute a disturbi o altro.
Si, si, appena vince59 ci conferma che la cosa va, poi passiamo ad aggiungere i ... "casi particolari" ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 07, 2018, 02:56 pm
:)
che velocità di esecuzione a parte è quello che avevo messo nel post #207 :D :)
Quote
prova a modificare così
Code: [Select]
void ISR1(void) {
  detachInterrupt(0);
  t1 = micros();
}
void ISR2(void) {
  detachInterrupt(1);
  t2 = micros();
}


e qui:
Code: [Select]

 if ((t1 != 0) && (t2 != 0))  {
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;
    attachInterrupt(digitalPinToInterrupt(2), ISR1, HIGH);
    attachInterrupt(digitalPinToInterrupt(3), ISR2, HIGH);
    //qui sommi il delta
    deltaTMedia += deltaT;

Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 07, 2018, 03:03 pm
che velocità di esecuzione a parte è quello che avevo messo nel post #207 :D :)
Si, si, lo avevo scritto che, alla luce del tipo di problema, era da riesaminare anche la tua soluzione ... :D

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 07, 2018, 03:16 pm
si si, la mia era solo una battuta :D

Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 07, 2018, 03:38 pm
... mi state quasi facendo venir voglia di costruirmene uno per la mia vecchia Gamo ... se non fosse che non ho il materiale pronto in casa, mi sarei gia messo a giocarci pure io :P :D
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 07, 2018, 03:45 pm
... mi state quasi facendo venir voglia di costruirmene uno per la mia vecchia Gamo ...
... non posso scrivere qui per cosa vorrei costruirlo io ... ma comunque il problema è che poi non saprei bene dove andare a fare le prove, non so se nei poligoni, qui, mi lascino usare alcune delle mie cosette ... :D :D :D

Guglielmo

Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 07, 2018, 04:28 pm
Lassu' da voi (:D) siete ancora fortunati ...  quaggiu' in in purgat ... er, volevo dire in Italia, sempre piu cavolate ed ostacoli legali e burocratici (per le persone oneste, ovviamente ... perche' al criminale che va a fare una rapina con l'intenzione di far fuori che si oppone, glie ne puo fregare assai che se lo prendono gli aggiungano anche "porto abusivo d'arma" al resto delle accuse ... :P :D)

Per non parlare delle norme sulle collezioni, che stanno diventando sempre piu assurde ...

Ho trovato un paio di forcelle ottiche abbastanza larghe su una vecchia scheda da stampante ... se adesso riuscissi a ricordarmi dove avevo buttato la scatola con i display ... mi viene quasi voglia di disegnarmi uno stampato, magari per uno standalone che stia saldato direttamente dietro ad un display a 4 righe ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 07, 2018, 09:32 pm
Bsera a tutti, scusate ma oggi avevo da fare  in barca. Un breve update per chi ha seguito i lavori.

HW: al circuito originale avevo aggiunto una barriera in più ma avevo notato che dovevo tenere il cursore del trimmer tutto chiuso sui 5Vcc e la cosa non mi andava giù..nessuna regolazione....volevo mettere a punto il circuito con l'ingegnere elettronico di casa ma dato che è su al nord ho lasciato così...oggi però complice un tiro storto un piombino ha spaccato un diodo. Ho ributtato tutto giù e riportato il circuito iniziale. Un IR ed un fotodiodo x barriera. Ora il trimmer funziona e lo regolo in modo dando un poco di più rispetto a quando si accende il led spia (led che è sempre on e che blinka quando il fascio è interrotto). Elettricamente devo ancora capire il suo funzionamento ma immagino che stabilisca un soglia per il comparatore.
Cmq vorrei una copertura totale e quindi vorrei trovare il modo di utilizzare due coppie per barriera.
Ete...e se utilizzassi un secondo lm358 x altre due barriere?...è na strunzat????
Ho poi realizzato un supporto per tenere il tubo sensori sullo smorzatore e fatto delle prove.
Devo dire che raramente il colpo non viene letto e credo sia esclusivamente dovuto a disallineamento.
AL momento lavoro con arduino ma monterò tutto su atmega328 stand-alone.


SW: ora faccio delle prove con l'ultimo codice di Gug e vi aggiorno. Al momento gira bene. Nessun ovf e nessun segno strano.
Il software mi saluta, mi mostra il peso impostato (parte da 0,35g) e mi chiede di correggerlo (se del caso), cosa che faccio con i due tastini, altrimenti mi invita a sparare.
Dopo 5 spari, per ognuno dei quali mi mostra v m/s e joule, mi da la media.
DEvo dire che è molto carino. Appena posso un video.

Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 07, 2018, 09:49 pm
Gug,

16 piombini lasciati cadere con il codice PRECEDENTE

Code: [Select]

deltaT microsecondi : 103004
deltaT microsecondi : 112284
deltaT microsecondi : 138796
deltaT microsecondi : 104536
deltaT microsecondi : 103132
deltaT microsecondi : 100520
deltaT microsecondi : 98464
deltaT microsecondi : 98220
deltaT microsecondi : 99680
deltaT microsecondi : 101184
deltaT microsecondi : 95392
deltaT microsecondi : 95824
deltaT microsecondi : 107188
deltaT microsecondi : 149136
deltaT microsecondi : 105692
deltaT microsecondi : 99160


Altrettanti con l'ultimo. NOTA: i due valori a sei cifre sono SEGUENTI  due mancate letture.

Code: [Select]

Tempo misurato : 98152
 microsec.
Tempo misurato : 126624
 microsec.
Tempo misurato : 96308
 microsec.
Tempo misurato : 96520
 microsec.
Tempo misurato : 98560
 microsec.
Tempo misurato : 144876
 microsec.
Tempo misurato : 98664
 microsec.
Tempo misurato : 96656
 microsec.
Tempo misurato : 100968
 microsec.
Tempo misurato : 2543684
 microsec.
Tempo misurato : 98508
 microsec.
Tempo misurato : 114480
 microsec.
Tempo misurato : 96188
 microsec.
Tempo misurato : 104268
 microsec.
Tempo misurato : 3003416
 microsec.
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 07, 2018, 11:27 pm
...in funzione video veloce veloce...

https://youtu.be/aDG0hPQjnNA
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 08, 2018, 04:44 am
Altrettanti con l'ultimo. NOTA: i due valori a sei cifre sono SEGUENTI  due mancate letture.
... come detto da MightyPegas al post#294 e da me al post #295, è ovvio che occorre introdurre il controllo di "casi particolari" in cui rientra, ovviamente, sia la "mancata lettura" da parte di uno dei due sensori, sia tempi fuori dal "normale" (... dubito che una lettura possa essere valida se sopra i 250 msec :D) con lo scarto di detti tempi ed il riazzeramento delle due variabili t1 e t2 ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 08, 2018, 08:48 am
Bgiorno, bene allora...

SW:
 provo a piazzare un if.
La mia idea è (Gug dimmi se l'approccio è corretto):
1.1 dopo ogni sparo verifico deltaT
se si:
1.2 faccio i calcoli ed aggiorno il contatore considerando valido il tiro nel contatore;
se no
1.3 Non faccio i calcoli e cosnidero nullo il tiro nel contatore avvertendo a display che è un tiro a vuoto.
Laddove la logica fosse corretta devo studiare come dire al contatore di ritenere nullo il tiro e quindi rimanere ad esempio, su 2 e NON pasare a 3. Si tenga conto che questo deve essere "detto" anche al calcolo media per non far dividere la somma per un numero tiri errato ;
PS: lascio il tuo ultimo codice è rimango sulla peultima versione?

HW:
ieri provando empiricamente, ho provato a dare un pò di controreazione condelle rsistenze. All'occhio sembra cambato nulla ma senza l'oscilloscopio in effeti non posso essere certo del vero risultato.
Volendo usare una seconda coppia IR/FTD quale potrebbe essere lo schema appropriato per gli IR e FTD?
Per gli IR ho pensato in parallelo e gli FTD?
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 08, 2018, 10:36 am
Lato hardware ... hai tutto su breadboard o hai gia realizzato uno stampato ? ... nel primo caso, puoi provare una nuova configurazione ? ... perche' mi e' venuta una mezza idea (attualmente, un terzo di idea, ci sto ancora pensando :D) per risolvere (forse) il problema del segnale dai fotodiodi ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 08, 2018, 10:49 am
Ciao Ete ancora su breadboard ma ora non vedo problemi. Cmq dimmi pure
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 08, 2018, 11:13 am
... difatti, con l'ultima versione del SW, il problema viene risolto li ... a questo punto, risolverlo HW, è solo una questione di "pulizia".

In marito hai controlli, NO, vanno fatti diversamente e PRIMA di quello attuale ...

1. se t1 == 0 e t2 != 0 ... impossibile, azzerare t2 ed ignorare la cosa

2. se ((micros() - t1) > 250000) ... impossibile, azzerare t1, azzerare t2 ed ignorare la cosa

... questi i primi che mi vengono in mente.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 08, 2018, 11:41 am
aggiungo se t1> t2... azzerare t1 e t2
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 08, 2018, 12:01 pm
aggiungo se t1> t2... azzerare t1 e t2
ASSOLUTAMENTE NO ... non stai tenendo conto che la cosa è possibilissima e ne abbiamo già discusso ... l'overflow di micros() che, per altro, abbiamo dismostrato essere ininfluente.  :smiley-mr-green:

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 08, 2018, 01:03 pm
boh, ritengo estremamente improbabile che l'aggeggio venga usato per oltre 71 minuti in continuo, nel caso eventualmente 1 sparo a cavallo dell'overflow verrebbe annullato... per contro un eventuale non azionamento di t1 verrebbe subito rilevato questa era una cag... :)
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 08, 2018, 01:12 pm
boh, ritengo estremamente improbabile che l'aggeggio venga usato per oltre 71 minuti in continuo, nel caso eventualmente 1 sparo a cavallo dell'overflow verrebbe annullato... per contro un eventuale non azionamento di t1 verrebbe subito rilevato questa era una cag... :)
Probabilmente è vero, difficilmente starà "acceso" oltre 70 minuti di fila, quindi l'overflow NON si presenterà mai, ma ... dato che è del tutto ininfluente non capisco perché, se capita, voler perdere una misura inutilmente ... ::)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 08, 2018, 04:28 pm
... difatti, con l'ultima versione del SW, il problema viene risolto li ... a questo punto, risolverlo HW, è solo una questione di "pulizia".
...
Stavo, piu che altro, pensando ad alcuni possibili problemi che potrebbero saltare fuori nell'uso "sul campo" ed in esterni ... tipo influenza della luce ambiente o solare, riflessi, e cosi via ... in pratica stavo cercando di inventarmi un qualche accrocchio circuitale che trasformasse il semplice comparatore fisso in qualcosa di "auto-adattante" e che non reagisse alle variazioni "lente" o casuali non dipendenti dal pallino ... ma anche solo a livello di simulazione teorica, farlo con un solo operazionale sta iniziando a diventare un bel mal di testa ... quindi, prima semmai aspetto che vince59 faccia qualche prova in esterni, magari al sole, e ci dica se quella circuiteria crea problemi o meno ...

Anche perche', volendo, c'e' pure il sistema "hard-hardware" ( "ferramenta" :P :D) per ridurre tale problema, cioe' allungare un po il tubo, verniciarlo di nero opaco internamente, e metterci un dischetto paraluce all'uscita del pallino ... un po piu di lavoro manuale ed un po meno di mal di testa :D ...

Comunque fin'ora, anche se solo a livello teorico, sono arrivato a questo tipo di circuito:

(https://forum.arduino.cc/index.php?action=dlattach;topic=547693.0;attach=281137)

In "teoria", appunto, questa configurazione dovrebbe creare un riferimento "automatico" sull'ingresso del comparatore, con una minima controreazione sul ramo positivo per introdurre un po di isteresi, ed una "piccola" prevalenza positiva sull'ingresso invertente, stabilizzata da un condensatore rispetto al non invertente ... in questo modo, le variazioni "lente" di luminosita' (intorno ad 1Hz, sempre teoricamente), non dovrebbero venire rilevate, mentre i picchi verso massa causati dal pallino dovrebbero far scattare l'operazionale come comparatore producendo impulsi positivi in uscita, perche' anche se entrambi gli ingressi vanno ai fotodiodi, il condensatore sul non invertente "rallenta" la variazione rispetto all'invertente ... forse si puo migliorare aggiungendo anche un condensatore in serie fra il ramo dei fotodiodi/resistenza+trimmer ed il punto in comune delle due resistenze da 100K, in modo da disaccoppiare in AC le due parti, devo ancora fare qualche conto per vedere, comunque ... purtroppo, cercando di usare un singolo operazionale, i valori diventano abbastanza critici ...

Dovrebbe anche essere possibile usare due fotodiodi in parallelo, ma non messi a croce con due led, messi affiancati e mascherati da una fessura e con un singolo led IR da 5mm, pero' devo fare un po di misure e vedere quanto in realta' si potrebbe guadagnarci, e SE ci si guadagna abbastanza ... ho visto un progetto simile in rete, ma per risolvere il problema il tipo ha finito per usare 8 fotodiodi per ogni traguardo, e la cosa mi sembra "leggermente" eccessiva ... giusto leggermente :D
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 08, 2018, 04:33 pm
... difficilmente starà "acceso" oltre 70 minuti di fila ...
Dipende ... hai mai conosciuto un maniaco del tiro "bench-rest" ? ... :D :D :D
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 08, 2018, 04:57 pm
Dipende ... hai mai conosciuto un maniaco del tiro "bench-rest" ? ... :D :D :D
:D :D :D ... comunque, anche se sta acceso si più, non c'è problema ... salvo probabilmente per le batterie  :smiley-yell:

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 08, 2018, 06:43 pm
...bsera...io lo utilizzo solo per vedere lo stato di salute della mia carabina. tiarre con quel coso sullo smorzatore non è pratico.

@ Ete. Appena posso faccio la prova con il tuo circuito...mancano gli IR o sbaglio? io vedo solo due FTD in parallelo.
 A breve mi arriveranno le barriere laser. INtanto se volessi aggiungere un ulteriore barriera - a scopo puramente didattico - quale sarebbe la soluzione circuitale?

@ Gug. Aggiorno con la tua versione ultima e ti faccio sapere.

Domani comincio a smanettare sulla parte di codice relativa all'errore.
INtanto anche provato su atmega 328 standalone gira bene.
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 08, 2018, 07:15 pm
@ Gug. Aggiorno con la tua versione ultima e ti faccio sapere.
... ricordati di inserire i due controlli di errore che ti ho indicato prima del IF attuale ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 08, 2018, 10:27 pm
Gug,....ehmmm....ignorare la cosa in arduinese comesedice??

cioè mi mancano le parole ora ...

dove devo studiare?  >:(  >:(
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 08, 2018, 11:06 pm
... dai che puoi farla in modo facile facile ... IF ... THEN ... ELSE ... se li metti in cascata hai risolto ... provaci dai ... ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 08, 2018, 11:33 pm
Gug, la versione 3 mi sembra sia meno stabile della precedente. Ovvero, la 3 genera più errori/letture anomale rispetto alla 2. La 2 sinora non sbaglia.

Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 09, 2018, 05:50 am
... hai aggiunto/modificato qualche cosa? Eventualmente metti qui il codice che stai usando.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 09, 2018, 08:00 am
Questa la versione con i controlli aggiunti ...

Code: [Select]
#define  MAXTIME  200000UL
//
volatile unsigned long t1, t2;
unsigned long deltaT;
//
// INT0 ISR
void ISR0(void) {
  t1 = micros();
  EIMSK &= ~(bit(INT0));
}

// INT1 ISR
void ISR1(void) {
  t2 = micros();
  EIMSK &= ~(bit(INT1));
}

void setup() {
  t1 = 0;
  t2 = 0;
  Serial.begin(9600);
  //
  EIFR |= bit(INTF0);
  EIFR |= bit(INTF1);
  //
  attachInterrupt(digitalPinToInterrupt(2), ISR0, RISING);    
  attachInterrupt(digitalPinToInterrupt(3), ISR1, RISING);
}

void loop() {
  if ((t1 == 0) && (t2 != 0))
  {
    t1 = 0;
    t2 = 0;
    Serial.println("Errore lettura tempo iniziale");
  }
  else if ((t1 != 0) && (micros() - t1 > MAXTIME))
  {
    t1 = 0;
    t2 = 0;
    Serial.println("Errore lettura tempo finale");
  }
  else if ((t1 != 0) && (t2 != 0))
  {    
    deltaT = t2 - t1;
    t1 = 0;
    t2 = 0;
    Serial.print("Tempo misurato : ");
    Serial.print(deltaT);
    Serial.println(" microsec.");
    //
    delay(100);
    EIFR |= bit(INTF0);
    EIFR |= bit(INTF1);
    EIMSK |= bit(INT0);
    EIMSK |= bit(INT1);
  }
}

... le due Serial.print() servono giusto per farti capire che evento c'è stato, ma poi possono essere tranquillamente tolte, tanto sono misure scartate.

All'inizio invece trovi una #define in cui è definito il tempo massimo ... ovviamente andrà poi aggiustata per i veri spari che, se ho ben capito (V >160 mt/sec), dovrebbero dare risultati sempre sotto il millisecondo.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 09, 2018, 08:30 am
bgiorno...

@Gug: al codice non ho aggiunto/tolto nulla. Lo riverifico. Più tardi provo il tuo ultimo.

@ Ete: ch ene dici se provassimmo anche una barriera con fototransistor/IR invece che fotodiodo/IR
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 09, 2018, 09:48 am
Si possono usare, ma NON sono veloci come i fotodiodi ... i piu veloci che conosco sono quelli della Optek, ma lo sono perch' in pratica non sono fototransistor "puri", sono quelli che chiamano "optologic" ... se guardi il datasheet (https://docs-emea.rs-online.com/webdocs/025c/0900766b8025c322.pdf), c'e' all'interno un fotodiodo PIN, un'amplificatore di segnale, un trigger, ed un transistor di uscita (o un totem-pole, secondo il modello ... ad esempio la serie OPL550 ha un tempo di risposta medio di 25nS, ed e' la piu veloce che conosco ...

I "normali" fototransistor in genere, anche i piu veloci, come il TEFT4300 (https://docs-emea.rs-online.com/webdocs/0e22/0900766b80e22cde.pdf) della Vishay, hanno un tempo minimo di risposta di circa 2.5 microsecondi, che puo anche raddoppiare con corrente di collettore bassa ... da 20 a 40 volte piu lenti di un fotodiodo PIN, insomma ... serve quindi vedere se sarebbero in grado di "leggere" il transito del pallino ... con una velocita' media di 170m/s (o 0.17mm/microsecondo, se preferisci), ed un pallino lungo in genere 5mm, il pallino rimarrebbe sopra il fototransistor, durante il transito, per circa 30 microsecondi ... per cui, per le armi ad aria compressa, usando un fototransistor tipo il TEFT4300, dovrebbe funzionare lo stesso ... modelli piu vecchi e lenti probabilmente no, ce ne sono anche che richiedono 20 o 25 microsecondi per "reagire", e quelli non credo potrebbero funzionare correttamente ... per armi da fuoco invece probabilmente e' meglio l'uso di diodi PIN o optologic, i fototransistor non darebbero sufficente garanzia ...

Per contro, il fototransistor, se correttamente posizionato, si comporterebbe quasi come un ormale transistor, per cui se, ad esempio, ne collegassi due verso massa agli ingressi con delle resistenze di pull-up (usando ovviamente "FALLING" come interrupt), probabilmente non servirebbe neppure l'opto, si comporterebbero come transistor in configurazione a collettore aperto, chiudendo a massa gli ingressi al passaggio del pallino ... non so che pendenza potrebbero avere i fronti di commutazione senza fare dei test, ma potrebbe anche funzionare ...

EDIT: per metterne due affiancati, ovviamente, sia i diodi che i transistor dovrebbero essere in parallelo ... mentre per gli optologic, sarebbe necessario usare per forza quelli con le uscite a collettore aperto, non si puo rischiare di collegare in parallelo due di quelli con le uscite in totem-pole ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 09, 2018, 04:04 pm
@ Gug, fatto qualche test ma il codice non gira bene.
1. il primo tiro non viene mai letto.
2. se tutto vabene ok;
3. se NON legge start segnala errore start ma al tiro successivo segnala errore finish dopodichè rimane inchiodato
4. se NON legge finish segnala errore finish ma al tiro successivo segnala errore start dopidchè rimane inchiodato.

Guarda questo codice trovato sul web se può dare qualche spunto


@ Ete: guarda questo circuito:

(https://preview.ibb.co/hYscxq/circuito-to-test.jpg) (https://ibb.co/c9nAHq)


Code: [Select]


/*-----( Importa le librerie necessarie)-----*/

#include "LiquidCrystal.h"

/*-----( Dichiarazioni Variabili )-----*/

int Diodo_Uno = 0;
int Diodo_Due = 0;

int pin2 = 1;
int pin3 = 1;
int pin12 = 1;
int pinA1 = 0;

unsigned long Tempo = 0;
unsigned long Tempo_Start = 0;
unsigned long Tempo_Stop = 0;
unsigned long Tempo_Loop_1 = 0;
unsigned long Tempo_Loop_2 = 0;
unsigned long Start_Loop_1 = 0;
unsigned long Start_Loop_2 = 0;
unsigned long Stop_Loop_1 = 0;
unsigned long Stop_Loop_2 = 0;
float Volt;
float Metri_Secondo = 0;


LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Sono i piedini usati dal display LCD

void setup()                    /*----( SETUP: Viene letto solo alla partenza )----*/
{

  lcd.begin(16, 2);              // Fa partire l'oggetto lcd
  
  pinMode(2, INPUT);   // Pin a cui è connesso il pulsante di reset
    pinMode(3, INPUT);  // Pin a cui è connesso il primo fotodiodo triggherato
     pinMode(12, INPUT);   // Pin a cui è connesso il secondo fotodiodo triggherato
  pinMode(A1,INPUT);    // ci leggo la tensione di batteria
  
;
  delay(2000);

  lcd.clear();                       // ripulisco lo schermo e ci scrivo
  lcd.setCursor(0, 0);              // i campi fissi normali sul display
  lcd.print("m/s= ");
  lcd.setCursor(0, 1);
  lcd.print("Micros =       ");

}/*--(Fine setup )---*/

void loop()  /*----( LOOP: Gira costantemente)----*/
{

  Diodo_Uno = 0;    // Azzero gli indicatori di evento
  Diodo_Due = 0;
  do {
          
    if (((B00000001 & (PIND >> 2))) == 0)   // se è stato pigiato il pulsante di RESET azzero e mostro la tensione di batteria
                                            // il piedino due si trova nel secondo bit del registro PIND
                                            // allora sposto o destra di due posizioni tutti i bit del registro, così il primo a destra è lui
                                            // poi faccio un AND logico in binario col il byte 00000001
                                            // e dato che l'AND torna UNO solo se entrambi i bit sono a UNO
                                            // leggo lo stato di quel bit.
    {        
      azzera();
    }
    
      
  } while ((B00000001 & (PIND >> 3)) == 1); // continua a girare fino a quando il pin 3 sta alto
                                             // il piedino tre si trova nel terzo bit del registro PIND
                                            // allora sposto o destra di tre posizioni tutti i bit del registro, così il primo a destra è lui
                                            // poi faccio un AND logico in binario col il byte 00000001
                                            // e dato che l'AND torna UNO solo se entrambi i bit sono a UNO
                                            // leggo lo stato di quel bit.
 
 
  Tempo_Start = micros();     // dato che è uscito dal loop mi segno il tempo dell'evento ed alzo il flag del diodo uno
  Diodo_Uno = 1;

  do {                      // passo ad osservare il secondo fotodiodo

    
    if ((micros() - Tempo_Start ) > 1000000)    // Controllo il tempo che passa aspettando un segnale
    {
    
      break;                    // se è passato troppo tempo dal primo evento esco dal ciclo while
    }                           // perché è una falsa partenza

  } while ((B00000001 & (PINB >> 4)) == 1); // altrimenti continua il giro fino a quando succede qualcosa anche al diodo due sul pin12
  
                                            // il piedino dodici si trova nel quarto bit del registro PINB
                                            // allora sposto o destra di quattro posizioni tutti i bit del registro, così il primo a destra è lui
                                            // poi faccio un AND logico in binario col il byte 00000001
                                            // e dato che l'AND torna UNO solo se entrambi i bit sono a UNO
                                            // leggo lo stato di quel bit.

  Tempo_Stop = micros();    // è uscito dal loop perchè ha sentito qualcosa o perché è passato troppo tempo e mi segno il tempo
  Tempo = (Tempo_Stop - Tempo_Start); //  mi calcolo l'intervallo tra i due eventi

  if (Tempo < 1000000 && Tempo > 100)    // Se il tempo è maggiore di 100 microsecondi e minore di un secondo
  {
    Diodo_Due = 1;                              // alzo il flag del diodo due perché qualcosa è passato davvero

  }
  else
  {
    Diodo_Due = 0; // altrimenti lo abbasso per un falso allarme
  }
  if ((Diodo_Uno == 1) && (Diodo_Due == 1))    // se entrambi i diodi hanno sentito un evento faccio i conti
  {

    Metri_Secondo = ((0.523 * 1000000) / Tempo); // 0.523 metri è la distanza fisica tra i diodi
    // se il proiettile, nei microsecondi indicati da Tempo,
    // ha percorso mezzo metro, quanti metri percorrerà in un milione di microsecondi ?
    // Tempo sta a 0.523 come 1000000 sta ad x  quindi x=0.523*1000000/Tempo
    
      scrivi_sul_display();      // scrivo sul display i valori calcolati
   
  }

}   // Chiude il LOOP principale

/*-----( Dichiarazioni di funzioni)-----*/

void azzera()
{

  lcd.clear();                // Pulisco lo schermo
  lcd.setCursor(0, 0);            // Posiziono il cursore all'inizio della prima riga
  lcd.print(" VOLT BATTERIA ");         // Scrivo sul display
  pinA1 = analogRead(A1);          // Leggo il piedino analogico 1
  Volt = 3*pinA1;                  // a cui ho applicato la tensione di batteria diviso tre (tre resistenze uguali in serie)
  Volt=Volt*5/1023;              // calcolo i volt corrispondenti
 
  lcd.setCursor(0, 1);             // posiziono il cursore all'inizio della seconda riga
 
  lcd.setCursor(6, 1);              // Posiziono il cursore alla sesta posizione della seconda riga
  lcd.print(Volt);              // Scrivo sul display il valore della tensione misurata

  delay(1000);   // Aspetto un secondo per dare modo di leggere quei valori
  lcd.clear();                       // poi ripulisco lo schermo e ci scrivo
  lcd.setCursor(0, 0);              // i campi fissi normali sul display
  lcd.print("m/s=            ");
  lcd.setCursor(0, 1);
  lcd.print("Micros =       ");


  Metri_Secondo = 0;
                            // Azzero tutte le variabili
  Tempo_Start = 0;
  Tempo_Stop = 0;
  Tempo = 0;
  Diodo_Uno = 0;
  Diodo_Due = 0;

}


// FUNZIONE CHE SCRIVE SUL DIPLAY

void scrivi_sul_display()
{
  
  lcd.setCursor(0, 0);           // Scrivo i campi fissi sul display
  lcd.print("m/s=            ");
  lcd.setCursor(0, 1);
  lcd.print("Micros =       ");

  lcd.setCursor(6, 0);           // Cursore alla  posizione 6 della prima riga
  lcd.print(Metri_Secondo);      // Scrive la velocità rilevata in m/s
  lcd.setCursor(10, 1);          // Cursore alla  posizione 12 della seconda riga
  lcd.print(Tempo);             // Scrive il tempo impiegato a quella velocità

}



Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 09, 2018, 04:20 pm
Azz ... ovvio, me so' scordato de riabilità gli interrupts :D :D :D

Tra qualche minuto il codice corretto ... ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 09, 2018, 04:56 pm
Ecco, prova questo se ti va ...

Code: [Select]
#define MAXTIME 300000UL

volatile unsigned long t1, t2;
unsigned long deltaT;

// INT0 ISR
void ISR0(void) {
   t1 = micros();
   EIMSK &= ~(bit(INT0));
}

// INT1 ISR
void ISR1(void) {
   t2 = micros();
   EIMSK &= ~(bit(INT1));
}

void clearAndEnable(void) {
   t1 = 0;
   t2 = 0;
   delay(500);
   EIFR |= bit(INTF0);
   EIFR |= bit(INTF1);
   EIMSK |= bit(INT0);
   EIMSK |= bit(INT1);
}

void setup() {
   t1 = 0;
   t2 = 0;
   Serial.begin(9600);
   //
   Serial.println("Pronto ... ");
   //
   EIFR |= bit(INTF0);
   EIFR |= bit(INTF1);
   //
   attachInterrupt(digitalPinToInterrupt(2), ISR0, RISING);
   attachInterrupt(digitalPinToInterrupt(3), ISR1, RISING);
}

void loop() {
   if ((t1 == 0) && (t2 != 0)) {
      Serial.println("Errore mancanza tempo iniziale");
      clearAndEnable();
   }
   else if ((t1 != 0) && ((micros() - t1) > MAXTIME)) {
      Serial.println("Errore mancanza tempo finale");
      clearAndEnable();
   }
   else if ((t1 != 0) && (t2 != 0)) {
      deltaT = t2 - t1;
      Serial.print("Tempo misurato : ");
      Serial.print(deltaT);
      Serial.println(" microsec.");
      clearAndEnable();
   }
}

... fammi sapere :)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 09, 2018, 04:58 pm
Per chi volesse provarlo su un Arduino UNO, usando un semplice filo da un lato collegato a GND e dall'altro usato per toccare rapidamente prima D2 e poi D3, il codice è:

Code: [Select]
#define MAXTIME 3000000UL

volatile unsigned long t1, t2;
unsigned long deltaT;

// INT0 ISR
void ISR0(void) {
   t1 = micros();
   EIMSK &= ~(bit(INT0));
}

// INT1 ISR
void ISR1(void) {
   t2 = micros();
   EIMSK &= ~(bit(INT1));
}

void clearAndEnable(void) {
   t1 = 0;
   t2 = 0;
   delay(500);
   EIFR |= bit(INTF0);
   EIFR |= bit(INTF1);
   EIMSK |= bit(INT0);
   EIMSK |= bit(INT1);
}

void setup() {
   t1 = 0;
   t2 = 0;
   Serial.begin(9600);
   //
   Serial.println("Pronto ... ");
   pinMode(2, INPUT_PULLUP);
   pinMode(3, INPUT_PULLUP);
   //
   EIFR |= bit(INTF0);
   EIFR |= bit(INTF1);
   //
   attachInterrupt(digitalPinToInterrupt(2), ISR0, FALLING);
   attachInterrupt(digitalPinToInterrupt(3), ISR1, FALLING);
}

void loop() {
   if ((t1 == 0) && (t2 != 0)) {
      Serial.println("Errore mancanza tempo iniziale");
      clearAndEnable();
   }
   else if ((t1 != 0) && ((micros() - t1) > MAXTIME)) {
      Serial.println("Errore mancanza tempo finale");
      clearAndEnable();
   }
   else if ((t1 != 0) && (t2 != 0)) {
      deltaT = t2 - t1;
      Serial.print("Tempo misurato : ");
      Serial.print(deltaT);
      Serial.println(" microsec.");
      clearAndEnable();
   }
}

... ovviamente qui l MAXTIME è messo a 3 secondi, i PIN D2 e D3 sono messi con le pull-up interne in HIGH e, di conseguenza, viene testato il FALLING e non il RISING :)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 09, 2018, 10:25 pm
Ho integrato il codice nel prototipo finale e funziona. A display ho anche il blinking del messaggio "misfire in" per barriera ant e "misfire out" per quella posteriore.
Potrei usare i tasti già esistenti per un soft reset, ovvero istruzioni poer far si che..ad esempio premo tasto dx ed entro 1 sec tasto sx ed il programma si riavvia.
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 09, 2018, 10:44 pm
Potrei usare i tasti già esistenti per un soft reset, ovvero istruzioni poer far si che..ad esempio premo tasto dx ed entro 1 sec tasto sx ed il programma si riavvia.
Scopo di questa cosa ? ? ? :o :o :o

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 09, 2018, 10:59 pm
RESET soft in caso si voglia far ripartire l'ambaradam...no? come se fosse pigiato il tastino reset di arduino.
Premesso che quando montato su stand alone ci sarà il reset sul pin 1 del chip atmega.
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 09, 2018, 11:42 pm
E che lo devi far ripartire a fare ? ? ? :o ... nel loop() hai tute le impostazioni, una volta avviato fai tutto da li ...

Non capisco ... CTRL-ALT-DEL è un concetto che sulla programmazione delle MCU NON esiste ...  :smiley-evil:
... salvo casi estramente particolari, ma in quei casi si usano meccanismi apposta ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 10, 2018, 12:07 am
Ricevuto.
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 10, 2018, 09:25 am
... e poi, scusa, a cosa ti servirebbe ? ... basterebbe spegnere e riaccendere ... ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 10, 2018, 09:28 am
Si basta spegnere ed accendere ma mi incuriosiva il reset software dal punto di vista didattico
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 10, 2018, 09:32 am
Si basta spegnere ed accendere ma mi incuriosiva il reset software dal punto di vista didattico
... si chiama Watchdog ... per un visione abbastanza completa, dai una letta QUI (http://www.leonardomiliani.com/2013/impariamo-ad-usare-il-watchdog-1/) e poi QUI (http://www.leonardomiliani.com/2013/impariamo-ad-usare-il-watchdog-2/) ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 10, 2018, 01:08 pm
...studio....
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 11, 2018, 04:13 pm
Io intanto mi sono appena scaricato l'ultimo LTSpice, per fare qualche simulazione circuitale sui circuiti e valori che mi ero calcolato ... e si, lo so che un software di simulazione ha poco a che fare con i circuiti reali, ma voglio provare a vedere cosa ne esce dai circuiti che mi ero immaginato, mentre aspetto che mi arrivi un po del materiale che avevo ordinato (l'avevo detto, che mi avevate fatto venire voglia di costruirmene uno :P :D)

Ho anche provato a buttare giu un possibile schema, per ora ovviamente solo di principio, ed una possibile disposizione dei componenti usando uno dei tanti display tipo "2004A" (20x4) che ti tirano dietro su internet per 3 o 4 Euro, ed includendoci anche qualche extra per una versione "alternativa" standalone ... 4 pulsanti, un cicalino, l'accensione dei led IR "a comando" per risparmiare le batterie, poca roba, ma che potrebbe rendere l'hardware magari utilizzabile anche per altri scopi, con un diverso firmware ... ad esempio, tanto per dire la prima che mi viene in mente, un'unita' cronografo portatile tipo start/stop, ma probabilmente potrebbe venire in mente anche qualche altro uso ad altre persone, avendo a disposizione un "coso" con due ingressi interrupt ed un display :P :D ... lo stampato l'ho disegnato grande esattamente come il display, in modo da potercelo fissare dietro con 4 colonnine, ci ho messo pure un LDO, ed e' pure avanzato un sacco di spazio ... questa e' l'impostazione preliminare, solo per dare un'idea ... la definitiva, ovviamente, dopo che avro' fatto un po di test e controllato che funzioni ...

(https://forum.arduino.cc/index.php?action=dlattach;topic=547693.0;attach=281483)

La parte piu o meno completa e' quella che comunque non cambierebbe, anche modificando il circuito di ingresso ... per completare il resto, devo prima fare i test ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 11, 2018, 08:29 pm
grande Ete...mi farebbe piacere seguire il tuo progetto. Mica sei di Roma?
Lo schema elettrico è sempre costituito da una barriera IR/FTD e relativo circuito di controllo (opamp)?
la PCB che vedo è lo schermo LCD cui hai aggiunto la componentistica per il "crono"?
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 12, 2018, 09:31 am
Ciao, sto in Lombardia ... il PCB e' grosso esattamente come il display, ed e' previsto per montarli uno sopra l'altro direttamente, con 4 colonnine ed un'header per saldarli insieme ... non ho usato quello I2C ne il convertitore, perche' tanto non serviva, c'erano pin che avanzavano e che ho usato per altre cose ed inoltre un chip in meno che consuma energia ... in questo schema, che usa sempre gli opto (ma ho invertito le connessioni di ingresso cosi adesso fornisce impulsi a livello alto al passaggio, e fa anche da filtro antidisturbo e da compensazione piu o meno automatica), ho aggiunto altri due pulsanti (pensavo di usarli tipo up - down - enter - IRon), un cicalino (non si sa mai), l'uscita di pilotaggio con un mosfet per accendere e spegnere a comando i led IR,, un connettore per l'ICSP, ed un regolatore LDO (per poter usare anche comuni pile alcaline da 9V, anche se non dureranno tantissimo) ... e se trovo dei potenziometri a disco (tipo quelli delle vecchie radioline, ma piu sottili), ci metto anche la regolazione del contrasto accessibile dall'esterno ...

Intanto che aspetto i componenti, ho provato a fare qualche simulazione con LTSpice, per la parte opto (simulando il fotodiodo con un transistor NPN pilotato ad impulsi inversi), ed i risultati non sembrano male ... anche aggiungendo intenzionalmente dei disturbi con altri due generatori (7 e 30 Hz insieme, ampiezza 3V), la parte dell'opto continua a funzionare correttamente ignorando i disturbi e generando correttamente gli impulsi ... ovvio, e' sempre una simulazione, finche' non ho i componenti per fare prove "fisiche" piu di tanto non mi fido, ma e' comunque relativamente incoraggiante ... lo schema modificato completo, se tutto va bene, dovrebbe uscire cosi ...

(https://forum.arduino.cc/index.php?action=dlattach;topic=547693.0;attach=281608)

Mancano alcuni valori ma da' l'idea, lo completero' stasera quando rientro, ora sto partendo ...
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 13, 2018, 05:22 pm
Nel frattempo ho completato lo stampato (tanto a modificarlo non ci si mette molto, dovendolo fare) ... non ho previsto alcun interruttore sullo stampato, si poteva mettere, ma e' molto piu comodo posizionarlo dove si vuole e collegarlo in serie al filo della batteria ... ho anche fatto il componente per il potenziometro a disco (questo (http://https://www.aliexpress.com/item/10pcs-Volume-Dial-Dual-Wheel-Duplex-Potentiometer-B103-10K-Radio-2-Channel-Stere/32802428659.html) del contrasto, e sostituito i plsanti con un modello piu economico e facile da trovare (questi (http://https://www.aliexpress.com/item/50Pcs-Free-shopping-2x4-2-4-3-5-MM-Micro-SMD-Tact-Switch-Side-Button-Switch/32899734312.html) da 3.8) ... secondo voi, puo essere utile avere ADC6 collegato ad un partitore di tensione sull'ingresso batteria, per controllarne la tensione/carica residua ? ... se si, dovrei riuscire a fare la modifica abbastanza facilmente ...

(https://forum.arduino.cc/index.php?action=dlattach;topic=547693.0;attach=281786)
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 13, 2018, 05:47 pm
secondo voi, puo essere utile avere ADC6 collegato ad un partitore di tensione sull'ingresso batteria, per controllarne la tensione/carica residua ?
Non ho visto, che MCU hai utilizzato? Perché magari c'è un'altra soluzione molto più semplice e precisa ... ::)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 13, 2018, 06:08 pm
che bello. Ete, Gug dobbiamo brevettarlo  :) .

@ Ete hai un PM incui ti chieo una cortesia...if possible. I am not able to do it!!

Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 13, 2018, 06:20 pm
Non ho visto, che MCU hai utilizzato? ...
normale 328P-AU SMD ... comunque la modifica richiede al massimo 10 minuti ...

EDIT: ho fatto prima a farlo che a dirlo :D

(https://forum.arduino.cc/index.php?action=dlattach;topic=547693.0;attach=281800)

Ho anche scollegato AREF dal VCC ed aggiunto il condensatore, cosi si puo attivare il riferimento interno da 1.1V ... con il partitore 330k/33K dovrebbe starci dentro il 9V di una normale batteria consumando quasi nulla ...
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 13, 2018, 06:41 pm
... ma perché una 9V e non una bella LiPo che si trovano con capacità decisamente superiore ?

Guglielmo

P.S.: Ho cancellato io un paio di nostri post che non sono pertinenti ...
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 13, 2018, 08:12 pm
infatti forse una moderna ricaricabile andrebbe meglio magari con spinotto per ricarica.

PS: @ Gug...tanto per soffrire un pò e studiare...ma se volessi registrare la differenza tra i vari tiri, che funzioni dovrei utilizzare?...nel senso:

- sparo T1..
- sparo T2...faccio la differenza T1-T2;
- sparo T3 faccio T2-T3
- sparo T4 faccio T3 - T4
- sparo T5 faccio T4 - T5.

Vediamose ci azzecco...immagazzino i dati (mps oppure il dato nudo e crudo deltaT) un array?
 
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 13, 2018, 10:18 pm
... si, volendo potresti utilizzare un array e salvare i vari ΔT per poterli poi analizzare.

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Patrick_M on Nov 13, 2018, 11:16 pm
però è meglio se fai sempre t2-t1 e salvi il risultato nell'array salvoSparo[x] , senza crearti tanti Tqualchecosa
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 13, 2018, 11:36 pm
OK vedo di pasticciare un pò.

@ Ete: una domanda tecnica. Nel circuito adottato abbiamo un trimmer da 10k (per ogni sezione del LM358) posto tra gnd e Vcc con il centrale verso l'entrata negativa dell'amp.
Immagino che sia una sorta di regolazione/trigger. La regolazione come va fatta?
Io ho sperimentato quanto segue usando i led collegati all'uscita dell'amp.
- ruotando tutto verso il GND il led si spegne;
- ruotandolo verso il +Vcc ad un certo punto si accende e così rimane fino a completa rotazione verso il +Vcc;
Adottando la posizione subito dopo l'accensione del led mi sembra di aver la massima sensibilità, accuratezza e costanza di lettura mentre se ruoto tutto verso +Vcc è meno sensibile, da più false letture con valori anche inferiori.
E' corretto ciò che accade?
Se si abbiamo una sorta di calibrazione...a sto punto come calibriamo per avere une lettura "precisa"?
 
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 14, 2018, 09:25 am
> Guglielmo: cancella pure tutto quello che ritieni necessario, lo sai che con me non ci sono problemi ;) ... si, e' possibile anche usare una LiPo, una 7.4V magari invece di una cella singola a 3.7V, cosi il micro puo andare alla massima frequenza consentita dai 5V ... avevo indicato una 9V solo perche' e' la piu "facile" da reperire ... quella da 9V sarebbe ovviamente non ricaricabile (oppure magari una di quelle nuove 9V LiPo con convertitore e caricatore USB incorporato, anche se per ora mi sembra costino ancora abbastanza, di buona qualita') .. usando una LiPo da 7.4V a due celle, si potrebbe sempre prevedere il connettorino di ricarica che si affaccia all'esterno da una finestrella del contenitore, in modo da poterla collegare al caricatore senza neppure toglierla ... ma qui stiamo andando piu avanti, per il momento sarebbe forse meglio vedere se e come funziona, prima ;)


> vince59: se ti riferisci al tuo circuito, si il trimmer serve per impostare la soglia a cui il comparatore scatta, per cui la taratura va fatta proprio in quel modo, portandolo nel puntosubito successivo a dove si accende, quello e' il punto di massima sensibilita' ... se invece intendevi il mio circuito, no, nel mio la soglia si autoregola, i trimmer servono per cambiare la polarizzazione inversa dei fotodiodi in modo da portarla al livello migliore possibile, perche' non tutti i modelli di fotodiodi sono identici ...

Il trigger andrebbe aggiunto ... basta collegare, per ognuno dei due operazionali, una resistenza di valore alto fra l'uscita e l'ingresso positivo ... nel tuo circuito, puoi provare con 3M3, o 4M7, e vedere se scatta in modo piu regolare e da meno false letture ... 
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 14, 2018, 10:24 am
... avevo indicato una 9V solo perche' e' la piu "facile" da reperire ... quella da 9V sarebbe ovviamente non ricaricabile (oppure magari una di quelle nuove 9V LiPo con convertitore e caricatore USB incorporato ...
... ed invece prevedere una semplice presa USB per l'alimentazione a 5V ed uno ci attacca magari un PowerBank esterno? Vero che è meno compatto, ma vero pure che 1. i PowerBank li trovi di capacità impressionanti, 2. ne puoi avere più di uno e se devi fare una giornata di misure puoi staccarne uno scarico e metterne uno carico, 3. ormai te li tirano dietro ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 14, 2018, 03:55 pm
... una semplice presa USB per l'alimentazione a 5V ...
... cosi ad occhio serve trovare lo spazio extra (ma una mini-usb forse ci sta), spostare un terzo della roba, e rifare meta' del routing ... ma come sfida non e' male, stasera vedo cosa ne esce ... :D
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 14, 2018, 04:26 pm
Ete, tieni conto che, come puoi immaginare, l'utilizzo del cronografo non sarà continuativo ma per brevi periodi o sessioni di prova.
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 14, 2018, 05:50 pm
Come sembra cosi ? ... ;) ... (pero' la macchinetta del caffe' non ci sta ... :P)

(https://forum.arduino.cc/index.php?action=dlattach;topic=547693.0;attach=281866)
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 14, 2018, 05:56 pm
Come sembra cosi ? ... ;) ... (pero' la macchinetta del caffe' non ci sta ... :P)
... e il frullatore ? :D :D :D

Come sempre ... gran lavoro Etem !!! ;)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 14, 2018, 08:33 pm
Bello Ete! Davvero. Mi sembra un bel progetto.
Spiegami una cosa per favore, io realizzavo circuiti col vecchio sistema pennarello ed acido, ma ovviamente ha dei limiti. AL giorno d'oggi esiste qualche software che dallo schema elettrico realizza il disegno della PCB o è un operazione fatta ancora a mano?
Grazie
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 15, 2018, 09:51 am
Io uso Eagle (http://web.cadsoft.de/ftp/eagle/program/7.7/eagle-win64-7.7.0.exe) (la versione vecchia di cadsoftusa, NON la nuova di autodesk), e fai sia lo schema sia lo stampato con quello ... serve un minimo di tempo per imparare ad usarlo bene, perche' alcune azioni non sono troppo intuitive, ma una volta che ci hai preso la mano, puoi farci quasi ogni tipo di stampato ... la versione "free", ha il limite del solo doppia faccia e massimo 80*100mm di schedina, ma gia consente di fare molto (tieni presente che anche arduino e' realizzato con la free, per darti l'idea) ...
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 15, 2018, 10:16 am
... la versione "free", ha il limite del solo doppia faccia e massimo 80*100mm di schedina, ma gia consente di fare molto (tieni presente che anche arduino e' realizzato con la free, per darti l'idea) ...
La versione "free" richiede che il layout (piste, piazzole, ecc) sia contenuto in 80x100 mm, ma NON limita le dimensioni dello stampato ;)

Dato che ormai CadSoft NON c'è più e c'è solo la versione di Autodesk (quella che si vuole collegare ogni settimana con il loro server per le autorizzazioni >:() ti consiglio di scaricare l'ultima CadSoft (versione 7.7) da QUESTO (http://ftp://ftp.cadsoft.de/eagle/program/7.7/) link FTP ed installare quella :)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 15, 2018, 12:05 pm
...Gug ho raggiunto la sufficenza?
... un 18 per la buona volontà ... ma per il 30 c'è ancora molto da fare :D :D :D

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: Etemenanki on Nov 15, 2018, 12:37 pm
> Guglielmo: nel tuo link mancano i due punti e da errore, te li ha cancellati il forum ?

comunque questo funziona ftp://ftp.cadsoft.de/eagle/program/7.7/
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 15, 2018, 01:25 pm
> Guglielmo: nel tuo link mancano i due punti e da errore, te li ha cancellati il forum ?
Grazie Etem ... si, il forum c'ha aggiunto davanti un bel http:// ... che, ovviamnete, non c'entra nulla ...

Ho corretto con il tuo link :)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 15, 2018, 02:40 pm
... un 18 per la buona volontà ... ma per il 30 c'è ancora molto da fare :D :D :D

Guglielmo
Gug...l'ultima differenza mi rimane in memoria ( o meglio il ciclo diff gira (su 2 tiri) e non riessco ad azzerarlo DOPO i 5 tiri) e quindi al nuovo ciclo la utilizza ...non riesco ad azzerarla dopo i 5 tiri.

:smiley-confuse:  :smiley-cry:
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 15, 2018, 06:41 pm
... metti tutto il programma che proviamo a dargli un'occhiata ::)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 15, 2018, 06:58 pm
ci sono riuscito con memset  ;D  ;D  :D inserito alla fine del ciclo 5.

PS: sempre 18 come voto?
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 15, 2018, 07:55 pm
PS: sempre 18 come voto?
per l'uso di memset() ti do un 24  :D

Guglielmo

P.S.: Occhio che con memset() se si sbaglia il numero dei bytes, si fanno bei danni ;)
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 15, 2018, 08:39 pm
P.S.: Occhio che con memset() se si sbaglia il numero dei bytes, si fanno bei danni ;)
...dove devo studiare?
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 15, 2018, 09:37 pm
...dove devo studiare?
In che senso scusa? :o ... se usi la memset() (https://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga8f49550cc1e16fff2d707f91667eb80c) spero bene che sai cosa fa ... ::)

Guglielmo
Title: Re: CRONOGRAFO BALISTICO
Post by: vince59 on Nov 15, 2018, 11:09 pm
...si ma con te mi aspetto sempre un "....studia qui leggi qui, qui e quiiiii!
Cmq si---ho studiato la funzione e la sintassi!!
Title: Re: CRONOGRAFO BALISTICO
Post by: gpb01 on Nov 16, 2018, 02:06 am
...si ma con te mi aspetto sempre un "....studia qui leggi qui, qui e quiiiii!
:smiley-twist: :smiley-twist: :smiley-twist:  ... con memset() c'è poco da studiare, se sbagli il valore del secondo parametro, sovrascrivi aree di memoria su cui non dovevi scrivere e ... i casini sono assicurati  :smiley-yell: :smiley-yell: :smiley-yell:

Guglielmo