Aus Raspberry Pi Geek 02/2020

Halloween 2019 – Erfolge und Rückschläge beim Elektronik-Basteln (Seite 2)

Ein Blick auf den Schaltplan (Abbildung 1) zeigt, wie Sensoren und Motoren für das Förderband sowie der Treiber für die Leuchtdioden zusammenarbeiten. Die LEDs benötigen eine Betriebsspannung von 5 Volt, die GPIO des Raspberry Pi liefert aber nur 3,3 Volt. Daher schalten Sie zwischen RasPi und WS2812 einen Treiberbaustein, der die Spannung erhöht. Dazu kommt der SN74HCT125 TTL zum Einsatz. Beachten Sie, dass der Baustein eine Spannungsversorgung benötigt, die aber über die GPIO des RasPi erfolgen kann.

Abbildung 1: Der Schaltplan für den Halloween-Automaten.

Abbildung 1: Der Schaltplan für den Halloween-Automaten.

Bei den LEDs des WS2812 handelt es sich um programmierbare Dioden, die 16 777 216 verschiedene Farben beherrschen. Sie bestehen intern aus drei einzelnen Leuchtdioden für Rot, Grün und Blau. Jede der drei Farben steuern Sie über ein Byte an und mischen auf diese Weise die drei Grundfarben beliebig. Die drei Bytes gelangen über ein Schieberegister in die LED, das hierbei verwendete Protokoll ist sehr zeitkritisch. Eine Hochsprache wie Python eignet sich dazu also eigentlich nicht. Es gibt aber eine Python-Bibliothek, die auf Assembler-Code zurückgreift, um die Daten zu übertragen.

Der Einsatz eines Schieberegisters erlaubt es, fast beliebig viele dieser LEDs als eine lange Kette anzusteuern. Am RasPi benötigen Sie zum Ansteuern immer nur einen GPIO-Pin, egal, wie viele LEDs die Kette enthält. Aber nicht jeder beliebige Pin ist dafür geeignet, da er bestimmte Timing-Eigenschaften benötigt. Genauere Informationen hierüber finden Sie auf der Homepage des Bibliotheksprojekts [3].

Bei maximaler Leuchtstärke nimmt eine LED bis zu 60 Milliampere auf, was Sie beim Dimensionieren des Netzteils beachten sollten. Falls Sie die Helligkeit nicht ganz so hoch drehen, genügt der 5-Volt-Ausgang des PiXtend (100 mA), um die Bausteine mit Strom zu versorgen. Reicht das nicht aus, dann schalten Sie beide 5-Volt-Ausgänge parallel, um auf 200 mA zu kommen.

Sie verbinden das Pixtend mit den LEDs über ein spezielles Flachbandkabel (Abbildung 2), das den GPIO-Pin 32 herausführt. Bei Bedarf können Sie es leicht selbst herstellen.

Abbildung 2: Über ein Flachbandkabel schließen Sie die WS2812-LEDs an das PiXtend an.

Abbildung 2: Über ein Flachbandkabel schließen Sie die WS2812-LEDs an das PiXtend an.

Software

Um möglichst schnell mit dem Programmieren starten zu können, verwenden Sie am besten das vorkonfigurierte Python-Image von der PiXtend-Webseite [4]. Achten Sie darauf, dass es zum verwendeten PiXtend-Modell passt. Suchen Sie dazu auf der Seite für das jeweilige Gerät nach der Überschrift PiXtend Python Library – darunter finden Sie dann das passende Image.

Haben Sie das Image heruntergeladen und auf eine SD-Karte geschrieben, steht Ihnen die PiXtend Python Library (PPL) direkt zur Verfügung. Sie brauchen nur noch die Bibliothek zum Ansteuern der WS2812-LEDs zu installieren. Alle hierfür nötigen Schritte fassen die ersten acht Zeilen von Listing 1 zusammen. Um zu testen, ob die Installation der Bibliothek geklappt hat, nutzen Sie anschließend das Programm strandtest.py (Zeile 9 und 10).

Listing 1

$ cd ~
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install build-essential python-dev python-pip unzip wget scons swig
$ wget https://github.com/jgarff/rpi_ws281x/archive/master.zip  unzip master.zip
$ cd rpi_ws281x-master
$ sudo scons
$ sudo pip install rpi_ws281x
$ cd ~/rpi_ws281x-master/python
$ sudo PYTHONPATH=".:build/lib.linux-armv7l-2.7" python examples/strandtest.py

Im Quellcode treffen Sie bei Bedarf unterschiedliche Einstellungen für die LEDs, unter anderem über den Parameter LED_BRIGHTNESS für die Helligkeit der Dioden. Hier sollten Sie einen möglichst geringen Wert wählen, da die LEDs bei voller Lichtstärke reichlich Strom aufnehmen und sich dadurch aufheizen.

Ansteuern

Das Programm ws.py (Listing 2) steuert die Augen und den Mund. Am Anfang des Programms finden Sie eine Übersetzungstabelle (TRANSLATE), die es ermöglicht, linear auf die einzelnen LEDs zuzugreifen. Wie eingangs bereits erwähnt sind die LEDs eigentümlich auf den Panels verbaut.

Die Informationen, welche LED schaltet, stecken in der Datei data.bin; einen Ausschnitt daraus zeigt Listing 3. Dort kommen quasi Bit-Muster zum Einsatz, um die LEDs anzusteuern. Hier dürfen Sie beliebig viele Muster hinterlegen, die das Programm ws.py nacheinander an die LEDs sendet. Es liest dabei die Datei zeilenweise ein und wandelt die Daten in Kommandos für die LEDs um. Eine Leerzeile leitet ein neues Bit-Muster ein; mit einer Raute eingeleitete Kommentarzeilen überspringt das Programm.

Listing 2

import time
from neopixel import *
import argparse
LED_COUNT      = 384
LED_PIN        = 12
LED_FREQ_HZ    = 800000
LED_DMA        = 10
LED_BRIGHTNESS = 16
LED_INVERT     = False
LED_CHANNEL    = 0
TRANSLATE = [0, 15, 16, 31, 32, 47, 48, 63, 64, 79, 80, 95, 96, 111, 112, 127, 128, 143, 144, 159, 160, 175, 176, 191, 192, 207, 208, 223, 224, 239, 240, 255, 256, 271, 272, 287, 288, 303, 304, 319, 320, 335, 336, 351, 352, 367, 368, 383, 1, 14, 17, 30, 33, 46, 49, 62, 65, 78, 81, 94, 97, 110, 113, 126, 129, 142, 145, 158, 161, 174, 177, 190, 193, 206, 209, 222, 225, 238, 241, 254, 257, 270, 273, 286, 289, 302, 305, 318, 321, 334, 337, 350, 353, 366, 369, 382, 2, 13, 18, 29, 34, 45, 50, 61, 66, 77, 82, 93, 98, 109, 114, 125, 130, 141, 146, 157, 162, 173, 178, 189, 194, 205, 210, 221, 226, 237, 242, 253, 258, 269, 274, 285, 290, 301, 306, 317, 322, 333, 338, 349, 354, 365, 370, 381, 3, 12, 19, 28, 35, 44, 51, 60, 67, 76, 83, 92, 99, 108, 115, 124, 131, 140, 147, 156, 163, 172, 179, 188, 195, 204, 211, 220, 227, 236, 243, 252, 259, 268, 275, 284, 291, 300, 307, 316, 323, 332, 339, 348, 355, 364, 371, 380, 4, 11, 20, 27, 36, 43, 52, 59, 68, 75, 84, 91, 100, 107, 116, 123, 132, 139, 148, 155, 164, 171, 180, 187, 196, 203, 212, 219, 228, 235, 244, 251, 260, 267, 276, 283, 292, 299, 308, 315, 324, 331, 340, 347, 356, 363, 372, 379, 5, 10, 21, 26, 37, 42, 53, 58, 69, 74, 85, 90, 101, 106, 117, 122, 133, 138, 149, 154, 165, 170, 181, 186, 197, 202, 213, 218, 229, 234, 245, 250, 261, 266, 277, 282, 293, 298, 309, 314, 325, 330, 341, 346, 357, 362, 373, 378, 6, 9, 22, 25, 38, 41, 54, 57, 70, 73, 86, 89, 102, 105, 118, 121, 134, 137, 150, 153, 166, 169, 182, 185, 198, 201, 214, 217, 230, 233, 246, 249, 262, 265, 278, 281, 294, 297, 310, 313, 326, 329, 342, 345, 358, 361, 374, 377, 7, 8, 23, 24, 39, 40, 55, 56, 71, 72, 87, 88, 103, 104, 119, 120, 135, 136, 151, 152, 167, 168, 183, 184, 199, 200, 215, 216, 231, 232, 247, 248, 263, 264, 279, 280, 295, 296, 311, 312, 327, 328, 343, 344, 359, 360, 375, 376]
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
strip.begin()
f = open("data.bin","rt")
data=f.readlines()
bitcounter=0
image=2
for line in data:
  if len(line)<3:
    bitcounter=0
    image=image+1
    strip.show()
    time.sleep(0.1)
  if not(line.find("#")):
    continue
  bits = line.split(" ")
  for bit in bits:
    bit=bit.strip()
    if len(bit) > 0:
      if bit=='1':
        strip.setPixelColor(TRANSLATE[bitcounter], Color(0,255,0))
      else:
        strip.setPixelColor(TRANSLATE[bitcounter], Color(0,0,0))
      bitcounter=bitcounter+1
f.close

Listing 3

# 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
# 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0

Programm

Das eigentliche Programm zur Ansteuerung des Automaten finden Sie in Listing 4. Es fragt kontinuierlich die Eingänge des PiXtend ab und startet abwechselnd die Förderbänder, sobald die Lichtschranke auslöst. Parallel zum Start der Bänder ruft es zwei zusätzliche Programme auf: zum einen das zum Ansteuern der LEDs, zum anderen das Play-Kommando mit dem passenden Gruselsound.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 7 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben