Difference between revisions of "Split-flap display"
From Fixme.ch
(Added code and doc) |
|||
Line 23: | Line 23: | ||
The code is there (not pushed to any GIT): | The code is there (not pushed to any GIT): | ||
− | // Roue des minutes : | + | <code> // Roue des minutes : |
− | // Engrenage moteur avec 4 aimants, capteur à effet Hall sur la PCB a la verticale | + | // 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. | + | // 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) | + | // 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.print("Position actuelle : "); | ||
− | + | Serial.println(*current); | |
− | Serial.println( | + | 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) | |
{ | { | ||
− | // Step 5 | + | 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+3, LOW); | ||
digitalWrite(hms+2, HIGH); | digitalWrite(hms+2, HIGH); | ||
digitalWrite(hms+1, LOW); | digitalWrite(hms+1, LOW); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
digitalWrite(hms, LOW); | digitalWrite(hms, LOW); | ||
− | delay(tempo); | + | delay(tempo*2); |
− | + | ||
− | + | (*current)++; | |
− | + | if(*current >= 61) | |
− | + | *current = 0; | |
− | + | ||
− | + | ||
− | + | ||
} | } | ||
− | + | ||
− | // | + | // Stop motor |
digitalWrite(hms+3, LOW); | digitalWrite(hms+3, LOW); | ||
− | digitalWrite(hms+2, | + | digitalWrite(hms+2, LOW); |
digitalWrite(hms+1, LOW); | digitalWrite(hms+1, LOW); | ||
digitalWrite(hms, 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; | |
− | void loop() { | + | 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); | |
− | + | } | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
} | } | ||
} | } | ||
− | + | ||
+ | </code> |
Latest revision as of 23:37, 22 November 2013
Someone donated three flip flop to fixme, it would be good to make them work and display whatever we would like to.
Contents
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); } } }