Wir wollen eine LED am Pin GPIO17 (wiringPi -> Pin 0, physisch -> Pin 11) mit Hilfe eines grafischen Interfaces (GUI) steuern. Pin 25 (physisch) ist ein Massepin.
Die Vorbereitungs-Maßnahmen für dieses kleine Projekt finden Sie hier.
Wir benutzen Code::Blocks als IDE (Entwicklungsumgebung) mit der Grafikbibliothek wxWidgets und dem GUI-Designer wxSmith.
Code::Blocks muss als Root über die Konsole gestartet werden - sonst bekommen wir keinen Zugriff auf die GPIO-Schnittstelle und die LED lässt sich später nicht steuern.
pi@raspberrypi: ~ $ sudo codeblocks
Wir starten dann ein neues Projekt mit wxWidgets / wxSmith namens LED_BLINK_02.
Wie das geht findet man hier. Es erscheint nun das wxWidgets-Demoprojekt mit zwei Buttons:
Das ist schon genau das, was wir brauchen, um die LED einzuschalten (oberer Button) und wieder auszuschalten (unterer Button).
Zuerst ändern wir das Textfeld von Welcome to wxWidgets in LED Control.
Dazu selektieren wir wStatic Text StaticText1. Dann erscheinen unten links im Fenster Management die Properties / Eigenschaften des Textfeldes. Wir müssen Label anklicken und ein Fenster Label erscheint, in dem wir den Text des Textfeldes ändern können auf LED Control (das kann natürlich auch ein anderer Text sein):
Dann ändern wir die Beschriftungen der beiden Buttons zu LED ON bzw. LED OFF.
Dann wählen wir den Button1 aus und klicken auf Events:
Wir wählen nun Add new handler aus.
-> Handler = Ereignisbehandlungsroutine (engl. listener, observer, event handler)
Daraufhin wird uns ein neuer event handler OnButton1Click vorgeschlagen. Wir bestätigen mit OK:
CodeBlocks öffnet daraufhin einen weiteren Tab mit der Beschriftung LED_BLINK_02Main.cpp:
Das ist der C-Programmcode unseres kleinen Fensters wxDialog mit den zwei Buttons.
Ganz unten im Code finden wir nun die Ereignisbehandlungsroutine / handler von Button1 (LED ON):
void LED_BLINK_02Dialog::OnButton1Click(wxCommandEvent& event)
{
}
Hier schreiben wir den Programmcode zum Einschalten unserer LED hinein: digitalWrite(0, HIGH):
void LED_BLINK_02Dialog::OnButton1Click(wxCommandEvent& event)
{
digitalWrite(0, HIGH);
}
Das bedeutet, dass der Pin 0 (nach der Zählung von wiringPi -> physisch Pin 11) auf HIGH (3,3V) gesetzt wird.
Nun müssen wir auch für Button2 (LED OFF) einen neuen Handler OnButton2Click erzeugen und schreiben dann im Programmcode ganz unten innerhalb der geschweiften Klammern der Ereignisbehandlungsroutine (event handler):
void LED_BLINK_02Dialog::OnButton2Click(wxCommandEvent& event)
{
digitalWrite(0, LOW);
}
Den darüber befindlichen (hier selektierten) Programmcode brauchen wir nicht und können ihn löschen:
Nun müssen wir noch die Bibliothek wiringPi anmelden. Dazu gehen wir im Tab mit dem Programmcode ganz nach oben und fügen eine dritte grüne include-Anweisung ein:
Nun muss noch die Initialisierung der GPIO-Schnittstelle eingetragen werden.
Das sind ganz unten die Zeilen:
wiringPiSetup();
pinMode(0, OUTPUT);
Sehen Sie den Schreibfehler im Screenshot? Sowas passiert...
Alle anderen Codezeilen dürfen wir aber nicht löschen oder verändern!
Nun starten wir Build - Build and Run und schauen mal, ob alles fehlerfrei kompiliert wird:
Wenn alles fehlerfrei kompiliert wurde, erscheint unsere kleine GUI (Grafisches Benutzerinterface) auf dem Bildschirm und wir können die LED nun komfortabel ein- und ausschalten.
kompletter Projektordner für Code::Blocks (zip-Datei, 240 kByte)
Nun wollen wir versuchen, ob das kleine LED-BLINK-Programm auch eigenständig läuft - also unabhängig von der IDE Code::Blocks.
Zuerst beenden wir Code::Blocks und starten die Konsole LXTerminal.
Dort geben wir nacheinander die folgenden Befehle ein:
Wenn alles klappt, dann erscheint wieder unsere kleine GUI zum Steuern der LED.
Anm.: Der Befehl sudo ./LED_BLINK_02 startet eine ausführbare Datei als Root. Ohne sudo funktioniert der Hardware-Zugriff auf die GPIO-Schnittstelle nicht! |
Da fällt mir noch etwas ein:
Es wäre ja mal interessant, zu testen, ob die Bibliothek wiringPi installiert sein muss, damit das Programm eigenständig läuft und auch die GPIO-Schnittstelle mit der LED gesteuert werden kann...
Dazu nimmt man am besten ein frisch aufgesetztes Raspbian, bei dem noch nichts zusätzlich installiert wurde... vielleicht später mal...
.