Split-flap display

From Fixme.ch
Jump to: navigation, search

Someone donated three flip flop to fixme, it would be good to make them work and display whatever we would like to.

Circuit board

Controller

8 bit micro Full datasheet : File:MC68HC705P6A-7151.pdf

T bridge

basically switch the power Full datasheet : File:DSA-60676.pdf

Manual driving

Principle

The stepper-motors can be driven directly by an Arduino powering the coils properly. The Arduino output is low-power so the motor needs to be driven in "high-torque" mode, ie. 2 coils at a time. That is to say, instead of having the magnetic field going N > E > S > W, it goes NE > SE > SW > NW.

To lower the electrical stress on the Arduino, it would be great to drive the motors with H-Bridges (or maybe T-bridge like in the original design).

Show me the code

The code is there (not pushed to any GIT):

// Roue des minutes :

 //   Engrenage moteur avec 4 aimants, capteur à effet Hall sur la PCB a la verticale
 //   Il faut compter 79 passages pour faire un tour de flaps. Vérifier s'il y a une dérive.
 //   Conclusion pour afficher le bon nombre : mapper 79*4 pas sur 62 positions (00->60 + blancs)
 
 // Tempo du moteur pas à pas
 #define tempo 14
 
 #define SEC 10
 #define MIN 6
 #define HOR 2
 
 unsigned int h = 0, m = 0, s = 0;
 unsigned int hM = 0, mM = 0, sM = 0;
 
 void setup() {
   // Define outputs
   for(int i=0; i<12; i++)
     pinMode(i+1, OUTPUT);
   Serial.begin(9600);
   Serial.setTimeout(30*1000);
 }
 
 void rot(unsigned char hms, unsigned int target)
 {
   // Demande invalide
   if((hms != SEC && hms != MIN && hms != HOR) || target > 60)
   {
     Serial.println("Incorrect !");
     return;
   }
   
   // Flap 00 > 29 : numéros
   // Flap 30      : blanc
   // Flap 31 > 60 : numéros-1
   // Flap 61      : blanc
 
   // Position actuelle
   unsigned int* current;
        if(hms == SEC) current = &s;
   else if(hms == MIN) current = &m;
   else                current = &h;
   
   Serial.print("Position actuelle : ");
   Serial.println(*current);
   Serial.print("Target : ");
   Serial.println(target);
 
   // Action !
   // On flip les flaps tant qu'on est pas arrivé à destination
   Serial.print("Action sur les pins ");
   Serial.print(hms+3);
   Serial.print(", ");
   Serial.print(hms+2);
   Serial.print(", ");
   Serial.print(hms+1);
   Serial.print(", ");
   Serial.println(hms);
   
   while(*current != target)
   {
     Serial.print("Position actuelle : ");
     int lol = *current;
     Serial.println(lol);
     
     for(int i = 0; i<4; i++)
     {
       // Step 5
       digitalWrite(hms+3, LOW);
       digitalWrite(hms+2, HIGH);
       digitalWrite(hms+1, LOW);
       digitalWrite(hms, HIGH);
       delay(tempo);
     
       // Step 7
       digitalWrite(hms+3, HIGH);
       digitalWrite(hms+2, LOW);
       digitalWrite(hms+1, LOW);
       digitalWrite(hms, HIGH);
       delay(tempo);
 
       // Step 1
       digitalWrite(hms+3, HIGH);
       digitalWrite(hms+2, LOW);
       digitalWrite(hms+1, HIGH);
       digitalWrite(hms, LOW);
       delay(tempo);
 
       // Step 3    
       digitalWrite(hms+3, LOW);
       digitalWrite(hms+2, HIGH);
       digitalWrite(hms+1, HIGH);
       digitalWrite(hms, LOW);
       delay(tempo);
     }
 
     // Demi-step pour faire tomber le flap, mais pas 2
     digitalWrite(hms+3, LOW);
     digitalWrite(hms+2, HIGH);
     digitalWrite(hms+1, LOW);
     digitalWrite(hms, LOW);
     delay(tempo*2);
 
     (*current)++;
     if(*current >= 61)
       *current = 0;
   }
   
   // Stop motor
   digitalWrite(hms+3, LOW);
   digitalWrite(hms+2, LOW);
   digitalWrite(hms+1, LOW);
   digitalWrite(hms, LOW);
   
   Serial.println("Done");
 }
 
 void loop() {
   if (Serial.available() > 0) {
     unsigned char b = Serial.read();
     if(b == 'h' || b == 'm' || b == 's')
     {
       int roue;
       if(b == 'h') roue = HOR;
       else if(b = 'm') roue = MIN;
       else roue = SEC;
       Serial.print("Roue selectionnee : ");
       Serial.println(roue);
       int nb = Serial.parseInt();
       Serial.println(nb);
       rot(roue,nb);
     }
     else if(b == 'w')
     {
       Serial.println("Give me 3 values !");
       h = Serial.parseInt();
       m = Serial.parseInt();
       s = Serial.parseInt();
     }
     else if(b == '+')
     {
       rot(MIN,m+1);
     }
   }
 }