In diesem Artikel wird der Bau eines Würfels mit einem ATtiny85 und sieben LEDs beschrieben. Auf Zufallszahlen wird komplett verzichtet.
Das "Würfeln" geschieht folgendermaßen:
Der Benutzer hält einen Taster gedrückt. Während dessen wechseln sich die Zahlen von 1-6 im 15 Millisekunden Abstand ab. Wird die Taste losgelassen, wird der aktuelle Würfelwert angezeigt. Das folgende Video zeigt das im Detail:
Dabei werden insbesondere die Sleep und Interrupt Methoden verwendet.
# | Bezeichnung | ~Preis |
1 | ATMEL ATtiny85 (Alternativ ATtiny 45) | 1,00 € |
7 | Widerstand 100 Ohm | 0,14 € |
7 | LEDs (ohne Nennenswerte Leistung) | 0,35 € |
1 | IC-Sockel mit 8 Pins | 0,20 € |
1 | Batteriehalterung für CR2032 | 0,50 € |
1 | Knopfzelle CR2032 | 0,30 € |
1 | Taster | 0,50 € |
~ 3 € |
# | Bezeichnung |
1 | Lötkolben und Ätzset (Lochrasterplatine nicht empfohlen) |
1 | Pfeile |
1 | Programmer, z.B. ArduinoISP (siehe hier) |
1 | Bohrmaschine / Standbohrer |
1 | Heißklebepistole |
-
Als erstes solltet ihr die Platine ätzen. Der Aufbau auf einer Lochrasterplatine ist natürlich möglich, sieht aber beim besten willen nicht so gut aus.
Hier befindet sich das Layout als Fritzing-Datei:
Hinweis: Ich habe vor dem Drucken noch die Massenfüllung durchgeführt.
Das ganze sieht dann so aus:
-
Als nächste müsst ihr den ATtiny85 mit dem folgenden Code flashen. Eine Beschreibung dazu gibt es in dieser FAQ.
/* LED-Wuerfel PIN-Out: A A B C B A A */ // Includes #include <avr/sleep.h> // Pins #define PIN_A 0 #define PIN_B 3 #define PIN_C 4 #define PIN_WAKE 1 // Interrupt PIN // Variables int current_random = 1; boolean goToSleep = true; #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif void setup(){ pinMode(PIN_A, OUTPUT); pinMode(PIN_B, OUTPUT); pinMode(PIN_C, OUTPUT); pinMode(PIN_WAKE,INPUT); sbi(GIMSK,PCIE); // Turn on Pin Change interrupt sbi(PCMSK,PCINT1); // Which pins are affected by the interrupt all(HIGH); delay(1000); all(LOW); delay(1000); } void loop(){ goToSleep=true; while(digitalRead(PIN_WAKE) == HIGH) { all(LOW); if(current_random == 1){ digitalWrite(PIN_C, HIGH); } else if(current_random == 2){ digitalWrite(PIN_B, HIGH); } else if(current_random == 3){ digitalWrite(PIN_B, HIGH); digitalWrite(PIN_C, HIGH); } else if(current_random == 4){ digitalWrite(PIN_A, HIGH); } else if(current_random == 5){ digitalWrite(PIN_A, HIGH); digitalWrite(PIN_C, HIGH); } else if(current_random == 6){ digitalWrite(PIN_A, HIGH); digitalWrite(PIN_B, HIGH); } delay(15); current_random++; if(current_random == 7) current_random = 1; } for (int i=0; i < 1000; i++){ delay(10); if(digitalRead(PIN_WAKE) == HIGH){ goToSleep = false; break; } } if(goToSleep){ all(LOW); system_sleep(); } } // From http://interface.khm.de/index.php/lab/experiments/sleep_watchdog_battery/ void system_sleep() { cbi(ADCSRA,ADEN); // Switch Analog to Digital converter OFF set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode sleep_mode(); // System sleeps here // sbi(ADCSRA,ADEN); // Switch Analog to Digital converter ON } ISR(PCINT0_vect) { } void all(int value){ digitalWrite(PIN_A, value); digitalWrite(PIN_B, value); digitalWrite(PIN_C, value); }
- Nun lötet die sieben 100 Ohm Widerstände und LEDs auf. Achtet dabei insbesondere auf die Polarität: Die eckigen PINs der LEDs sind die Anoden, die runden die Kathoden.
- Als letztes lötet ihr die Knopfzellenhalterung von oben auf. Dabei habe ich kleine Metalldrähte verwendet, die von den Nachbarlöchern aus dorthin zeigen.
-
Um die Knopfzellenhalterung zu fixieren, habe ich sie mit Heißkleber an die Platine geklebt. Um einer Entladung der Batterie vorzubeugen, habe ich ein kleines Pappstück als Schalter verwendet:
Kommentare
Gruss Klaus