Benutzer mit den meisten Antworten
C# Programm für Raspberry Pi erstellen

Frage
-
Hallo,
für die Hausbeleuchtung meiner Modelleisenbahn möchte ich einen Raspberry Pi verwenden. Um die Benutzerfreundlichkeit so hoch wie möglich zu machen, dachte ich mir ein C# Programm zu schreiben, auf den Raspberry kopieren und dort auszuführen. So weit so gut. Testprogramm ohne jegliche Funktionen erstellt, auf den Desktop vom Raspberry kopiert. Ich kann es auch mit Doppelklick ausführen und starten.
Nun kommt aber das eigentliche Problem. Ich möchte ja nun mal die GPIOs ansteuern. Eine passende Beispieldoku habe ich hier gefunden:
https://unosquare.github.io/raspberryio/#img-srchttpsgithubcomunosquareraspberryiorawmasterlogosraspberryio-logo-32pngimg-raspberryio---pis-hardware-access-from-net
Ich verstehe nur nicht den Programmteil. Ich brauche doch eigentlich noch eine Library für meine C# Umgebung. Oder habe ich da was falsch verstanden?
Vielen Dank für eure Hilfe
Florian
Nachtrag: Ich habe da noch was anderes gefunden.
https://github.com/AlexSartori/Raspberry-GPIO-Manager
Dort gibt es EIGENTLICH genau das was ich suche. Die Library habe ich in mein C# Programm eingebunden und den Code hinzugefügt.
static void Main(string[] args) { GPIOPinDriver led1; // Create the object. led1 = new GPIOPinDriver(GPIOPinDriver.Pin.GPIO4); // Set it as an output pin. led1.Direction = GPIOPinDriver.GPIODirection.Out // Give it power. led1.State = GPIOPinDriver.GPIOState.High; }
nur leider tut sich da gar nicht. Wenn ich das ganze in eine Buttonfunktion gebe bekomme ich die Fehlermeldung, dass ein GPIOPinDriver Obejct nicht gefunden wurde. Aber wie erstellt man sowas?
private void btneinschalten_Click(object sender, EventArgs e) { GPIOPinDriver led1; // Create the object. led1 = new GPIOPinDriver(GPIOPinDriver.Pin.GPIO4); // Fehlermeldung // Set it as an output pin. led1.Direction = GPIOPinDriver.GPIODirection.Out; // Give it power. led1.State = GPIOPinDriver.GPIOState.Low; }
- Bearbeitet Florian1234 Dienstag, 2. Februar 2021 23:02
Antworten
-
Die UI ist das User interface also das Programm was man sieht. Bei Linux und .NET Core ist es meist so das man schon das Linux ohne Desktop installiert und eine UI auf anderem Wege bereitstellt wie z.B. als Website die dann von jedem Device im Netzwerk aufgerufen kann
Ich habe für RPI und ASP.NET Core eine Anleitung geschrieben nur ist sie nicht mehr aktuell. Aktuell ist .NET 5
ASP.NET Core auf dem Raspberry Pi mit Linux, GPIO, PI Camera u.v.m
Sobald ich etwas jetzt habe werde ich sie aktualisieren
Gruß Thomas
Github- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 9. Februar 2021 09:07
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 19. Februar 2021 08:02
-
Genau so ist es. Du kannst natürlich auf dem PI selbst die Website öffnen und die Website nur über localhost betreiben. Dann ist das Programm auch nicht von außen erreichbar. Website funktionieren jetzt schon auf alle Devices. Es ist eigentlich unsinnig für jedes Betriebssystem oder Device wieder andere UI erstellen zu müssen.
Andere Möglichkeiten als die schon geschriebenen sind mir mit C# nicht bekannt.
Gruß Thomas
Github- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 9. Februar 2021 09:07
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 19. Februar 2021 08:02
Alle Antworten
-
Hallo Florian,
Mir sind zuerst die unterschiedlichen Gültigkeitsbereiche in Deinen zwei Codebeispielen aufgefallen: während im ersten die GPIOPinDriver-Instanz am Anfang der Main-Funktion erstellt wird und während der Ausführung dieser Funktion bestehen bleibt, wird sie bei btneinschalten_Click nur im Bereich dieses Ereignishandlers gültig sein, nach dessen Abschluss verworfen (disposed), sodass auf die GPIOPinDriver-Instanz nur während der Ausführung des Ereignishandlers (beim Klicken auf die Schaltfläche) zugegriffen werden kann.
Der veröffentlichte Code auf GitHub deutet auf die Angabe der Richtung als Out und des Zustandes als Low bereits bei Instanziierung mit nur einem Parameter hin, was auch Deinen Anforderungen entspricht, wie ich verstanden habe:
public GPIOPinDriver(Pin gpioPin) : this(gpioPin, GPIODirection.Out, GPIOState.Low) { }
Es wäre einen Versuch wert, einen größeren Bereich zu wählen und/oder den Kontruktor mit einem Parameter zu verwenden:
GPIOPinDriver led1; private void btneinschalten_Click(object sender, EventArgs e) { // Create the object. led1 = new GPIOPinDriver(GPIOPinDriver.Pin.GPIO4); }
Gruß,
DimitarBitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Hallo Florian,
man braucht keine fremde Lib um auf die GPIO zugreifen zu können. MS biete volle zugriff
Zudem auch fertigen Code für viele weitere Chips Device Bindings
Ich würde dir empfehlen das ganze mit ASP.NET Core zu entwickeln. Dann kannst Du die Steuerung auch vom Handy ausführen.
Ich habe z.B. eine Temperatursteuerung für einen Schmelzofen so entwickelt was echt super ist Oven
Gruß Thomas
Github -
Hallo,
vielen Dank für eure Antworten.
@Dimitar: Leider hat dein Vorschlag nicht funktioniert. Ich bekomme noch immer den gleichen Fehler.
@Thomas: Die Library hab ich gefunden. Aber leider keinen passenden Beispielcode der für den Raspberry passt.
-
Hallo Thomas,
ich benutze auf dem Pi das Betriebssystem Raspbian. Eine Steuerung mit dem Handy brauche ich nicht.
Mein Code sieht nun folgendermaßen aus:
using System; using System.Windows.Forms; using System.Device.Gpio; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btneinschalten_Click(object sender, EventArgs e) { var pin = 4; GpioController controller = new GpioController(); // Fehlermeldung controller.OpenPin(pin, PinMode.Output); controller.Write(pin, PinValue.High); } private void btnausschalten_Click(object sender, EventArgs e) { int pin = 4; GpioController controller = new GpioController(); // Fehlermeldung controller.OpenPin(pin, PinMode.Output); controller.Write(pin, PinValue.Low); } } }
Wenn ich das Programm nun auf dem PC starte läuft es erstmal ohne Probleme. Sobald ich aber ein Button drücke kommt die Fehlermeldung: System.NotSupportedException: "No GPIO controllers exist on this system."
Verwende ich das Programm auf dem Pi stürzt das Programm bim Button drücken ab.
- Bearbeitet Florian1234 Donnerstag, 4. Februar 2021 12:02
-
Du kannst WinForms, WPF oder UWP nicht auf Raspbian verwenden. Es geht nur .NET Core ohne UI. Programme mit UI erfordern DirectX was auf Raspbian nicht vorhanden ist. Die einzige Ausnahme ist WinForms mit Mono
Es gibt weitere Projekt mit dem man Apps für Linux mit C# und UI erstellen kann avalonia UNO
Ich persönlich arbeite mit ASP.NET Core und als UI Blazor (Website)
Die einfachste Lösung für dich wäre auf dem Raspberry PI Windows IoT Core zu installieren und darauf eine UWP App die mit dem System sofort startet. Es werden aber nur PIs bis 3B unterstützt. Modele ab 3B+ werden nicht unterstützt da hier seitens des Hersteller keine Treiber zur Verfügung stehen
Der einstieg in Win IoT Core und UWP ist recht einfach. Schau dir dazu die Doku an
Entwickeln einer App für dein Gerät
Vergewissere dich aber das Du eine empfohlene SD-Karte verwendest
Auf anderen SD-Karten kann es zu Problemen kommen
Gruß Thomas
Github -
Windows IoT ist dann für mich also nicht zu gebrauchen. Ich habe nämlich einen Pi4 :-(
Mono habe ich auf dem Pi am laufen. Deswegen kann ich auch die .exe Dateien ausführen. Ich habe es mit mehreren WinForms versucht (.NET Framework und .Net COre) Was meinst du mit UI?
Bin gerade dabei das Visual Studdio mit ASP.NET upzugraden. Mal sehen, ob das was bringt
-
Die UI ist das User interface also das Programm was man sieht. Bei Linux und .NET Core ist es meist so das man schon das Linux ohne Desktop installiert und eine UI auf anderem Wege bereitstellt wie z.B. als Website die dann von jedem Device im Netzwerk aufgerufen kann
Ich habe für RPI und ASP.NET Core eine Anleitung geschrieben nur ist sie nicht mehr aktuell. Aktuell ist .NET 5
ASP.NET Core auf dem Raspberry Pi mit Linux, GPIO, PI Camera u.v.m
Sobald ich etwas jetzt habe werde ich sie aktualisieren
Gruß Thomas
Github- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 9. Februar 2021 09:07
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 19. Februar 2021 08:02
-
Verstehe ich das richtig, das man dann als Endergebnis quasi eine Weboberflächse hat und das Programm mit dem Webbrowser ausgeführt wird?
Das ist dann eigentlich wie NodeRed. Sowas möchte ich aber nicht. Ich wollte ein eigenständiges Programm auf dem Pi laufen lassen
-
Genau so ist es. Du kannst natürlich auf dem PI selbst die Website öffnen und die Website nur über localhost betreiben. Dann ist das Programm auch nicht von außen erreichbar. Website funktionieren jetzt schon auf alle Devices. Es ist eigentlich unsinnig für jedes Betriebssystem oder Device wieder andere UI erstellen zu müssen.
Andere Möglichkeiten als die schon geschriebenen sind mir mit C# nicht bekannt.
Gruß Thomas
Github- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 9. Februar 2021 09:07
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 19. Februar 2021 08:02