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]