Halloween Bastelprojekt

Dieses Jahr habe ich mit Jan einen Kürbis aus Pappkarton gebaut, der von innen mit zwei WS2812b RGB LEDs beleuchtet wird. Die Ansteuerung haben wir mit einem Attiny85 umgesetzt, den wir mit Arduino programmiert haben. Der Attiny85 kostet ca. 90 Cent, die WS2812b vielleicht 50 Cent pro Stück. Alles in allem liegen die Materialkosten – inklusive dem Programmer – deutlich unter 10 Eur. Also ganz viel Spaß für wenig Geld.

Die Grundform des Kürbis haben wir aus DIN A4 Fotokarton ausgeschnitten. Ebenso die Seitenwände.

Grundform aus Fotokarton

Im Inneren haben wir dann die beiden RGB LEDs angebracht und die Kabel durch ein Loch auf der Rückseiten nach aussen geführt. Auf dem Steckbrett links neben der Grundform sieht man den Prototypen der Schaltung zur Ansteuerung der LEDs.

Grundform mit RGB LEDs und Schaltung auf dem Steckbrett

Mit tatkräftiger Unterstützung von Jan haben wir dann die Grundform mit farbigem Kopierpapier beklebt, um einen schönen Kürbis in leuchtenden Farben zu erhalten.

Jan bei der Arbeit

Um Augen, Nase und Mund entsprechend abzudecken sind wir in der Küche auf die Suche gegangen. Dort haben wir Butterbrotpapier gefunden. Das ist halbtransparent und bricht das Licht schön, sodass die Ausschnitte später als leuchtende Flächen erscheinen.

Teilweise beklebter Kürbis mit Butterbrotpapier in den Ausschnitten

Nachdem wir die Grundform fertig gestellt hatten, war es an der Zeit die Steuerung in eine “richtige” Schaltung zu verwandeln. Diese haben wir gemeinsam auf eine kleine Platine gelötet. Man sieht den Attiny85 in der Mitte, rechts oben Kondensatoren und links am Attiny den Pullup Widerstand für den Reset PIN. Die obere Pin-Leiste links ist für den Akku, die Buchsenleisten darunter für den Anschluß der LEDs im Kürbis. Die Steuerleitung liegt in der Mitte an, oben ist Minus (VSS) und unten Plus (VDD). Den Akku haben wir von einem Modellauto ausgeliehen. Der Akku hat 4.8V und 3000mAh. Damit kann man den Kürbis für eine lange Zeit betreiben.

Unsere Schaltung

Unsere Schaltung sieht schematisch ungefähr so aus. Wobei wir im alten Fritzing keinen Folienkondensator gefunden haben. Daher haben wir einen Kerko genommen. Der Folienkondensator hat 10nf, der Elko 100uF, der Pullup-Widerstand ist 10kOhm und die WS2812b haben bei uns eine deutlich kleinere Platine.

Schaltung schematisch

Da Jan aus der MakerAG bereits mit Arduino vertraut ist, haben wir auf diese Plattform zurückgegriffen. Auf GitHub findet man einen entsprechenden Arduino Core für die Attiny Serie. Das Projekt ist aktiv maintained und die Installation und Verwendung ist dort gut dokumentiert. Die Einrichtung war also kein Problem. Lediglich die Übertragung des Programms auf den Attiny stellte noch eine kleine Hürde dar. Da wir den einzelnen Chip im Einsatz haben, braucht es einen ISP Programmer um das Programm auf den Attiny zu überspielen. In der Bastelkiste waren noch ein paar China-Klone, die ich vor einiger Zeit bestellt hatte. Leider haben diese nicht auf Anhieb unter Ubuntu 20.04 und in Arduino 1.8.13 funktioniert. Aber mit einiger Recherche im Netz war es möglich, diese auf USBasp von Thomas Fischl umzurüsten. Dazu schreibe ich vielleicht die Tage noch einen eigenen Artikel. Damit kann man den Attiny85 dann direkt aus der Arduino-Oberfläche programmieren.

Attiny85 am 3 Euro ISP Programmer

Der Code selber ist sehr einfach gehalten, da Jan ihn auch verstehen soll. Ausserdem haben ihm die in den Beispielen aufgezeigten Lichteffekte schon so gut gefallen, dass er gar nicht viel daran ändern wollte. Die Bibiliothek tinyNeoPixel ist bereits Bestandteil des oben erwähnten Attiny Core von SpenceKonde und kann direkt verwendet werden. Und letztlich wurde es auch schon dunkel, sodass der Kürbis dringend zum Einsatz kommen sollte 🙂

#include <tinyNeoPixel.h>

#define PIN PB3
#define NUM_PIX 2

tinyNeoPixel strip = tinyNeoPixel(NUM_PIX, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show();
}

void loop() {
  rainbowCycle(20);
  theaterChaseRainbow(50);
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on
      }
      strip.show();
      delay(wait);
      for (uint16_t i=0; i< strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0); //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Und das hier ist am Ende dabei heraus gekommen. Wir sind zufrieden und stolz.

Jan und Daniel zu Halloween 2020

Leave a Reply