Résolu Arduino 16 servos I2C

  • Auteur de la discussion Alex31
  • Date de début
A

Alex31

Compagnon
Bonjour à tous

j'essai de réaliser une manip avec
1 carte Atduino UNO
1 carte contrôleur PWM/Servo 16 canaux (12 bits) I2C interface.
la carte I2C interface est alimenté avec une alim 5V indépendante
le code se compile sans erreur, les includes sont bien ajouté

selon le lien
http://wiki.mchobby.be/index.php?title=AdaFruit_PWM_Driver

J'ai branché plusieurs servos (sortie 4,8,12,16)
mais rien ne bouge


lorsque je regarde le "moniteur série"
la 1ère ligne s'affiche: Serial.println("Controle des Servo Moteur #1 et #9!");
mais pas le reste des séquences

j'ai l'impression que le reste des instructions ne s"execute pas

voici mon code:
/***************************************************
Voici un exemple qui utilise breakout PWM Driver d'AdaFruit
(nom: Adafruit 16-channel PWM & Servo driver)
Ce programme de démonstration commande deux servo moteurs
(Un TowerPro Micro Servo SG90 et un TowerPro SG 5010).
Disponible sur le WebShop de MCHobby!
------> http://www.mchobby.be/

Cet exemple utilise la communication I2C pour communiquer avec le
breakout. 2 broches sont nécessaire pour réaliser cet interfaçage.
Pour Arduino UNOs, SCL -> Analogique 5, SDA -> Analogique 4

Basé sur l'exemple orginal de la librairie Adafuit_PWMServoDriver/Servo.uno

****************************************************
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
AdaFruit products!

Original demo written by Limor Fried/Ladyada for Adafruit Industries.
This sample and translation by MC Hobby (www.mchobby.be)
BSD license, all text above must be included in any redistribution
Cet exemple et traduction par MC Hobby (www.mchobby.be)
Licence BSD, tout le texte ci-dessus doit etre inclus dans toutes les redistributions.
****************************************************/

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

// Utilisation de l'adresse par défaut 0x40 du Breakout.
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver( 0x40 );

// Suivant le type de servo utilisé, la largeur d'impulsion minimale et Maximale
// peut changer. L'idéal est de sélectionner des valeurs aussi petites et aussi
// grande que possible sans jamais atteindre la butée de blocage du servo-moteur.
// Vous aurrez peut-etre besoin de modifier ces valeurs pour les faire correspondrent
// à votre type de servo!
#define SERVOMIN 150 // La longueur d'impulsion 'minimale' (valeur du compteur, max 4096)
#define SERVOMAX 600 // La longueur d'impulsion 'maximale' (valeur du compteur, max 4096)

// Servos Commandés - Numéro de sorties sur le breakout
uint8_t servo1 = 1;
uint8_t servo2 = 2;
uint8_t servo3 = 3;
uint8_t servo4 = 4;
uint8_t servo5 = 5;
uint8_t servo6 = 6;
uint8_t servo7 = 7;
uint8_t servo8 = 8;
uint8_t servo9 = 9;
uint8_t servo10 = 10;
uint8_t servo11 = 11;
uint8_t servo12 = 12;
uint8_t servo13 = 13;
uint8_t servo14 = 14;
uint8_t servo15 = 15;
uint8_t servo16 = 16;




void setup() {
Serial.begin(9600);
Serial.println("Controle des Servo Moteur #1 et #9!");

pwm.begin();
pwm.setPWMFreq(60); // Les servo sont mis-à-jour à ~60 Hz
Serial.println("Fin de setup()");
}

void loop() {
//--- Controle du Premier Servo (no 1) ---
Serial.println("Servo #1 à 45 degrés");
// Transformation de degré (0 à 180) en pulse (SERVOMIN à SERVOMAX)
int pulseLen = map( 45, 0, 180, SERVOMIN, SERVOMAX );
pwm.setPWM(servo1, 0, pulseLen);
pwm.setPWM(servo2, 0, pulseLen);
pwm.setPWM(servo3, 0, pulseLen);
pwm.setPWM(servo4, 0, pulseLen);
pwm.setPWM(servo5, 0, pulseLen);
pwm.setPWM(servo6, 0, pulseLen);
pwm.setPWM(servo7, 0, pulseLen);
pwm.setPWM(servo8, 0, pulseLen);
delay(1000);
//--- Controle du Deuxieme Servo (no 9) ---
Serial.println("Servo #9 à 30 degrés");
pulseLen = map( 30, 0, 180, SERVOMIN, SERVOMAX );
pwm.setPWM(servo9, 0, pulseLen);
pwm.setPWM(servo10, 0, pulseLen);
pwm.setPWM(servo11, 0, pulseLen);
pwm.setPWM(servo12, 0, pulseLen);
pwm.setPWM(servo13, 0, pulseLen);
pwm.setPWM(servo14, 0, pulseLen);
pwm.setPWM(servo15, 0, pulseLen);
pwm.setPWM(servo16, 0, pulseLen);
delay(1000);

//--- Controle du Premier Servo (no 1) ---
Serial.println("Servo #1 à 120 degrés");
// Transformation de degré (0 à 180) en pulse (SERVOMIN à SERVOMAX)
pulseLen = map( 120, 0, 180, SERVOMIN, SERVOMAX );
pwm.setPWM(servo1, 0, pulseLen);
pwm.setPWM(servo2, 0, pulseLen);
pwm.setPWM(servo3, 0, pulseLen);
pwm.setPWM(servo4, 0, pulseLen);
pwm.setPWM(servo5, 0, pulseLen);
pwm.setPWM(servo6, 0, pulseLen);
pwm.setPWM(servo7, 0, pulseLen);
pwm.setPWM(servo8, 0, pulseLen);
delay(1000);

//--- Controle du Deuxieme Servo (no 9) ---
Serial.println("Servo #9 à 150 degrés");
pulseLen = map( 150, 0, 180, SERVOMIN, SERVOMAX );
pwm.setPWM(servo9, 0, pulseLen);
pwm.setPWM(servo10, 0, pulseLen);
pwm.setPWM(servo11, 0, pulseLen);
pwm.setPWM(servo12, 0, pulseLen);
pwm.setPWM(servo13, 0, pulseLen);
pwm.setPWM(servo14, 0, pulseLen);
pwm.setPWM(servo15, 0, pulseLen);
pwm.setPWM(servo16, 0, pulseLen);
delay(1000);
//--- Les deux servo à 0 ---
Serial.println("Servo #1 et #9 à 150 degrés");
pulseLen = map( 0, 0, 180, SERVOMIN, SERVOMAX );
pwm.setPWM(servo1, 0, pulseLen);
pwm.setPWM(servo2, 0, pulseLen);
pwm.setPWM(servo3, 0, pulseLen);
pwm.setPWM(servo4, 0, pulseLen);
pwm.setPWM(servo5, 0, pulseLen);
pwm.setPWM(servo6, 0, pulseLen);
pwm.setPWM(servo7, 0, pulseLen);
pwm.setPWM(servo8, 0, pulseLen);
pwm.setPWM(servo9, 0, pulseLen);
pwm.setPWM(servo10, 0, pulseLen);
pwm.setPWM(servo11, 0, pulseLen);
pwm.setPWM(servo12, 0, pulseLen);
pwm.setPWM(servo13, 0, pulseLen);
pwm.setPWM(servo14, 0, pulseLen);
pwm.setPWM(servo15, 0, pulseLen);
pwm.setPWM(servo16, 0, pulseLen);
delay(3000);
}
 
J

jpbbricole

Compagnon
Bonjour Alex31

J'ai copié et collé ton code et ça été l'émeute au sein des servos connectés:lol:
Ton code marche impecable!
Cherche du côté câblage.
Essayes avec l'alimentation par le connecteur en bout du circuit et avec un seul servo.

Cordialement
jpbbricole
 
Dernière édition:
A

Alex31

Compagnon
Ah, ok

j'esseairai ça demain
ce soir, je n"aurai pas la possibilité

et quand le code s'exécute, est-ce que "moniteur série" affiche plusieurs lignes?
 
A

Alex31

Compagnon
Bjr

j'ai refait mon montage, et maintenant ça marche!

le moniteur série affiche bien les lignes au fil de l'exécution du programe

j"ai pas compris où était le PB

Merci à tous

PS: je vais utiliser ce montage avec 16 micro servo SG90, pour piloter une gare caché dans mon futur réseau de train HO
 

Sujets similaires

V
Réponses
3
Affichages
1 189
vibram
V
01power
Réponses
3
Affichages
13 952
01power
01power
D
Réponses
9
Affichages
3 085
David80
D
taratata
Réponses
4
Affichages
4 341
taratata
taratata
V
Réponses
62
Affichages
39 455
Dardar88
Dardar88
V
Réponses
4
Affichages
2 979
wika58
wika58
V
Réponses
7
Affichages
2 018
vibram
V
J
Réponses
18
Affichages
4 456
jpbbricole
J
Haut