====== 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 ===== - Baue die Schaltung auf dem Steckbrett auf. \\ {{:schule:prog:rpi-schaltung.png|}} - Lade die [[https://github.com/cypherkey/RaspberryPi.Net/|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 ein Projekt und eine GUI nach dem folgenden Vorschlag. \\ {{:schule:prog:rpi-programmierung-gui-screenshot.png|}} - Binde die RPi-DLL als Verweis in dein Projekt ein. \\ {{:schule:prog:rpi-prigrammierung-verweise.png|}} - Erstelle den Quellcode für den Button. - Übertrage das fertige Projekt auf den Pi (z.B. mit [[debman>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. [[https://github.com/cypherkey/RaspberryPi.Net/issues/27#issuecomment-76073166|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 ===== * [[http://raspberrypiguide.de/howtos/raspberry-pi-gpio-how-to/|GPIO ansteuern]] ist eine ausführliche Beschreibung dazu, wie GPIOs angesteuert werden können. * [[https://github.com/cypherkey/RaspberryPi.Net/|RaspberryPi.Net]] ist C# Bibliothek zur Ansteuerung von GPIO aus C# heraus.