Gérer un moteur avec un joystick.

Bonjour à tous,

Voila, je m’intéresse à l’Arduino depuis peu, j’ai fait quelques programmes avec LED, poussoir, … et maintenant j’ai un projet de gestion (sens et vitesse de rotation) d’un moteur CC avec un joystick.

Après quelques recherches, j’ai trouvé un possibilité avec comme matériel :

  • Arduino Nano
  • 43A H-Bridge Drive PWM For Arduino Semiconductor BTS7960B
  • 1 module joystick

J’utilise le programme suivant :

/*
IBT-2 Motor Control Board driven by Arduino.
 
Speed and direction controlled by a potentiometer attached to analog input 0.
One side pin of the potentiometer (either one) to ground; the other side pin to +5V
 
Connection to the IBT-2 board:
IBT-2 pin 1 (RPWM) to Arduino pin 5(PWM)
IBT-2 pin 2 (LPWM) to Arduino pin 6(PWM)
IBT-2 pins 3 (R_EN), 4 (L_EN), 7 (VCC) to Arduino 5V pin
IBT-2 pin 8 (GND) to Arduino GND
IBT-2 pins 5 (R_IS) and 6 (L_IS) not connected
*/
 
int SENSOR_PIN = 0; // center pin of the potentiometer
 
int RPWM_Output = 5; // Arduino PWM output pin 5; connect to IBT-2 pin 1 (RPWM)
int LPWM_Output = 6; // Arduino PWM output pin 6; connect to IBT-2 pin 2 (LPWM)
 
void setup()
{
  pinMode(RPWM_Output, OUTPUT);
  pinMode(LPWM_Output, OUTPUT);
}
 
void loop()
{
  int sensorValue = analogRead(SENSOR_PIN);
 
  // sensor value is in the range 0 to 1023
  // the lower half of it we use for reverse rotation; the upper half for forward rotation
  if (sensorValue < 512)
  {
    // reverse rotation
    int reversePWM = -(sensorValue - 511) / 2;
    analogWrite(LPWM_Output, 0);
    analogWrite(RPWM_Output, reversePWM);
  }
  else
  {
    // forward rotation
    int forwardPWM = (sensorValue - 512) / 2;
    analogWrite(LPWM_Output, forwardPWM);
    analogWrite(RPWM_Output, 0);
  }
}

J’arrive ainsi à contrôler la vitesse et le sens du moteur avec le joystick.

Cependant, d’après ce que j’ai compris, du fait du PWM, le moteur émet en permanence un “bruit” dérangeant et cela même à l’arrêt.

Ma question est : Existe t’il une solution pour “empêcher” ce “bruit” lorsque le moteur est à l’arrêt ?

Je ne sais pas trop par où chercher, j’ai fais quelques tests par exemple avec des fonctions “IF” avec Sensorvalue (ex: ne rien faire quand les valeurs sont entre 511 et 513) mais rien n’y fait .
Je ne vois pas trop ce qui est possible et si même cela est possible, c’est pourquoi je me tourne vers vous pour me guider.

Par avance merci

On dirait qu'il manque une temporisation dans ta boucle ?
Tu lis une entrée analogique (qui peut fluctuer un peu) et tu envoie une commande au moteur selon la valeur lue.
Et tu fais ça "à fond la caisse".

bonjour,
définis un point neutre de ton joystick avec une petite fourchette.
pour le faire, utilise un serial print de la valeur lue.
ca peut fluctuer de 10 lorsqu'il est au neutre.
une fois cette valeur définie, tu mets un autre else et LPWM_Output RPWM_Output à zéro

Bonjour,

Il faut que tu mettes un hystérésis, c’est à dire qu’il ne faut envoyer des commandes que si la valeur lue a variée de plus d’un certain nombre de pas.

void loop()
{
  static int sensorValuePrec = 0;   // valeur lue au cycle précédent
  const int hysteresis = 2;

  int sensorValue = analogRead(SENSOR_PIN);

  // sensor value is in the range 0 to 1023
  // the lower half of it we use for reverse rotation; the upper half for forward rotation
  if (sensorValue <= sensorValuePrec - hysteresis || sensorValue >= sensorValuePrec + hysteresis)
  {
    sensorValuePrec=sensorValue;
    if (sensorValue < 512)
    {
      // reverse rotation
      int reversePWM = -(sensorValue - 511) / 2;
      analogWrite(LPWM_Output, 0);
      analogWrite(RPWM_Output, reversePWM);
    }
    else
    {
      // forward rotation
      int forwardPWM = (sensorValue - 512) / 2;
      analogWrite(LPWM_Output, forwardPWM);
      analogWrite(RPWM_Output, 0);
    }
  }
}

Bonsoir,

Merci à vous de vous intéressez à mon cas.

J'ai eu peu de temps et je n'ai pu tester que la dernière solution proposée (la plus rapide à essayer lol).
L’hystérésis semble être la bonne solution. J'ai incorporé le code proposé par Kamill dans le mien mais cela ne semble rien changé. J'ai essayé avec d'autres chiffres mais cela n'a rien changé. Le moteur émet toujours un son (qui a tendance a énerver mon chien).
Je vais chercher à me documenter pour comprendre correctement le principe et pourquoi ca n'a pas fonctionné

Sinon j'essaierai de faire un "point neutre" sur la position du joystick comme le propose infobarquee, ce que j'avais déjà essayé mais je n'ai pas gardé le code testé.

Sinon manque t'il réellement une temporisation dans mon programme ?

Comme j'ai dit dans mon premier post je débute avec l’Arduino et la programmation et j’essaie tout de même de comprendre le fonctionnement.

Merci pour votre aide.

Bonsoir,

Après plusieurs essais l’hystérésis donnait des résultats aléatoires quelques fois le “bruit” s’arrêtait et d’autres fois non, voir même des petits mouvements du moteur se produisait.

Finalement en repartant de zero avec le code original, en sortant une fourchette de valeur (de 507 à 517) le bruit s’arrête bien quand le joystick est au neutre (théoriquement 511/512) avec une certaine tolérance. J’avais bien essayé cette solutions avant d’exposer mon problème mais il devait y avoir un couac quelque part dans le code.
Finalement cela semble fonctionner.

int SENSOR_PIN = 0; // center pin of the potentiometer
 
int RPWM_Output = 5; // Arduino PWM output pin 5; connect to IBT-2 pin 1 (RPWM)
int LPWM_Output = 6; // Arduino PWM output pin 6; connect to IBT-2 pin 2 (LPWM)
 
void setup()
{
  pinMode(RPWM_Output, OUTPUT);
  pinMode(LPWM_Output, OUTPUT);
}

 
void loop()
{
  int sensorValue = analogRead(SENSOR_PIN);
 
  // sensor value is in the range 0 to 1023
  // the lower half of it we use for reverse rotation; the upper half for forward rotation
  if (sensorValue < 507)
  {
    // reverse rotation
    int reversePWM = -(sensorValue - 506) / 2;
    analogWrite(LPWM_Output, 0);
    analogWrite(RPWM_Output, reversePWM);
  }
  else
        if (sensorValue > 517)
  {
    // forward rotation
    int forwardPWM = (sensorValue - 517) / 2;
    analogWrite(LPWM_Output, forwardPWM);
    analogWrite(RPWM_Output, 0);
  }
}

Merci de m’avoir apporté votre aide.