Contrôleur de zoom pour reflex numérique
Projet réalisé par : Edgar Bonet et Alexandre Bonet.
État d'avancement : circuit monté, à tester.
Sources du projet: Les fichiers CAO et le firmware sont disponibles sur GitHub:edgar-bonet/ctrl-zoom.
Les reflex numériques sont aujourd'hui une alternative intéressante aux caméscopes quand on veut un maximum de qualité d'image. Mais il n'est pas pratique de contrôler la focale du zoom lorsque le reflex est monté sur trépied ou en caméra d'épaule. Le but de ce projet est de motoriser le zoom pour en déporter la commande ; et de recycler au passage un moteur de tête d'impression d'une imprimante hors service. Mon frère (Alexandre) s'occupe de la partie mécanique, alors que je (Edgar) m'occupe de la partie électronique.
Principe général
La commande se fait par un bouton à bascule permettant de zoomer dans les deux sens à plusieurs vitesses. On pense acheter une télécommande filaire toute faite, dans le genre de ce modèle de chez Magnus. Ces télécommandes parlent un protocole appelé LANC, créé par Sony pour leurs caméscopes.
La motorisation sera assurée par un moteur DC équipé d'un réducteur. On envisage d'utiliser un moteur recyclé d'une imprimante qui est coupé à un codeur incrémental. Si nécessaire, le codeur pourra servir pour asservir en vitesse, mais dans un premier temps le moteur sera piloté en boucle ouverte.
Ci-dessous le schéma d'ensemble. La boîte de gauche est la télécommande filaire. La boîte « contrôleur » est l'électronique à réaliser, à base d'un microcontrôleur AVR et d'un pont en H.
┌──────────┐ bus ┌────────────┐ ┌────────┐ ┌──────┐ │ commande ┝━━━━━━┥ contrôleur ┝━━━┥ moteur ╞═╡ zoom │ └──────────┘ LANC └────────────┘ └────────┘ └──────┘
Bus LANC
Ce bus sert normalement à raccorder une caméra à un périphérique. Le périphérique reçoit des informations sur le fonctionnement de la caméra, et peut à son tour envoyer des commandes. Ici, le périphérique est la télécommande filaire, et le contrôleur du schéma ci-dessus va se faire passer pour une caméra.
Au niveau physique, c'est un bus série à trois fils :
- GND ;
- +5 V, fourni par la caméra au périphérique ;
- data, bidirectionnel en collecteur ouvert.
D'après les projets trouvés sur le Web, il semble que ce soit au périphérique de fournir un pullup de 4,7 kΩ.
Le format des trames ressemble à une connexion série classique à 9600 bps, mais avec une logique inversée (+5 V représente ‘0’), et des bits de stop plus longs. Toutes les 20 ms une trame de 8 octets est échangée, suivie d'un silence. Les bits de start sont toujours envoyés par la caméra. Les quatre premiers octets de données sont émis par le périphérique, les quatre suivants par la caméra.
On trouve sur le Web beaucoup de projets interfaçant le bus LANC avec un Arduino ou un microcontrôleur. Seulement, dans tous les projets que j'ai vus le microcontrôleur joue le rôle de périphérique, alors qu'ici il va jouer le rôle de caméra.
Références
- La page Wikipedia sur LANC décrit ce protocole dans son contexte d'utilisation, mais manque de détails techniques ;
- Arduino controlled video recording using the LANC port : détaille assez bien le protocole au niveau matériel ;
- How SONY's LANC™ protocol works : décrit le protocole surtout au niveau logique, avec une longue liste de commandes couramment supportées ;
- LANC control with Arduino : projet de télécommande LANC avec code source Arduino ;
- Instructables – Cheap PIC controlled Helmet Camera using Sony LANC – Step 3: What is LANC and how does the program work? : décrit brièvement le protocole et donne un code source commenté en assembleur PIC ;
- B & H Photo Video – Zoom & Focus Controls : télécommandes filaires pour zoom, la plupart basées sur LANC.
Le microcontrôleur AVR en maitre LANC
On peut utiliser le port série physique de l'AVR pour recevoir les commandes LANC, mais il faut envoyer les bits de start sur la ligne RX. Ceci n'est pas possible avec le port série des ATmega 48/88/168/328. D'après la fiche technique : « When the USART Receiver is enabled this pin is configured as an input regardless of the value of DDD0. ». Il faudrait donc relier à la broche RX une broche GPIO dédiée à l'émission des bits de start.
Le port USI des ATtinies n'a pas cet inconvénient. D'après la datasheet des ATtiny24A/44A/84A, « USI Three-wire mode does not override normal port functions, so pin must be configure as an input for DI function. » Ce port n'est a-priori pas prévu pour fonctionner en tant qu'UART, mais on trouve des codes permettant de le faire :
- L'appnote AVR307 d'Atmel explique comment le mode SPI peut être détourné pour faire un UART half-duplex.
- Simple ATtiny USI UART 2 est un pilote pour utiliser l'USI en tant que récepteur UART, que j'ai aidé à peaufiner.
Je me suis basé sur ce dernier exemple pour implémenter le récepteur LANC.
Moteur
Les réflexions concernant la motorisation sont dans la sous-page Moteur.
