none
C# Programm für Raspberry Pi erstellen RRS feed

  • 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
    Dienstag, 2. Februar 2021 13:01

Antworten

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ß,
    Dimitar


    Bitte 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.

    Mittwoch, 3. Februar 2021 09:18
    Administrator
  • Hallo Florian,

    man braucht keine fremde Lib um auf die GPIO zugreifen zu können. MS biete volle zugriff 

    System.Device.Gpio

    IoT Github

    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

    Mittwoch, 3. Februar 2021 14:02
  • 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.

    Mittwoch, 3. Februar 2021 18:22
  • Im Github Projekt gibt es doch Samples z.B. LED Blink

    Wenn Du auf dem Raspberry PI Windows IoT nutzt muss der Code etwas anders aussehen hello-blinky


    Gruß Thomas
    Github

    Mittwoch, 3. Februar 2021 20:16
  • 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
    Donnerstag, 4. Februar 2021 11:56
  • 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

    Einrichten deines Geräts

    Entwickeln einer App für dein Gerät

    Vergewissere dich aber das Du eine empfohlene SD-Karte verwendest 

    Speichermedien

    Auf anderen SD-Karten kann es zu Problemen kommen


    Gruß Thomas
    Github

    Donnerstag, 4. Februar 2021 16:19
  • 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

    Freitag, 5. Februar 2021 13:23
  • 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

    Freitag, 5. Februar 2021 15:12
  • 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

    Freitag, 5. Februar 2021 17:37
  • 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

    Freitag, 5. Februar 2021 19:19