Voici le code que j'ai fait :
#include <Servo.h> // on inclue le header pour incorporer les librairies qu'il faut pour controler les servomoteurs
Servo myservo;
Servo myservo2;
// on créé deux objets servomoteur
int pos = 90; // on met la variable de position initiale des deux servomoteurs à 90° et non 0° pour pouvoir tourner des deux côtés (l'amplitude utilisée sera bien inférieure à 90 ° dans tout les cas)
char signalPin = 3; // numéro de pin du premier capteur
char signalPin2 = 4; // numéro de pin du deuxième capteur
void setup()
{
pinMode(signalPin, INPUT); // on indique que le pin 3 est en mode input
pinMode(signalPin2, INPUT); // on indique que le pin 4 est en mode input
Serial.begin(9600); // ?
myservo.attach(1); // on indique que le premier servo est sur le pin 1
myservo2.attach(2); // on indique que le deuxième servo est sur le pin 2
myservo.write(pos); // on met le premier servo en position 90°
myservo2.write(pos); // on met le deuxième servo en position 90°
}
void loop()
{
if(HIGH == digitalRead(signalPin)) // on teste le capteur 1 (à droite dans le sens du déplacement de l'appareil) pour vérifier la présence de la ligne noire
{
pos -= 2; // on fait tourner les deux servomoteurs de 2° car sinon ça pourrait être trop lent de tourner, et le capteur risque de dépasser la ligne noire, et la machine perdrait ainsi sa trajectoire
myservo.write(pos);
myservo2.write(pos); // les roues pivotantes sont celles à l'arrière, donc on doit les faire pivoter dans le sens inverse où la machine veut tourner
delay(15); // pour laisser le temps au servomoteur d'atteindre sa position
}
else if (HIGH == digitalRead(signalPin2)) // on teste le capteur 2 seulement si le capteur 1 n'a pas indiqué "HIGH"
{
pos += 2;
myservo.write(pos);
myservo2.write(pos); // le même principe est appliqué
delay(15); // pour laisser le temps au servomoteur d'atteindre sa position
}
}
nb : - le code est sur-commenté exprès, on sait jamais si c'est tellement un mauvais code que même le principe n'est pas évident à comprendre ^^'
- le code est supposé ainsi si on considère que ajouter +1 à pos fait tourner le servomoteur dans le sens horaire, et -1 dans le sens trigonométrique, avec servomoteur 1 et capteur 1 à droite, et servomoteur 2 et capteur 2 à gauche (vue de derrière la machine).
Voilà donc le but de ce code est le suivant (je dis bien le but car je ne sais pas encore si il l'atteint) :
L'objectif est de faire suivre une courbe (par le moyen d'une ligne noire sur un fond blanc) à une machine qui, à la base, ne peut poser des dominos qu'en ligne droite.
On a donc "greffé" sur cette machine traction un système de liaison pivot sur l'axe arrière, un système à coté de la roue gauche, et de la roue droite (il y a donc deux servomoteurs). Faire tourner l'axe arrière dans son ensemble était impossible, ou très difficile à réaliser vu la machine, on a donc du faire tourner les deux roues arrières indépendamment entre elles, mais elles doivent quand même être parallèles en permanence.
Ces deux servomoteurs sont contrôlés par une carte arduino nano 2.x, cette carte de programmation agit en fonction de deux capteurs situés sur chacun des côtés de l'appareil.
Les capteurs utilisés sont ceux-ci :
http://www.seeedstudio.com/depot/electronic-brick-–-line-finder-p-680.html?cPath=144_149
Les servomoteurs utilisés sont ceux-ci :
http://www.conrad.fr/micro_servo_top_line_es_07_p_50802_52047_856617_491302_FAS
La courbe n'étant pas aléatoire (nous la ferons sans piège, et peu courbée, juste des rotations faibles, pourquoi pas une à droite puis une à gauche), le code devrait être plus facile à établir.
J'ai donc imaginé le code ci dessus.
Deux précisions sur ce code :
Je ne sais pas si " Serial.begin(9600); " est utile en pratique
Dans cet exemple http://www.seeedstudio.com/depot/datasheet/line%20finder%20demo_code.zip , le pin des capteurs (pin 3 et 4) est stocké dans une variable de type int. Personnellement, je crois qu'une variable char est suffisante, non ?
Donc en résumé :
l'axe arrière ressemble à ça (vue de face, à l'arrière de la machine) :
s s
O--I-[-------]-I--O
Les O sont les roues arrière
Les I sont les liaisons pivot
Les [] sont les bord de la machine ( donc [-------] représente l'épaisseur de la machine )
Les s sont les servomoteurs directement fixés sur l'axe vertical de rotation de l'embout du servomoteur
L'axe est immobile au milieu, il ne tourne même pas, par contre, après les liaisions pivots (donc à gauche et à droite des " I "), les axes tournent (on a donc fait deux roues libres, grâce à des petits roulements intégrés aux embouts qui relient les deux axes de la liaison pivot).
Que pensez vous de ce code par rapport au système ?
ps : en fait j'ai utilisé le capteur en mode digital ^^" , seul le noir et le blanc m'intéresse comme couleur, il n'y aura pas d'intermédiaire en plus (normalement).