problemi di velocità ...

dunque ... vi spiego un attimo il mio problema, ho costruito un sistema con 2 sensori 2 laser e un relè per attivare una fotocamera, il senso è catturare un'azione ad alta velocità.
il problema ? è lento.

entriamo piu nel dettaglio, il sistema funziona in questo modo :

A1 è un analog input che legge i livelli del fotodiodo ( nello schema non avevo i riceventi e ho messo un'emettitore ma è un fotodiodo)

A2 è un digital output che fornisce il livello al relay reed

i componenti li ho selezionati per la loro alta velocità di risposta

il relay è un D1C051000, con un tempo di commutazione di 1ms max. e un'assorbimento di 25mA (quindi gestibile senza transistor)

il fotodiodo è un VTB8440BH.

il laser porta la lettura del diodo a 0, senza laser abbiamo 1023, quindi perfetto.

avevo scritto diverse versioni di software, ma pensando che fosse il software a rallentare tutto ne ho scritta una versione veramente minimal

int relay=13;
int sensore1=0;
int sensore2=1;

void setup(){
  pinMode(relay,OUTPUT);
  pinMode(sensore1,INPUT);
  pinMode(sensore2,INPUT);
  digitalWrite(relay,LOW);
}
void loop(){
  if((analogRead(sensore1)>5)&&(analogRead(sensore2)>5)){
   digitalWrite(relay,HIGH);
   delay(20);
   digitalWrite(relay,LOW);
   delay(1000); 
  }
}

quando entrambi i sensori danno un valore superiore a 5 il relay viene attivato per 20ms cortocircuitando il controllo remoto della mia canon 5D.

ora uno dei problemi potrebbe essere che la macchina ha bisogno di un tot di tempo per riconoscere la pressione del sensore esterno ... su questo farò altri test in serata ...

sostituendo lo scatch complessino che c'era prima (400righe con tutti i menu e le impostazioni) con quello minimal di sopra, non ho guadagnato pressochè nulla ..

quindi la mia domanda è ... secondo voi da cosa potrebbe essere dato questo ritardo oltre che dalla macchina fotografica ? intanto preparo le foto dei test da allegare.

ecco le foto delle prove, la prima colonna è col software piu pesante, la seconda è con la versione minimal ... come vedete il pezzo lanciato nella colonna di test si trova sempre tra 2 e 8 ... quindi grossolanamente direi che il problema non è nel software. anche perchè l'oggetto si trova in tutte le foto a una buona 40ina di cm dal sensore, piu tardi magari mi armo di barra graduata e di un'oggetto di peso definito, cosi posso avere un'idea precisa del ritardo del circuito ...

con gli ultimi test sono riuscito a dimezzare se non di piu il ritardo, ma è stata necessaria una modificazione sul connettore della macchina in modo che leggesse una richiesta di messa a fuoco costante, in questo modo le pulsazioni dello scatto vengono rilevate anche se piu corte.
penso che per ottenere qualcosa di piu prestazionale dovrei modificare il firmware della macchina fotografica per accettare pulsazioni piu corte...

altre idee ?

Io non userei il delay ma il millis().

Durante il delay il programma è FERMO e quindi l'arduino non può eseguire questa riga

if((analogRead(sensore1)>5)&&(analogRead(sensore2)>5)){

prima che siano scaduti i mS. Nel tuo caso un ciclo di programma dura più di 1020mS !!!

Poi non capisco a cosa ti serve il delay (1000) ... io lo toglierei proprio e sosituirei il delay(20) con:

unsigned long millis_attuali = 0;
..

if (millis() - millis_attuali > 20) {
digitalWrite(relay,LOW);
millis_attuali = millis();
}

EDIT

Al max puoi inserire un piccolissimo delay per dare il tempo all'arduino di fare la conversione da analogico a digitale, ma secondo me non è necessario perchè se guardi nelle reference c'è scritto che arduino ci mette 1 uS cioè 0,0001 s ... 0,1 ms.

Se non mettendo ritardo ti dovesse dare problemi prova con un delay(1) ... max delay(2).

allora ti commento un'attimo il codice, cosi capisci il motivo delle mie scelte, l'idea del millis l'avevo presa in considerazione ma come leggerai sotto non mi è utile.

qui controllo che entrambe i sensori vengano attivati ( il valore basso l'ho scelto perchè piu vicino allo 0 di quando il sensore viene colpito in pieno, teoricamente piu questo valore è basso piu potrei guadagnare in velocità di risposta perchè basterebbe anche la piu piccola interferenza sul raggio laser da spostarlo, il problema è che rischio di fare scatti a vuoto con un valore piu basso per colpa di un allineamento sbagliato dei laser o pulviscolo ecc quindi il valore 5 è quello che piu mi ha soddisfatto nei test)

if((analogRead(sensore1)>5)&&(analogRead(sensore2)>5)){

Qui faccio partire lo scatto, quindi tutto quello che succede DOPO questa riga non è influente alla velocità di scatto.
digitalWrite(relay,HIGH);

lascio 20 millisecondi il sistema fermo perchè mi serve che il relay rimanca eccitato per minimo 20 millisecondi, l'uso di millis puo andare bene se mi servisse eseguire altre routine durante questo tempo, ma siccome lo scatto è gia partito non mi serve

delay(20);

riporto il relay allo stato basso.
digitalWrite(relay,LOW);

Attendo 1 secondo, tempo medio di ricarica dei flash, nel quale è NECESSARIO che il sistema rimanga fermo, in caso contrario rischierei di fare foto a vuoto o non completamente illuminate perchè i 2\3\4 flash possono avere tempi di ricarica differenti e quindi poi andare fuori fase. questo delay poi va impostato col tempo di ricarica massimo dei flash, ma idealmente per i test 1secondo era sufficente.

delay(1000);
}

http://www.glacialwanderer.com/hobbyrobotics/?p=11
Non sembra esserci nessun accorgimento software, l'unica cosa che ho visto è che in questi "grilletti laser" non viene usato un relé, ma il flash e foto vengono sempre comandati direttamente.

qui usa un'opto isolatore, che è pressapoco la stessa cosa di un relè ma usa una fotoresistenza e un'emettitore al posto di una bobina, forse la velocità di commutazione è minore ...

e seconda cosa, collega il flash al trigger e non la camera, in questo modo devi operare completamente al buio in modalità bulb e attendere che scatti il flash, è un metodo che poteva essere usato con le camere analogiche, ma con le digitali si assorbe troppo rumore ...

Be se lo colleghi al flash lo puoi collegare anche alla macchina fotografica immagino.
Non è che a rallentare lo scatto è la macchina digitale stessa?

che cos'e' la modalita' bulb?

e nel dubbio, a che velocita' fai scattare la macchina? cioe', quanto tieni aperto l'otturatore?

Ah scusa ... hai ragione : non avevo visto che il delay era all'interno della condizione di IF !!! :stuck_out_tongue:

@federico: la modalità Bulb è una modalità per usate tempi estremamente lunghi, praticamente il tempo di esposizione è pari al tempo in cui il pulsante di scatto è premuto. E' praticamente indispensabile un cavalletto e un telecomando per lo scatto remoto (o meglio ancora il nostro arduino !!!)

Non so se avevi gia visto qui:

http://photocritic.org/camera-laser-trigger/

Viane usato un semplice transistor per la commutazione, decisamente piu veloce di un relais.

Una prova sarebbe utile falra.

->uranio
penso proprio che sia la macchina a rallentare lo scatto, ovvero la macchina deve leggere una pulsazione sul suo connettore, a quella pulsazione corrisponde lo scatto, il problema è che per evitare scatti a vuoto penso abbiano messo un controllo sulla durata della pulsazione, perchè altrimenti qualunque piccola interferenza farebbe scattare. ho risolto in parte mantenendo cortocircuitato la parte dell'autofocus, in questo modo la durata della pulsazione richiesta è minore.

->federico
la macchina ora sta lavorando a 2000@f. 1.8, ma cambiando la velocità dell'otturatore cambierebbe solo la scia dell'oggetto, non la velocità di risposta.

->tinman66
hai perfettamente ragione, però il mio voleva essere un dispositivo generico adattabile a qualsiasi macchina fotografica, e il relay era molto piu neutro rispetto al transistor, però il transistor mi farebbe guadagnare 1ms volendo ...
piu tardi una prova sarà fatta sicuramente, con un 2n2222 che dovrebbe fare al caso mio

in grossa sostanza penso che gran parte del problema derivi dalla fotocamera ... infatti moltissima gente usa questi trigger a una certa distanza dal punto di fuoco ... ora comincio a capirne il motivo ... penso che la camera si mangi almeno 4-5 ms per colpa del controllo sulla pulsazione ... piu tardi farò dei test piu precisi provando a dare delle pulsazioni differenti fino a raggiungere quella di scatto ...

hai perfettamente ragione, però il mio voleva essere un dispositivo generico adattabile a qualsiasi macchina fotografica, e il relay era molto piu neutro rispetto al transistor, però il transistor mi farebbe guadagnare 1ms volendo ...
piu tardi una prova sarà fatta sicuramente, con un 2n2222 che dovrebbe fare al caso mio

Beh per avere una risposta molto simile al relais ( ovvero indipendente dalle correnti in gioco ) la soluzione ottimale e' un Mosfet Logic Level ( la serie IRL ad esempio ) che a 5 volts ha una resistenza bassisima e a 0 V una molto elevata.
Comunqeu prova prima con un classico 2n2222 e se vedi che funziona sai dove lavorare.
Per quanto riguarda i tempi ( ma questo lo saprai meglio di me ) dovresti lavorare al buio con l'otturatore aperto e triggerare il flash.