TELECOMMANDE TELESCOPE. (2011)
Voici dans le détail un projet à base d'Arduino Uno : une télécommande de télescope LX200 (entrée CCD).
Le but est de pouvoir réajuster la position du télescope autour de sa
position de suivit à distance, pour une démonstration.
Ne souhaitant qu'un seul câble de liaison, j'ai opté pour une liaison Ethernet
(jusqu'à 100m donc sans répéteur) qui permettra de passer dans un sens les signaux
de la télécommande et dans l'autre le retour image d'une caméra Ethernet
(pour
visualiser des taches solaires... donc pas besoin d'une caméra tip-top). Ayant aussi besoin du secteur il est possible
d'utiliser des boîtiers CPL ou carrément du Wifi pour la liaison.
Voici en image :
Pour la télécommande je souhaite pouvoir me passer d'une interface et piloter directement du PC, il faudra donc que ce soit compatible...
Donc coté télécommande ce sera une platine Arduino
Uno, avec une platine Ethernet Shield
et une platine Joystick pour les essais, l'assemblage du tout
donne un montage conséquent... mais bon, pour tester cela peut bien suffire, si
le fonctionnement doit perdurer il sera possible de remplacer les deux platines
Arduino par une Arduino Ethernet !
L'utilisation se fera aussi bien via le Joystick ou les boutons poussoirs.
L'utilisation de la platine Ethernet fait qu'il faut surélever la platine
joystick, car le connecteur Ethernet est notablement plus haut que l'USB, j'ai
donc inséré une série de connecteur entre les deux, il est dommage que ce ne
soit pas prévu d'origine (des connecteur dont la partie femelle soit plus
haute).
Coté programmation après quelques essais infructueux j'abandonne
l'interface HTML, pour une liaison telnet et finalement cela donne un programme
très simple découlant de celui de démo "Chat Server", il est vrai
que je n'ai pas trop compliqué, seul un test des commandes interdites est
effectué afin de ne pas les générer. Il est toujours possible d'améliorer et
d'adjoindre les commandes de déplacement en "biais" tel Nord/Est ou
Nord/Ouest ou .... si l'interface CCD du télescope l'accepte en final.
La seule grosse modification est d'utiliser le programme non plus en serveur,
mais en client ;)
Voici le programme commenté coté télécommande :
/*
Télécommande Télescope. (Adapté de "Chat Server")
Programme à base de Telnet avec platine Arduino +Ethernet-Shield + interface Joystick
Emission des commandes Nord/Sud/Ouest/Est via les caractères
8/2/4/6 en fonction de l'activation Joystick ou boutons
Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
* Buttons attached to pin 2 to 6
* Joystick Analog inputs attached to pins A0 à A1
created 16 Oct 2011
by F1MVP
*/
#include <SPI.h>
#include <Ethernet.h>
// Definition addresse MAC et IP.
// gateway et subnet sont optionnel
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x64, 0x0B };
byte ip[] = { 192,168,1, 232 };
byte gateway[] = { 192,168,1, 1 };
byte subnet[] = { 255, 255, 0, 0 };
byte server[] = { 192,168,1,233 }; // Platine RX Ethernet
int inx ;
int iny ;
// telnet defaults to port 23
Client client(server, 23);
void setup() {
// initialise ethernet
Ethernet.begin(mac, ip, gateway, subnet);
// Definie les entrees des bouttons résistances de pull-up sur la platine.
pinMode(6,INPUT); // Boutton Ouest
pinMode(5,INPUT); // Boutton Sud
pinMode(4,INPUT); // Boutton Nord
pinMode(3,INPUT); // Boutton Est
pinMode(2,INPUT); // Boutton Joystick non utilisé.
}
void loop() {
if (client.connect()) {
//client.print('U');
}
char thisChar = client.read(); // lecture du port au cas où,
sans utilisation ensuite...
inx = analogRead(0);
// lecture des entrées analogiques joystick
iny = analogRead(1);
// pour chaque direction on vérifie que l'ordre contraire n'est pas
demandé avant de l'envoyer.
if ((iny>520 || digitalRead(4)==0) && digitalRead(5)!=0){
client.print('8'); // Nord
}
if ((iny<480 || digitalRead(5)==0) && digitalRead(4)!=0) {
client.print('2'); // Sud
}
if ((inx<480 || digitalRead(6)==0) && digitalRead(3)!=0) {
client.print('4'); // Ouest
}
if ((inx>520 || digitalRead(3)==0) && digitalRead(6)!=0) {
client.print('6'); // Est
}
delay(40); // petit moment d'attente avant de boucler
(doit être inférieur au watchdog coté récepteur).
}
Coté PC si je veux réaliser les mêmes commandes, il me suffit
d'ouvrir une fenêtre Telnet par :
telnet 192.168.1.233
Puis de "jouer" avec le pavé numérique avec les touches 2,4,6,8 représentant
les touches du clavier Joystick...
L'utilisation des touches d/l/r/u ou s/o/e/n donnera les mêmes combinaisons.
Les touches appuyées reviennent en écho sur le terminal, cela permet un mini-contrôle
de fonctionnement.
Passons à l'interface coté télescope, celle-ci se réduit à
la plus simple expression de la platine Arduino Ethernet avec une petite
interface de "puissance" et d'isolement à l'aide de photo coupleurs
MOS et de la connectique adéquate pour le télescope !
Il s'agit juste de convertir le signal TTL en signal TTL avec un isolement,
je vais utiliser un optocoupleur MOSFEET de faible puissance (0,15A), j'en
profite pour insérer dans l'entrée une led de visualisation de la commande
avec la résistance série qui va bien. La sortie du MOSFEET commande
directement le télescope via la prise CCD. Quoi de plus simple ?
Ci dessus le schéma avec une proposition d'implantation sur
plaque pastillée et le résultat en boîte (légèrement différent, la face
des fils n'aillant pas été respecté). Par rapport au schéma minimum, j'ai
rajouté une led sur le port 2 et une autre sur l'alimentation. Il ne manque que
le câble qui n'est pas encore brasé sur le bornier au milieu du circuit.
Coté programmation toujours la simplicité, avec juste
l'impossibilité programmée de ne pouvoir activer qu'une commande à la fois,
si l'on souhaite adjoindre des commandes "en biais" tel Nord/Est, ...
il faudra repenser cette partie.
Il y a aussi un watch-dog travaillant avec la variable time, qui permet
d'interrompre toute commande au bout de 120ms s'il n'y a plus de réception de
commande, cela peut éviter quelques problèmes en cas d'interruption de
liaison...
/*
Interface Télescope. (Adapté de "Chat Server")
Programme à base de Telnet avec platine Arduino-Ethernet + interface personelle
Réception des commandes Nord/Sud/Ouest/Est via les caractères
8/2/4/6 ou u/d/l/r ou n/s/o/e
Sorties sur 7/6/5/3 + photoMOS
created 15 Oct 2011
by F1MVP
*/
#include <SPI.h>
#include <Ethernet.h>
// Definition addresse MAC et IP.
// gateway et subnet sont optionnel
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x60, 0x7C };
byte ip[] = { 192,168,1, 233 };
byte gateway[] = { 192,168,1, 1 };
byte subnet[] = { 255, 255, 0, 0 };
unsigned long time;
// telnet defaults to port 23
Server server(23);
boolean gotAMessage = false; // whether or not you got a message from the client yet
void setup() {
// initialize the ethernet device
Ethernet.begin(mac, ip, gateway, subnet);
// start listening for clients
server.begin();
// Définition des sorties
pinMode(7,OUTPUT); // Nord
pinMode(6,OUTPUT); // Sud
pinMode(5,OUTPUT); // Ouest
pinMode(3,OUTPUT); // Est
time=millis(); // T0 pour wtchdog
}
void loop() {
// wait for a new client:
Client client = server.available();
// when the client sends the first byte, say hello and send syntax:
if (client) {
if (!gotAMessage) {
client.println("Hello, client!");
client.println("Use 8462 like directional key");
gotAMessage = true;
}
// read the bytes incoming from the client:
char thisChar = client.read();
// echo the bytes back to the client:
server.write(thisChar);
if (thisChar=='?') { // Envoi une
aide si le caractère "?" est reçu.
client.println("");
client.println("Use 8462 like dir or ulrd and ? for info");
}
if (thisChar=='8' || thisChar=='u' || thisChar=='n') {
digitalWrite(7,HIGH);
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(3,LOW);
time=millis();
}
if (thisChar=='2' || thisChar=='d' || thisChar=='s') {
digitalWrite(7,LOW);
digitalWrite(6,HIGH);
digitalWrite(5,LOW);
digitalWrite(3,LOW);
time=millis();
}
if (thisChar=='4' || thisChar=='l' || thisChar=='o') {
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(5,HIGH);
digitalWrite(3,LOW);
time=millis();
}
if (thisChar=='6' || thisChar=='r' || thisChar=='e') {
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(3,HIGH);
time=millis();
}
}
if (millis()-time>120) { // Timeout de 120ms
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(3,LOW);
}
}
En l'état, l'ensemble fonctionne en local sur un réseau fermé,
mais rien n'empêche un fonctionnement via Internet et donc de pouvoir télécommander
le télescope à distance respectable. Tout va être une question de
programmation de la passerelle de la "Box".
Le nombre d'entrées/sorties permet de passer encore quelques commandes supplémentaires
et en changeant l'Arduino Uno pour un Arduino Mega il est possible d'étendre
considérablement les fonctionnalités. Après, tout est une question de
programmation, on peut même envisager de télécommander complètement la
raquette du télescope via sa prise RS232...