Inverser le sens d'un moteur CC à l'aide d'un capteur

Salut !

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);
  }
}

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Bonsoir lucas31344

Il change de direction ou il recule?
S'il recule, le sens des moteurs de traction s'inversent donc tu peux aussi inverser le sens de la brosse.

Cordialement
jpbbricole

Bonsoir,

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

Cordialement

Bonsoir lucas31344

Le programme qui gère le sens de rotation semble juste (n'ai pas essayé).
Donc tu devrai gérer le sens de la brosse de façon identique.

Est-ce que le texte Ultrason 3: s'affiche, dans la console, avec des distances justes?

Cordialement
jpbbricole

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 :

  • le robot avance avec les brosses dans le sens 1
  • il recule avec les brosses dans le sens 2

Bonjour lucas31344

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é?

Cordialement
jpbbricole

Il y a 2 capteurs normalement un à l’avant et un à l’arrière !

Bonjour lucas31344

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.

Cordialement
jpbbricole

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 ?

En effet c'est une solution potentielle, je n'y avais pas pensé..

Par contre comment je pourrai faire pour basculer d'un capteur à l'autre ? En éteignant le premier capteur et en allumant le deuxième ?

Merci pour la réponse en tout cas !

C'est à dire ?

Pour ma part je ne dois uniquement coder le sens de rotation de la brosse, je ne m'occupe pas du déplacement d'où une seule variable.

Oui, il fait un léger virage pour descendre sur la partie inférieure mais il se déplace en majorité en ligne droite.

Non, en déclarant le deuxième capteur avec ses 2 pin, pinTriger et pinEcho

Ultrasonic ultrasonicGauche(pinTriger, pinEcho); // Trig et Echo

et en mesurant la distance avec

	int distSens2 = ultrasonicGauche.Ranging(CM);
et
	if (distSens2 < 8){

Cordialement
jpbbricole

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

Je vais essayer ça alors merci !

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

Merci en tout cas !

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

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.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.