Aller au contenu


robot01

Inscrit(e) (le) 13 juin 2012
Déconnecté Dernière activité juin 26 2012 10:50
-----

#44913 Programmation Arduino-Processing

Posté par robot01 - 13 juin 2012 - 06:59

Bonjour à toutes et à tous!

En fait je dois contrôler un servomoteur Futaba RS304MD de telle sorte qu'il fasse une rotation de X degrés. L'angle X dépend de la distance mesurée par un capteur IR qui peut détecter une objet entre 10 et 80 cm. Plus la distance mesurée est petite, plus l'angle de rotation est élevé. J'utilise une carte Arduino et des modules Xbee, je programme avec le logiciel Arduino en langage Processing. Initialement j'avais décidé d'utiliser les "short packets" pour la configuration des angles, mais après j'ai pensé qu'une fonction mathématique linéaire serait meilleure, telle que y = -0.706*x + 180 = angle de rotation, où x est la distance mesurée par le capteur.

Voici, ci dessous, mon programme. Mon problème est que le servomoteur ne tourne que d'un seul angle quelque soit la distance mesurée, alors qu'il devrait varier en fonction de la distance. Malgré plusieurs modifications je n'arrive pas à trouver l'erreur.

Y aurait-il des habitués d'Arduino ou de Processing qui pourraient m'aider ?

Merci d'avance!

********************************************************************************************

#include <Distance.h>

Distance myDistance = Distance(4);

// Torque ON Packet
byte trqOn[] = {0xFA, 0xAF, 0x01, 0x00, 0x24, 0x01, 0x01, 0x01, 0x24};
// Motor rotates 0 degree(doesn't rotate)
byte cw0[] = {0xFA, 0xAF, 0x01, 0x00, 0x1E, 0x02, 0x01, 0x00, 0x00, 0x1C};
// Random Rotate and Speed Packet
byte rrs[] = {0xFA, 0xAF, 0x01, 0x00, 0x1E, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};

void setup() {
  Serial.begin(115200);        // if the communication speed is 115200bps
  delay(500);
  Serial.write(trqOn,9);
}

void loop() {
    myDistance.available();
  
  int x = myDistance.numberOfDistance(); // x is the distance between the object and the robot
  int y = -7,06*x + 1800; // y correspond to the angle of rotation
  
  if ((x>=32)&&(x<=255)) // 10cm<x<80cm???
 	{
        delay(1000); //delay of 1s
        rrs[7]=lowByte(y);//Little Endian
        rrs[8]=highByte(y);//Little Endian
        calcCheckSum(rrs,12);
        Serial.write(rrs,12);

        delay(1000); //delay of 1s
        rrs[7]=lowByte(-y);//Little Endian
        rrs[8]=highByte(-y);//Little Endian
        calcCheckSum(rrs,12);
        Serial.write(rrs,12);
        
 	} else {
        delay(1000); // delay of 1s
        Serial.write(cw0,10); //Motor rotates 0 degree(doesn't rotate)
 	}
  
}

void calcCheckSum(byte pkt[], byte n) {    // Setting of the checksum
  int sum = 0;
  for(int i=2; i<n-1; i++){
    sum = sum ^ pkt[i];
  }
  pkt[n-1]=sum;
}


EDIT Modération : rajout des balises [ code][ /code]