Régulation des tensions de sortie moteur (robot 4 roues)

Un shield de pilotage pour 4 moteurs à courant continu ou 2 moteurs pas à pas, qui permet une alimentation sur 12V et qui n'utilise que 4 sorties Pwm (sur 6) et 2 entrées analogiques (sur 6) de l'Arduino

Régulation des tensions de sortie moteur (robot 4 roues)

Message non lude HeLiTiK » Dim 25 Sep 2011 20:41

Bonjour,

Je viens de faire l'acquisition du rotoshield et j'ai en projet de réaliser un petit robot autonome à quatre roues.

P8190003.JPG
P8190003.JPG (165.81 Kio) Vu 2456 fois


Je rencontre un problème au niveau des tensions de sortie des moteurs (M1 et M2).

J'ai écrit un code simple pour tester les différents composants :

Code: Tout sélectionner
/**
 * Programme de test des moteurs DC et du capteur infrarouge SHARP
 */

#include <Wire.h>
#include <snootor.h>

const double REF_ANALOG_VALUE = 3.3;

// declaration detecteur IR
int pinIr = 1;

// declaration des moteurs
SnootorDC M1;  // avant gauche
SnootorDC M2;  // avant droit
SnootorDC M3;  // arrière gauche
SnootorDC M4;  // arrière droit

void setup()
{
  // init
  Serial.begin(9600);
  analogReference( EXTERNAL ); // définis la référence analogique sur la borne 3.3V
  Wire.begin();
  M1.init(1);
  M2.init(2);
  M3.init(3);
  M4.init(4);
}

void loop()
{
  // active les 4 moteurs -> mouvement ligne droite
  runMotors(200, FORWARD);
  // detection obstacle via infrarouge
  if(hasObstacle())
  {
    // arrete les moteurs
    stopMotors();
    delay(500);
    // rotation de 90° environ
    turn();
    delay(2000);
    // arrete les moteurs
    stopMotors();
    delay(1000);
  }
  delay(200);
}

/**
 * Fais tourner le véhicule de 90° toutes les 2s environ
 */
void turn()
{
  // moteurs coté gauche mouvement avant
  M1.setSpeed(255);
  M1.run(FORWARD);
  M3.setSpeed(255);
  M3.run(FORWARD);
 
  // moteurs coté droit mouvement arrière
  M2.setSpeed(180);
  M2.run(BACKWARD);
  M4.setSpeed(180);
  M4.run(BACKWARD);
}

/**
 * Fais avancer les quatres moteurs
 */
void runMotors(int vitesse, int sens)
{
  M1.setSpeed(vitesse);
  M1.run(sens);
  M2.setSpeed(vitesse);
  M2.run(sens);
  M3.setSpeed(vitesse);
  M3.run(sens);
  M4.setSpeed(vitesse);
  M4.run(sens);
}

/**
 * Arrete les 4 moteurs
 */
void stopMotors()
{
  M1.stop();
  M2.stop();
  M3.stop();
  M4.stop();
}

/**
 * Vérifie si un obstacle est détecté par le capteur infrarouge
 * @return true si un obstacle est à moins de 16cm
 */
int hasObstacle()
{
    // Capture de la valeur 0 <= x < 1024
   int valeurIr = analogRead( pinIr );
   // Transformation en volts (référence=3.3v)
   float voltIr = ((float)valeurIr) * REF_ANALOG_VALUE / 1024;
   return (voltIr > 1.5); // obstacle < 16cm environ
}


En ligne droite, les moteurs ne sont pas alimentés avec la même tension par le rotoshield (pourtant ils sont programmés à la même vitesse, à savoir 200 sur 255) :
  • M1 et M2 : 1.5V
  • M3 et M4 : 3.1V

Du coup le véhicule à tendance à aller sur le côté.
Avez-vous déjà rencontré ce type de problème ? Pouvez me donner une piste pour le résoudre ?

Pour information j'alimente l'arduino soit par usb soit avec une pile 9V et les moteurs avec un bloc de pile (5 * 1.5V).
Et voici les moteurs que j'utilisent : http://www.arobose.com/shop/moteurs-servos-robot/55-mini-motoreducteur-6v.html

De plus j'ai une petite question supplémentaire :
Les sorties marquées d'une croix sont déjà utilisées par le rotoshield, on ne peut donc pas y brancher d'autre composant ?

Merci par avance pour votre réponse.
HeLiTiK
 
Messages: 3
Inscription: Mar 28 Juin 2011 22:05
Localisation: Epinal

Re: Régulation des tensions de sortie moteur (robot 4 roues)

Message non lude Tinou » Mar 27 Sep 2011 21:51

Concernant tes problèmes de tension, est-tu sur que tes moteurs soient identiques? As-tu essayé de les inversés afin de voir si le problème venait des moteurs ou de la carte.

Pour le résoudre (dans le cas ou tu n'y peux rien en terme d'électronique) il te faudrait un système d'auto-régulation, je vois deux solutions :

- Un peu complexe mais parfaite, un système de roue codeuse sur tes roues, tu récupère un signal sur lequel tu peux appliqué une relation mathématique en fonction de la vitesse que tu traitera par programmation pour que les deux pairs de moteurs soient égales.
- Solution simple en réalisation et efficace seulement dans le cas ou les différences de tension entre tes pairs de moteurs sont linéaires, tu calcule la différence de tension, puis tu équilibre en programmation avec ta commande :
M1.setSpeed(x);
M2.setSpeed(x);
M3.setSpeed(x +- la différence);
M4.setSpeed(x +- la différence);
Voila il y a surement d'autre solutions!

Pour les sorties marqués d'une croix en effet aucun composant ne peut y être branché, SAUF si tu veux récupérer le signal MLI (ton signal de vitesse) pour une application externe (mon cas je risque de l'expliquer dans un nouveau poste.)

Cordialement Tinou

PS Joli plateforme.
Avatar de l’utilisateur
Tinou
 
Messages: 7
Inscription: Sam 10 Sep 2011 10:33

Re: Régulation des tensions de sortie moteur (robot 4 roues)

Message non lude Lionel » Mer 28 Sep 2011 09:30

HeLiTiK a écrit:Bonjour,
(...)
En ligne droite, les moteurs ne sont pas alimentés avec la même tension par le rotoshield (pourtant ils sont programmés à la même vitesse, à savoir 200 sur 255) :
  • M1 et M2 : 1.5V
  • M3 et M4 : 3.1V
(...)

Bonjour,

Nous allons vérifier ça avec notre codeur de librairie cet après midi et une configuration assez proche de la votre,
Merci de votre retour.
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Régulation des tensions de sortie moteur (robot 4 roues)

Message non lude Lionel » Mer 28 Sep 2011 16:19

Bonjour,

Pourriez vous remplacer votre séquence d'initialisation des moteurs par celle ci et vérifier si le pb est résolu ?

Code: Tout sélectionner
 M1.init(1,MOTOR12_1KHZ);
 M2.init(2,MOTOR12_1KHZ);
 M3.init(3,MOTOR34_1KHZ);
 M4.init(4,MOTOR34_1KHZ);
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Régulation des tensions de sortie moteur (robot 4 roues)

Message non lude HeLiTiK » Mer 28 Sep 2011 21:26

Bonjour,

Effectivement cela résout le problème. Je n'avais pas vu que la fonction init (snootor_dc) pouvait prendre un deuxième paramètre :
Code: Tout sélectionner
init(uint8_t motornum, uint8_t freq =  MOTOR34_8KHZ)


Sinon Tinou, j'ai déjà installé des roues codeuses sur mes deux moteurs avant afin de contrôler la distance parcourue (elles ne sont pas branchées sur l'arduino pour l'instant). Je vais pouvoir m'amuser avec les algorithmes de régulation de vitesse ;)

Merci beaucoup pour vos réponses.
Quand je commencerai à avoir des résultats satisfaisants de mon robot je les ferai partager dans la partie "Vos projets, vos idées".

Bonne continuation à toute l'équipe de Snootlab !
HeLiTiK
 
Messages: 3
Inscription: Mar 28 Juin 2011 22:05
Localisation: Epinal


Retourner vers Rotoshield

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron