Pages: [1]   Go Down
Author Topic: Aide pour clarifier mon programme  (Read 727 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous, j'aimerais savoir si des techniques dans l'écriture en langage Arduino pourrait permettre de rendre mon programme moins lourd (surtout au niveau des déclarations de broches, création de l'objet servo, etc...). Il s'agit d'un programme pour le contrôle d'un petit bras robot composé de 6 servos.

Voici le programme en question :

Quote
// --- Inclusion des librairies utilisées ---

#include <Servo.h> // La bibliothèque servo.h est un ensemble de fonctions qui permettent le controle de servomoteurs

// --- constantes des broches ---

const int SERVO_1=1; // On déclare le servo1 en broche 1
const int SERVO_2=2;
const int SERVO_3=3;
const int SERVO_4=4;
const int SERVO_4=4;
const int SERVO_5=5;
const int SERVO_6=6;

// --- Déclaration des variables globales ---

int impulsion = 1500; // Valeur d'initialisation qui va permettre la mise en position initiale du servomoteur

// --- Initialisation des fonctionnalités utilisées ---

Servo mon_servo1; // Création d'un objet servo pour utiliser les fonctionnalités de la bibliothèque servo.h
Servo mon_servo2;
Servo mon_servo3;
Servo mon_servo4;
Servo mon_servo5;
Servo mon_servo6;

// --- Fonction Setup ---

void setup()
{
  mon_servo1.attach(SERVO_1); // On relie l'objet servo a la branche SERVO_1 (branche 1)
  mon_servo2.attach(SERVO_2);
  mon_servo3.attach(SERVO_3);
  mon_servo4.attach(SERVO_4);
  mon_servo5.attach(SERVO_5);
  mon_servo6.attach(SERVO_6);
  pinMode(SERVO_1, OUTPUT); // On déclare la broche 1 comme une sortie
  pinMode(SERVO_2, OUTPUT);
  pinMode(SERVO_3, OUTPUT);
  pinMode(SERVO_4, OUTPUT);
  pinMode(SERVO_5, OUTPUT);
  pinMode(SERVO_6, OUTPUT);
}

void loop()

{
   
   mon_servo1.writeMicroseconds(impulsion); // Initialise la position du servomoteur a 0°
   delay(200); // Tempo
   mon_servo2.writeMicroseconds(impulsion);
   delay(200);
   mon_servo3.writeMicroseconds(impulsion);
   delay(200);
   mon_servo4.writeMicroseconds(impulsion);
   delay(200);
   mon_servo5.writeMicroseconds(impulsion);
   delay(200);
   mon_servo6.writeMicroseconds(impulsion);
   delay(200);
   mon_servo1.writeMicroseconds(2100);
   delay(500);
   mon_servo2.writeMicroseconds(1000);
   delay(1000);
   mon_servo3.writeMicroseconds(1660);
   delay(400);
   mon_servo4.writeMicroseconds(1800);
   delay(2000);
   mon_servo5.writeMicroseconds(1000);
   delay(200);
   mon_servo6.writeMicroseconds(2000);
   delay(500);
   
}


Merci de vos réponse,

Cordialement,

Papey.
Logged


France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Voila ce que je ferais pour raccourcir ton programme:
Code:
#include <Servo.h>

Servo servoCtrl[6];
int temps[6] = {500,1000,400,2000,200,500};
int impulsion[6] = {2100,1000,1660,1800,1000,2000};

void setup(){
  for(int i=1;i<7;i++){
    servoCtrl[i-1].attach(i);
    pinMode(i, OUTPUT);
  }
}

void loop() {
  for(int i=0;i<7;i++){
    servoCtrl[i].writeMicroseconds(1500);
    delay(200);
  }
  for(int i=0;i<7;i++){
    servoCtrl[i].writeMicroseconds(temps[i]);
    delay(impulsion[i]);
  }
}

Après est-ce bien utile de raccourcir un tel programme ?
ps: tu utilise la broche tx (D1) gaffe au problème d'upload smiley-wink et tu définie deux fois SERVO_4 ça doit te donner une erreur de compilation normalement.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

L’intérêt peut être discutable mais je préfère commencé a faire quelque chose de propre avec mes premiers programmes pour ne pas avoir de mauvaises habitudes par la suite.

Merci beaucoup !

Pour commencer a branché les câbles de commande sur la broche l'entrée/sortie 2 cela suffit ?

Quote
#include <Servo.h>

Servo servoCtrl[6];
int temps[6] = {500,1000,400,2000,200,500};
int impulsion[6] = {2100,1000,1660,1800,1000,2000};

void setup(){
  for(int i=1;i<7;i++){
    servoCtrl[i-1].attach(i+1);
    pinMode(i+1, OUTPUT);
  }
}

void loop() {
  for(int i=0;i<7;i++){
    servoCtrl.writeMicroseconds(1500);
    delay(200);
  }
  for(int i=0;i<7;i++){
    servoCtrl.writeMicroseconds(temps);
    delay(impulsion);
  }
}

« Last Edit: May 11, 2011, 03:36:28 pm by papey » Logged


0
Offline Offline
Full Member
***
Karma: 0
Posts: 104
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bonjour,
je suis en train de fabriquer un bras et je souhaiterai savoir si tu avais fabriqué toi-même le bras, ou si tu l'avais acheté? San les 2 cas pourrais tu poster une photo / vidéo / lien?
merci par avance.
Logged

J'apprends tous les jours!

France
Offline Offline
Sr. Member
****
Karma: 2
Posts: 380
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
 for(int i=1;i<7;i++){
    servoCtrl[i-1].attach(i+1);
    pinMode(i+1, OUTPUT);
  }

Attention : pinMode varie ic de 2 à 8, alors que dans le programme de base c'est de 1 à 6.

donc changer eventuellement par :

Code:
 
for(int i=1;i<7;i++){
    servoCtrl[i-1].attach(i);
    pinMode(i, OUTPUT);
  }

Ou encore mieux :

Code:
int pinAssign={1,2,3,4,5,6};

for(int i=0;i<7;i++){
    servoCtrl[i-1].attach(pinAssign[i]);
    pinMode(attach(pinAssign[i], OUTPUT);
  }

Comme çà tu peux changer l'assignation des pin comme tu veux en modifiant le contenu du tableau pinAssign.

Voilou

Et si on veut pousser un peu :

Code:
#define NBSERVO 6

Servo servoCtrl[NBSERVO];
int temps[NBSERVO] = {500,1000,400,2000,200,500};
int impulsion[NBSERVO] = {2100,1000,1660,1800,1000,2000};

void setup()
{
  int i;

  for(i=0;i<=NBSERVO;i++){
    servoCtrl[i].attach(pinAssign[i]);
    pinMode(pinAssign[i], OUTPUT);
  }
}

void loop()
{
 int i;

  for(i=0;i<=NBSERVO;i++){
    servoCtrl.writeMicroseconds(1500);
    delay(200);
  }
  for(i=0;i<=NBSERVO;i++){
    servoCtrl.writeMicroseconds(temps[i]);
    delay(impulsion[i]);
  }
}


Comme çà si tu veux ajouter, retirer des servos il y aura moins de maintenance de code.

Après le top, c'est de créer un classe spécifique qui gerera tout ca.
« Last Edit: May 11, 2011, 05:17:43 pm by Grag38 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bonjour,
je suis en train de fabriquer un bras et je souhaiterai savoir si tu avais fabriqué toi-même le bras, ou si tu l'avais acheté? San les 2 cas pourrais tu poster une photo / vidéo / lien?
merci par avance.

Je fais ça dans le cadre des ppe de terminale et en 30h on avait pas le temps de tout concevoir on a donc acheter le robot. Apres une étude mécanique dessus, on a refais intégralement 2 commande une manuelle et une "automatique".



c'est un al5d acheter sur Lynxmotion

@Grag38 :

C'était volontaire de faire le branchement de la broche 2 à 8 après la réponse de skywodd qui me parlait de problème potentiel avec la broche TX.
Pour le programme complet que tu as posté je ne connaissais pas encore #define et je ne vois pas ce qu'il fait. Je test mon programme aujourd'hui et je reviens ce soir si jamais y a des soucis.

Merci pour les réponses rapides !

Logged


France
Offline Offline
Sr. Member
****
Karma: 2
Posts: 380
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

#define est une macro qui est traitée par le pre processeur du compilateur. Il en existe beaucoup d'autre.

Celle ci ne fait qu'une chose :

Lors de la phase de compilation, elle remplace toutes les occurence du nom par ce qui suit, donc :

#define NBMOTOR 6  // tu remarqueras qu'il n'y a pas de signe = ou autre...

Remplacera tous les NBMOTOR dans le programme par 6.

mais on peut faire aussi d'autre macros comme :

#define max(a,b) ( ((a)>(b)) ? (a) : (b)  )

la notation : X?Y:Z signifie : si X est vrai retourner Y sinon Z
donc une ligne de code qui serait :

int res, x, y;

if (x>y)
  res = x;
else
  res = y;

peut se noter :   res = (x>y)?x:y;     

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci pour tes explications Grag38.

Mon programme fonctionne plutôt bien dans l'ensemble sauf pour 2 servos qui font des petit vas et viens autour de la position qui leur est demandé quelqu'un aurait une réponse ?
Logged


Pages: [1]   Go Up
Jump to: