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 :

Projet liaison telescope - PC avec Arduino.

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).

Empilage Arduino uno + Ethnet shield + Joystick. Empilage Arduino uno + Ethnet shield + Joystick.

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.

Interface telnet PC télécomande Arduino télescope

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 ?

Schéma interface Arduino - Telescope - clic pour réalisation. Implantation CIE prévue.

Télécommande LX200 arduino + interface dans la boite.

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...

Up

   Retour Arduino    -     Retour Robotique

Retour platines.