Commande 2 moteurs CC avec arduino UNO et manette PS4

Bonsoir, j'ai dans l'idée la construction d'un char (pour mon petit-fils...). La chose prend tournure, mais :

Le matériels :
1 : arduino UNO, sur lequel est broché :
2 : un shield USB, sur lequel est enfiché un dongle USB. Sur ce shield, est enfiché
3 : Un shield Cytron 2 moteurs

L'arduino est alimenté par une pile carrée de 9V. Le shield Cytron est alimenté par une batterie LiPo 2S (7,4 V).

La connexion de la manette PS4 ne pose pas de problème. Les ordres moteurs sont pris sur les joysticks gauche et droit, en ne considérant que les mouvements verticaux. Mon code fonctionne tout a fait correctement, tant que le shield Cytron n'est pas alimenté. Le retour des joysticks au neutre est parfaitement bien détecté et les ordres correspondant envoyés (moteurs à l'arrêt).

Lorsque le shield Cytron est alimenté (arduino non connecté au PC), il y a toujours un moment où les moteurs ne recoivent plus aucun ordre, les moteurs restant sur le dernier ordre reçu.

Auriez vous une idée du pourquoi ?

Les alimentations arduino et cytron étant différentes, doivent elles néanmoins avoir une masse commune ?

Merci pour votre aide.

Cordialement à tous

Alain

Oui, masse commune.

Merci pour cette indication. Je suis maintenant en masses communes dans mon montage, mais j'ai toujours le problème de blocage en marche des moteurs. Notez que cela ne se produit que lorsque le montage n'est pas raccordé au PC.

Avez-vous un avis concernant mon code ?

/*  
 Conduite d'un machin à deux moteurs avec une manette PS4
 Suppose la mise en place sur l'arduino uno :
 1: en bas l'arduino uno lui-même
 2: le shield usb recevant le dongle bluetooth
 3: le shield Cytron pour deux moteurs électriques CC
    pin 4 : sens de rotation moteur droit (sensMoteurDroit)
    pin 5 : vitesse moteur droit (vitesseMoteurDroit)
    pin 6 : vitesse moteur gauche (vitesseMoteurGauche)
    pin 7 : sens de rotation moteur gauche (sensMoteurGauche)

  4: Concernant la manette PS4, les joysticks ne seront lus que sur les axes verticaux
     Les valeurs lues varient de 0, joysticks poussé vers le haut, à 255, joysticks
     complètement tiré vers le bas
*/

//Inclusions des bibliothèques PS4 bluetooth et USB
#include <PS4BT.h>
#include <usbhub.h>

// Satisfy the IDE, which needs to see the include statment in the ino too.
// Repris de PS4BT.ino
#ifdef dobogusinclude
  #include <spi4teensy3.h>
#endif

#include <SPI.h>

#include <Shield2AMotor.h>

//Création d'une instance de la liaison USB du shield
USB Usb;

//Création d'une instance du dongle bluetooth
BTD Btd(&Usb); 

/* You can create the instance of the PS4BT class in two ways */
// This will start an inquiry and then pair with the PS4 controller - you only have to do this once
// You will need to hold down the PS and Share button at the same time, the PS4 controller will then start to blink rapidly indicating that it is in pairing mode
//PS4BT PS4(&Btd, PAIR);

// After that you can simply create the instance like so and then press the PS button on the device
PS4BT PS4(&Btd);

//Variables de lecture des joysticks
//Valeurs brutes des joysticks lues avec la fonction "getAnalogHat"
int jsGy,jsDy; 

//Déclaration du shield de commande des deux moteurs, en mode "Signed Magnitude"
//La déclaration assure également l'assignation des pins vers l'Arduino
Shield2AMotor motor(SIGNED_MAGNITUDE);

//Variable des vitesses calculées des moteurs
//Peut varier de -100 à +100
signed int vitesseD=0; 
signed int vitesseG=0;
/* Fin des initialisation */

void setup() {  
  //Moteurs à l'arrêt à l'initialisation
  vitesseG=0;
  vitesseD=0;
  motor.control(vitesseG, vitesseD);

  // Initialisation de la liaison série pour suivre le programme
  Serial.begin(115200);

  // Wait for serial port to connect - used on Leonardo, Teensy and other boards 
  // with built-in USB CDC serial connection
#if !defined(__MIPSEL__)
  while (!Serial); 
#endif

  if (Usb.Init() == -1) {
    Serial.print(F("\r\nUSB n'a pas démarré"));
    while (1); // Halt
  }
  Serial.print(F("\r\nLibrairie PS4 démarrée"));
}

void loop() {
  Usb.Task();
  
  if (PS4.connected()) //La manette PS4 est bien connectée
  {
    //Lecture de la position des deux joysticks (uniquement en vertical)
    jsGy=PS4.getAnalogHat(LeftHatY);
    jsDy=PS4.getAnalogHat(RightHatY);
    
    Serial.print(F("\r\njoyGauche: "));
    Serial.print(jsGy);
    Serial.print(F("\tjoyDroit: "));
    Serial.print(jsDy);
    
    //Joy Gauche au neutre
    if ((jsGy > 117) && (jsGy < 137))
    {
      //Serial.print(F("\r\nJoysticks Gauche au centre"));
      vitesseG=0;
    }
    //Joy droit au neutre
    if ((jsDy > 117) && (jsDy < 137))
    {
      //Serial.print(F("\r\nJoysticks Droit au centre"));
      vitesseD=0;
    }
    
    //Joy Gauche vers le haut
    if (jsGy <= 117)
    {
      //Serial.print(F("\r\nJoystick Gauche vers le haut"));
      vitesseG=map(jsGy, 117, 0, 0, 90);          
    }

    //Joy Gauche vers le bas
    if (jsGy >= 137)
    {
      //Serial.print(F("\r\nJoystick Gauche vers le bas"));
      vitesseG=map(jsGy, 137, 255, 0, -90);
    }
    
    //JS Droit vers le haut
    if (jsDy <= 117)
    {
      //Serial.print(F("\r\nJoystick Droit vers le haut"));
      vitesseD=map(jsDy, 117, 0, 0, 90);
    }

    //JS Droit vers le bas
    if (jsDy >= 137)
    {
      //Serial.print(F("\r\nJoystick Droit vers le bas"));
      vitesseD=map(jsDy, 137, 255, 0, -90);          
    }

    ordresCharEtPS4(vitesseG, vitesseD);
      
    Serial.print(F("\tvitesseG: "));
    Serial.print(vitesseG);
    Serial.print(F("\tvitesseD: "));
    Serial.print(vitesseD);
      
    //Test bouton TRIANGLE (arrêt des deux moteurs)
    if (PS4.getButtonClick(TRIANGLE)) 
    {
      /*Test d'appui sur le bouton "Triangle", alors arrêt moteurs*/
      Serial.print(F("\r\nTriangle : Arrêt deux moteurs"));
      
      vitesseG=0;
      vitesseD=0;
      ordresCharEtPS4(vitesseG, vitesseD);
      PS4.disconnect();
    }

    //Test bouton PS (déconnexion, arrêt moteurs)
    if (PS4.getButtonClick(PS)) 
    {
      /*Test appui sur touche "PS", qui conduit à la déconnexion de la 
        manette PS4. Il faut d'abord arrêter les moteurs*/
      Serial.print(F("\r\nPS : Déconnexion - Arrêt deux moteurs"));
      
      vitesseG=0;
      vitesseD=0;
      ordresCharEtPS4(vitesseG, vitesseD);
      PS4.disconnect();
    }
  }
  else
  {
    Serial.print(F("\r\nPS4 non connectee"));
  }
}

void ordresCharEtPS4(signed int vG, signed int vD){
  //Deux Moteurs à l'arrêt
  if ((vG == 0) && (vD == 0))
  {
    PS4.setRumbleOn(0,0);
    PS4.setLed(Blue);
    PS4.setLedFlash(0, 0);
  }

  //Deux moteurs vers l'avant
  else if ((vG > 0) && (vD > 0)) 
  {
    PS4.setRumbleOn(0,127);  
    PS4.setLed(White);
    PS4.setLedFlash(0, 0);
  }

  //Deux Moteurs vers l'arrière
  else if ((vG < 0) && (vD < 0))
  {
    PS4.setRumbleOn(65,0);      
    PS4.setLed(Yellow);
    PS4.setLedFlash(10, 10);
  }

  //Tourne vers la droite
  else if (vG > vD)
  {
    PS4.setRumbleOn(0,0);
    PS4.setLed(Green);
    PS4.setLedFlash(10, 10);    
  }
  else if (vG < vD)
  {
    PS4.setRumbleOn(0,0);
    PS4.setLed(Red);
    PS4.setLedFlash(10, 10);        
  }
  motor.control(vG, vD);
}

Bonjour!

Chouette projet ^^

J'ai jeté un oeil à ce (très cher) driver, vite fait. Attention, je suis pas le mieux placé pour parler ampères et compagnie:

Specifications and Features:
Logic control, 5V from Arduino main board
bi-directional control of two DC brush motor
Motor Driven Voltage:6.5 to 12VDC(VIN Power Supply), 5.0 to 26VDC (External Power Source)

Tu dis que ton arduino est alimenté par une pile 9v. Je commencerais par vérifier cette pile...
Ton driver est alimenté par du 7,4v. J'ai un driver L293d à la maison, je lui donne du 7,4v pour des moteurs qui marchent en 6v, et c'est tout juste. Comme je ne connais pas la réf. de tes moteurs, vérifie au voltmètre que tu as bien la tension minimum recommandée aux bornes des moteurs, réfère toi à la datasheet de tes moteurs et de ton driver. Si les moteurs sont très gourmands en courant, teste aussi l'intensité qu'ils tirent à pleine puissance.

A ta place je commencerais par vérifier mes alimentations avant tout. Ensuite, un schéma du montage peut aider si le problème persiste.

Ma pensée, c'est que l'alim de ton PC aide le tout à fonctionner. On ne sait pas dans quelle mesure, sans voir le montage. Ca ne délivre pas des masses (du moins sur un laptop) mais ça peut faire la différence entre avec USB/sans USB. Les batteries sont annoncées avec des tas de mAh, mais il a été démontré ici qu'on ne peut généralement pas s'y fier.

Ce n'est qu'une suggestion.

Merci kammo pour ces indications, je vais vérifier tous ces points.