Le Vuzix VR920 est un casque vidéo plutôt haut de gamme (400 EUR) commercialisé pour des applications 3D avec un PC de bureau :
deux modules Kopin 640x480 ;
entrée vidéo analogique VGA DB15 ;
alimentation par le port USB (en principe 500 mA sous 5 V, mais fonctionne jusqu'à 3,7 V) ;
écouteurs stéréo et microphone mono intégrés (norme USB audio) ;
accéléromètre 3 axes et magnétomètre 3 axes (norme USB HID).
Spécifications détaillées : http://www.vuzix.com/iwear/products_vr920.html
TI OMAP3530, max 600 MHz (démarre à 500 MHz par défaut) ;
256 Mo RAM, flash microSD ;
WiFi, Bluetooth ;
USB OTG (fournit 100 mA max) ;
signaux vidéo numériques LCD sous 1,8 V ;
s'interface par deux connecteurs CMS de 70 broches au pas de 0,4 mm.
Spécifications détaillées : http://www.gumstix.com/store/catalog/product_info.php?products_id=227
Pour interconnecter le module Overo et le VR920, j'ai dû concevoir et fabriquer une carte d'extension avec des connecteurs de taille raisonnable pour l'alimentation et le port USB, et des convertisseurs numérique-analogique (CNA) à base de résistances pour la sortie VGA analogique. Les CNA sont connectés directement à la sortie LCD numérique du OMAP et fournissent 12 bits par pixel (4 bits par composante). Les signaux de synchro LCD du OMAP sont routés directement vers les broches VGA correspondantes (par chance, le VR920 accepte des signaux de 1,8 V au lieu de 5 V). Le reste du travail est fait en logiciel sur le OMAP. En fait, le OMAP ne peut pas générer des signaux de synchro parfaitement conformes à la norme VGA (les impulsions HSYNC sont probablement un peu trop courtes), mais le VR920 est tolérant de ce côté là aussi.
La platine double face a été conçue sous gEDA gschem, routée sous gEDA PCB, et gravée par impression directe à jet d'encre du masque de gravure (voir [PCBPRT]).
J'ai dû convertir le brochage et la géométrie du module Overo au format gEDA : OVERO.sym, OVERO.fp. Ces fichiers sont dérivés de spécifications publiées par Gumstix sous licence Creative Commons Attribution-ShareAlike2.5. Une partie du travail a été réalisée manuellement ; des erreurs sont donc possibles.
Comme le port USB OTG du module Overo ne peut fournir que 100 mA,
le casque est alimenté par VSYSTEM
au lieu de USBOTG_VBUS
.
J'avais considéré comme acquis, au début du projet, que le connecteur 13 broches à l'intérieur du VR920 recevrait directement les signaux VGA et USB. Mais il s'est avéré que le cordon, qui se sépare en une branche VGA d'une part et une branche USB d'autre part, contient une petite platine qui traite les signaux de synchro VGA.
Je n'ai pas cherché à déterminer si le OMAP pourrait générer la même synchro composite (non standard) que ce circuit. J'ai préféré intégrer la platine dans le projet. Par ailleurs, je n'avais pas trouvé de fournisseur pour le connecteur à 13 broches au pas de 1,0 mm du VR920. En sacrifiant le câble d'origine, je résolvais ce problème par la même occasion.
USB . L'interface USB du VR920 indique à l'hôte qu'il a besoin de 500 mA ; c'est pourquoi Linux le déconnecte immédiatement. On contourne habituellement ce problème en insérant un hub USB disposant de sa propre alimentation. Au lieu de cela, comme nous alimentons le VR920 directement sur VSYSTEM, nous pouvons forcer Linux à ignorer la consommation de courant USB avec usb_ignore_power.patch.
Frame-buffer . La résolution du frame-buffer de Linux doit être positionnée à 640x480 dans l'environnement de u-boot.
Configuration LCD OMAP . Les commandes ci-dessous configurent le sous-système LCD du OMAP pour produire des signaux proches de la norme VGA :
DISPLAY=:0.0 xset -dpms # Empêche la mise en veille de la logique LCD ; sinon on ne peut pas manipuler ses registres. devmem2 0x480504fc w 0x00003000 # Polarités devmem2 0x48050464 w 0x02f00f3f # HSYNC devmem2 0x48050468 w 0x02000901 # VSYNC devmem2 0x4805047c w 0x01df027f # Dimensions killall Xorg # Force la prise en compte des modifications.
HID
. L'interface la plus appropriée pour utiliser les capteurs d'inclinaison est /dev/hidraw
,
ce qui exige de recompiler le noyau Linux de Gumstix avec CONFIG_HIDRAW=y
. On reçoit alors des messages de 17 octets contenant six entiers 16 bits little-endian :
root@overo:~# hexdump -e '4/1 "%02x " 6/2 " %4d " 1/1 " %02x" "\n"' < /dev/hidraw0 00 02 02 00 -1 403 -60 82 421 189 ab 00 02 02 00 -9 374 -68 65 400 175 ab 00 02 02 00 -8 394 -65 62 396 174 ab 00 02 02 00 -19 378 -78 35 364 158 ab
La monotonie des gradients est satisfaisante, malgré l'usage de résistances de la série E12 (10 %). Finalement, il aurait été utile d'utiliser 5 bits ou plus par composante.
La piètre qualité de l'affichage dans ces photos s'explique principalement par la distorsion des signaux dans les CNA à résistances, mais aussi par la difficulté de positionner l'appareil photo exactement au plan focal de l'optique du casque.
Le programme de démonstration vroom920.c affiche une pièce cylindrique autour de l'utilisateur, en rendu fil de fer stéréoscopique avec suivi des mouvements.
Avertissement . Ce prototype viole probablement la plupart des normes techniques d'interopérabilité applicables et des réglementations en matière de sécurité et de compatibilité électromagnétique.
CNA . Avec le recul, j'aurais pu utiliser de vrais CNA vidéo rapides. Mais comme il s'agissait de mon premier projet hardware CMS avec une platine fabriquée par jet d'encre, il m'a paru plus sage d'éviter les complications ; la solution à base de résistances pose moins de problèmes d'approvisionnement et de mise au point.
GPIO . Les CNA à résistances sur les sorties GPIO abusent probablement un peu des spécifications électriques du OMAP, mais cela n'a pas d'effet notable puisqu'il chauffe déjà beaucoup tout seul. Si mon module Overo finit par griller, je le signalerai ici même.
Autonomie . Le système consomme 1 A sans aucune optimisation. Ceci reste raisonnable puisque, de toute façon, aucun utilisateur n'accepterait de passer plus de quelques minutes avec sur le front deux émetteurs d'impulsions micro-ondes, une batterie au lithium en surchauffe et des lunettes donnent la migraine.
Améliorer l'intégration . L'électronique du VR920 implémente plusieurs fonctions sophistiquées dont nous n'avons pas vraiment besoin pour ce projet, comme l'échantillonnage et l'interpolation de nombreuses variantes et résolutions de la norme VGA, et même des menus en incrustation vidéo. Il est certainement possible de s'en passer et de piloter directement les modules Kopin. C'est ce que fait [VOGL2008] avec la version 320x240 du module, qui a une interface analogique RVB légèrement différente. Les principales difficultés seraient de travailler avec des signaux de 9 V, d'implémenter l'inversion de polarité à chaque ligne, et de trouver les bons connecteurs ZIF pour nappe flexible.
[PCBPRT] pcbprt - Fabrication artisanale de circuits par impression à jet d'encre . http://www.pabr.org/pcbprt/pcbprt.fr.html .
[VOGL2008] Gumstix Video out board :: Kopin K230LV adapter . http://pervasive.researchstudio.at/portal/node/49 .