DIY - Come ti costruisco un intervallometro!

Discussione in 'Intervallometri, CHDK, Magic Lantern e Brampers..' iniziata da marcokava, 17 Giugno 2012.

  1. marcokava Novizio

    Località:
    Ossona
    Ave o foro!
    eccomi nuovamente da queste parti per proporvi il mio ultimo progetto!
    (qui dovrebbe partire la musichetta McGyver ( )
    Dunque, dopo aver proposto il mio dolly (che con grande piacere ha stimolato molti a cotruirsene uno, tra l'altro con risultati veramente notevoli, nettamente superiori al mio) ho pensato bene di costruire un intervallometro che avesse delle funzioni "personalizzate"
    Siccome non volevo fosse un progetto che mi portasse via troppo tempo (tempo sottratto alle foto!) ho deciso di rendere il progetto il più semplice possibile cercando di esaltarne la praticità e la funzionalità.
    Infatti il funzionamento è banale, posso impostare intervallo, numero di fotografie da effettuare e ho trovato utile indicare la durata del filmato in timelapse risultante (settando come predefinito 30fps).

    Lista della spesa:
    - arduino 2009
    - led bicolore (rosso/verde)
    - interruttore a levetta
    - 6 pulsanti
    - presa jack 3,5mm femmina da pannello
    - 1 resistenza da 470 ohm
    - 1 resistenza da 1k ohm
    -3 resistenza da 1,5k ohm
    - scatoletta in plastica per contenere il progetto
    - 1 basetta millefori
    - fotoaccoppiatore 4n25

    ecco un paio di foto:

    [IMG]

    [IMG]

    vediamo i comandi:
    2 pulsanti in alto: aumentano e decrementano l'intervallo
    2 pulsanti a metà: aumentano e decrementano il numero di fotografie da effettuare
    pulsante rosso, riavvia tutto per una nuova sequenza
    pulsante in basso a dx accende la retro illuminazione
    l'interruttore a levetta imposta l' "edit mode" o lo "shot mode"

    vedimo il funzionamento:
    con la levetta a dx si è nell' "edit mode",( il led di colore verde è acceso fisso) ovvero sia la modalità che permette di impostare i valori, spostando la levetta a sinistra, si avvia l'intervallometro, che regolerà gli scatti in base ai valori impostati nell'edit mode.
    Il led, di colore rosso, lampeggierà con la frequenza dell'intervallo impostato, quindi ogni 1,2,3...ecc secondi.
    Nello shot mode, viene aggiornato il numero di scatti rimanenti, in modo da poter visualizzare a che punto siamo della ripresa.
    Al termine della sequenza, il sistema va in stand-by e il led rosso rimane acceso fisso.
    Per ripartire con una nuova sequenza, bisogna riportarsi nell'edit mode, premere il tasto rosso, impostare i valori e spostare la levetta nello "shot mode"

    vediamo la costruzione:
    LCD
    ho utlizzato un lcd 4x16 di colore blu (costa un sacco di più ma è molto +fico)
    e va collegato all'arduino secondo questo schema:
    http://www.google.it/imgres?q=ardui...w=1012&h=621&ei=IiHeT5reKumk4gTF8aCvCg&zoom=1

    il pulsante rosso serve per resettare, percui un contatto al reset, e l'altro a massa.
    il pulsante della luce, funge da interruttore luce x l'lcd, percui un contatto va al +5v e l'altro al piedino della retroilluminazione sull'lcd.

    i 4 tasti che regolano i valori, vanno collegati secondo questo schema:

    [IMG]http://www.freeimagehosting.net/4wa7r

    il funzionamento è semplice, arduino leggendo valori diversi (risultanti dalle resistenze diverse) eseguirà comandi diversi, percui per fare un esempio:

    se premendo il tasto in alto a sx arduino legge un valore di "310", lo vado a programmare dicendogli che ogni volta che leggerà il valore 310 dovrà diminuire di 1 secondo l'intervallo, e così via per gli altri.
    NB su un pulsante manca la resistenza, non è un errore, semplicemnete premendo quel bottone, arduino leggerà il valore massimo di +5v, e alla stessa stregua dell'esempio sopracitato, istruirò arduino dicendogli "quando leggi 1023(valore max) fai questo..".

    per aiutarmi con le connessioni, ho utilizzato 2 basettine millefori, questo per evitare di avere le saldature volanti da isolare.

    Per ora la verione ufficiale è la 1.2.1
    ci sto ancora lavorando , in quanto a causa di limiti di programmazione, non può intervallare oltre a 65 secondi..
    lo so è un bel handicap però nel frattempo è cmq utilizzabile.
    appena risolvo questo inghippo ovviamente aggiornerò alla versione 1.3

    ovviamente chi ha suggerimenti è ben accetto! ;)


    Dimenticavo, per comandare la macchina fotografica ho usato il solito fotoaccoppiatore 4n25 come spiega Massimo Banzi.


    ecco il codice:

    Codice:
    #include <LiquidCrystal.h>
    #define verde 8
    #define rosso 9
    #define fotoaccoppiatore 10
    LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
    int button = 0;
    int levetta= 0;
    unsigned int time = 1;
    unsigned int repeat = 300;
    unsigned int scatto = 0;
     
    void setup(){
      pinMode(10, OUTPUT);
      pinMode(8, OUTPUT);
      pinMode(9, OUTPUT);
      lcd.begin(16, 4);
      lcd.setCursor(0, 0);
      lcd.print("Cava's");
      lcd.setCursor(0, 1);
      lcd.print("Intervallometer");
      lcd.setCursor(2, 3);
      lcd.print("Ver. 1.2.1");
      delay(1000);
      lcd.clear();
      lcd.setCursor(2, 1);
      lcd.print("Designed for");
      lcd.setCursor(-2, 2);
      lcd.print("Canon EOS 5d");
      delay(1000);
      lcd.clear();
      lcd.setCursor(11, 1);
      lcd.print(time);
      lcd.setCursor(7, 2);
      lcd.print(repeat);
     
    }
    void loop (){
      levetta=analogRead(4);
      if (levetta == 0) {                      //levetta a dx: entra nel modo "edit"
        digitalWrite(rosso, LOW);
        digitalWrite(verde, HIGH);
        lcd.setCursor(3, 0);
        lcd.print("EDIT MODE");
        lcd.setCursor(0, 1);
        lcd.print("TIME:");
        lcd.setCursor(-4, 2);
        lcd.print("REPEAT:");
        lcd.setCursor(-4, 3);
        lcd.print("MOVIE:");
        lcd.setCursor(7, 3);
        lcd.print(repeat/30);
        button=analogRead(5);
        if (button >= 929 && button <= 931){  // imposta i decrementi per l'intervallo di scatto
          lcd.clear();
          lcd.setCursor(3, 0);
          lcd.print("EDIT MODE");
          lcd.setCursor(0, 1);
          lcd.print("TIME:");
          lcd.setCursor(-4, 2);
          lcd.print("REPEAT:");
          lcd.setCursor(-4, 3);
          lcd.print("MOVIE:");
     
          time--;
          lcd.setCursor(7, 2);
          lcd.print(repeat);
          lcd.setCursor(7, 3);
          lcd.print(repeat/30);
          lcd.setCursor(11, 1);
          lcd.print(time);
          delay(250);
     
     
        }
        if (button >= 509 && button <= 511){  // imposta l'incremento per l'intervallo di scatto
          lcd.clear();
          lcd.setCursor(3, 0);
          lcd.print("EDIT MODE");
          lcd.setCursor(0, 1);
          lcd.print("TIME:");
          lcd.setCursor(-4, 2);
          lcd.print("REPEAT:");
          lcd.setCursor(-4, 3);
          lcd.print("MOVIE:");
     
          time++;
          lcd.setCursor(7, 2);
          lcd.print(repeat);
          lcd.setCursor(7, 3);
          lcd.print(repeat/30);
          lcd.setCursor(11, 1);
          lcd.print(time);
          delay(250);
     
        }
        if (button >= 888 && button <= 890){  // imposta il decremento per il numero di fotografie da eseguire
          lcd.clear();
          lcd.setCursor(3, 0);
          lcd.print("EDIT MODE");
          lcd.setCursor(0, 1);
          lcd.print("TIME:");
          lcd.setCursor(-4, 2);
          lcd.print("REPEAT:");
          lcd.setCursor(-4, 3);
          lcd.print("MOVIE:");
     
          repeat--;
          lcd.setCursor(11, 1);
          lcd.print(time);
          lcd.setCursor(7, 3);
          lcd.print(repeat/30);
          lcd.setCursor(7, 2);
          lcd.print(repeat);
          delay(250);
        }
        if (button == 1023){                // imposta l'incremnto per il numero di fotografie da eseguire
          lcd.clear();
          lcd.setCursor(3, 0);
          lcd.print("EDIT MODE");
          lcd.setCursor(0, 1);
          lcd.print("TIME:");
          lcd.setCursor(-4, 2);
          lcd.print("REPEAT:");
          lcd.setCursor(-4, 3);
          lcd.print("MOVIE:");
     
          repeat++;
          lcd.setCursor(11, 1);
          lcd.print(time);
          lcd.setCursor(7, 3);
          lcd.print(repeat/30);
          lcd.setCursor(7, 2);
          lcd.print(repeat);
          delay(250);
        }
     
     
      }
      else {                          // levetta a sx: entra nel modo "shot"
        unsigned int remain = repeat;
        digitalWrite(verde, LOW);
        digitalWrite(rosso, HIGH);
        lcd.setCursor(3, 0);
        lcd.print("SHOT MODE");
        lcd.setCursor(0, 1);
        lcd.print("TIME:");
        lcd.setCursor(-4, 2);
        lcd.print("REPEAT:");
        lcd.setCursor(-4, 3);
        lcd.print("MOVIE"); 
        lcd.setCursor(11, 1);
        lcd.print(time);
        lcd.setCursor(7, 2);
        lcd.print(repeat);
        lcd.setCursor(7, 3);
        lcd.print(repeat/30); 
     
     
        while (scatto < repeat) {    // intervalla gli scatti in accordo con il tempo impostato e il numero di fotografie da esegire
          lcd.clear();              // terminato il loop, accende il led rosso e rimane in stand-by
          lcd.setCursor(3, 0);
          lcd.print("SHOT MODE");
          lcd.setCursor(0, 1);
          lcd.print("TIME:");
          lcd.setCursor(-4, 2);
          lcd.print("REPEAT:");
          lcd.setCursor(-4, 3);
          lcd.print("MOVIE:"); 
          lcd.setCursor(11, 1);
          lcd.print(time);
          lcd.setCursor(7, 3);
          lcd.print(repeat/30); 
     
          digitalWrite(rosso, HIGH);
          digitalWrite(fotoaccoppiatore, HIGH);
          lcd.setCursor(7, 2);
          lcd.print(remain);             
          delay(200);                  // impulso per lo scatto (chiude il circuito per 200 ms)
          digitalWrite(rosso, LOW);
          digitalWrite(fotoaccoppiatore, LOW);
          delay((time*1000)-200);      // intervallo di tempo tra uno scatto e l'altro meno il tempo impiegato
          scatto++;                    //  per la chiusura del circuito
          remain--;
          lcd.clear();
        }
     
      }
     
    }
     
     
     
     
     
     
    

    Aloa!
    Marco.
    A Marco Famà e Pirpa piace questo messaggio.
  2. Mamo Donatore generoso

    Località:
    Varedo (MB)
    Ciao Marco e grazie ancora per la "stimolazione" :)
    Complimenti per la nuova creatura

    Probabilmente è dovuto al fatto che usi delle variabili unsigned int che possono memorizzare un valore fino a 65536.
    Prova ad usare unsigned long (dove puoi arrivare a oltre 4 miliardi )
    Ciao

    P.s.
    Nella lista della spesa manca LCD
    A Marco Famà piace questo elemento.
  3. marcokava Novizio

    Località:
    Ossona
    Già è vero ! l'lcd! ;)
    Ho appena corretto e verificao con un cronometro! funziona! Evvai! finalmente posso annunciare la versione 1.3 !!!
    Che stupido, mi ero fissato sulla funzione "delay", pensavo il problema stesse lì... e invece era nelle variabili!
    Cmq Mamo grazie per la dritta! chapeau! ;)
    preso posterò un filmanto dell'intervallometro in funzione! e poi ovviamente qualche timelapse!
    Aloa!
    Marco.
    A Marco Famà e Mamo piace questo messaggio.
  4. Marco Famà Fondatore del progetto TLI

    Località:
    Torino
    Quanto invidio la vostra bravura a giocare con l'elettronica... bravi ragazzi ;)
    A maestrosplinter e Mamo piace questo messaggio.
  5. tonymultimedia Donatore generoso

    Località:
    Prv. Como
    MI ASSOCIO!!!
    stardi!!! :D:D
    A Mamo piace questo elemento.
  6. marcokava Novizio

    Località:
    Ossona
    eheheh :) niente di fantascientifico! solo un po' di pazienza (mooolta), voglia di imparare e tanta buona musica da ascoltare durante le notti passate in bianco! ;)

    Facendo gli opportuni calcoli penso di essere l'unico ad avere un intervallometro che intervalli da 1 secondo a 50 giorni!

    Da questa esperienza ho capito che il little bramper non è niente di fantascientifico, è un microcontrollore simil-arduino programmato ad-hoc, insieme ad una manciata di componenti ! ;)

    M.
  7. Mamo Donatore generoso

    Località:
    Varedo (MB)
    Concordo
    Visto le mie esigenze, non sono mai andato oltre i 30 secondi (che equivalgono a 1 ora e 40 minuti per un set di 200 foto) :rolleyes:
    Se possiedi una Nikon (come il sottoscritto) ti do ragione. Ma possedendo Canon, il little bramper ti puo' fare anche da bulb ramping (anzi penso che sia quello lo scopo principale).
  8. marcokava Novizio

    Località:
    Ossona
    Intendevo proprio quello! nel senso, costruire un bulb ramper non è una cosa tanto difficile, il più è riuscire a renderlo gestibile!
    Cmq Mamo spiegami una cosa, come mai il famoso little bramper non va bene per nikon?
    Voglio dire, con il sistema del fotoaccoppiatore si possono far scattare tutte le reflex del mondo, in fondo chiude un circuito..
    Come ben sai il fotoaccoppiatore è gestito come un normalissimo led, percui impostando la posa B e programmando il mio intervallometro in questo modo:

    void loop()[
    digitalWrite (fotoaccoppiatore, HIGH);
    delay(500);
    digitalWrite(fotoaccoppiatore, LOW);
    delay(2000);
    ]

    avrei un loop nel quale si eseguirebbe una fotografia ogni 2 secondi con un esposizione di 1/2 secondo.
    se questo lo gestissi con dei"while" si potrebbe far eseguire N loop con un esposizione di 1/2 secondo, N2 loop con un'esposizione di 1 sec &cc sempre intervallati da 2 secondi.
    Non so se sono riuscito a spiegarmi...e non so se la metto troppo semplice..
    Probabilmente mi manca qualche info..:(
    A Marco Famà piace questo elemento.
  9. Mamo Donatore generoso

    Località:
    Varedo (MB)
    Beh la gestione potrebbe essere molto più semplice.
    Pensa che avevo messo anche una fotoresistenza che in automatico faceva da esposimetro e regolava di conseguenza i tempi dell'otturatore.
    Purtroppo la gestione della posa B con le Nikon è assai diversa da Canon e alquanto imprecisa.
    Tramite la porta dedicata (sembra assurdo ma è così) non è possibile avere un controllo fine dei tempi di esposizione.
    Per esempio: se do un segnale di 1,2 sec a volte lo legge per 1 sec e a volte per 1,2 sec (per non parlare di tempi ancora piu' stretti).
    Non hai costanza.
    Qui puoi trovare un articolo, dove viene spiegato meglio il perchè e proposta una soluzione.
    http://www.elysiavisuals.com/content/bulb-ramping-nikon-dslr-technical-story
    A Marco Famà piace questo elemento.
  10. marcokava Novizio

    Località:
    Ossona
    Grazie del link, davvero interessante! ;)
    Ho già pensato come modificare la mia creatura per poter implementare la funzione ramping!
    Ora avrei bisogno di un consiglio..
    Utilizzando il little bramper, o magic lantern che sia...la funziona bulb ramper che range di valori ha?
    ovvero, +- 1 stop? 2stop? 3 stop? e di solito in quanto tempo ? 1, 2, 3 ,4 ore?
    In parte già mi rispondo da solo "dipende dall'utilizzo"! ;) ma cercando di fare una media, entro che range conviene stare?

Condividi questa Pagina