Nous avons commencé à réparer une matrice d'électroaimants amenées par Vincent. Le but est de l'automatiser avec un arduino et de s'en servir pour contrôler un fluide magnétique.
Afin de ne pas risquer d'endommager les bobines, qui ont un certain age, nous avons commencé par déterminer la tension maximale d'alimentation.
Nous avons mesuré la résistance d'une des bobine et trouvé 23 ohm. Nous souhaitons limiter la puissance à 1Watt. Grâce à la formule P=U²/R, nous déduisons la tension max : 4V.
Le circuit est basé sur un driver de leds 7-segments : le SAA1064.
Le driver communique en i2c. La première étape est de suivre les pistes pour savoir où connecter l'arduino. Les physiciens de l'UPMC qui ont conçu ce circuit, nous ont simplifié la vie : on trouve sur le bord de la carte, 4 connecteurs femelles correspondant à SCL, SDA, +5V, GND.
La datasheet du driver nous indique que l'on peut choisir l'adresse i2c du driver et ainsi en commander jusqu'à 4 sur le même bus i2c. Il suffit pour cela de changer la tension sur la patte ADR du driver.
Là encore les concepteurs du circuit ont rendus cela paramétrable grâce à 3 cavaliers qui réalisent des combinaisons de 3 résistances (10kOhm, 22kohm, 18kohm). On peut déterminer quel cavalier sélectionne quelle adresse avec la formule du diviseur de tension : R2/(R1+R2).
Avant de tester sur le circuit de la matrice, nous testons le driver sur un circuit trouvé dans la boîte (surement le circuit d'origine du driver), qui possède 4 afficheurs 7 segments.
Nous utilisons le code Arduino suivant:
/* * Programme de Test pour le projet * matrice d'electroaimants */ #include "Wire.h" // Bibliothèque I2C pour Arduino byte saa1064 = 0x70 >> 1; // Adresse I2C du driver (le décallage est important) // Codes pour les chiffres de 0 à 9 et les caractères de A à F int digits[16] = {63, 6, 91, 79, 102, 109, 125,7, 127, 111, 119, 124, 57, 94, 121, 113}; void setup() { Wire.begin(); // On lance le bus delay(500); initDisplay(); } void initDisplay() { Wire.beginTransmission(saa1064); Wire.write(B00000000); // Le prochain byte est le byte de contrôle Wire.write(B01000111); Wire.endTransmission(); } void displayDigits() { // Affiche les chiffre de 0 à 9 plus les caractères A à F for (int z=0; z<16; z++) { Wire.beginTransmission(saa1064); Wire.write(1); // On envoi des données Wire.write(digits[z]); // digit 1 (RHS) Wire.write(digits[z]); // digit 2 Wire.write(digits[z]); // digit 3 Wire.write(digits[z]); // digit 4 (LHS) Wire.endTransmission(); delay(500); } // Affiche les chiffre de 0 à 9 plus les caractères A à F, avec un point for (int z=0; z<16; z++) { Wire.beginTransmission(saa1064); Wire.write(1); // On envoi des données Wire.write(digits[z]+128); // digit 1 (RHS) Wire.write(digits[z]+128); // digit 2 Wire.write(digits[z]+128); // digit 3 Wire.write(digits[z]+128); // digit 4 (LHS) Wire.endTransmission(); delay(500); } } void clearDisplay() { Wire.beginTransmission(saa1064); Wire.write(1); // On envoi des données Wire.write(0); // digit 1 (RHS) Wire.write(0); // digit 2 Wire.write(0); // digit 3 Wire.write(0); // digit 4 (LHS) Wire.endTransmission(); } void loop() { displayDigits(); clearDisplay(); delay(1000); }