Dans le cadre d'un projet robot, je dois utiliser un capteur et un moteur pour faire tourner une brosse mais mon problème est le suivant :
Pour faire simple, imaginez un rectangle et le robot posé dans l'angle supérieur gauche. Le robot entame sa course et se dirige vers l'angle supérieur droit (déplacement horizontal). Pendant ce déplacement, la brosse de mon robot tourne dans un sens. Ce que je dois faire, c'est inverser le sens de rotation de la brosse lorsque le robot arrive au bout du rectangle.
En gros,
il avance et la brosse tourne dans le sens 1
il arrive au bout du panneau
le capteur détecte une distance inférieure ou égale à 8cm (par exemple)
il change sa direction (part dans le sens inverse)
la brosse tourne désormais dans le sens 2 jusqu'à ce que le capteur détecte de nouveau une distance inférieure ou égale à 8., dans quel cas, la brosse tourne de nouveau dans le sens 1.
Comme vous l'auriez compris, mon problème c'est que je n'arrive pas à conserver le sens de rotation après la mesure, j'arrive à changer la direction de la brosse quand la distance est < 8 mais je n'arrive pas à la conserver jusqu'à la prochaine mesure < 8 .
J'utilise un capteur ultrason ainsi qu'un moteur CC et un driver L298N.
Merci pour votre réponse !
#include "Ultrasonic.h"
Ultrasonic ultrasonicdroite(6, 5); // Trig et Echo
const int motor1Pin1 = 10; // Pin pour controler le sens du moteur 1
const int motor1Pin2 = 9; // Pin pour controler la vitesse du moteur 1
int ena = 11;
void setup() {
Serial.begin(9600);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
}
void loop () {
int dist = ultrasonicdroite.Ranging(CM);
Serial.print("Ultrason 3:");
Serial.print(dist);
Serial.print(" cm ; ");
delay(100);
if (dist < 8){
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
analogWrite(ena, 255);
}
else {
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
analogWrite(ena, 255);
}
}
Il recule ! Mais le groupe qui s'occupe de la fonction déplacement rencontre lui aussi ce même problème.... ils n'arrivent pas à inverser le sens des moteurs eux non plus...
Oui le programme fonctionne mais pas comme je le souhaite..
Codé comme il l’est actuellement il réalise la tâche suivante :
le moteur tourne dans le sens 1
le capteur capte une distance inférieure à 8 alors le moteur tourne dans le sens 2
la distance est toujours > 8 alors le moteur tourne dans le sens encore dans le sens 1
Pour l’instant il tourne dans le sens 2 uniquement quand la distance est inférieure à 8, càd que quand j’éloigne le capteur, le moteur tourne dans le sens 1 ! or je souhaiterai que le sens 2 soit conservé jusqu’à ce que le capteur capte une nouvelle distance inférieure a 8. si je reprends l’exemple du déplacement :
Un truc que je n'ai pas compris, quand ton robot recule, est ce que son capteur tourne dans l'autre sens ou est-il fixe?
Quand il recule comment le robot sait qu'il approche du mur opposé?
Dans votre programme, vous ne "lisez" que le capteur droite, c'est normal, qu'après détection d'une distance minimum (if (dist < 8)) , le moteur change de direction, pour tout de suite détecter dist > 8 et aussitôt repartir en avant.
Au moment de if (dist < 8) et inversion du moteur et de la brosse, il faut passer sur l'autre capteur jusqu'à dist < 8 et ainsi de suite.
Pourquoi tu n'utilise pas deux variables, pour le sens de déplacement et celui du sens de rotation?
Le sens de la variable te permet ainsi en plus de faire tourner tes moteurs dans le bon sens, de savoir quel capteur tu doit regarder.
Là dans ton code des que dist est supérieur à 8, tu va inverser le sens de déplacement.
Ton robot ne doit se déplacer qu'en ligne droite ?
Dans ce cas une seul variable suffit.
En fait que doit tu faire quand tu recule.
La tu à codé, il me semble, recule jusqu'à ce que la distance soit supérieur à 8, puis re avance, ceci indéfiniment ?
J'ai l'impression qu'il manque un truc dans le cahier des charges
Par ailleurs j'en profite pour poser la question suivante, est ce qu'un capteur ultrason classique type HC-SR04 est un minimum étanche ? est ce qu'il résiste à des éclaboussures (sans le plonger dans l'eau évidemment).
Quand j'avance, la brosse doit tourner dans le sens 1 (dans le sens des aiguilles d'une montre par exemple) et quand je recule elle doit tourner dans l'autre sens (sens 2).
Il avance jusqu'à ce que la distance soit < 8, et recule jusqu'à la distance soit de nouveau < 8 et ce indéfiniment.
Oui ça j'avais compris et cela correspond à ton code
Ok, ça par contre ça ne correspond forcément pas à ton code , qui utilise qu'un seul capteur regardant toujours dans la même direction.
Une solution du coup est comme le propose @jpbbricole d'avoir deux capteurs, chacun te donnant une distance(distA, distR), tu utilise alors ces deux distances pour savoir dans quel direction du va.
Tu peux surement faire l'économie d'une variable, mais je trouve code ton code serait plus facile à lire avec une variable(direction) qui t'indique la direction et donc quel groupe Write tu actionne.
Les deux distances de ton capteur influençant la valeur de cette variable(direction)
Du coup ce virage léger ou pas, cela ne se voit pas dans ton code.