Remote Shooter 3.0 controllo wireless macchine fotografiche

wil + remshoot

Remote Shooter BT 3.0, è la soluzione hardware e software per il controllo remoto dello scatto di macchine fotografiche digitali via BT con funzioni di Time Lapse e ad eventi, in continua evoluzione abbiamo ora sviluppato nuovi comandi all'interfaccia grafica, realizzando una App per dispositivi Android impiegando App Inventor per dare a chiunque la possibilità di creare altre funzioni, e da PC utilizzando Microsoft VC2005 o SharpDeveloper. Per i programmatori più esperti che avessero particolari necessità renderemo disponibile i sorgenti per sviluppare con il toolkit Google Android Eclipse.
Il nostro progetto partito circa 2 anni fa, anche grazie al supporto di questo blog, è stato inizialmente pensato per controllare alcune fotocamere digitali, come la Nikon D50, ma può controllare molte altre fotocamere digitali che utilizzano lo standard PTP (la nostra attenzione sarà focalizzata particolarmente sulle DSLR di Nikon e Canon, e sulle rispettive compatte Coolpix o Powershot) , tutto dipende dalle funzioni specifiche fornite dalla fotocamera che si possiede.
Una volta connesso il dispositivo alla porta USB della fotocamera, verrà effettuato automaticamente il discovery delle funzionalità disponibili; da quel momento con Remote Shooter 3.0 sarà possibile controllare le principali funzioni della fotocamera.
Una porta jack stereo 2.5 è disponibile (Focus & Release) per dare la possibilità di controllo remoto (scatto e Time Lapse) anche a fotocamere che non siano gestibili via PTP. In questo caso sarà necessario procurarsi un cavo adattatore (su ebay, ad esempio) con il giusto connettore per la vostra fotocamera.

Funzioni principali:

  •     Remote Shoot;
  •     Time Lapse (intervallo in sec, numero ripetizioni);
  •     Shutter Speed Settings; (se la fotocamera espone i relativi comandi PTP);
  •     Aperture Settings; (se la fotocamera espone i relativi comandi PTP);
  •     Iso Settings; (se la fotocamera espone i relativi comandi PTP);
  •     Bracketing on/off; (se la fotocamera espone i relativi comandi PTP);
  •     Shake&Shoot (l'app legge i dati dell'accelerometro dello smartphone android);
  •     Sound&Shoot (l'app legge i valori del microfono dello smartphone, la soglia di rumore necessaria allo scatto è regolabile);
  •     Read&Shoot (l'app legge ed esegue una sequenza di azioni programmabili)
  •     Visualizzazione sullo smartphone della thumbnail della foto appena scattata, o anche delle ultime 10;
  •     Porta USB Host mode per connessione a fotocamera (le funzioni dipendono dalle caratteristiche della fotocamera)
  •     Porta Jack 2.5 mm per funzionalità base di fuoco e scatto (disponibile su molte reflex) nel caso in cui il modo PTP USB non sia possibile.
  •     I/O port expansion per sensori/attuatori esterni (eg light sensor o flash)
  •     Wireless firmware Upgrade (basato sul bootloader Microchip)
  •     Li-Po Battery da 750mAh, ricaricabile da qualunque caricabatterie micro-usb

Attualmente testato su:
Nikon D50 (funzioni complete, vedi video)
Nikon Coolpix AW100
Canon Powershot A300
Canon Poweshot S500

Per la comunicazione con l'unità di interfaccia connessa alla fotocamera, è stata creata una app di gestione per smartphone/tablet Android e forniremo anche una applicazione per PC Windows 7, dando modo ai più smart di autocostruirsi la propria interfaccia se non soddisfatti di quella da noi realizzata. Comunque grazie a questa scelta di lasciare open il codice sorgente, si potranno aggiungere nuove funzionalità come ad esempio lo scatto alla ricezione di un messaggio(SMS), la posizione rilevata dal GPS etc.
La comunicazione tra Smartphone/PC ed il nostro dispositivo Remote Shooter si basa sul protocollo Bluetooth in modalità SPP (Serial Port Profile). Essa avviene con uno scambio di messaggi che prevede un set di comandi di lettura/scrittura appositamente  implementati e che ne definiscono a tutti gli effetti un semplice ma efficace linguaggio di scripting, per mezzo del quale è possibile dare delle semplici istruzioni in sequenza, anche su un file di testo che sarà letto dall'app dello smartphone, e inviate una ad una al dispositivo connesso alla macchina fotografica.

Di seguito i comandi di setting base:

ENSENS= 0 od 1 :::::::::::::::: abilita/disabilita il sensore di autoscatto
ENSENS? :::::::::::::::: per ottenere lo stato
DELAYSENS= microsecondi :::::::::::::::: microsecondi da abilitare
DELAYSENS? :::::::::::::::: per ottenere il valore impostato
ENTIMER= 0 od 1 :::::::::::::::: abilita/disabilita il timer
ENTIMER? :::::::::::::::: per ottenere il valore impostato
TIMEINT=secondi :::::::::::::::: setta i secondi del timer
TIMEINT? :::::::::::::::: per ottenere il valore impostato
TIMERIP=numero ripetizioni :::::::::::::::: setta le ripetizioni del timer
TIMERIP? :::::::::::::::: per ottenere il valore impostato

Di seguito i comandi PTP di comunicazione con la fotocamera:

SHOOT ::::::::::::::::  Comando di scatto con messa a fuoco
GETPROP? ::::::::::::::::: per ottenere le proprietà esposte dalla fotocamera
GETEVENT? ::::::::::::::::: per ottenere eventi esposti dalla fotocamera
GETOPCODE? ::::::::::::::::: per ottenere gli Opcode (comandi tipo scatto etc) esposti dalla fotocamera
SENDCMD!100E,0,0,0,0,0,0.  dove il primo parametro è il comando, (nell'esempio il comando PTP di scatto standard)
GETPROPVAL? o restituisce il valore o il codice con l'errore
SETPROPVAL=restituisce l'esito con il codice.
GETOBJHDL? Comando per ottenere tutti gli handle di tutte le immagini presenti sulla macchinetta
GETOBJINF?handledapassare.....Comando per ottenere le info dell'immagine, va sempre chiamata prima di prendere l'immagine con le chiamate successive. Esempio chiamata GETOBJINF?00000001.
GETTHUMB?handledapassare...... Comando per ottenere la thumbnail dell'immagine richiesta, Esempio comando GETTHUMB?00000001.

Nel tempo, ed in base anche ad eventuali suggerimenti, saranno resi disponibili altri comandi sul firmware, aggiornabile via bluetooth. Con l'intento di offrire la massima flessibilità d'uso, cercando di coprire le esigenze sia dei meno esperti sia dei professionisti,  abbiamo preso due strade per implementare su Android l’interfaccia di gestione e controllo. La prima è tramite App Inventor, tool grafico di Google estremamente intuitivo anche se non consente il controllo totale sulle risorse di uno smartphone, con una App che offrirà delle funzioni base (simile alla versione 2.0) dove anche i meno esperti potranno comunque iniziare a customizzare la propria interfaccia. Qui un esempio dei comandi inviati sul canale Bluetooth quando si clicca sui rispettivi bottoni: SHOOT, Intervallo (per il Time Lapse) e Abilita Sensore.

 La seconda, decisamente più completa, ed aperta a mille applicazioni, è tramite il tool SDK di sviluppo integrato (ADT Android Developer Tools). Il tool è davvero potente, non c'è praticamente limite alla realizzazione di qualunque applicazione.
Abbiamo pensato anche ad una terza opzione, una via di mezzo tra i due tool, che permetta a chi è completamente a digiuno di tecnologia e sviluppo, di utilizzare un semplice ma efficace linguaggio di "scripting", un batch, da mettere su un file di testo che mediante un pulsante dell'app verrà letto ed eseguito. L'idea ci è venuta immaginando anche una possibile applicazione di laboratorio, dove fosse necessario avere un certo automatismo che ripeta una serie di operazioni base, anche più volte.

Per la versione PC, forniremo i sorgenti della GUI mostrata in figura, sviluppata con Microsoft VC2005.

Da notare che nella versione per PC è disponibile una utile funzione di debugging per visualizzare tutti i comandi, proprietà ed eventi di cui la fotocamera dispone. Tale funzionalità potrà essere utilizzata per creare un database online delle fotocamere, a supporto di tutti coloro che ne abbiano necessità per sviluppare proprie applicazioni basate su specifiche fotocamere.

Ma torniamo alla parte più interessante per i più esperti e curiosi, relativa allo sviluppo con Eclipse: l’Sdk di Google per Android. Il progetto di comunicazione tra Smartphone e l'unità fisica connessa via USB alla macchina fotografica, è partito dalla struttura della chat bluetooth di esempio fornita proprio dall’sdk di google Android, da qui sono state implementate subito alcune funzioni più sofisticate, come, ad esempio, il trasporto delle thumbnail dalla macchina al telefonino e la relativa visualizzazione, o lo scatto innescato da un evento sonoro rilevato dal microfono del telefono. Per chi volesse cimentarsi, prima di tutto è necessario tenere ben presente una indicazione più specifica sui sorgenti dell’app, relativamente all’uso della seriale bluetooth in android: va infatti impostato uno specifico UUID, senza il quale non avviene la comunicazione seriale (SPP) con nessun dispositivo:

// Unique UUID for this application
//for Bluetooth serial board
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

Vediamo ora più nello specifico una delle funzioni presenti sull'APP, il trigger che scatena il comando di scatto quando il microfono dello smartphone rileva un suono/rumore che supera una certa soglia preimpostata. Il comando di scatto è stato implementato tramite un thread separato al fine di evitare il blocco di tutta l’app. I programmatori devono considerare che su Android, e su tutti i telefonini in genere, una delle cose importanti per la corretta gestione delle App è infatti quella di non legare mai le azioni/funzioni direttamente al click/touch, ma separare gli eventi dall’azione legata ad essi. Il trigger del suono è stato implementato tramite la classe android.media.MediaRecorder che permette di registrare non solo audio ma anche video, nello specifico per lo scatto legato ad un evento sonoro è stato usato il metodo getMaxAmplitude() che restituisce l'ampiezza massima assoluta che è stata campionata dall'ultima chiamata a questo metodo. Il valore restituito è un intero, quindi se l’intero restituito sarà superiore al valore impostato come soglia nella nostra variabile (sensibilità), l’App invierà il comando di SHOOT verso l'unità fisica e conseguentemente verso la macchina fotografica. Il thread, una volta lanciato, sarà in continua lettura del valore pronto a scattare.

Riportiamo di seguito il codice della nostra funzione:

  private class GetMaxAmplitudeXS extends Thread {
      public GetMaxAmplitudeXS() {
      }
      public void run() {
       int Sound = 0;
               while (true)
               {
                Sound =0;
                try {Thread.sleep(10);
                      } catch (InterruptedException e) {   
           e.printStackTrace();
                      }
                try {
                 Sound = recorder.getMaxAmplitude();
                } catch (IllegalStateException e)
{
                            Log.e(TAG, "recorder.getMaxAmplitude()",e);
                        }  
           mProgressAudio.setProgress(Sound);
                if( Sound > Sensibilita)
                 {
             Log.i(TAG, "SHOOT.");
    if (rShootService.getState() != RemoteShootService.STATE_CONNECTED) {
                   Message msg = mHandler.obtainMessage(RemoteShoot.MESSAGE_TOAST);
                         Bundle bundle = new Bundle();
               bundle.putString(RemoteShoot.TOAST, "You are not connected to a device");
               msg.setData(bundle);
               mHandler.sendMessage(msg);
                  } else{
                 String Msg = "SHOOT.";
      byte[] send = Msg.getBytes();
       rShootService.write(send);
        }

Hardware

Processore                            PIC24FJ64GB002 16BIT, USB-OTG 8K Ram,16Mips@32Mhz

Program Memory                  64K Flash

Comunicazione                    Bluetooth serial module HC-05 class2 certified 30ft/10mt coverage

Power supply                        3,7V 750mAh LiPo onboard battery

Lo schema elettrico, così come il layout del PCB, è ancora in fase di ottimizzazione, e sarà offerto in Open Source se porteremo a termine il progetto. Il tutto è stato realizzato con Eagle versione 6.0; per la rappresentazione 3D stiamo utilizzando l'ottimo plugin eagleup che crea un file 3d compatibile con il cad 3D di Google, Sketchup. Per dare l'idea riportiamo la parte più significativa dello schema elettrico.

Il core del dispositivo è il microchip PIC24FJ64GB002 , la scelta è caduta su questo microprocessore per le ridotte dimensioni, il consumo bassissimo grazie alla tecnologia nanoWatt di Microchip, il clock interno che non necessita di circuito di oscillazione (quarzo e condensatori). Per la comunicazione tra smartphone/PC e l'unità fisica abbiamo scelto il modulo seriale Bluetooth HC-05 , anche questo componente ha un basso consumo (circa 8 mA) dopo la fase di pairing e discovery (in media circa 25mA). Per l'alimentazione del dispositivo abbiamo optato per una batteria ai polimeri di Litio da 750mA. Le caratteristiche di tali batterie dovrebbero garantirci una sufficiente autonomia. Per il circuito di ricarica specifico per le Li-Po è stato scelto il chip MCP73831 , anch'esso della Microchip.

Permettetemi due parole sul futuro del progetto: considerando il rapido sviluppo anche in Italia del fenomeno del Crowdfunding, abbiamo pensato di metterci in gioco anche noi, dopo una selezione delle principali piattaforme mondiali, la scelta è caduta su Indiegogo, prima di tutto perchè è forse il principale concorrente di KickStarter, con il vantaggio che dà la possibilità di accesso anche a makers non residenti in USA.

Trovate la nostra campagna attiva su Indiegogo proprio qui.

Per maggiori dettagli e aggiornamenti si rimanda al sito pic-ap-board.blogspot.it

Demo video

 

Demo Time-Lapse con Remote Shooter

 

 

 

5 Comments

  1. Boris L. 17 maggio 2013
  2. Giorgio B. Giorgio B. 20 maggio 2013
  3. ciccio-1976 16 maggio 2013
  4. ciccio-1976 16 maggio 2013
  5. telegiangi61 16 maggio 2013

Leave a Reply