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