Je n'ai pas la tension désirée au bornes d'un moteur

Bonsoir,

Histoire de changer un peu d'air, j'ai décidé de faire quelques tests avec mon matos.
J'ai découvert les joies de la manette PS2X avec son récepteur 2.4 GHz.

J'aimerais faire tourner un moteur lorsque j'appuie sur la gachette R2.
Seulement celui ci ne tourne pas, car au lieu d'avoir mes 5 volts à ces bornes lorsque j'appuie sur la gachette, je n'en ai seulement 1.2 environ.

Voici mon code :

#include <PS2X_lib.h> /* PS2 Controller Library http://www.billporter.info/2010/06/05/playstation-2-controller-arduino-library-v1-0/ */
PS2X ps2x; /* on crée l'instance du controleur */

// information http://www.rhydolabz.com/wiki/?p=12663

// Connecter de gauche à droite en regardant le connecteur
// ----------------------
// Data --> pin 12
// Command --> pin 11
// NC
// ----------------------
// GND --> GND
// Power --> 3.3V
// Attention --> Pin 10
// ----------------------
// Clock --> pin 13
// NC
// NC
// ----------------------

const byte dataPin = 12;
const byte commandPin = 11;
const byte attentionPin = 10;
const byte clockPin = 13;

int pinmotor = 7;
byte motor = 0;

void setup() 
{
  Serial.begin(115200);
  pinMode(pinmotor, OUTPUT);

  /* config_gamepad(clock, command, attention, data, Pressures?, Rumble?) */
  ps2x.config_gamepad(clockPin, commandPin, attentionPin, dataPin, true, true); // gardez true, true à la fin même si pas de moteurs

  if (ps2x.readType() == 1) Serial.println(F("DualShock"));
  else {
    Serial.print(F("Manette Absente - code "));
    Serial.println(ps2x.readType());
    while (true); // on meurt ici, éventuellement enlever si vous avez un autre code manette
  }

  ps2x.read_gamepad(); // initialisation des valeurs
  delay(50);
  ps2x.read_gamepad();  /* initialise les états */

}


void loop() {
  static uint32_t chrono = 0;
  const uint32_t periode = 20ul; // la manette est assez sensible, il ne faut pas lui demander les infos trop souvent. 15ms ou 20ms ça fonctionne pour moi

  if (millis() - chrono >= periode) {
    int RX = 0, RY = 0, LX = 0, LY = 0;
    static int PRX = 127, PRY = 128, PLX = 127, PLY = 128;

    chrono += periode;

    ps2x.read_gamepad();   /* on lit l'état de la manette */

    LX = ps2x.Analog(PSS_LX);          /* joystick de gauche X*/
    LY = ps2x.Analog(PSS_LY);          /* joystick de gauche Y */
    RX = ps2x.Analog(PSS_RX);          /* joystick de droite X */
    RY = ps2x.Analog(PSS_RY);          /* joystick de droite Y */

    // si une des coordonnées des joystick a changé alors on imprime les nouvelles coordonnées
    if ((LX != PLX) || (LY != PLY) || (RX != PRX) || (RY != PRY)) {
      PLX = LX;
      PLY = LY;
      PRX = RX;
      PRY = RY;
      Serial.print(LX);    Serial.print(F(" ,"));
      Serial.print(LY);    Serial.print(F(" ,"));
      Serial.print(RX);    Serial.print(F(" ,"));
      Serial.println(RY);
    }

    // if (ps2x.NewButtonState()) {}  /* vrai s'il y a un changement d'état, si on ne veut pas lire l'état à la main  */

    // ButtonPressed(unsigned int) vrai si le bouton VIENT d'être appuyé (depuis la dernière lecture de config)
    if (ps2x.ButtonPressed(PSB_L1))        Serial.println(F("GAUCHE 1 APPUI"));
    if (ps2x.ButtonPressed(PSB_R1))        Serial.println(F("DROITE 1 APPUI"));
    if (ps2x.ButtonPressed(PSB_L2))        Serial.println(F("GAUCHE 2 APPUI"));
    if (ps2x.ButtonPressed(PSB_R2))        Serial.println(F("DROITE 2 APPUI"));

    // Button(uint16_t); vrai si le bouton est tenu enfoncé
    if (ps2x.Button(PSB_L1)) Serial.println(F("GAUCHE 1"));
    if (ps2x.Button(PSB_R1))Serial.println(F("DROITE 1"));
    if (ps2x.Button(PSB_L2))Serial.println(F("GAUCHE 2"));
    if (ps2x.Button(PSB_R2))
    {
      motor = 1;
      Serial.println(F("DROITE 2"));
      Serial.println(motor);
    }

    // ButtonReleased(unsigned int) vrai si le bouton VIENT d'être relâché (depuis la dernière lecture de config)
    if (ps2x.ButtonReleased(PSB_L1))        Serial.println(F("GAUCHE 1 RELACHE"));
    if (ps2x.ButtonReleased(PSB_R1))        Serial.println(F("DROITE 1 RELACHE"));
    if (ps2x.ButtonReleased(PSB_L2))        Serial.println(F("GAUCHE 2 RELACHE"));
    if (ps2x.ButtonReleased(PSB_R2))
    {
      motor = 0;
      Serial.println(F("DROITE 2 RELACHE"));
      Serial.println(motor);
    }
  }

  if(motor == 1)
  {
    digitalWrite(pinmotor, LOW);
  }
  else if(motor == 0)
  {
    digitalWrite(pinmotor, HIGH);
  }
  
}

En espérant que vous trouverez pourquoi :slight_smile:
Merci d'avance

EDIT : Le moteur est alimenté par une source externe à l'arduino, qui peu fournir jusqu'à 2 ampères.
Les masses sont communes.
J'ai essayé en alimentant avec l'arduino mais même problème.
Je précise que le moteur est fonctionnel.

Il est branché comment le moteur?
Si c’est directement sur ta carte, d’ailleurs quelle carte? On ne sait pas, il y a de forte chance que ça ne fonctionne pas.

Quelles sont les caractéristiques du moteur aussi

Arduino UNO, le + du moteur est au 5v de l'alim externe, le - à la broche 7 de l'arduino.

C'est un moteur de récup mais il ressemble fortement aux moteurs 3v chinois.

Bonjour,

Une pin de l'arduino ne peut fournir que 20mA (aussi bien en source qu'en sink). Il y a de grandes chances que ton moteur consomme plus que ça.
Il faut utiliser un transistor ou un mosfet.

Je sais bien que l'idéal serait d'utiliser un mosfet mais je n'en ai pas sous la main.
Par contre j'ai trouvé un relais compatible arduino et là ça fonctionne.

Autre problème d'ailleurs.
J'ai suivi le tuto de JML pour la manette PS2X.
La manette est bien connectée au recepteur mais le programme ne la détecte pas.
Je suis obligé d'éteindre et de rallumer la console, en ésperant avec un peu de chance voir la manette de connectée. Cela peu durer jusqu'a 2 minutes des fois et c'est un peu embetant ...