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.

Benötigte Bauteile:
# 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 €

 

Benötigte Werkzeuge:
# Bezeichnung
1 Lötkolben und Ätzset (Lochrasterplatine nicht empfohlen)
1 Pfeile
1 Programmer, z.B. ArduinoISP (siehe hier)
1 Bohrmaschine / Standbohrer
1 Heißklebepistole

 

  1. 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:

  2. 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);
    }

     

  3. 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.
  4. 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.
  5. 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: