Programme Arduino moteurs CC - Problème

Bonsoir,

Pour un projet électronique, nous avons dû réaliser une voiture radio-commandée au moyen de la technologie Xbee.
Nous avions à notre disposition :

  • Un module XBEE émetteur, branché sur une platine permettant de relier le module à l'ordinateur et lui envoyer des données grâce au logiciel XCTU
  • Un module XBEE récepteur, branché sur une carte shield wireless I/O (voir lien ci dessous), elle même reliée sur notre carte Arduino.

Nous avons branché un servomoteur (pour la direction de la voiture) sur la shield wireless et grâce au programme rentré dans la Arduino, la communication entre les XBEE fonctionne, et l'angle du servomoteur change quand nous appuyons sur une touche spécifique.
Nous aurions voulu faire pareil avec deux moteurs CC et contrôler leur vitesse en appuyant sur différentes touches du clavier, mais lorsque nous branchons le contrôleur moteur à la Arduino et aux deux moteurs, rien ne se passe, nous n'arrivons pas à écrire un programme qui puisse au moins vérifier le bon fonctionnement des moteurs. Comme les ports Rx, Tx, Gnd de la wireless sont occupés par le xbee, nous devons créer un port série de manière à relier le contrôleur moteur relié à la Arduino au ports 8 et 10 de la shield wireless. Après de nombreux essais, toujours rien et on en vient à se demander si le controleur moteur est pas foutu.

Quelqu'un aurait-il une idée de programme pouvant tester simplement nos moteurs ?
Par exemple, lorsqu'on appuie sur la touche "h", le moteur prend une vitesse précise.

Voila si quelqu'un pouvait nous aider, ca nous serait très utile sachant que l'échéance pour rendre ce projet approche :~
Merci d'avance !

Lien pour le contrôleur moteur et sa bibliothèque de programmation : http://www.robotshop.com/controleur-moteur-cc-md49-24v-5a-devantech.html
Lien pour les deux moteurs à faire avancer : http://www.gotronic.fr/art-module-de-propulsion-rd03-11568.htm

Ebauche de notre programme (il marche pour le servomoteur) :
Programme moteur MD49

#include <SoftwareSerial.h>

// Values of 0 being sent over serial write have to be cast as a byte so they arent misinterpreted as NULL
// This is a bug with arduino 1.0
#define CMD (byte)0x00 // MD49 command address of 0
#define GET_VER 0x29
#define GET_ENC1 0x23
#define GET_ENC2 0x24
#define GET_VI 0x2C
#define GET_ERROR 0x2D
#define SET_ACCEL 0x33
#define SET_SPEED1 0x31
#define SET_SPEED2 0x32

#define LCD_RX 0x02 // RX and TX pins used for LCD0303 serial port
#define LCD_TX 0x03
#define LCD03_HIDE_CUR 0x04
#define LCD03_HOME 0x01
#define LCD03_CLEAR 0x0C
#define LCD03_SET_CUR 0x02

SoftwareSerial lcd03 = SoftwareSerial(LCD_RX, LCD_TX); // Creates a serial port for the LCD03

byte enc1a, enc1b, enc1c, enc1d = 0;
byte enc2a, enc2b, enc2c, enc2d = 0;
byte bat_volt, mot1_cur, mot2_cur = 0;
byte ver = 0;
byte error = 0;

void setup()
{
Serial.begin(38400);
lcd03.begin(9600);

lcd03.write(LCD03_CLEAR);
lcd03.write(LCD03_HIDE_CUR);

}

void loop()
{
Serial.write(CMD); // command byte
Serial.write(SET_ACCEL);
Serial.write(5); // Set accelleration to 5
Serial.write(CMD);
Serial.write(SET_SPEED1);
Serial.write(140); // Set motor 1 speed
Serial.write(CMD);
Serial.write(SET_SPEED2);
Serial.write(140); // Set motor 2 speed

Serial.write(CMD);
Serial.write(GET_VER); // Recieve version back
delay(50);
if(Serial.available() > 0)
{
ver = Serial.read();
}

Serial.write(CMD);
Serial.write(GET_ERROR); // Recieve error byte back
delay(50);
if(Serial.available() > 0)
{
error = Serial.read();
}

Serial.write(CMD);
Serial.write(GET_VI); // Recieve battery volts and both motor currents back
delay(50);
if(Serial.available() > 2)
{
bat_volt = Serial.read();
mot1_cur = Serial.read();
mot2_cur = Serial.read();
}

Serial.write(CMD);
Serial.write(GET_ENC1); // Recieve encoder 1 value
delay(50);
if(Serial.available() > 3)
{
enc1a = Serial.read();
enc1b = Serial.read();
enc1c = Serial.read();
enc1d = Serial.read();
}

Serial.write(CMD);
Serial.write(GET_ENC2); // Recieve encoder 2 value
delay(50);
if(Serial.available() > 3)
{
enc2a = Serial.read();
enc2b = Serial.read();
enc2c = Serial.read();
enc2d = Serial.read();
}

lcd03.write(LCD03_HOME); // Return cursor home

lcd03.print("Rev: "); // Display data to the screen
lcd03.print(ver,DEC);
lcd03.print(" Battery V: ");
lcd03.print(bat_volt, DEC);
lcd03.write(LCD03_SET_CUR); // Set position of cursor
lcd03.write(21);

delay(5); // Delay to allow LCD03 time to process data

lcd03.print("Encoder 1:");
lcd03.print(enc1a,HEX);
lcd03.print(enc1b,HEX);
lcd03.print(enc1c,HEX);
lcd03.print(enc1d,HEX);
lcd03.write(LCD03_SET_CUR);
lcd03.write(41);

delay(5);

lcd03.write("Encoder 2:");
lcd03.print(enc2a,HEX);
lcd03.print(enc2b,HEX);
lcd03.print(enc2c,HEX);
lcd03.print(enc2d,HEX);
lcd03.write(LCD03_SET_CUR);
lcd03.write(61);

delay(5);

lcd03.print("Mot 1 I:");
lcd03.print(mot1_cur,DEC);
lcd03.print(" Mot 2 I:");
lcd03.print(mot2_cur,DEC);
lcd03.print("");

delay(5);

}

Salut !

Specs du module : 5A par moteur, protection contre les courts-circuits, les tensions incorrectes et les surcharges ... A mon avis, à moins d'avoir fait une grosse (très grosse même) bêtise, votre module se porte bien :wink:

Quel code avez-vous essayer ? Dans la doc il y a un exemple simple :

For example to read the battery voltage, send:
0x00 - sync byte
0x26 - READ VOLTS command
and the MD49 would respond with
0x18 - returned byte (24 decimal) 24v

L'avez-vous essayé ?

P.S : utilise les balises # dans le menu reply pour insérer du code, ça sera bien plus lisible :wink:

Dear Forum,

For laboratory work, I ordered an MD49 and two EMG49s. I can make them turn at various speeds, and read out certain things, like voltage etc. I have two questions left, and I would be very happy if you could answer them.

  1. I read out the encoder position with the command
    Serial.write(GET_ENC1);
    What I get is four numbers, which I have to concatenate to form a signed long. This value rises when the motor is turning. I would like to know how to convert this value to something human-readable, like angular or radial position.

  2. I can also change the motor speed with the commands
    Serial.write(SET_SPEED1);
    Serial.write(140);
    or some other number. I have about the same question as the above: what does the value 140 mean in human-readable language (in rpm or degrees/sec).

Many thanks,

Jorris