l’Arduino et SD21 : ou comment obtenir 21 PWM avec une arduino

sd21

24 mar l’Arduino et SD21 : ou comment obtenir 21 PWM avec une arduino

La carte SD21 est à l’origine un contrôleur de servo moteur avec 21 canal. Le taux de rafraichissement est de 20ms et ce quelques soit le nombre de moteur commandé. La SD21 est commandé via un bus I2C.

Il est donc tout à fait possible de commander la SD21 à partir de l’Arduino et ainsi augmenter le nombre de sortie PWM.


Alimentation de la carte SD21

Il est possible d’alimenter la SD21 de deux façons :

  • Soit en utilisant une alimentation de 5V pour le processeur de la carte, et une alimentation séparée comprise entre 6 et 7,2V pour les asservissements.
  • Soit avec une seule alimentation de 5V. Pour cela, il faut placer un jumper sur les cavaliers à côté du bornier.

Sortie PWM de la SD21

Les sorties sont disponibles au bord de la carte SD21.
La masse se trouvant le plus proche à l’extérieur de la carte SD21.

Le processeur de la SD21

Le cœur de la SD21 est une puce PIC18F2220 pré-programmés. On y accède via le bus I2C à l’adresse 0xC2 ($ C2) par l’une des options de commande ci-dessus.  Il possède trois registres internes associés à chacun des 21 sorties PWM.

Register Servo Function Register Servo Function Register Servo Function
0 1 Speed 24 9 Speed 48 17 Speed
1 1 Low byte 25 9 Low byte 49 17 Low byte
2 1 High byte 26 9 High byte 50 17 High byte
3 2 Speed 27 10 Speed 51 18 Speed
4 2 Low byte 28 10 Low byte 52 18 Low byte
5 2 High byte 29 10 High byte 53 18 High byte
6 3 Speed 30 11 Speed 54 19 Speed
7 3 Low byte 31 11 Low byte 55 19 Low byte
8 3 High byte 32 11 High byte 56 19 High byte
9 4 Speed 33 12 Speed 57 20 Speed
10 4 Low byte 34 12 Low byte 58 20 Low byte
11 4 High byte 35 12 High byte 59 20 High byte
12 5 Speed 36 13 Speed 60 21 Speed
13 5 Low byte 37 13 Low byte 61 21 Low byte
14 5 High byte 38 13 High byte 62 21 High byte
15 6 Speed 39 14 Speed 63 -
16 6 Low byte 40 14 Low byte 64 - Software version
17 6 High byte 41 14 High byte 65 - Battery Volts
18 7 Speed 42 15 Speed
19 7 Low byte 43 15 Low byte
20 7 High byte 44 15 High byte
21 8 Speed 45 16 Speed
22 8 Low byte 46 16 Low byte
23 8 High byte 47 16 High byte

L’impulsion PWM de la carte SD21

L’octet de poids fort et l’octet de poids faible permettent de définir un nombre sur 16 bits définissant la largeur d’impulsion du signal PWM.

Réglage de la vitesse de transition entre deux largeur d’impulsion PWM

Le registre de vitesse contrôle la vitesse à laquelle se déplace le servo à sa nouvelle position.  Si le registre de vitesse est égale à zéro (0x00), le servo est simplement mis à la position désirée. Si le registre de vitesse est réglé sur autre valeure que zéro, alors la valeur est ajoutée à la position actuelle toutes les 20ms jusqu’à ce que la position cible soit atteinte.

Si vous souhaitez passer de 1000 à 2000 avec le registre de vitesse est fixée à 10, il va prendre 2 secondes pour atteindre la position définie. La formule pour le temps qu’il faudra pour faire le changement est :
((position cible- position de dé&part)/Registre de vitesse)*20mS

Voici quelques exemples:

Position de départ Position cible Vitesse Reg Temps pour le changement
2000 1000 10 2000ms (2sec)
1000 2000 2000 10 2000ms (2sec)
1000 2000 2000 1 20000ms (20sec)
1000 2000 2000 100 200mS (0.2sec)
1234 1987 1987 69 220mS (0.22Sec)

Numéro de révision du logiciel

Le registre 64 est le numéro de révision du logiciel.

Tension de la batterie

Le registre 65 contient la tension de la batterie servo dans 39mV unités jusqu’à un maximum de 10V.  Il est mis à jour toutes les 20 ms.

Adresse de la SD21

Le module SD21  est situé à l’adresse 0xC2 sur le bus I2C.

Code Arduino permettant de commander via SD21 de l’allumage ainsi que l’extension progressive d’une led

#include <Wire.h>

#define address 0x61 // Adresse SD21
#define servo 0x43 // PWM 5

void setup() {
  Wire.begin();
  Wire.beginTransmission(address);
  Wire.send(0x0C);  // Sélection vitesse Servo 5
  Wire.send(0x0A);
  Wire.endTransmission();
}

void loop() {
  Wire.beginTransmission(address);
  Wire.send(0x0D); // écriture du low bit
  Wire.send(0x01);
  Wire.endTransmission();
  delay(20);
  Wire.beginTransmission(address);
  Wire.send(0x0E); // écriture du hight bit
  Wire.send(0x00);
  Wire.endTransmission();
  delay(5000);
  Wire.beginTransmission(address);
  Wire.send(0x0D);
  Wire.send(0xD0);
  Wire.endTransmission();
  delay(20);
  Wire.beginTransmission(address);
  Wire.send(0x0E);
  Wire.send(0x07);
  Wire.endTransmission();
  delay(5000);
}

Schéma de connection Arduino et SD21

Be Sociable, Share!
Tags:
,
No Comments

Post A Comment