Je travaille sur un robot, il fait partie de l'atelier de robotique d'été de notre collège. Nous utilisons des microcontrôleurs C-STAMP d'A-WIT. Je pouvais le faire bouger, tourner à gauche, tourner à droite, reculer. J'ai même réussi à le faire passer le long de la bande noire en utilisant un capteur de contraste.Comment faire bouger mon robot dans un chemin rectangulaire le long du ruban noir?
J'envoie le robot à 30-45 degrés vers le ruban noir sur la table et il s'aligne et commence à se déplacer le long du ruban noir. Il saute un peu, probablement en raison de ma logique de programmation ci-dessous, il exécute une boucle while et vérifie constamment les if, donc il finit par essayer de tourner à gauche et à droite toutes les quelques millisecondes, ce qui explique la secousse. Mais ça va, ça marche, pas aussi lisse que je veux que ça marche mais ça marche! Le problème est que je ne peux pas faire mon robot aller dans un chemin rectangulaire de la bande noire. Dès qu'il atteint le coin de la bande noire, il continue tout droit au lieu de faire un virage à gauche ou à droite.
Mes 2 capteurs sont situés juste en dessous du robot, près de la roue avant, presque au niveau du sol. Il a une valeur "index" allant de 0 à 8. Huit étant le contraste le plus brillant et zéro étant le contraste le plus sombre. Ainsi, lorsque le robot se déplace dans la zone de bande noire, la valeur de l'indice diminue, et sur cette base, j'ai une instruction if disant à mon robot de tourner à gauche ou à droite.
Voici ma tentative. Pour éviter toute confusion, je n'ai pas affiché le code source entier, mais seulement la partie logique responsable du mouvement de mon robot le long de la bande noire.
while(1) {
// don't worry about these.
// 10 and 9 represent Sensor's PIN location on the motherboard
V = ANALOGIN(10, 1, 0, 0, 0);
V2 = ANALOGIN(9, 1, 0, 0, 0);
// i got this "formula" from the example in my Manual.
// V stands for voltage of the sensor.
// it gives me the index value of the sensor. 0 = darkest, 8 = lightest.
index = ((-(V - 5)/5) * 8 + 0.5);
index2 = ((-(V2 - 5)/5) * 8 + 0.5);
// i've tweaked the position of the sensors so index > 7 is just right number.
// the robot will move anywhere on the table just fine with index > 7.
// as soon as it drops to or below 7 (i.e. finds black tape), the robot will
// either turn left or right and then go forward.
// lp & rp represent left-wheel pin and right-wheel pin, 1 means run forever.
// if i change it from 1 to 100, it will go forward for 100ms.
if (index > 7 && index2 > 7)
goForward(lp, rp, 1);
if (index <= 7) {
turnLeft(lp, rp, 1);
goForward(lp, rp, 1);
// this is the tricky part. i've added this code last minute
// trying to make my robot turn, but i didn't work.
if (index > 4) {
turnLeft(lp, rp, 1);
goForward(lp, rp, 1);
}
}
else if (index2 <= 7) {
turnRight(lp, rp, 1);
goForward(lp, rp, 1);
// this is also the last minute addition. it's same code as above
// but it's for the 2nd sensor.
if (index2 > 4) {
turnRight(lp, rp, 1);
goForward(lp, rp, 1);
}
}
}
J'ai passé la journée entière à essayer de comprendre. J'ai à peu près épuisé toutes les avenues. Demander la solution sur stackoverflow est ma toute dernière option maintenant.
Merci d'avance! Si vous avez des questions sur le code, faites le moi savoir, mais les commentaires doivent être explicites.
Ceci est ma fonction goForward au cas où quelqu'un se demande:
void goForward(BYTE lp, BYTE rp, WORD t)
{
WORD i;
for(i = 0; i < t; i = i + 1){
PULSOUT(lp, 400, 1, 1);
PULSOUT(rp, 800, 1, 1);
PAUSE(17);
}
}
MISE À JOUR: Voici ce que je suis venu avec jusqu'à présent. J'ai effacé tous mes si-déclarations que j'ai posté plus tôt et décidé d'écrire la logique à partir de zéro:
// if there's enough bright light in both sensors at the same time
// robot will move forward forever.
if (index > 7 && index2 > 7)
goForward(lp, rp, 1);
// but if there's not enough bright light anymore (i.e. reached black tape)
// proceed to the else-statement.
else {
// if left sensor detects the black tape then turn right
// if doesn't detect the black tape then keep going forward
if (index2 <= 7)
turnRight(lp, rp, 1);
else
goForward(lp, rp, 1);
// if right sensor detects the black tape then turn left
// if it doesn't detect the black tape then keep going forward
if (index <= 7)
turnLeft(lp, rp, 1);
else
goForward(lp, rp, 1);
}
// The reason for turnLeft and turnRight is to keep robot re-alligning
// to the black tape. It will happen so fast (every 1ms) that the jerking
// shouldn't even be noticeable.
Avez-vous essayé chiphacker.com? –