Motor Shield v2 adafruit

Bonjour,
j’utilise la shield adafruit v2 pour controler les moteurs d’un robot filoguidé.
Les moteurs sont des MFA 950D réduction 100:1
http://www.selectronic.fr/motoreducteur-fixe-950d-1001.html

Le code du joystick

// Librairie Adafruit
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 

// Branchement joystick et moteur
const int x = A0;
const int xMin = 0;
const int xMax = 1023;
const int y = A1;
const int yMin = 0;
const int yMax = 1023;
int neut = 2; // zone neutre
int neutn = -2; // zone neutre négative
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1);
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(4);

// Définition des variables
int lecX, lecY, calX, calY, retX, retY, vit;

void setup () {
// Initialisation port serie
Serial.begin(9600);
AFMS.begin();

// Lecture des valeurs en x et y
lecX = analogRead(x);
lecY = analogRead(y);
}

void loop() {

// Calibration du joystick en 0,0
calX = analogRead(x)-lecX;
calY = analogRead(y)-lecY;

// Réatalonnage x et y de 0,1023 à -255,255
retX = map(calX, xMin, xMax, -255 , 255);
retX= constrain(calX, -255, 255);
retY = map(calY, yMin, yMax, -255, 255);
retY = constrain(calY, -255, 255);
Serial.print("X : ");
Serial.print(retX);
Serial.println();
Serial.print("Y : ");
Serial.print(retY);
Serial.println();
delay(50);

if ((abs(retX)) > (abs(retY)))
{
vit = (abs(retX));
}
else
{
vit = (abs(retY));
}

//Vitesse et direction moteurs
if (((retX) > (neut)) && ((retY) < (neutn)))
{
myMotor1->setSpeed(abs(vit));
myMotor1->run(BACKWARD);
myMotor2->setSpeed(abs(vit));
myMotor2->run(FORWARD);
Serial.print("Haut-gauche");
Serial.println();
}
else if (((retX) < (neutn)) && ((retY) < (neutn)))
{
myMotor1->setSpeed(abs(vit));
myMotor1->run(FORWARD);
myMotor2->setSpeed(abs(vit));
myMotor2->run(BACKWARD);
Serial.print("Haut-droit");
Serial.println();
}
else if (((retX) < (neutn)) && ((retY) > (neut)))
{
myMotor1->setSpeed(abs(vit));
myMotor1->run(BACKWARD);
myMotor2->setSpeed(abs(vit));
myMotor2->run(FORWARD);
Serial.print("Bas-droit");
Serial.println();
}
else if (((retX) > (neut)) && ((retY) > (neut)))
{
myMotor1->setSpeed(vit);
myMotor1->run(FORWARD);
myMotor2->setSpeed(vit);
myMotor2->run(BACKWARD);
Serial.print("Bas-gauche");
Serial.println();
}
else if (((retY) <= (neut)) && ((retY) >= (neutn)) && ((retX) >= (neut)))
{
myMotor1->setSpeed(vit);
myMotor1->run(BACKWARD);
myMotor2->setSpeed(vit);
myMotor2->run(FORWARD);
Serial.print("demi-tour-droite");
Serial.println();
}
else if (((retY) <= (neut)) && ((retY) >= (neutn)) && ((retX) <= (neutn)))
{
myMotor1->setSpeed(vit);
myMotor1->run(FORWARD);
myMotor2->setSpeed(vit);
myMotor2->run(BACKWARD);
Serial.print("demi-tour-gauche");
Serial.println();
}
else if (((retX) <= (neut)) && ((retX) >= (neutn)) && ((retY) >= (neut)))
{
myMotor1->setSpeed(vit);
myMotor1->run(FORWARD);
myMotor2->setSpeed(vit);
myMotor2->run(FORWARD);
Serial.print("arriere");
Serial.println();
}
else if (((retX) <= (neut)) && ((retX) >= (neutn)) && ((retY) <= (neutn)))
{
myMotor1->setSpeed(vit);
myMotor1->run(BACKWARD);
myMotor2->setSpeed(vit);
myMotor2->run(BACKWARD);
Serial.print("avant");
Serial.println();
}
else
{
myMotor1->setSpeed(0);
myMotor1->run(RELEASE);
myMotor2->setSpeed(0);
myMotor2->run(RELEASE);
}

}

Quand je tourne droite gauche tout fonctionne, par contre quand je veux aller tout droit ou en arrière, les moteurs saccadent et ils font n’importent quoi.
J’ai essayé avec d’autres moteurs et cela fonctionne.
Je n’y comprends plus rien.
Quand j’essaie un seul moteur cela fonctionne aussi, c’est dès que je mets les deux.
Et les moteurs émettent un sifflement.
Si quelqu’un peut m’aider.
Merci

Comment est alimenté le montage ?

Bonjour, Pour la carte arduino je passe par une petite alimentation stabilisée de 12v qui délivre 1,5A max, pour la shield aussi une alimentation stabilisée de 12v mais qui peut délivrée 40A. Bonjour, Pour la carte arduino je passe par une petite alimentation stabilisée de 12v qui délivre 1,5A max, pour la shield aussi une alimentation stabilisée de 12v mais qui peut délivrée 40A. Le plus surprenant c'est que cela fonctionne quand les moteurs sont inversés en polarité cela fonctionne. Quand ils ont la même polarité aux bornes, le pont en H chauffe énormément. Je me demande quand même si cela ne dépasse pas les 3A. Mais cela devrait être le cas quand l'un va à droite et l'autre à gauche.

Salut,

La valeur gérant la vitesse (PWM) varie bien de 0 à 255, par contre il faut une tension mini pour que les moteurs commencent à tourner, ce qui se traduit par une valeur mini aussi PWM, si elle est trop basse, le moteur oscille , sans mise en rotation. Il faut quelle tension mini pour que les moteurs se mettent en route , de la c'est facile de déterminer la valeur mini PWM.

Par contre je ne comprends pas "Quand ils ont la même polarité aux bornes," ???, le moteur possède un connecteur (+) et un (-), avec le pont en H, l'alimentation du moteur sera ; (+) moteur et (+) Alim et donc (-) moteur et (-) Alim, donc rotation sens horaire sinon, (+) moteur et (-) Alim et donc (-) moteur et (+) Alim et la rotation moteur sens anti-horaire.

Mais le moteur ne peut pas être alimenté en (+) sur ces deux broches.

En effet impossible d'avoir deux (+) sur un seul moteur. Je me suis mal exprimé.

Si on avance : Moteur 1 : Borne 1 (+) et borne 2 (-) Moteur 2 : Borne 1 (+) et borne 2 (-)

Tourne droite : Moteur 1 : Borne 1 (-) et borne 2 (+) Moteur 2 : Borne 1 (+) et borne 2 (-)

Etc.

Tout fonctionne quand je tourne droite ou gauche mais si j'avance ou recule, les moteurs saccadent et font n'importent quoi et le pont en H est brûlant. C'est à n'y rien comprendre.

Quand tu avances en ligne droite, mesure avec un multimètre la tension au niveau des 2 moteurs, pour voir ce qui arrive et si celle-ci est suffisante,

@+

Merci de votre aide. Mais rien de tout cela. Un foutu court circuit entre les fils des deux moteurs, du coup un court circuit sur le pont en H quand les moteurs tournaient en sens opposé. J'ai trouvé un peu par hasard, mais le principal c'est le résultat. Encore merci.