Aide pour clarifier mon programme

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 :

// --- 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.

Bonjour,

Voila ce que je ferais pour raccourcir ton programme:

#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 :wink: et tu définie deux fois SERVO_4 ça doit te donner une erreur de compilation normalement.

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 ?

#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);
    }
    }
    [/quote]*_

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.

  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 :

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

Ou encore mieux :

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 :

#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.

MrAlexis44600:
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 !

#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;

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 ?