Split-flap display

From Fixme.ch
Revision as of 23:33, 22 November 2013 by Greg (Talk | contribs) (Added code and doc)

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

  1. define tempo 14
  1. define SEC 10
  2. define MIN 6
  3. 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);
   }
 }

}