Aus Raspberry Pi Geek 04/2018

Einen Kubus aus 125 LEDs mit dem RasPi steuern (Seite 2)

Achtung: Sie dürfen die Betriebsspannung (3,3-Volt-Anschlüsse) des Raspberry Pi und der LEDs keinesfalls zusammenschließen; die Massenleitungen hingegen müssen Sie miteinander verbinden. Als externe Spannungsquelle eignet sich zum Beispiel ein stabilisiertes Steckernetzteil mit einer Ausgangsspannung von 5 bis 12 Volt.

In Tabelle “GPIO-Belegung” finden Sie noch einmal eine Übersicht, welche Komponente der Schaltung an welchem GPIO-Pin des Raspberry Pi hängt. Sie benötigen diese Informationen sowohl beim Löten der Platine als auch später beim Programmieren. Die Platinen selbst verdrahten Sie in Fädeltechnik (siehe Kasten “Fädeltechnik”). Je nachdem, wie akkurat Sie fädeln, kann das Verlöten viele Stunden in Anspruch nehmen. Sicherheitshalber sollten Sie daher alle Verbindungen durchmessen, bevor Sie den Aufbau in Betrieb nehmen: Bei einem solchem Aufbau schleicht sich schnell ein Fehler ein, der das Gesamtkunstwerk dann lahmlegt.

GPIO-Belegung

GPIO

Schaltung

0

D1 an allen 74HC574

1

D2 an allen 74HC574

2

D3 an allen 74HC574

3

D4 an allen 74HC574

4

D5 an allen 74HC574

5

Transistor GND1

6

Transistor GND2

7

Transistor GND3

8

Transistor GND4

9

Transistor GND5

10

Output Enable OE

11

Clock 74HC574 #1

12

Clock 74HC574 #2

13

Clock 74HC574 #3

14

Clock 74HC574 #4

15

Clock 74HC574 #5

Kasten Fädeltechnik

Bei der Fädeltechnik handelt es sich um ein Verfahren, mit dem man Prototypen elektronischer Schaltungen auf Lochrasterplatinen erstellen kann. Die Basis dafür bilden mit einem speziellen Lack ummantelte Kupferdrähte, die Fäden. Der Lack verbrennt, sobald er mit heißem Lot in Berührung kommt; nach Abkühlen der Lötstelle bildet sich eine leitende Verbindung zwischen Lot und Kupferdraht.

So weit die Theorie – in der Praxis passiert es allerdings oft, dass der Lack nicht so schnell schmilzt, wie man es gerne hätte. In diesem Fall entstehen elektrisch nicht leitende Verbindungen. Folgende Tipps helfen Ihnen das zu verhindern:

  • Verzinnen Sie die Drahtenden vor dem eigentlichen Verlöten. Das hilft generell beim Arbeiten mit dieser Technik.
  • Drehen Sie die Temperatur des Lötkolbens hoch. Bei höherer Temperatur verbrennt der Lack schneller, allerdings erhitzen sich dabei das Zinn und alle Bauteile ebenfalls stärker. Bei thermisch empfindlichen Halbleitern sollten Sie dies daher vermeiden. Auch IC-Sockel verformen sich, sobald sie zu heiß werden. Das führt später beim Einstecken der Chips zu Problemen. Auch bei zu hoch erhitztem Lötzinn besteht die Gefahr, dass es sich verändert und instabile Lötstellen entstehen.
  • Verlängern Sie alternativ die Lötdauer. Das hat allerdings ähnliche Nebenwirkungen wie das Löten bei hoher Temperatur. Zudem kann langes Heizen dazu führen, dass sich die Kupferpunkte von der Platine lösen.

Um ein Gefühl zu bekommen, wann der Lack schmilzt und die Verbindung gelingt, sollten Sie generell das Verlöten der Fäden ein wenig üben. Messen Sie auf jeden Fall nach dem Löten alle Verbindungen durch. Damit kontrollieren Sie, ob alle Lötstellen in Ordnung sind und der Strom wie gewünscht fließt.

Go installieren

Nach dem Aufbau der Hardware bereiten Sie den Raspberry Pi für die folgenden Beispielprogramme vor. Laden Sie dazu die aktuelle Version von Raspbian Lite herunter und schreiben Sie das Image auf eine SD-Karte. Die Wahl fällt auf die Lite-Variante, weil diese kaum Ballast beinhaltet. Beim Cube-Projekt kommt es darauf an, den Code mit möglichst wenig Störungen durch andere Programme auszuführen. Nach dem Booten von der SD-Karte aktualisieren Sie das System und installieren die Programmiersprache Go sowie die benötigen Bibliotheken (Listing 1).

Listing 1

 

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install golang git wiringpi
$ mkdir /home/pi/go/cube -p
$ export GOPATH=/home/pi/go
$ go get -d -u github.com/stianeikeland/go-rpio

Die Umgebungsvariable GOPATH muss immer gesetzt sein, wenn Sie mit Go arbeiten. Möchten Sie sich etwas intensiver mit Go beschäftigen, fügen Sie das Export-Kommando daher am besten einfach der Datei ~/.bashrc im Home-Verzeichnis des Benutzers pi hinzu. Auf diesem Weg lädt das System die Variable automatisch bei jedem Login.

Testprogramm

Mit dem ersten Testprogramm prüfen Sie nun, ob die Schaltung fehlerfrei funktioniert. Speichern Sie dazu den Inhalt von Listing 2 als test.go ab. Beim Aufruf schaltet es nach und nach jede LED einzeln an und wieder aus; auf Multiplexing verzichtet es noch. Um bei Fehlern in der Hardware einen Anhaltspunkt zu bekommen, was genau nicht funktioniert, gibt das Programm dabei die aktuellen Werte der Variablen auf dem Bildschirm aus.

Listing 2

 

package main
import (
  "fmt"
  "github.com/stianeikeland/go-rpio"
  "time"
)
var gpio[16] rpio.Pin
func gndOn(gnd int) { gpio[gnd+4].High()}
func gndOff(gnd int) { gpio[gnd+4].Low() }
func outputEnable() { gpio[10].Low() }
func outputDisable() { gpio[10].High() }
func clock(cl int) {
  gpio[cl+10].High()
  time.Sleep(time.Nanosecond * 100)
  gpio[cl+10].Low()
}
func resetAll(){
  for i:=0; i<5; i++ { gpio[i].Low() }
  for i:=1; i<6; i++ { clock(i) }
  for i:=1; i<6; i++ { gndOff(i) }
}
func main() {
  if err := rpio.Open(); err != nil {fmt.Println(err)}
  defer rpio.Close()
  pins := [16]int{17,18,27,22,23,24,25,4,2,3,8,7,10,9,11,14}
  for i:=0 ; i<16 ; i++ {
    gpio[i] = rpio.Pin(pins[i])
    gpio[i].Output()
    gpio[i].Low()
  }
  resetAll()
  outputEnable()
  for gnd:=1 ; gnd<6 ; gnd++ {
    gndOn(gnd)
    for line:=1 ; line<6 ; line++ {
      for led:=0 ; led<5 ;led++ {
        gpio[led].High()
        fmt.Print("led:"); fmt.Println(led)
        fmt.Print("line:"); fmt.Println(line)
        fmt.Print("gnd:"); fmt.Println(gnd)
        clock(line)
        time.Sleep(time.Millisecond * 200)
        gpio[led].Low()
        clock(line)
      }
    }
    gndOff(gnd)
  }
}

Es kann vorkommen, dass in den 74HC574 noch alte Daten liegen. Mit der Funktion resetAll() setzen Sie deshalb den Kubus zunächst einmal komplett auf null. Die Funktion clock() erzeugt einen Impuls auf der entsprechenden Taktleitung, um die Daten in den Zwischenspeicher zu laden. Alle übrigen Hilfsfunktionen besitzen sprechende Namen.

Am Anfang der main() erzeugt das Programm ein rpio-Objekt, über das Sie auf die GPIO des Raspberry Pi zugreifen können. Die Bibliothek verwendet dazu unschönerweise die BCM-Pinnummern. Das Array pins übersetzt diese wieder in die von der WiringPi-Bibliothek gewohnten Bezeichnungen.

Die folgende Schleife setzt die ersten 15 GPIO-Anschlüsse auf den Output-Modus und schaltet sie auf Low. Um den Kubus dann in einen definierten Anfangszustand zu bringen, rufen Sie resetAll() auf. Mit enableOutput() schaltet das System dann den Inhalt der Zwischenspeicher zu den LEDs durch.

Die drei ineinandergeschachtelten Schleifen in main() durchlaufen jede Position des Kubus und lassen eine einzelne LED für eine halbe Sekunde leuchten. Die Werte der einzelnen Variablen geben die Zeilen im Kern der Schleifen aus. Sollten einzelne LEDs nicht aufleuchten, können Sie sich die Fehlersuche erleichtern, indem Sie die Leuchtzeit verlängern. Passen Sie dazu die Codezeile time.Sleep(time.Millisecond * 200) entsprechend an.

Die Funktion clock() übernimmt dann das Übertragen der Daten in den Zwischenspeicher. Der erste Aufruf schreibt die logische Eins in den Zwischenspeicher; die LED geht daraufhin an. Ein zweiter Aufruf von clock() löscht den Speicher wieder, die LED geht aus. So schaltet die Routine nach und nach alle Leuchtdioden des Kubus durch.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 8 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