Un’applicazione con Webcam USB

Il bus USB (Universal Serial Bus) si sta diffondendo rapidamente nel settore delle applicazioni multimediali. Si tratta di una tecnologia che può essere utilizzata per archiviare immagini statiche o video su memorie Flash, oppure per trasferire ed elaborare flussi video in tempo reale. La realizzazione di una semplice applicazione di una webcam, come quella descritta in questo articolo, è probabilmente un caso che molti progettisti troveranno interessante.

Spesso per realizzare una webcam si  utilizza un  microprocessore affiancato da un circuito integrato dedicato alla ricetrasmissione sul bus USB. Sfortunatamente, questo tipo di progetto spreca uno spazio considerevole sulla scheda e richiede un numero di componenti relativamente elevato. Una soluzione alternativa, molto più integrata, sarebbe preferibile, in quanto si possono ottenere costi più bassi, si può arrivare prima sul mercato e con un prodotto di dimensioni inferiori.

Nell’esempio illustrato nella figura 1, si è utilizzato questo approccio. In questo caso si è integrato nel progetto di sistema un dispositivo controllore USB Host/Slave ad alte prestazioni. Viene usato per leggere i dati video provenienti dalla webcam USB, elaborarli tramite la sua CPU a 16 bit e convertirli in formato RGB affinché possano essere visualizzati su un display OLED. Con una soluzione del genere si può ottenere una frequenza di quadro di 4,4 fps con una risoluzione di 160x120 pixel. Il dispositivo di controllo è utilizzato il modello Vinculum II di FTDI.

Figura 1: schema della webcam USB.

Figura 1: schema della webcam USB.

CONSIDERAZIONI HARDWARE

L’hardware utilizzato per realizzare questa applicazione, come mostrato nella figura 2, è composto da quanto segue:

  • Una scheda V2EVAL, compreso un alimentatore da 5 V, 2 A.
  • Una scheda figlia a 64 contatti Vinculum II.
  • Un modulo display OLED a colori (risoluzione 160 x 128 pixel).
  • Un convertitore e regolatore DC/DC da 5 V/12 V DC/DC (che alimenta l’OLED a 12 V).
  • Un controllore e circuito di pilotaggio per display OLED RGB a 128 punti, 262K colori.
  • Una webcam che supporta la classe UVC (Universal Video Class).
Figura 2: la scheda FTDI V2EVAL con il display OLED.

Figura 2: la scheda FTDI V2EVAL con il display OLED.

La webcam è collegata alla porta USB 1. Le linee dati e di controllo vengono pilotate dai piedini GPIO del dispositivo Vinculum II. Il convertitore DC/DC fornisce l’alimentazione a 12 V del display OLED. La potenza assorbita totale è dovuta per 136 mA alla webcam, per 103 mA al display e per appena 21 mA alla scheda V2EVAL. La circuiteria di debug e programmazione integrata nella scheda V2EVAL, grazie all’ampia area di prototipazione, consente di svolgere agevolmente molte attività di sviluppo e sperimentazione.

LA STRUTTURA DEL SISTEMA

Il display OLED utilizzato in questa applicazione può funzionare secondo due modalità operative, che vengono entrambe utilizzate, quella con interfaccia per bus a 8 bit e quella con interfaccia RGB a 6 bit. Ciascuna delle due modalità dispone del suo insieme di segnali di controllo.

  • Modalità di interfaccia bus – Questa modalità viene utilizzata all’accensione per configurare le caratteristiche del display OLED. Quando l’OLED è completamente configurato, l’applicazione commuta alla modalità RGB, pronta a inviare i dati RGB all’OLED.
  • Modalità di interfaccia RGB – Questa modalità viene utilizzata quando l’OLED visualizzata i dati Il programma applicativo è composto da due thread di base nell’ambito del sistema operativo in tempo reale (RTOS) Vinculum, come illustrato nella figura 3.
Figura 3: thread per la gestione della webcam e del display.

Figura 3: thread per la gestione della webcam e del display.

I due thread sono:

  • USBReader – Questo thread è responsabile della connessione della webcam dopo che è stata identificata dall USB Host, dalla sua configurazione e delle lettura/memorizzazione del flusso di dati video prodotto dalla webcam.
    DisplayOutput - Questo thread è responsabile dalla conversione dei dati video provenienti dalla webcam, che sono in formato YUV, nel loro equivalente in formato RGB, e poi di inviare i dati al display. Vengono utilizzati dei doppi buffer per memorizzare i dati, il cui accesso viene sincronizzato tramite semafori. I semafori controllano le letture e scritture nel buffer condiviso dai thread.

FIRMWARE APPLICATIVO

Il firmware è necessario per interfacciare la webcam al display OLED. Poiché i dispositivi Vinculum II sono supportati da catene di strumenti di sviluppo gratuite, il tempo e lo sforzo per realizzazione del firmware può essere enormemente ridotto. La catena di strumenti di sviluppo comprende un compilatore C, assembler, linker e debugger che condividono un ambiente di sviluppo integrato (IDE) che può essere usato per sviluppare firmware personalizzato. I driver privi di costi di licenza, librerie software ed esempio per facilitare lo sviluppo di applicazioni, sono reperibili sul sito web di FTDI. Il programma applicativo crea una connessione tra il driver UVC e l’USB Host inviando una richiesta VOS_IOCTL_UVC_ATTACH al driver UVC passando un handle come parametro all’USB Host. La richiesta VOS_IOCTL_UVC_ATTACH rimane bloccata finché l’Host ha riconosciuto (enumerated) la webcam sulla sua porta. Quando la richiesta VOS_IOCTL_UVC_ATTACH termina, la webcam è collegata alla porta USB e il programma applicativo può inviare le richiesta alla webcam tramite il driver UVC. I dati a colori, in formato YUV, vengono ricevuti dalla webcam tramite un punto di connessione USB isocrono. I dati YUV vengono ricevuti in trame da 192 byte. I primi 12 byte della trama costituiscono l’intestazione, mentre i 180 byte rimanenti costituiscono i veri e propri dati video. L’applicazione sfrutta le informazioni dell’intestazione per sincronizzarsi con il flusso di dati; i byte rimanenti nel flusso sono i dati YUV. Per sincronizzarsi con i dati della trame, l’applicazione attende il segnale di fine trama. Durante questa fase, tutti gli altri dati ricevuti vengono ignorati. Quando l’applicazione è sincronizzata con i dati della trama, la ricezione di un errore significa che è necessario procedere di nuovo con la sincronizzazione. In tutta questa fase, l’applicazione ignora tutti  i dati finché è stato ricevuto il fine trama e la sincronizzazione è di nuovo avvenuta. I dati YUV ricevuti dalla webcam devono essere elaborati per adattarli al display OLED. I dati vengono convertiti in formato RGB e il risultato viene inviato al display tramite le uscite dell’interfaccia GPIO. La conversione dei dati in formato YUV, provenienti dalla webcam nel formato RGB richiesto dal display OLED, avviene usando un algoritmo la cui approssimazione è definita dal codice riportato nel listato 1 (sul web sono reperibili diverse alternative).

unsigned char Blue, Green, Red;
unsigned char Y0, Y1, U, V;
unsigned char *inBuf;
unsigned char size;
void YUY2RGBConvert
(unsigned char *inputBuffer1 )
{
inBuf = inputBuffer1;
while (size)
{
//size -= 4;
asm { DEC8 size $4; };
// Y0 = (*inBuf++) - 16;
asm {
CPY16 %r0 inBuf
INC16 inBuf $1
CPY8 %r0 (%r0)
SUB8 %r0 $16
CPY8 Y0 %r0
}
//U = (*inBuf++) - 128;
asm {
CPY16 %r0 inBuf
INC16 inBuf $1
CPY8 %r0 (%r0)
SUB8 %r0 $128
CPY8 U %r0
}
//Y1 = (*inBuf++) - 16;
asm {
CPY16 %r0 inBuf
INC16 inBuf $1
CPY8 %r0 (%r0)
SUB8 %r0 $16
CPY8 Y1 %r0
}
//V = (*inBuf++) - 128;
asm {
CPY16 %r0 inBuf
INC16 inBuf $1
CPY8 %r0 (%r0)
SUB8 %r0 $128
CPY8 V %r0
}
//Red = Y0 + V;
asm {
ADD8 Red Y0 V;
}
gpio_port_b = 0x60;
gpio_port_a = Red;
gpio_port_b = 0x70;
//Green = Y0 - V - U;
asm {
SUB8 Green Y0 V;
SUB8 Green U;
}
gpio_port_b = 0x60;
gpio_port a = Green;
gpio_port b = 0x70;
//Blue = Y0 + U ;
asm {
ADD8 Blue Y0 U;
}
gpio_port_b = 0x60;
gpio_port_a = Blue;
gpio_port_b = 0x70;
//Red = Y1 + V;
asm {
ADD8 Red Y1 V;
}
gpio_port_b = 0x60;
gpio_port_a = Red;
gpio_port_b = 0x70;
//Green = Y1 - V - U;
asm {
SUB8 Green Y1 V;
SUB8 Green U;
}
gpio_port_b = 0x60;
gpio_port_a = Green;
gpio_port_b = 0x70;
//Blue = Y1 + U;
asm {
ADD8 Blue Y1 U;
}
gpio_port_b = 0x60;
gpio_port_a = Blue;
gpio_port_b = 0x70;
}
return;
}
Listato 1

L’applicazione della webcam descritta in questa sede dimostra le funzionalità isocrone del chip Vinculum II, una delle caratteristiche che lo differenzia dal molte altre soluzioni USB disponibili sul mercato. Sebbene in questa particolare applicazione venga usata solamente una delle due porte USB disponibili (come USB Host), il chip comunica con la webcam e il display OLED per riprodurre le immagini video acquisite. Questa applicazione potrebbe essere estesa configurando una seconda porta USB host per, ad esempio, registrare i dati su un disco o una chiavetta USB realizzata con memorie Flash. La maggiore flessibilità offerta dalla disponibilità di funzionalità Host/Slave nello stesso dispositivo a semiconduttore non solo semplifica le attività di progettazione, ma anche la gestione e l’approvvigionamento dei componenti. Offrendo ai progettisti una piattaforma di questo tipo, così semplice da utilizzare, è possibile realizzare applicazioni multimediali sofisticate con minima difficoltà.

Una risposta

  1. Giovanni Di Maria Giovanni Di Maria 7 agosto 2019

Scrivi un commento