8. Dezember 2011
![YouTube Preview Image](http://img.youtube.com/vi/lqKZuAdnxpc/0.jpg)
Technisches
Die Funktion der Startrampe ist folgendermassen aufgebaut: Im schwarzen Trichter, welcher die Pinpong Kugel auffängt ist ein Lichtsensor verbaut, welcher ab einem gewissen Wert die Startrampe in Gang setzt. Nach der LED Animation, welcher über 2 seriell geschaltete Shift-Register gesteurt wird, setzt sich der Servo in Bewegung und läst so die Schlaufe los. Durch das Gewicht wird die Schlaufe nach vorne geszogen uns reist so den Papierflieger mit. Stösst der Papierflieger auf die Landebahn, wird der Impuls von einem Piezo-keramischen Sensor aufgefangen und mittels zwei Drähten an das Arduino der nächsten Grupper weitergeleitet.Code Startrampe:
// Includes #include <Servo.h> // Pins #define SERVO 5 #define LIGHT 0 #define REG_LATCH 8 #define REG_CLOCK 12 #define REG_DATA 11 // Constants #define DEBOUNCE 1000 #define ANIMATION_PACKS 40 #define ANIMATION_DELAY_START 200 #define REWIND_DELAY 2000 #define LIGHT_TRESHHOLD 30 // Objects Servo servo; // Variables boolean hasReleasedOnce = false; unsigned long lastReadFromLight = 0; boolean doRelease = false; boolean doRewind = false; boolean doAnimate = false; unsigned long releaseTime = 0; int animationDelay = 0; int animationPacks = 0; boolean animateRow = true; unsigned long lastAnimationChange = 0; int animationStep = 0; // Rows int row1a = B00001101; int row1b = B00000000; int row2a = B00100010; int row2b = B00000010; int row3a = B11000000; int row3b = B00000001; int row4a = B00010000; int row4b = B00000000; // Cols int col1a = B01010001; int col1b = B00000010; int col2a = B00111000; int col2b = B00000001; int col3a = B10010110; int col3b = B00000000; // Off int allOn = B11111111; int allOff = B00000000; // Setup Routine void setup() { // Setup Serial Serial.begin(9600); Serial.println("SETUP"); // Attach Servo servo.attach(SERVO); // Rewind Servo servo.write(0); Serial.println("REWIND SERVO TO 0"); // Prepare Shift Register pinMode(REG_LATCH,OUTPUT); pinMode(REG_CLOCK,OUTPUT); pinMode(REG_DATA,OUTPUT); // Clear Shift Register off(); } void loop() { // Check Button if(millis() - lastReadFromLight > DEBOUNCE && analogRead(LIGHT) < LIGHT_TRESHHOLD && !doAnimate && !hasReleasedOnce) { Serial.println("HAS BUTTON -> START ANIMATION"); doAnimate = true; lastReadFromLight = millis(); animationDelay = ANIMATION_DELAY_START; animationStep = 0; animationPacks = 0; } // Check for Animation if(doAnimate) { // In Animation? if(animationPacks < ANIMATION_PACKS) { // New Change? if(millis() - lastAnimationChange > animationDelay) { // Set lastAnimationChange = millis(); // Debug Serial.println("CHANGE ANIMATION"); // Is Animating Row? if(animateRow) { switch(animationStep) { case 1: row1(); break; case 2: row2(); break; case 3: row3(); break; case 4: row4(); break; } if(animationStep == 4) { Serial.println("SPEEDUP ANIMATION"); animationStep = 0; animationDelay -= 5; animationPacks++; animateRow = false; } else { animationStep++; } } else { switch(animationStep) { case 1: col1(); break; case 2: col3(); break; case 3: col2(); break; } if(animationStep == 3) { Serial.println("SPEEDUP ANIMATION"); animationStep = 0; animationDelay -= 5; animationPacks++; animateRow = true; } else { animationStep++; } } } } else { Serial.println("FINISH ANIMATION"); on(); doAnimate = false; doRelease = true; releaseTime = millis(); } } // Check for Release if(doRelease) { // Release Servo Serial.println("RELEASE SERVO"); servo.write(180); doRelease = false; doRewind = true; } // Check for Rewind if(millis() - releaseTime > REWIND_DELAY && doRewind) { // Rewind Servo Serial.println("REWIND SERVO"); servo.write(0); doRewind = false; off(); hasReleasedOnce = true; } } void row1() { digitalWrite(REG_LATCH,0); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,row1b); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,row1a); digitalWrite(REG_LATCH,1); } void row2() { digitalWrite(REG_LATCH,0); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,row2b); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,row2a); digitalWrite(REG_LATCH,1); } void row3() { digitalWrite(REG_LATCH,0); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,row3b); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,row3a); digitalWrite(REG_LATCH,1); } void row4() { digitalWrite(REG_LATCH,0); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,row4b); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,row4a); digitalWrite(REG_LATCH,1); } void off() { digitalWrite(REG_LATCH,0); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,allOff); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,allOff); digitalWrite(REG_LATCH,1); } void on() { digitalWrite(REG_LATCH,0); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,allOn); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,allOn); digitalWrite(REG_LATCH,1); } void col1() { digitalWrite(REG_LATCH,0); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,col1b); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,col1a); digitalWrite(REG_LATCH,1); } void col2() { digitalWrite(REG_LATCH,0); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,col2b); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,col2a); digitalWrite(REG_LATCH,1); } void col3() { digitalWrite(REG_LATCH,0); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,col3b); shiftOut(REG_DATA,REG_CLOCK,MSBFIRST,col3a); digitalWrite(REG_LATCH,1); }
Landebahn Code:
// Pins #define PIEZO 0 #define SOUND 6 #define OUT 2 #define LED1 8 #define LED2 10 // Constants #define TRESHHOLD 25 #define BLINK_SPEED 500 // Variables unsigned long lastLEDChange = 0; boolean isActive = false; boolean isOn = false; // Setup Routine void setup() { // Set Pin Modes pinMode(SOUND,OUTPUT); pinMode(OUT,OUTPUT); pinMode(LED1,OUTPUT); pinMode(LED2,OUTPUT); // Default digitalWrite(OUT,LOW); } // Loop Routine void loop() { // Read int in = analogRead(0); // Check if(in > TRESHHOLD) { // Set Active isActive = true; } // Check for Activeness if(isActive) { // Write Out digitalWrite(OUT,HIGH); // Set LED's digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); // Play Sound tone(SOUND,110); delay(100); tone(SOUND,220); delay(100); tone(SOUND,440); delay(100); tone(SOUND,880); delay(100); noTone(SOUND); delay(2000); // Write Out digitalWrite(OUT,LOW); // Turn Off isActive = false; } else { if(millis() - lastLEDChange > BLINK_SPEED) { if(isOn) { digitalWrite(LED1,HIGH); digitalWrite(LED2,LOW); isOn = false; } else { digitalWrite(LED1,LOW); digitalWrite(LED2,HIGH); isOn = true; } lastLEDChange = millis(); } } }