Demande d'aide driver PmodHB5

Bonjour

Je suis débutant avec Arduino et j'essaie d'utiliser le driver PmodHB5 (https://digilent.com/reference/_media/pmod:pmod:pmodHB5_rm.pdf), avec le moteur Diligent 6V: Motoréducteur Digilent 6 V avec encodeur pour robotique et une carte arduino Mega. Pour l'alimentation du driver j'utilise une batterie 6v 600mA.

Je voulais juste faire tourner le moteur j'ai donc fait le programme suivant:

const int dir = 2;
const int vitesse = 3;
const int Mtr1SA = 4;
const int Mtr1SB = 5;

void setup() {
  pinMode(vitesse, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(Mtr1SA, INPUT_PULLUP);
  pinMode(Mtr1SB, INPUT_PULLUP);
  Serial.begin(115200);

  analogWrite(vitesse, 0);
  analogWrite(dir, 0);
}

void loop() {
  analogWrite(vitesse, 127);
  delay(1000);
  analogWrite(vitesse, 0);
  delay(1000);
}

Malheureusement mon moteur ne bouge pas :frowning:
Si vous avez des idées pour m'aider je suis preneur

bonne journée

Tu es dans le cas de gauche ?
image

VCC est fourni par la carte Mega (5V) : c'est l'alimentation du composant (pont en H).
L'alim du moteur se fait par le connecteur J3 (le bornier) :

(source)

Bonjour fredrouv

J'ai essayé ton programme, il y a bien le PWM sur la pin 3 et un LOW sur la pin 2, donc ton devrait tourner. Un problème de câblage?
Fais une photo en gros plan de ton montage.

Cordialement
jpbbricole

Avez vous testé le moteur tout seul, branché directement sur la batterie (i.e. sans Arduino ni driver)

Je suis côté gauche sur la carte Arduino, et droite vers le moteur

J''ai branché le sur M+ et M- (noir et rouge du moteur) sur la carte arduino et il tourne

J'avais bien testé le moteur avec l'alim de la carte Arduino mais pas ma batterie qui est morte....

J'en profite pour poser une question sur la batterie , je dois acheter quoi comme type de batterie pour alimenter deux moteurs?

Je peux me servir de la batterie pour alimenter la carte Arduino?

Oui ... si elle est chargée et vivante . (Vin). Testez d'abord avec deux alims distinctes -risque de parasitage autrement-

A priori, votre UNO mange 50 mA; les moteurs mangent chacun 240mA; mettons 300 mA (d'après votre lien pdf)
Ca vous fait, avec un peu de marge, 700mA
Ensuite, si vous voulez que ça dure une heure, il vous faut ... 700mAh (ou 350 mAh pour une demiheure).
Une recherche google avec comme mots clés "700mAH" "6v" m'a ramené -entre autres- Batterie 6V NiMH 700mAh | Émetteur et récepteur | Batteries pour modélisme | Batteries | Batterie-Boutique.fr qui est à 41 euros .... (batterie à base d'or?)
A ce prix là, j'espère que ma façon de chercher des batteries est une hérésie..

Edité: votre batterie de 600mA ne serait elle pas de 600mAH? Si c'est le cas, et vus les prix, vous pourriez tenter de la ressusciter.

Déjà, il faut regarder comment tu va la charger.
Comme tu en avais une de 6V, je suppose que tu possède un chargeur compatible NIMH?
Quels sont les prises que ton chargeur accepte ?

Ensuite quelle autonomie minimal exige tu ?

pour le moment je n'ai pas d'exigence de durée. Mais au moins une heure...

Actuellement j'utilise des lego EV3 pour faire une équipe de jeune participe a la robocup. Je regardai un peu ailleurs pour voir ce qu'on pourrait faire.

Oui c'etait un chargeur compatible NIMH que j'avais dans un coin.

Je viens de trouver également une lithium-ion 12V 3000MAh, si je peux passer par la carte Arduino, je vais pouvoir commencer à regarder comment marche les encodeurs. Si je trouve combien de PPR font mes encodeurs...

Sur la doc il y a plusieurs possibilités en fonction du diamètre du moteur (https://digilent.com/reference/_media/motor_gearbox/magnetic-encoders.pdf?_gl=1*1ogj9a2*_ga*NzQyMzE5ODcxLjE2ODk4NTk3OTM.*_ga_JSPEFFCPBT*MTY5MDIxNzE3Ni44LjEuMTY5MDIxNzI2NC40MC4wLjA.)

En tout cas merci pour voter aide

et du coup, tu ne donne pas les types de prises qu'il peut utiliser.
A moins que cela ne te dérange pas de racheter un nouveau chargeur ?

Tu peux aussi l'utiliser, mais je crois qu'il vaut mieux passer par un abaisseur de tension à découpage pour abaisser la tension plus proche de la tension d'entrée minimal demandé par le régulateur de ton Arduino.
Car sinon passer de 12V à 5V, demande de perdre la différence en chaleur.
D'autre seront te conseiller un abaisseur à recommander.

C'est une vieille batterie que j'avais récupérer donc s'il faut en acheter une pourquoi pas.

L'arduino prend jusqu'à 12v donc je pense que je vais faire quelques tests déjà comme ca. Sauf si cela peut endommager le matériel.

Tu parle de quelle batterie ?
Pour l'instant si tu achète une nouvelle batterie, rien ne dis que tu aura de quoi la recharger.

L'arduino Mega prend entre 6 et 20V, donc 12V ne pose aucun problème.

Je parlais de celle qui ne fonctionne plus.

Je vais me lancer comme ca pour faire des tests, je verrai plus tard.
Merci

Décidément j'ai du mal. J'ai plusieurs problèmes:
-- Sens de rotation voici le code:

//#define ENCODER_DO_NOT_USE_INTERRUPTS
#include <Encoder.h>


const int dir = 4;
const int vitesse = 5;
//const int Mtr1SA = 4;
//const int Mtr1SB = 5;
Encoder myEnc(2, 3);

long oldPosition  = -999;

void setup() {
  pinMode(vitesse, OUTPUT);
  pinMode(dir, OUTPUT);
  
  Serial.begin(9600);

  analogWrite(vitesse, 0);
  analogWrite(dir, HIGH);
}

void loop() {
  analogWrite(dir, HIGH);
  delay(1000);  
  Serial.println("on demare");
  analogWrite(vitesse, 100);
  delay(1000); 
  analogWrite(vitesse, 0);
  delay(1000); 
  Serial.println("on change de sens");
  analogWrite(dir, LOW);
  analogWrite(vitesse, 250);
  delay(1000); 
  analogWrite(vitesse, 0);
}

Le moteur tourne toujours dans le même sens... J'ai bien branché le cable J1-1 en 4 sur la carte arduino (je l'ai même changé au cas ou....)

-- Problème sue les encodeurs:
voici le programme:


#include <Encoder.h>


const int dir = 4;
const int vitesse = 5;
//const int Mtr1SA = 4;
//const int Mtr1SB = 5;
Encoder myEnc(2, 3);

long oldPosition  = -999;

void setup() {
  pinMode(vitesse, OUTPUT);
  pinMode(dir, OUTPUT);
  
  Serial.begin(9600);
  Serial.println("Basic encoder Test:");
  Serial.println(HIGH);
  Serial.println(LOW);

  analogWrite(vitesse, 0);
  analogWrite(dir, HIGH);
}

void loop() {
  long newPosition = myEnc.read();
  Serial.println(newPosition);
   
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
    Serial.println(dir);
  }
  
  if ( newPosition > -200 ) {
    analogWrite(vitesse, 127);
  }
  else {
    analogWrite(vitesse, 0);
  }
  
}

-- J'ai du mal a savoir combien de "tick" "compteur de l'encodeur" pour un tour d'axe. Si j'ai bien compris d'après la doc il y en a 6 par tour moteur avec une réduction de 52.734 cela ferai 6*52.734=316 . Il semble pourtant que cela ne fait qu'un demi tour d'axe ....

-- Les pins de l'encodeur doivent bien être branché en 2 et 3? si je les branche en 4 et 5 (en modifiant dans le programme bien évidemment) je n'ai pas le même résultat

-- Je voulais contrôler le nombre de tick: arréter le moteur au bous de 200 tick par exemple mais il s'arrête au bous de 358. Est ce du à l'inertie? au temps de traitement? Peut on faire mieux?

Décidément je ne suis pas très doué....

Bonjour fredrouv

Pour les plus courants, genre:
image
C'est 11 ticks.
Si ce n'est pas ce modèle, donnes un lien sur le tien.

C'est mieux ces 2 pin sur un UNO on l'interruption.
image

Oui, tu auras le même résultat.

C'est un résultat difficilement à obtenir, je n'y suis pas arrivé. Une option est d'alimenter le moteur, brièvement, en sens inverse afin de le "planter" et, il faut encore anticiper ce coups de frein.

Cordialement
jpbbricole

il y a effectivement 6 pôles d'après la doc, mais tu as 2 capteurs donc tu dois compter le double d'impulsions.

Il serait plus judicieux de lire la valeur des ticks et de faire ralentir le moteur à temps pour s'arrêter doucement.

Bonsoir fredrouv

Remplaces tout tes commandes de direction analogWrite(dir, par digitalWrite(dir et l'inversion se fera.

A+
Cordialement
jpbbricole

Bonjour,

C'est mieux

analogWrite(vitesse, max(0,min(abs(newPosition+200),127)));

avec ce code, j'arrive à -269, il faudra faire avec et voir pour anticiper ce décalage

Merci ca marche, par contre quelle est la différence entre ces deux commandes?
Si je modifie analogWrite par digitalWrite dans le code pour ralentir je suis à -401 au lieu de 269...

Bonjour

avec 632 s=cela semble plus juste, merci