RaspberryPi-Programmierung mit C#
Mit diesem kleinen Projekt sollen die GPIO-Pins eines Raspberry Pi mit einem C#-Programm angesteuert werden.
Auftrag
Eine LED, die an einem Pi angeschlossen ist, soll über einen Button in einer Windwos-Forms-Anwendung ein- und wieder ausgeschaltet werden können. Die LED wird über GPIO PIN7 und GND PIN6 angeschlossen. Vor der LED wird ein Widerstand (500 Ohm) geschaltet.
Vorgehen
- Lade die RaspberryPi.Net C# Bibliothek herunter und kompiliere sie. Es wird eine DLL in
bin/Debug
erzeugt. Diese wird benötigt, wenn wir aus C# heraus auf die GPIO des Pi zugreifen möchten. - Erstelle den Quellcode für den Button.
- Übertrage das fertige Projekt auf den Pi (z.B. mit scp) und teste es. Du kannst es dort wie folgt starten.
$ sudo mono Projekt/bin/Debug/Projekt.exe
FAQ
Warum lässt sich die C#-Bibliothek nicht mit xbuild
auf dem Pi kompilieren?
Es scheint ein Fehler in den locales zu sein. Quelle
Folgender Aufruf klappt:
$ LANG=en_GB.UTF-8 xbuild RaspberryPiDotNet.csproj
Warum wird der Namespace RaspberryPiDotNet
nicht gefunden?
Es fehlt der Verweis auf die entsprechende dll in den Projektverweisen.
Warum lässt sich mein Projekt unter MonoDevelop nicht erstellen?
Wieder ein Problem mit den locales. Du kannst monodevelop wie folgt starten.
$ LANG=en_GB.UTF-8 monodevelop
Lösung
Es folgt die Lösung für dieses Projekt. Probiere erst selbst aus, auf eine Lösung zu kommen, bevor du diesen Abschnitt liest.
using System; using Gtk; using RaspberryPiDotNet; public partial class MainWindow: Gtk.Window { // Der aktuelle Status, der angibt, ob die LED leuchten soll. bool bStatus; // Steuert einen GPIO über das Dateisystem an. GPIOFile led; public MainWindow() : base(Gtk.WindowType.Toplevel) { Build(); bStatus = false; lblStatus.Text = "Status: " + bStatus; // Pins konfigurieren // Es wird PIN7 auf einem RPi 2 gewählt led = new GPIOFile (GPIOPins.V2_Pin_P1_07); led.PinDirection = GPIODirection.Out; } protected void OnDeleteEvent(object sender, DeleteEventArgs a) { Application.Quit(); a.RetVal = true; } protected void OnBtnOnOffClicked (object sender, EventArgs e) { bStatus = !bStatus; lblStatus.Text = "Status: " + bStatus; if (bStatus) { led.Write (PinState.High); } else { led.Write (PinState.Low); } } }
Links
- GPIO ansteuern ist eine ausführliche Beschreibung dazu, wie GPIOs angesteuert werden können.
- RaspberryPi.Net ist C# Bibliothek zur Ansteuerung von GPIO aus C# heraus.