Mise à jour en avril 2011
Un robot qui roule, c’est chouette. Un robot qui grimpe, c’est encore mieux. Mais quand il s’agit de grimper et de conserver une plateforme horizontale au-dessus du robot, voilà un parfait sujet de projet.
C’est ce que Astro, élève de Terminale S option Sciences de l’Ingénieur (SI), a décidé de faire comme PPE (Projet Personnel Encadré). Nous lui apportons notre expérience en simplifiant sa mécanique : avec deux servomoteurs à 90° l’un de l’autre, on peut corriger l’assiette de la plateforme.
Principe du montage}
Pour être plus explicite, un petit schéma sous Sketch’up est plus parlant :
L’électronique est simple :
– un accéléromètre électronique (puces MEMS) mesure la rotation dans chaque direction X et Y
– une carte programmée lit régulièrement ces valeurs et filtre les valeurs
– deux servomoteurs sont pilotés par le programme pour corriger l’erreur entre la valeur lue et la valeur de départ
Vu de dessous, on voit l’accéléromètre, qui doit être le plus possible centré avec les axes de rotation des servomoteurs.
Composants et coût
La liste préalable
– 21 euros pour la carte programmable Arduino
– 4 euros pour le câble USB
– 20 euros pour la carte à accéléromètres (deux axes nécessaires)
– 20 euros pour les deux servomoteurs
– 6 euros de câbles simples
– 9 euros de fournitures de bricolage pour faire la plateforme
Soit un total de 80 euros !
Photos du montage
Pour la réalisation, l’équipe a choisi un CUBLOC et des servomoteurs de EasyRobotics.
Code source
Astro nous a donné des nouvelles du projet, et partage avec nous le code source en Basic du microcontrôleur CUBLOC 220 (qui est en fait un AVR ATmega128). Il utilise 5 pattes : 3 en entrée sur un convertisseur analogique/numérique, et 2 en sortie pour les servomoteurs.
- Déclaration du micro-contrôleur utilisé (pour le compilateur) :
Const Device = CB220
- Déclaration des constantes :
Const minY As Single=2000
Const maxY As Single=4000
Const minX As Single=3700 '-30degres
Const maxX As Single=5000 '+30degres
- Déclaration des variables :
Dim mes_x As Integer
Dim mes_y As Integer
Dim mes_z As Integer
Dim acc_x As Single
Dim acc_y As Single
Dim acc_z As Single
Dim dx As Integer
Dim dy As Integer
Dim dz As Integer
Dim angle_x As Single
Dim angle_y As Single
Dim angle_z As Single
Dim pas As Single
Dim angle1 As Single
Dim angle2 As Single
Dim commande As Single
- Configuration des pattes en PWM (0 et 1 sur P5 et P6) :
'Configure les port P5 et P6 en sortie
Low 5
Low 6
- Ouverture de la boucle infinie :
Do
- Lecture des 3 accéléromètres :
mes_x=Adin(0)
mes_y=Adin(1)
mes_z=Adin(2)
- Normalisation des mesures (enlever la moyenne lue à l’horizontale et mettre sur une échelle commune entre -PI et PI :
acc_x=(mes_x-337.0)/167.0
acc_y=(mes_y-345.0)/160.0
acc_z=(mes_z-337.0)/167.0
- Conversion en deux angles (voir le modèle 3D ci-dessus) :
angle1=Atan acc_x/(Sqr(acc_y*acc_y+acc_z*acc_z))
angle2=Atan acc_y/(Sqr(acc_x*acc_x+acc_z*acc_z))
- Conversion en degrés et affichage pour vérifier les valeurs lors des tests :
angle1=angle1/3.14257*180
angle2=angle2/3.14257*180
Debug "angle1 = ", Float angle1,Cr
Debug "angle2 = ", Float angle2,Cr
- Commande du servomoteur en X en fonction de l’angle (dès que la variation dépasse 2 degrés) :
If (angle1>2) Or (angle1<-2) Then
pas=-20.0
commande=angle1*pas+4350
dx=commande
Pwm 0, dx, 32768
Else
dx=4350
Pwm 0, dx, 32768
Endif
- Idem pour le servomoteur en Y :
If (angle2>2) Or (angle2<-2) Then
pas=20.0
commande=angle2*pas+3000
dy=commande
Pwm 1, dy, 32768
Else
dy=3000
Pwm 1, dy, 32768
Endif
- Fin de la boucle, avec un retour à la ligne (Cr = Carriage return) dans le debug et une pause de 200 ms :
Debug Cr
Delay 200
Loop
Et ça reprend à "Do" en haut.
Voilà, bravo Astro et bon courage pour la suite.