Externe Steuerung

  • Hallo zusammen,
    ich habe eine Frage bezüglich der Möglichkeiten der externen Steuerung meines Raspberry PI 3 Model B.
    Mein Ziel ist es, diesen von einem Steuerrechner zu steuern.
    Was für Möglichkeiten gibt es da?
    Ich habe davon gehört mittels HTML5 den RPI zu steuern, wie muss hier der PC mit dem RPI verbunden werden? Können auch CAN Nachrichten mit Hilfe des PICAN2 Moduls gesendet/empfangen werden?
    Und gibt es Möglichkeiten ein User Interface beispielsweise in C# zu erstellen?

    Vielen Dank für eure Hilfe,
    Liebe Grüße
    Annika

    • Offizieller Beitrag

    Der Pi ist kein Modellauto...fernsteuern klingt schrecklich. Was möchtest du denn von deinem SteuerPC aus am Pi verändern? Du kannst ein Userinterface in C# schreiben wenn du das möchtest und beherrschst. Solange beide Geräte im gleichen Netzwerk oder am Internet sind reicht das vollkommen aus.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Einmal editiert, zuletzt von dbv (2. August 2016 um 16:05)


  • Der Pi ist kein Modellauto...fernsteuern klingt schrecklich. Was möchtest du denn von deinem SteuerPC aus am Pi verändern? Du kannst ein Userinterface in C# schreiben wenn du das möchtest und beherrschst. Solange beide Geräte im gleichen Netzwerk oder am Internet sind reicht das vollkommen aus.

    Ich möchte GPIOs schalten und auslesen können.
    Außerdem will ich mit Hilfe des PICAN2 Moduls CAN Nachrichten senden und empfangen.
    Wie "verbinde" ich denn dann mein RPI mit meinem GUI, das ich in C# geschrieben habe? Gibt es da ein Tutorial oder ähnliches?

  • Aber das ist doch ein Skript direkt auf dem RPI.

    Also was ich gerne machen würde, ich will mir auf einem PC eine GUI in C# erstellen. Und wenn ich einen Button betätige, soll auf dem RPI ein vorher definiertes Skript ausgeführt werden.
    Es soll auch die Möglichkeit bestehen, eingegebene Werte aus der GUI dann im Skript zu verwenden.
    Funktioniert sowas?

    Danke schon mal

  • Ich verstehe den Sinn noch nicht so ganz.
    Du kannst per SSH auf den Pi zugreifen, sogar vnc funktioniert.
    Warum dann ein gui schreiben, die Befehle an den Pi senden bzw. von ihm empfangen soll?

    Einmal editiert, zuletzt von Lumumba (3. August 2016 um 13:25)

  • Klar geht das, aber ganz einfach wird das nicht. Ich könnte mir durchaus eine Art Client-/Server-Anwendung vorstellen. Der Raspi wäre dann der Server, welcher die GPIO Schnittstelle bedient und mit einem Listener auf die Befehle vom PC wartet. Auf dem PC hast du deine GUI-Anwendung als Client. Ist die Eingabe abgeschlossen sendest du die Daten an den Server, der die gewünschte Aktion ausführt und ggf. eine Antwort zurückschickt, d.h. du brauchst auch ein Protokoll mit dem sich die beiden verständigen können.

    Deinen Informationen entnehme ich, dass du C# kennst und bevorzugst. Du kannst auf dem Raspi unter Raspian auch Mono installieren und mit C# programmieren. Beispiele für Client-/Server-Anwendungen gibt es eigentlich genügend im Internet. Falls du Raspian Jessie als Betriebssystem verwendest, dann kannst du die Pins der GPIO mittels Device Tree lesen und setzen, d.h. im Prinzip schreibst du einfach eine 1 nach /sys/class/gpio/gpio17/value falls du das GPIO Pin 17 setzen willst. Da dies aber nicht das Pin 17 auf dem Stecker ist und die GPIO Ports auch noch initialisiert werden müssen wird das Ganze etwas komplexer. Das heisst du musst dich mit all dem Kram auseinandersetzen und ihn verstehen.

    Persönlich würde ich in etwa wie folgt vorgehen:
    1) Ich würde mich mit dem Thema GUI befassen, aber damit scheinst du ja schon zurechtzukommen.
    2) Zum Thema Client-/Server würde ich mir als Einstieg dem Microsoft Artikel Networking mit C# zu Gemüte führen um den Protocol-Stack und Socket-Programmierung zu verstehen.
    3) Da ich bereits von zwei Arten zur Ansteuerung der GPIO Pins gelesen habe, würde ich mich vorerst mit der für mich einfacheren Programmierung über den Device Tree befassen. Dazu gehe ich für das Verständnis von einfachen Beispielen auf der Command-Ebene, bzw. Shell Scripten aus. Einen wirklich guten Einstieg mit Links zur Programmierung gibt es hier: http://www.netzmafia.de/skripten/hardw…RasPi_GPIO.html
    4) Um den Schrecken mit den Pin-Belegungen zu verstehen und loszuwerden, würde ich mir noch den Raspberry Pi GPIO Pinout Guide zu Hilfe nehmen.

    Neugierig wie ich bin, würde ich natürlich noch weiter nach Erklärungen, Begriffen und Beispielen "googeln", wenn ich etwas nicht verstehe oder weiterführende Informationen brauche.

    Habe ich mal verstanden, wie es geht, dann fange ich ganz klein an und füge nach und nach dazu, was ich noch brauche.

    Ich stehe mit der von dir beschriebenen Thematik selbst ganz am Anfang und versuche ähnliches in Go (golang) zu realisieren. Ich habe am vergangenen Freitag mein erstes Bastelset (Sunfounder Super Kit 2.0 for Raspberry Pi) erhalten und inzwischen auch schon meine erste LED verbraten ;)

    Zu HTML 5: In dem Fall müsstest du eine Web-Serveranwendung auf dem Raspberry Pi schreiben und du würdest dann über einen Browser von deinem PC auf den Server zugreifen. Die grafische Oberfläche wäre dann als eine HTML 5 Seite (in der Regel bestehend aus HTML, CSS, Javascript) programmiert. Persönlich fängt mir dieser Ansatz an immer besser zu gefallen und ich bin mir recht sicher, dass die Zukunft eher weg vom klassischen GUI in diese Richtung geht. Hier ist noch ein Beispiel einer Demo Web-Anwendung mit PHP, zwar nicht HTML 5, das Prinzip ist aber dasselbe.

    Zur GPIO Programmierung: zum einen ist zu sagen, dass es verschiedene Libraries für C und Python gibt, welche die Programmierung erleichtern. Ich weiss nicht, ob es auch was es für C# gibt. Zum andern ist zu sagen, dass es unter Raspbian zwei Arten zur Ansteuerung der GPIO Schnittstelle gibt. Die eine geht nach dem Prinzip "alles ist eine Datei" über den Device Tree. In dem Fall wird mit Lese- und Schreibbefehlen über Pseudo-Dateien unter /sys/class/gpio auf die Schnittstelle zugegriffen. Mit der andern Methode wird über die Speicheradressen direkt auf Hardware-Register zugegriffen. Da diese Methode das Betriebssystem umgeht, würde ich persönlich dies nur für Funktionen anwenden, die über den Device Tree nicht verfügbar sind.

    Zu Mono und C#: ich weiss nicht, wie der aktuelle Stand ist, aber als ich vor ca. 8 Monaten auf dem Raspi angefangen habe zu programmieren und mit C# für Mono einen Server programmierte, da gab es zwei Probleme: zum einen funktionierten mit selbst-signierten Zertifikaten gesicherte Verbindungen nicht und zum andern hatte ich auf dem Raspi regelmässig einen Crash, wenn ich die Verbindung serverseitig beendete. Unter Windows liefen die Programme problemlos.

    Ich hoffe, dass ich ein paar Anregungen geben konnte und bin gespannt auf deine Lösung. Viel Spass!

  • Hallo Annika,

    herzlich Willkommen in unserem Forum!

    Was Du vorhast, lässt sich am leichtesten mit einem sog. Socket-Client und Socket-Server lösen.

    In diesem Fall wäre der PC der Socket-Server, der RPi der Socket-Client.

    Die Verbindung erfolgt über LAN / WLAN anhand der IP-Adresse. Der PC sendet über einen zuvor definierten Port ein Kommando, das Du Dir im Prinzip selber ausdenken kannst. Z.B. kann L17 bedeuten, das GPIO17 gelesen werden soll. Und S17 0 könnte bedeuten, dass GPIO17 auf Output und 0 gesetzt wird.

    Ein Programm auf dem RPi "lauscht" auf dem definierten Port. Und setzt die erhaltenen Kommandos entweder direkt über Features von C# / Mono um. Oder Du nutzt vorhandene GPIO-Bibliotheken oder Du setzt die Linux-Kommandos zum Schreiben der GPIOs / Lesen der GPIOS über system()-Kommandos ab.
    Möglichkeiten gibt es da einige.

    Eine andere Art der Kommunikation ist über die serielle Schnittstelle möglich.
    Der Server (PC) sendet Anfragen, der Client (RPi) interpretiert die Anfragen, setzt diese um und liefert ein Ergebnis oder bestätigt die Durchführung. Bei der seriellen sChnittstelle musst Du nur beachten, dass der RPi Pegel von max. 3,3 V sehen darf. Zwischen TxD des PC und dem RxD des RPi ist ein Pegelwandler oder ein Spannungsteiler (2 passend dimensierte Widerstände) einzusetzen. In der Richtung TxD des RPi zum RxD des PC brauchst Du normalerweise nichts zu tun, da das HIGH des RPi ausreicht, um ein HIGH beim PC zu bewirken. Wenn es da Probleme geben sollte, dann helfen da zwei Transistoren (z.B. BC547B und noch drei Widerstände) - oder ein Pegelwandler...

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (3. August 2016 um 16:51)


  • In diesem Fall wäre der PC der Socket-Server, der RPi der Socket-Client.

    Das sehe ich jetzt genau umgekehrt. Es ist der RPi der auf den PC wartet.

    Ich versuche gerade ansatzweise ein kleines Beispiel zu stricken, aber vor morgen Abend schaff ich das zeitlich nicht. Den Client mit einem Output und einem Input Pin (als Radio Buttons implementiert) habe ich schon.

    Wird durch anklicken der Status des Output Radio-Buttons geändert, so wird entsprechend eine Message an den Server geschickt. Der Input Radio-Button kann vom Benutzer nicht geändert werden. Ein Delegate empfängt den Status des Input Pins, das vom Server bei Änderungen an den Client geschickt wird und setzt entsprechend den Input Radio-Button. GUI und Logik habe ich schon fast fertig.

    Ich hoffe, dass ich morgen genügend Zeit finde um mein Beispiel fertig zu stellen.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!