Controllare una fotocamera digitale tramite porta USB in modalità PTP 1/2

Controllare una fotocamera digitale tramite porta USB, ora con un processore PIC, (famiglia 24 o 32 della Microchip) si può. La fotocamera eseguirà in automatico molti comandi con un sistema basato su un microcontroller della Microchip con funzioni di USB Host/OTG. Da molto tempo le moderne fotocamere digitali possono utilizzare la porta USB non solo per trasferire immagini al PC (USB Mass Storage) , ma anche per ricevere specifici comandi di controllo che ne controllano alcune funzioni (USB PTP).

Prima parte: descrizione del protocollo PTP.

La base del progetto

Appassionato da sempre di fotografia ed elettronica, ho cercato di coniugare i miei due hobby per poter esplorare nuove tecniche di ripresa ad alta velocità e non, con l'ausilio di sistemi automatici. Il primo problema e' nato poichè spesso i produttori di macchine fotografiche non diffondono informazioni tecniche sulle funzioni interne dei loro modelli. Prendendo spunto da alcuni progetti realizzati su Arduino, (in particolare quello di Alex Glushchenko )  e su Linux (http://sourceforge.net/projects/libptp/, http://libptp.sourceforge.net/README) dopo mesi di lavoro insieme ad un amico più ferrato di me nella programmazione C, abbiamo progettato e realizzato un prototipo USB Host che implementa alcune funzioni di controllo delle fotocamere digitali tramite protocollo USB PTP, utilizzando  le funzioni embedded disponibili su un PIC24F.

Tra marche e modelli compatibili (le funzioni PTP non sono recepite alla stessa maniera), abbiamo testato alcune compatte e  DSLR Nikon e Canon. I comandi piu’ interessanti da implementare per l’appassionato di fotografia sono:

1) Remotizzazione del pulsante di scatto (shutter),

2) Impostazione/lettura dei valori tempi di scatto, apertura diaframma etc.

3) Intervallometro (Time Lapse)

4) Controllo remoto della messa a fuoco dell’obiettivo motorizzato, dipende dalle fotocamere.

5) Bracketing (per le fotocamere che ne prevedono la funzione) per effettuare postelaborazioni in tecnica HDR. Per chi non fosse a conoscenza, la funzione Bracketing (in genere si trova sulle DSLR) nelle macchine fotografiche indica la "esposizione variata a forcella", questa prevede l'esecuzione di almeno 3 foto in successione separate tra loro da un valore di sovra e sottoesposizione (tempo più lungo e più corto del previsto) che permette di "centrare" la foto perfetta o di ottenere con speciali software un effetto particolare (HDR, High Dynamic Range) sovrapponendo le tre foto (esempio HDR).

La possibilità di attivare remotamente molte funzioni (ma in particolare lo scatto) sulle macchine fotografiche digitali rendono possibili molte fotografie a volte impossibili o almeno difficili da realizzare con il metodo tradizionale a causa dei tempi di reazione umani.

MI riferisco ad esempio a scatti nel mondo della fotografia ad alta velocita’ (caduta di una goccia d’acqua o altro liquido, esplosioni di palloncini etc) o a tecniche di fotografia a intervalli regolari (anche di molte ore) come il Time Lapse (ad esempio per registrare lo sbocciare di un fiore o lo schiudersi di un uovo) e’ facilmente realizzabile abbinando a questo sistema opportuni sensori di movimento, luce o suono

Implementazione del protocollo PTP su PIC 24/32 della microchip.

Il protocollo PTP è stato implementato basandoci sul documento di specifiche PTP Picture Transfer Control PIMA/ISO 15740 ,  dove viene descritto il funzionamento di una fotocamera digitale USB. Le informazioni scambiate per la gestione della fotocamera  si chiamano  transazioni, (dove sono previste domande, risposte ed eventi)

La microchip ha rilasciato una serie di PIC della famiglia 18/24/32 con modulo USB integrato.
E’ possibile quindi tramite gli stessi creare applicazioni di tipo USB device, USB embedded host od addirittura USB OTG senza l’aggiunta di componenti esterni.
 

Per facilitare lo sviluppo la microchip ha rilasciato una serie di sorgenti di esempio FREE con implementate già alcune delle possibili applicazioni del modulo USB come l’implementazione degli HID device.
Ha inoltre messo a disposizione uno stack USB che può essere utilizzato come base per l’implementazione di funzionalità non presenti tra gli esempi.
Nel nostro caso specifico il protocollo PTP non faceva parte della collezione rilasciata da microchip, abbiamo cosi sfruttato le funzionalità dell’USB embedded host stack per l’implementazione del PTP.

Di seguito un’immagine che illustra lo stack che fornisce le seguenti funzionalità:

• Esegue l'identificazione del dispositivo
• Esegue enumerazione dispositivo
• Gestione driver client
• Fornisce una semplice interfaccia per comunicare con un dispositivo USB periferico

Quello che abbiamo dovuto quindi fare noi è stata l’implementazione dell’ USB client driver per il PTP, con relativa applicazione.
Il PTP identifica due entità (ruoli) che sono l’Initiator e il Responder che nel caso dell’implementazione sull’usb sembrano collimare perfettamente con l’usb host il primo ed usb device il secondo, almeno per molti versi.

Affinchè il dispositivo PTP comunichi perfettamente bisogna identificare correttamente gli End Point da utilizzare .

 

Come da immagine sopra indicata il device espone vari End Point con i quali comunicare e sono, l’End Point di default sul quale viene eseguita l’identificazione del device e successiva inizializzazione, per intenderci questo è l’End Point per la comunicazione USB pura, quello sul quale comunica l’USB embedded Host firmware. Poi ci sono gli altri End Point che sono quelli propri del protocollo PTP e sono tre; uno di input ed uno di output che sono dello stesso tipo e poi c’è quello di tipo interrupt sul quale si possono leggere vari eventi della macchinetta come ad esempio batteria scarica.

Gli End Point del PTP anche se sempre dello stesso tipo possono cambiare l'enumerazione da modello a modello di macchinetta, è quindi l’identificazione degli stessi la prima operazione da eseguire in fase di inizializzazione del driver PTP.
Un’altra operazione che va effettuata in fase di inizializzazione è la raccolta di tutte le funzionalità che la macchinetta può eseguire in PTP. Tale raccolta viene effettuata tramite una chiamata PTP getdeviceinfo la quale restituisce l’insieme di proprietà, di operazioni e di eventi che sono disponibili per quel determinato modello di macchinetta.

 Il Protocollo PTP impone delle proprietà, delle operazioni e degli eventi uguali per tutti ma ne permette anche la libera implementazione di altre (Estensioni esistono ad esempio per Canon e Nikon), è quindi in fase di inizializzazione che vanno verificate tali funzionalità.

Come abbiamo potuto vedere tramite il PTP è quindi possibile leggere o settare determinate proprietà della macchinetta ad esempio il setting dello zoom.

E’ possibile eseguire determinate operazioni come ad esempio lo scatto di una fotografia , o la copia di una immagine ed è possibile tenere sotto monitorning la stessa controllando tra gli eventi variazioni di stato come ad esempio il full della memoria di massa.

A livello di comunicazione il PTP impone che ad eccezione della chiamata getdeviceinfo tutte le altre chiamate devono essere all’interno di una sessione che viene vista come la connessione logica con il dispositivo e che ad ogni operazione corrisponda una transazione che è vista come invocazione atomica all’interno della sessione.

Per dare una idea delle informazioni necessarie al controllo di una fotocamera riporto gli id di alcuni produttori e una piccola parte degli operation codes previsti dai produttori.

/* Vendor IDs */
#define PTP_VENDOR_EASTMAN_KODAK 0x00000001
#define PTP_VENDOR_SEIKO_EPSON  0x00000002
#define PTP_VENDOR_AGILENT  0x00000003
#define PTP_VENDOR_POLAROID  0x00000004
#define PTP_VENDOR_AGFA_GEVAERT  0x00000005
#define PTP_VENDOR_MICROSOFT  0x00000006
#define PTP_VENDOR_EQUINOX  0x00000007
#define PTP_VENDOR_VIEWQUEST  0x00000008
#define PTP_VENDOR_STMICROELECTRONICS 0x00000009
#define PTP_VENDOR_NIKON  0x0000000A
#define PTP_VENDOR_CANON  0x0000000B

/* Operation Codes */

#define PTP_OC_Undefined                0x1000
#define PTP_OC_GetDeviceInfo            0x1001
#define PTP_OC_OpenSession              0x1002
#define PTP_OC_CloseSession             0x1003
#define PTP_OC_GetStorageIDs            0x1004
#define PTP_OC_GetStorageInfo           0x1005
#define PTP_OC_GetNumObjects            0x1006
#define PTP_OC_GetObjectHandles         0x1007
#define PTP_OC_GetObjectInfo            0x1008
#define PTP_OC_GetObject                0x1009
#define PTP_OC_GetThumb                 0x100A
#define PTP_OC_DeleteObject             0x100B
#define PTP_OC_SendObjectInfo           0x100C
#define PTP_OC_SendObject               0x100D
#define PTP_OC_InitiateCapture          0x100E
#define PTP_OC_FormatStore              0x100F
#define PTP_OC_ResetDevice              0x1010
#define PTP_OC_SelfTest                 0x1011
#define PTP_OC_SetObjectProtection      0x1012
#define PTP_OC_PowerDown                0x1013
#define PTP_OC_GetDevicePropDesc        0x1014
#define PTP_OC_GetDevicePropValue       0x1015
#define PTP_OC_SetDevicePropValue       0x1016
#define PTP_OC_ResetDevicePropValue     0x1017

Link simili:

Nella seconda parte (pubblicata domani) vedremo i dettagli del prototipo e le soluzioni hardware adottate. Poi alcuni scatti fotografici realizzati grazie a questo controllore di fotocamere digitali tramite USB

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend