Radiocommande pour caméscope avec ARDUINO et PICAXE

Introduction
Qu'ils soient cablés, sans fil ou à fibre optique les moyens de commander un système à distance ou de transmettre des informations sont multiples.
La plupart du temps, on parle de télécommande (Remote Control en anglais), de radiocommande, de liaison sans fil (wireless en anglais), de Bluetooth, de wifi ou encore de 4G. Les supports d'informations ou de commandes les plus couramment utilisés sont optiques, à ultrasons ou hertziens.

Ils dépendent de plusieurs facteurs dont la distance émetteur-récepteur, la configuration des lieux, le flux et le type d'informations, le besoin de cryptage etc.

Dans le cadre de la photo/vidéo animalière, le contrôle à distance d'un caméscope nécessite une liaison bidirectionnelle.
En effet, d'une part il faut commander l'orientation et les fonctionalités du boîtier déporté, et d'autre part un retour d'image est primordial.
La pratique s'avère utile en cas de météo défavorable, par exemple lorsque le vent change d'orientation et risque de dévoiler aux animaux la présence humaine.


Dans le système présenté ci-après, j'ai choisi d'utiliser 2 faisceaux hertziens en UHF, un pour envoyer des commandes et un pour le retour vidéo.

Sur le pupitre de commande, j'ai utilisé un écran TFT initialement destiné à l'automobile (DVD player, caméra de recul...) mais tout autre écran LCD équipé d'une entrée ''vidéo composite" devrait convenir. A part le caméscope, l'ensemble ''émetteur-récepteur'' utilisé pour la transmission de l'image, ainsi que l'écran vidéo représentent les postes les plus onéreux. Le thème principal de cet article étant la commande à distance, le retour d'image n'y sera pas développé.


Ce système a connu plusieurs vagues d'évolutions :  la portée radio a été augmentée en même temps que la fiabilité de la transmission, les moteurs à courant continu ont été remplacés par des moteurs ''Pas-à-Pas'' et le codage/décodage des commandes est aujourd'hui pris en charge par un ARDUINO.
Deux joysticks ont remplacé 8 boutons-poussoirs sur les 9.
On pourrait aussi envisager de remplacer un jour le PICAXE qui contrôle les moteurs par une carte d'extension d'entrées-sorties reliée en I2C à l'ARDUINO.


Réalisation
Une astuce du système réside dans l'utilisation de la télécommande du Caméscope (Remote Control Box), ici un ancien mais excellent Panasonic NV/GS400.
Souder de petits fils électriques sur les contacts de la télécommande permet de laisser intact le caméscope, sans risquer de commettre l'irréparable.



En lieu et place des piles boutons, l'alimentation de la télécommande est fournie par le boîtier électronique qui accompagne le caméscope sur le terrain.
Le sabot enfichable à la place de la batterie permet également une alimentation séparée du caméscope.










Les diodes visibles à côté des fins-de-courses sont nécessaires si on utilise des moteurs CC à la place de moteurs pas-à-pas (voir un article précédent).


Les mouvements d'orientation du caméscope, par leurs niveaux sonores, ne doivent pas effrayer les animaux que l'on désire filmer.
La rotation silencieuse et régulière des moteurs pas-à-pas est obtenue grâce à un pilotage par demi-pas.
Cela implique l'utilisation de moteurs unipolaires au lieu de moteurs bipolaires, même s'il faut déplorer une légère perte de couple par rapport à ces derniers.

Les rapports de transmission entre les moteurs et les berceaux rotatifs du caméscope doivent être ajustés empiriquement et le manque de place pour de grandes poulies nécessite de parfaire les réglages par le biais de la programmation.
Les commandes séparées de chaque moteur pas-à-pas dans le programme du PICAXE permettent de leur appliquer des vitesses différentes.
  


Circuits électroniques
Schéma de l'émetteur dans le pupitre de commande
Un inconvénient majeur de ce caméscope était de ne pas pouvoir empêcher son arrêt automatique au bout d'une minute d'inactivité.
C'est ce qui justifie la fonction ''Power-off to restart Cam'' qu'il a fallu ajouter.
A condition d'avoir une paire de jumelle et une vue dégagée sur le site, en plaine par exemple, il est possible de ne démarrer le caméscope qu'en cas de besoin et donc de moins solliciter les batteries.


Quelques points particuliers permettent d'économiser l'énergie des batteries :
- caméscope hors tension pendant l'attente d'un animal
- pas de led-témoin en service inutilement
- si possible, pas de surfréquences d'horloge des microcontrôleurs et recours à des fonctions PICAXE telles que ''disablebod'' ou sleep (non utilisées ici)
- moteurs hors tension une fois en position
  (mis à part le vent, il n'y a pas de force entraînante en rotation, mais ce n'est réalisable en élévation que si le berceau du caméscope est équilibré)
 


Schéma du récepteur (proche du caméscope)
 Au fil du temps, j'ai utilisé des batteries différentes aux voltages allant de 12V à 13.8V, ce qui a nécessité des régulateurs pour alimenter les ARDUINO.

Voici quelques recommandations pour utiliser le module nRF24L01+ de Norway NORDIC company avec un ARDUINO :
- veiller à  différencier les modules nRF24L01 et nRF24L01+
- la puissance disponible à la sortie 3.3V de l'ARDUINO est insuffisant pour le module nRF24L01+.  Il faut utiliser un ''voltage converter'' à partir de la sortie 5V.
- il est possible d'utiliser le connecteur ICSP de la carte ARDUINO au lieu des pins 11,12 et 13.
-  Lors de la mise au point, ne pas utiliser les I/O Rx (pin0) et Tx (pin1) en même temps que le moniteur série sur le PC (instruction Serial)


Schéma du circuit de contrôle des moteurs



Programmes pour les microcontrôleurs

Dans le programme du PICAXE ci-dessous, quel que soit le mouvement en cours, la lecture du Port C (commandes et fins-de-courses) ne s'effectue qu'à la fin d'une séquence de 8 pas. Vu la démultiplication des vitesses liée aux rapports des poulies, la rigueur dans le nombre de pas influence peu la précision de positionnement de chaque moteur. La seule précaution à prendre est de veiller à ce qu'aucun mouvement ne se poursuive au-delà de son fin-de-course.
Pour plus de précision, il faudrait lire les entrées entre chaque pas.

Programme du PICAXE 20M2 (module de contrôle des moteurs pas-à-pas)

; Commandes SEPAREES des moteurs par Picaxe 20M2

; C.0=Cmd_DW  -  C.1=Cmd_UP  -  C.2=Cmd_CCW  -  C.3=Cmd_CW
; C.4=Fdc_UP  -  C.5=Fdc_DW  -  C.6=Fdc_CCW  -  C.7=Fdc_CW

; LSB du Port B pour la ROTATION
; MSB du Port B pour l'ELEVATION

; La fréquence d'horloge du PICAXE (4 MHz par défaut)
; suffit et convient aux transmissions utilisées


let dirsC=0            ; Port C en Entrées
let dirsB=255        ; Port B en Sorties

Symbol Index=b25    ; pointeur vers la séquence de pas
let b26=2                  ; Délais en mS entre les pas en ROTATION
let b27=3                  ; Délais en mS entre les pas en INCLINAISON

; Adresses de stockage des séquences de pas en EEPROM
Symbol _CW=0
Symbol _CCW=8
Symbol _UP=16
Symbol _DW=24

; Stockage des séquences de Pas en EEPROM
Data _CW,(1,3,2,6,4,10,8,9)
Data _CCW,(9,8,10,4,6,2,3,1)
Data _UP,(16,48,32,96,64,160,128,144)
Data _DW,(144,128,160,64,96,32,48,16)

main:
let b24=pinsC   
select b24        ; Conditions d'autorisation des mouvements
    case 8,24,40,72,88,104
        Index=_CW : gosub ROTATION : goto main
    case 4,20,36,132,148,164
        Index=_CCW : gosub ROTATION    : goto main
    case 2,66,130,18,82,146
        Index=_UP : gosub ELEVATION : goto main
    case 1,65,129,33,97,161
        Index=_DW : gosub ELEVATION : goto main
    else
        let pinsB=0
end select
goto main


ROTATION:
    for bptr=0 to 7
        read Index,pinsB
        Index=Index+1
        pause b26
    next bptr
return

ELEVATION:
    for bptr=0 to 7
        read Index,pinsB
        Index=Index+1
        pause b27
    next bptr
return


Programme de l'ARDUINO dans le pupitre de commande

 // Camera-sur-Pied_Emetteur.ino   ( 9 canaux TOR / Module nRF24L01 )

# include <SPI.h>
# include <nRF24L01.h>
# include <RF24.h>

RF24 radio(9,10);
const byte address[6]="00001";
word ENTREES=0;   // le word ENTREES est l'image des entrées 0 à 8
bool ETAT;

String texte = "";
char Message[10];

void setup() {
  for (byte i=2; i <= 8; i++){
      pinMode(i, INPUT_PULLUP);   // Entrées 2 à 8 "active LOW"
  }
  for (byte i=14; i <= 15; i++){
      pinMode(i, INPUT_PULLUP);   // Entrées 14=(A0) et 15=(A1) "active LOW"
  }
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MAX);
  radio.setDataRate(RF24_250KBPS);
  radio.stopListening();
}

void loop() {
  for (byte i=2; i <= 8; i++){
      ETAT=!digitalRead(i);
      bitWrite(ENTREES,i,ETAT);
  }
  for (byte i=14; i <= 15; i++){
      ETAT=!digitalRead(i);
      bitWrite(ENTREES,i-14,ETAT);
      // Transfert de A0 et A1 vers les bits 0 et 1 de ENTREES
      // afin de ne pas utiliser RX et TX de l'Arduino !
  }
  switch (ENTREES) {
  case 1:
   texte ="Power-off";
    break;
  case 2:
   texte="RIGHT";
    break;
  case 4:
    texte="LEFT";
    break;
  case 8:
    texte="UP";
    break;
  case 16:
    texte="DOWN";
    break;  
  case 32:
    texte="ZOOM+";
    break;
  case 64:
    texte="ZOOM-";
    break;
  case 128:
    texte="Record";
    break;
  case 256:
    texte="INFOS";
    break;
  default:
    texte="";
    break;
  }
  texte.toCharArray(Message,texte.length()+1);
  radio.write(&Message,sizeof(Message));
}



Programme de l'ARDUINO dans le boîtier récepteur des commandes

 // Camera-sur-Pied_Recepteur.ino   ( 9 canaux TOR / Module nRF24L01 )

# include <SPI.h>
# include <nRF24L01.h>
# include <RF24.h>

RF24 radio(9,10);
const byte address[6]="00001";

void setup() {
  radio.begin();
  radio.openReadingPipe(0,address);
  radio.setPALevel(RF24_PA_MAX);
  radio.setDataRate(RF24_250KBPS);
  radio.startListening();
  for (byte i=2; i<=8;i++){
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
    }
  // Utilisation de A0(14) et A1(15)
  // au lieu de RX(0) et TX(1) !
  pinMode(14, OUTPUT);
  digitalWrite(14, LOW);
  pinMode(15, OUTPUT);
  digitalWrite(15, LOW); 
}

void loop() {
        char text[32]="";
        radio.read(&text,sizeof(text));
        String message = String(text);
                  if (message=="Power-off")
                      {digitalWrite(14, HIGH);}
                      else {digitalWrite(14, LOW);}
                  if (message=="RIGHT")
                      {digitalWrite(15, HIGH);}
                      else {digitalWrite(15, LOW);}
                  if (message=="LEFT")
                      {digitalWrite(2, HIGH);}
                      else {digitalWrite(2, LOW);}
                  if (message=="UP")
                      {digitalWrite(3, HIGH);}
                      else {digitalWrite(3, LOW);}
                  if (message=="DOWN")
                      {digitalWrite(4, HIGH);}
                      else {digitalWrite(4, LOW);}
                  if (message=="ZOOM+")
                      {digitalWrite(5, HIGH);}
                      else {digitalWrite(5, LOW);}
                  if (message=="ZOOM-")
                      {digitalWrite(6, HIGH);}
                      else {digitalWrite(6, LOW);}
                  if (message=="Record")
                      {digitalWrite(7, HIGH);}
                      else {digitalWrite(7, LOW);}
                  if (message=="INFOS")
                      {digitalWrite(8, HIGH);}
                      else {digitalWrite(8, LOW);}
                  message = "";                
}








Aucun commentaire:

Enregistrer un commentaire

Les commentaires constructifs sont les bienvenus.
Contact par mail via mon profil dans la colonne de droite.