Remote Shooter 3.0 controllo wireless macchine

Transcript

Remote Shooter 3.0 controllo wireless macchine
Remote Shooter 3.0 controllo wireless
macchine fotografiche.
Agostino Mosillo, Gian Luigi Perrella
Contatti: [email protected]
are
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, , è 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 http://www.youtube.com/watch?v=XIFIyEyb14A )
Nikon D7100
Nikon D90
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
Program Memory
PIC24FJ64GB002 16BIT, USB-OTG 8K Ram,16Mips@32Mhz
64K Flash
Comunicazione
Bluetooth serial module HC-05 class2 certified 30ft/10mt coverage
Power supply
3,7V 750mAh LiPo onboard battery
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 www.pic-ap-board.eu
Demo video presentazione e time lapse
http://www.youtube.com/watch?v=Ja_a4orvkso
http://www.youtube.com/watch?v=y5xD9wCzvEY
Versione futura in diversi colori
Versione attuale