Matrice d'électroaimants

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.

Test d'un aimant

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.

Circuit de commande

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);
}