LE SHIELD COMMANDE 16 SERVOMOTEURS ADAFRUIT
Le shield Commande 16 servomoteurs développé par Adafruit comporte un TLCC5940 qui permet de piloter 16 servomoteurs grâce au bus I2C. Les sorties délivrent en fait des signaux PWM (Pulse Width Modulation) et nous pouvons commander également des led. Nous pouvons même empiler jusqu'à 62 shields por commander 992 sorties en PWM !!!
Ce shield est vendu sous forme de kit et son montage ne nécessite pas une grande maîtrise technique.
La bibliothèque gérant ce module est téléchargeable ici et ses principales fonctions sont :
-
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(). Cette fonction permet de créer l'objet.
-
pwm.begin(). Cette fonction permet d'initialiser l'objet.
-
pwm.setPWMFreq(fequence). Cette fonction permet de fixer la fréquence du signal PWM (entre 40 et 1000 Hz).
-
pwm.setPWM(numéro_sortie, t_on, t_off) où numéro_sortie représente le numéro de la sortie (entre 0 et 15), t_on et t_off (voir exemple ci dessous). t_on et t_off sont compris entre 0 et 4095. Cette fonction permet de générer le signal PWM.
Pour obtenir ce signal, nous avons paramétré l'instruction de la façon suivante pwm.setPWM(0, 409, 1228).
Ce shield comporte également une zone de prototypage et un bornier à vis sur lequel nous devons appliquer une tension comprise entre 5 et 6 V fournissant la puissance aux servomoteurs ou aux led.
Dans l'univers Arduino, le shield Commande 16 servomoteurs est principalement utilisé pour piloter un robot hexapode.
Exemple 1 :
Nous souhaitons générer un signal PWM (fréquence 50 Hz et rapport cyclique à 50%) sur la sortie 0 du shield.
Liste du matériel :
-
1 Arduino Uno
-
1 shield de commande sevomoteurs
-
1 alimentation 5 V
Programme :
/*Shield_PWM_Test est un programme qui génère un signal PWM sur la sortie 0 */
#include <Wire.h> // appel des bibliothèques
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); // création de l'objet pwm
#define frequence 50
int numero_sortie = 0;
void setup()
{
pwm.begin();
pwm.setPWMFreq(frequence); // configuration de la fréquence du signal PWM
}
void loop()
{
pwm.setPWM(0, 0, 2048); // génération du signal PWM
}
Signal :
Exemple 2 :
Nous souhaitons mettre en mouvement deux servomoteurs reliés aux sorties 4 et 13.
Liste du matériel :
-
1 Arduino Uno
-
1 shield de commande sevomoteurs
-
2 servomoteurs SG90
-
1 alimentation 5 V
Câblage :
Programme :
/*Shield_Servo est un programme qui met en mouvement deux servomoteurs branchés sur les sorties 4 et 13 */
#include <Wire.h> // appel des bibliothèques
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); // création de l'objet pwm
#define frequence 50 // la fréquence (période=20ms) du signal de commande des servo est de 50 Hz (voir documentation du servo)
#define pulse_min 450 // l'impulsion minimale correspond à la position 0° (voir documentation du servo)
#define pulse_max 2450 // l'impulsion maximale correspond à la position 180° (voir documentation du servo)
#define servo1 4 // le servo 1 est branché sur la sortie 4 du shield
#define servo2 13 // le servo 2 est branché sur la sortie 13 du shield
void setup()
{
pwm.begin(); // initialisation de l'objet pwm
pwm.setPWMFreq(frequence); // configuration de la fréquence du signal PWM
Serial.begin(9600);
Serial.println("Initialisation");
pwm.setPWM(servo1, 0, valeur_angle(0)); // position initiale du servo 1 à 0°
pwm.setPWM(servo2, 0, valeur_angle(90)); // position initiale du servo 2 à 90°
delay(5000);
}
void loop()
{
pwm.setPWM(servo1, 0, valeur_angle(45)); // position du servo 1 à 45°
pwm.setPWM(servo2, 0, valeur_angle(180)); // position du servo 2 à 180°
delay(1000);
pwm.setPWM(servo1, 0, valeur_angle(0)); // position du servo 1 à 0°
pwm.setPWM(servo2, 0, valeur_angle(0)); // position du servo 2 à 0°
delay(1000);
}
// fonction permettant de calculer la largeur de l'impulsion du signal de commande en fonction de l'angle désiré
int valeur_angle(int angle)
{
int pulse_wide, analog_value;
pulse_wide = map(angle, 0, 180, pulse_min, pulse_max);
analog_value = int(float(pulse_wide) / 1000000 * frequence * 4096);
return analog_value;
}