Club robotique de Sophia-Antipolis

Accueil > Projets, études > Nos robots > Robots du club > Robots spéciaux > Soucoupe Terro Navale (2011) > Soucoupe contrôlée à distance

Soucoupe contrôlée à distance

mercredi 26 septembre 2012, par Julien H.

Notre plate-forme flottante est opérationnelle depuis plusieurs mois, et les tests de flottaison sont concluants.

Les circuits ne sont pas encore fixés dans la sculpture unique qui couvrira l’ensemble, d’où l’allure globale du montage :

Le montage de contrôle de la soucoupe
Tout est destiné à tenir dans le support de protection, d’où le paquet de fils !

Avant de procéder à l’asservissement automatique, voici un programme permettant de la contrôler à distance, de recevoir les valeurs internes de différentes variables et surtout... de ramener la soucoupe à bon port quand elle se retrouvera en plein milieu d’une piscine :)

Le matériel utilisé est le suivant :

 carte Arduino Diecimilla avec un AVR ATmega168
 carte d’extension IO v5 (shield)
 carte à relais de fabrication maison (1 entrée pour signal type servomoteur)
 carte à transistor de fabrication maison (2 entrées tout ou rien)
 la soucoupe avec un potentiomètre (orientation du propulseur) et 8 détecteurs à infra-rouge

Le code ci-dessous permet de piloter les deux moteurs et de recevoir les valeurs des 8 capteurs.

 avance
 recule
 gauche
 droite
 milieu
 stop
 frein

Pour être plus commode, on utilise des lettres du clavier proches les unes des autres. Même si on est ainsi plus rapide, il faut absolument éviter d’abîmer le matériel, par inadvertance ou par perte de la connexion sans-fil. Il y a notamment un couplage fragile entre l’axe de rotation du propulseur azymutal et le potentiomètre qui indique sa position. Si le propulseur peut tourner complètement, ce n’est pas le cas du composant électronique qui a une limite mécanique (à 180°).

Même contrôlé par un humain, il est plus simple d’ajouter de petits asservissements, comme le retour automatique à la position médiane.


/**
* Soucoupe Terro-Navale
*
* Projet 2011-2012 - Association Pobot
*
* Julien, Jean-Pierre, Pierre, Eric
*
*/
#include <Servo.h>

// position de l’hélice
#define MILIEU 52
#define DROITE 10
#define GAUCHE 90

// connexion des capteurs
#define C1 6
#define C2 3
#define C3 9
#define C4 8
#define C5 2
#define C6 5
#define C7 4
#define C8 7

// moteur de l’hélice (carte maison)
Servo helice ;

// moteur de rotation (carte maison)
int tourne1 = 16 ; // patte analog 2
int tourne2 = 17 ; // patte analog 3

// variables
int consigne = 0 ; // consigne de vitesse de l’hélice

void setup()

Serial.begin(9600) ;

helice.attach(10) ;
helice.write(90) ; // arrêt de l’hélice

pinMode(16,OUTPUT) ;
pinMode(17,OUTPUT) ;

arret() ; // arrêt de la rotation
frein() ;

Serial.println("Plate-forme prête") ;

void loop()

if (Serial.available())

switch(Serial.read())

case ’t’ :
consigne += 5 ;
vitesse(consigne) ;
break ;
case ’e’ :
consigne -=5 ;
vitesse(consigne) ;
break ;
case ’s’ :
arret() ;
frein() ;
break ;
case ’g’ :
gauche() ;
break ;
case ’d’ :
droite() ;
break ;
case ’r’ :
avance() ;
break ;
case ’f’ :
recule() ;
break ;
case ’m’ :
// arrêter l’hélice puis rejoindre le milieu et attendre
frein() ;
milieu(true) ;
arret() ;
break ;

// sécurité
if (position() < DROITE || position() > GAUCHE)

arret() ;

trace() ;
delay(200) ;

void vitesse(int speed)

helice.write(90-speed) ;

void arret()

digitalWrite(tourne1,LOW) ;
digitalWrite(tourne2,LOW) ;

void gauche()

digitalWrite(tourne2,LOW) ;
digitalWrite(tourne1,HIGH) ;

while (position() >= GAUCHE)
// sortir de la position de sécurité

void droite()

digitalWrite(tourne1,LOW) ;
digitalWrite(tourne2,HIGH) ;

while (position()<= DROITE)
// sortir de la position de sécurité

void milieu(boolean attendre)

if (position() < MILIEU)
droite() ;
else
gauche() ;

if (attendre)
while (position() != MILIEU)
// attendre d’avoir atteint la position milieu
// peut être long donc actif uniquement selon le choix "attendre"
trace() ;

void avance()

helice.write(0) ;

void recule()

helice.write(180) ;

void frein()

helice.write(90) ;
consigne = 0 ;

int position()

return analogRead(0)/10 ; // les valeurs entre 0 et 1024 sont réduites à 0...102

// affichage de la position et des 8 capteurs (3 gauche + 1 avant + 3 droite + 1 arrière séparé par ||)
void trace()

Serial.print("[") ;
Serial.print(position()) ;
Serial.print("|") ;
Serial.print(digitalRead(C6)) ;
Serial.print("|") ;
Serial.print(digitalRead(C7)) ;
Serial.print("|") ;
Serial.print(digitalRead(C8)) ;
Serial.print("|") ;
Serial.print(digitalRead(C1)) ;
Serial.print("|") ;
Serial.print(digitalRead(C2)) ;
Serial.print("|") ;
Serial.print(digitalRead(C3)) ;
Serial.print("|") ;
Serial.print(digitalRead(C4)) ;
Serial.print("||") ;
Serial.print(digitalRead(C5)) ;
Serial.print("]") ;
Serial.println() ;

Ce code est compilé pour la carte et envoyé par câble USB. Il peut être testé directement grâce à la console série intégrée dans le logiciel de développement Arduino.

Terminal de test
Affichage de la trace et envoi des commandes

Il est ensuite très simple de remplacer le cordon par un XBee (la carte shield "extension IO" étant pourvue d’un emplacement pour cette puce sans-fil) et d’utiliser un second XBee dans un adaptateur USB pour retrouver la même simplicité d’utilisation avec un terminal série.

Attention, la liaison sans-fil ne permet pas (pour l’instant) de programmer à distance la carte Arduino.

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.