Programme de contrôle d'un moteur par télécommande et suiveur de ligne

Bonjour,
Je suis actuellement en train de coder un programme pour contrôler mon moteur à partir d'un suiveur de ligne et d'une télécommande pour mon TIPE. Le principe est assez simple: lorsque le suiveur de ligne détecte une ligne blanche, le moteur démarre dans une direction. La télécommande quant à elle permet de changer la vitesse du moteur. Or, mon code ne marche pas et cela me paraît assez étonnant puisqu'il me semble correct et logique. J'ai également vérifié les branchements et ils sont bons. Est-ce que vous pourriez m'aider s'il-vous-plaît? Je vous joint mon code:

/*----------------------------------DECLARATION DES MODULES-------------------------------------------------------------------------------*/

#include "IRremote.h"
#include "SR04.h"

/*-----------------------------------DECLARATION DES SORTIES-------------------------------------------------------------------------------*/

#define ENABLE 5  //
#define DIRA 3    //M+
#define DIRB 4    //M-
#define TRIG_PIN 12
#define ECHO_PIN 13

/*--------------------------------------DECLARATION DES ENTREES-------------------------------------------------------------------------------*/

int CapteurIR = 11;
int LED = 13;
int SuiveurDeLigne = 10;
SR04 sr04 = SR04(ECHO_PIN, TRIG_PIN);

/*---------------------------------------DECLARATION DES VARIABLES-------------------------------------------------------------------------------*/

IRrecv irrecv(CapteurIR);  // create instance of 'irrecv'
decode_results results;    // create instance of 'decode_results'

int val;
int vitesse;
int time;
int v;
/*---------------------------------------DEFINITION DES FONCTIONS-------------------------------------------------------------------------------*/

void Sens_A() {
  digitalWrite(ENABLE, v);
  digitalWrite(DIRB, LOW);
  digitalWrite(DIRA, HIGH);
  delay(2000);
}

void Sens_B() {
  digitalWrite(ENABLE, v);
  digitalWrite(DIRA, LOW);
  digitalWrite(DIRB, HIGH);
  delay(2000);
}

void Stop() {
  digitalWrite(DIRA, LOW);
  digitalWrite(DIRB,LOW);
}

int Detection_Ligne() {
  val = digitalRead(SuiveurDeLigne);
  if (val == HIGH) {
    return 1;
  } else
    return 0;
}

int Reception_IR() {
int value = 0; // Valeur par défaut
  if (irrecv.decode(&results)) { // Si des données infrarouges sont reçues
    switch (results.value) {
      case 0xFFA25D: value = 0; break; // Touche POWER
      case 0xFFE21D: value = 1; break; // Touche MODE
      case 0xFF629D: value = 2; break; // Touche MUTE
      case 0xFF22DD: value = 3; break; // Touche PLAY/PAUSE
      case 0xFF02FD: value = 4; break; // Touche REWIND
      case 0xFFC23D: value = 5; break; // Touche FORWARD
      case 0xFFE01F: value = 6; break; // Touche EQ
      case 0xFFA857: value = 7; break; // Touche VOL-
      case 0xFF906F: value = 8; break; // Touche VOL+
      case 0xFF9867: value = 9; break; // Touche 0
      case 0xFFB04F: value = 10; break; // Touche RPT
      case 0xFF6897: value = 11; break; // Touche 1
      case 0xFF30CF: value = 12; break; // Touche 2
      case 0xFF18E7: value = 13; break; // Touche 3
      case 0xFF7A85: value = 14; break; // Touche 4
      case 0xFF10EF: value = 15; break; // Touche 5
      case 0xFF38C7: value = 16; break; // Touche 6
      case 0xFF5AA5: value = 17; break; // Touche 7
      case 0xFF42BD: value = 18; break; // Touche 8
      case 0xFF4AB5: value = 19; break; // Touche 9
      case 0xFFFFFFFF: Serial.println(" REPEAT"); break; // Touche maintenue
      default: Serial.println(" other button"); break; // Autre touche
    }
    irrecv.resume(); // Reprise de la réception infrarouge
  }
  return value; // Retourne la valeur correspondant à la touche appuyée
  }


void Reception_US() {
  digitalWrite(TRIG_PIN, LOW);
  delay(5);
  digitalWrite(TRIG_PIN, HIGH);
  delay(10);
  digitalWrite(TRIG_PIN, LOW);
  time = pulseIn(ECHO_PIN, HIGH);
}

int Controle_Vitesse() {
  int i=Reception_IR();
  switch (i) {
    case 9: vitesse = 0; break;
    case 11: vitesse = 25; break;
    case 12: vitesse = 50; break;
    case 13: vitesse = 70; break;
    case 14: vitesse = 100; break;
    case 15: vitesse = 130; break;
    case 16: vitesse = 160; break;
    case 17: vitesse = 190; break;
    case 18: vitesse = 210; break;
    case 19: vitesse = 255; break;
    default: vitesse=255;
  }
  return vitesse;
}

/*------------------------------------------INITIALISATION-----------------------------------------------------------------------*/

void setup() {
  //---set pin direction
  pinMode(ENABLE, OUTPUT);
  pinMode(DIRA, OUTPUT);
  pinMode(DIRB, OUTPUT);
  pinMode(LED, OUTPUT);
  pinMode(SuiveurDeLigne, INPUT);
  Serial.begin(9600);
}

/*------------------------------------PROGRAMME PRINCIPAL-------------------------------------------------------------*/

void loop() {
  v = Controle_Vitesse();
  if (Detection_Ligne () == 1 ){
      Sens_A();
    }
  //Si on capte un changement de rotation, on arrête le moteur
  //delay(10000);
  //Stop();
}

(J'ai également à programmer un capteur ultrasonique comme capteur de rotation mais je le ferai plus tard)
Merci beaucoup de votre aide

Bonjour
Tracez le passage dans les differentes parties en insérant des serial.print.
Cela permettrait de voir ce qui se passe réellement.
C est toujours une bonne chose quitte a les enlever quand ca fonctionne.

Bonjour, que voulez-vous dire par tracer le passage dans différentes parties? Dois-je marquer serial.print(9600) dans toutes mes fonctions mettant en jeu le moteur?

Par exemple

Serial.println(”passage a”); dans sens a
Si ca s affiche et que ca tourne pas c est qu il y a une erreur dans la fonction ,dans les affectations ou le câblage.

D'accord, je vois. Je vais essayer de faire ça. Merci beaucoup de votre réponse! :smile:

Si ca s affiche pas pareil dans le if de la loop

Ok, je viens de tester et en effet, cela m'a fait apparaître ce qui n'allait pas dans mon code. Cela se passe au niveau de ma deuxième condition (Si il y a détection de ligne). Le problème c'est que la détection en elle même marche d'après les résultats donc je ne vois pas comment cela se fait que la fonction Sens_A ne démarre pas.

J'ai essayé de faire le programme avec digitalWrite(DIRA, HIGH) et ça marche. Maintenant, il faut que je réussisse à faire en sorte que DIRA prenne la valeur donnée par la commande

Revoir le cours arduino sur les fonctions peut etre :upside_down_face:

Où peut-on le trouver sur le site?

Suffit de faire une recherche google sur un cours arduino de base pour trouver des tonnes d exemples

Mais c est bien il y a du progrès

Par contre je doute que l emplacement du post dans produits finis soitble bon.

Mon programme marche à peu près. Il y a juste parfois le moteur qui fait une sorte d'ultrason bizarre :sweat_smile:.

En effet, j'aurais dû être plus attentive lorsque j'ai écrit le post. Je pensais qu'on parlait ici de "réalisations"( pas forcément finies) et de projets finis :sweat_smile:

. Il y a juste parfois le moteur qui fait une sorte d'ultrason bizarre :sweat_smile

C est quoi comme moteur ?.

Verifier s il le fait quand il est alimenté directement si oui suivant type
Roulements
Balais
Palier
Alimentation

Sinon verifier sur le montage la qualité de l alimentation si c est un pwm (CE QUI SEMBLE ETRE LE CAS) on peut entendre parfois la frequence du pwm avec une sorte de sifflement ( enfin plus a mon age) il est possible d augmenter la frequence
Parfois des mauvais contacts ou des vibrations peuvent créer le probleme
Enfin le pont en H est aussi a verifier
Appliquer une demarche de controle logique et rigoureuse pour isoler le probleme

En regardant le programme de facon plus approfondie je penche pour un bruit créé par le pwm et la sous alimentation a vitesse faible ou en phase de démarrage.

Lire un tuto sur le pwm et le reglage de cette frequence suivant le type de carte arduino.

On peut aussi decider de ne pas partir de zero et de donner au demarrage une valeur permettant au moteur d avoir un peu de peche pour vaincre l inertie et les pertes mécaniques.
Suivant le niveau d etude ca peut justifier une expliquations physique et ou mathématique.

Verifier aussi que le moteur ne surchauffe pas a la fréquence util sée

:.

Bonjour
Fil de discussion déplacé dans la partie principale du forum francophone pour ne pas squatter le sous-forum dédié, je cite' , "à la présentation de projets/réalisations complets et fonctionnels."

Bonjour melimelo43

Dans void Sens_A() , tu fais digitalWrite(ENABLE, v); or v est une int qui est issue de: v = Controle_Vitesse(); qui peut prendre de 0 à 255.
Ce serai, plutôt analogWrite qui faudrait employer, ainsi, via le signal ENABLE de ton pont en H, tu ferai varier la vitesse de ton moteur.

Comment as tu câblé ton pont en H, fais, éventuellement, une photo en gros plan avec l'Arduino.

Cordialement
jpbbricole

D’où la lecture nécessaire d'un tuto sur le PWM .... :slightly_smiling_face:
et le
si c est un pwm (CE QUI SEMBLE ETRE LE CAS)

S'informer c'est une des premières compétences a développer dans un TIPE

Quand on le fais bien on développe l'autonomie.

C'est un moteur à courant continu 9V.
En effet, en vérifiant sur internet c'est bien le signal PWM :sweat_smile:

Bonjour jpbbricole, merci beaucoup de votre réponse. Je viens de changer mes fonctions mais ça ne semble pas changer grand chose. Je vous envoie une photo de mes branchements. Je ne sais pas si tout est bien visible sur la photo: il y a tellement de fils partout qu'il est difficile de s'y retrouver.