ACTIVITE ARDUINO : Contrôler un générateur de vagues NOVA PHYSICS avec ARDUINO

Objectif : « débrider » un générateur de vagues pour l’utiliser à vitesse élevée. Le système fourni par Nova est à la base prévu pour des mouvements lents car c’est un choix pertinent pour créer des vagues dans une longue cuve. Certains étudiants de TIPE aimeraient cependant utiliser ce dispositif pour des mouvements rapides, par exemple afin de simuler des tremblements de terre avec un plateau roulant.

ll peut être possible de contrôler le moteur pas à pas de ce système grâce à une carte Arduino et un motorshield pour accéder à des vitesses plus élevées, comme expliqué dans cet article.

Cet article est destiné aux étudiants du lycée Pothier car nous utilisons un système « trafiqué » présent au labo, n’hésitez pas à me contacter dans le formulaire de contact si vous voulez plus de précisions.

Pour en savoir plus sur le moteur pas à pas, vous pouvez consulter cet article dans le blog

Ce système utilise le générateur de vagues NOVA PHYSICS, système qui est très utile pour des déplacements en translation (applications : création de vagues dans une longue cuve, simulation de tremblement de terre avec un plateau roulant … ). Le moteur pas à pas de ce dispositif est initialement contrôlé par une carte électronique qui permet de faire du « microstepping », ce qui est très efficace pour des mouvements lents. (voir partie 3 de l’article sur les moteurs pas à pas)

La vitesse de ce moteur est par conséquent limitée (fréquence de rotation maximale : 4 tours/s). Le but de cet article est de permettre des mouvements plus rapides jusqu’à une fréquence de rotation de 6 tours/s.

Pour cela, le système a été un peu « détourné » (désolé NOVA !), pour pouvoir accéder au moteur pas à pas, afin de le contrôler directement avec une carte Arduino, équipée d’un Motorshield Arduino.

Conception du système


Matériel

Générateur de vagues NOVA PHYSICS, modifié pour pouvoir brancher le moteur pas à pas directement sur une carte Arduino :

Carte Arduino (ou modèle générique)

Mode d’emploi

Branchement du moteur pas à pas du générateur de vagues à la carte Arduino

  • Débrancher le câble qui relie le boîtier de commande au moteur pas à pas sur le « générateur de vagues modifié haute vitesse » (identifié au labo avec une étiquette sur le boîtier) :

  • Brancher le câble du moteur sur le Motorshield Arduino de la façon suivante :
  • Brancher les deux fils d’alimentation du Motorshield Arduino sur une alimentation stabilisée type EA-PS 2016-100 (bien respecter les polarités !)
  • Relier la carte Arduino à un PC

Configuration de l’environnement Arduino

  • Ouvrir l’IDE Arduino.
  • Vérifier que la carte sélectionnée est bien Arduino Uno via le menu [Outils] > [Type de carte].
  • Sélectionner le port série correspondant via le menu [Outils] > [Port].

Code Arduino

Le code est déjà téléversé sur la carte mais peut être modifié de telle manière à agir sur la vitesse. Pour cela, faire varier la valeur de freq entre 3 et 6 Hz

//Parameters

const int directionA  = 12;
const int directionB  = 13;
const int rateA  = 3;
const int rateB  = 11;
float freq = 3; //entre 3 et 6 Hz, adapter la tension d'alimentation selon la vitesse
int microsBtwnSteps ;
int vitesse=255 ;

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  microsBtwnSteps = int(5000/freq);
  //Init Motor Shield
  pinMode(directionA, OUTPUT); //Initiates Motor Channel A pin
  pinMode(directionB, OUTPUT); //Initiates Motor Channel B pin
}

void loop() {
  
  testStepperMS();
}

void testStepperMS() { /* function testStepperMS */
  //// Test stepper
  Serial.println("Move stepper 10 step clockwise"); //on reprend le programme d'un moteur pas à pas contrôlé par le motorshield, mais on le le fait tourner sans fin dans le même sens
  stpCW(50);
//  delay(1000);
//  Serial.println("Move stepper 2 step counter clockwise");
//  stpCCW(100);
//  delay(1000);
}


void stpCW(int nbstep) { /* function stpCW */
  //// Move stepper clockwise
  for (int i = 0; i < nbstep; i++) {
    
    digitalWrite(directionA, HIGH);   //Set direction of CH A
    analogWrite(rateA, 255);   
    analogWrite(rateB
    , 0);   
    delayMicroseconds(microsBtwnSteps);

    
    digitalWrite(directionB, LOW);   //Set direction of CH B
    analogWrite(rateB, 255);   
    analogWrite(rateA, 0);   
    delayMicroseconds(microsBtwnSteps);

    
    digitalWrite(directionA, LOW);   //Set direction of CH A
    analogWrite(rateA, 255);   
    analogWrite(rateB, 0);   
    delayMicroseconds(microsBtwnSteps);

   
    digitalWrite(directionB, HIGH);   //Set direction of CH B
    analogWrite(rateB, 255);   
    analogWrite(rateA, 0);   
    delayMicroseconds(microsBtwnSteps);
  }
}

void stpCCW(int nbstep) { /* function stpCCW */
  //// Move stepper counter-clockwise
  for (int i = 0; i < nbstep; i++) {
    
    digitalWrite(directionA, HIGH);   //Set direction of CH A
    analogWrite(rateA, 255);   
    analogWrite(rateB, 0);   
    delayMicroseconds(microsBtwnSteps);

   
    digitalWrite(directionB, HIGH);   //Set direction of CH B
    analogWrite(rateB, 255);   
    analogWrite(rateA, 0);   
    delayMicroseconds(microsBtwnSteps);

    
    digitalWrite(directionA, LOW);   //Set direction of CH A
    analogWrite(rateA, 255);   
    analogWrite(rateB, 0);   
    delayMicroseconds(microsBtwnSteps);

    
    digitalWrite(directionB, LOW);   //Set direction of CH B
    analogWrite(rateB, 255);   
    analogWrite(rateA, 0);   
    delayMicroseconds(microsBtwnSteps);
  }
}

Remarque

Il est nécessaire d’adapter la valeur de la tension de l’alimentation stabilisée à la valeur de la fréquence de rotation.

A faible vitesse, le moteur grince avec une valeur de tension trop élevée. En revanche, à forte vitesse, il est nécessaire d’augmenter cette tension !

Voici quelques valeurs de tension pour différentes vitesses de rotation :

  • 3 Hz -> 5 V
  • 4 Hz -> 7 V
  • 5Hz -> 9 V
  • 6 Hz-> 11 V

Important

Les valeurs de vitesse sont approximatives, l’idéal serait de mesurer la vitesse de rotation à l’aide d’un tachymètre (ou un autre capteur)

Script Arduino disponible sur ce lien Github