GPI auf Monitor signalisieren

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    ich wollte mir ein kleines Teil programmieren und hoffe, es ist auch einfach umzusetzen da ich noch recht weit am Anfang stehe. Nur bevor ich mir wieder etwas aneigne was am Ende dann doch das falsche ist, würde ich gerne einen Anhaltspunkt haben:

    Ich möchte verschiedene GPI Signale (Schalter) auf einem Monitor im Fullscreen darstellen. Sprich, es sind z.B. acht Felder mit Bezeichnung welche erstmal alle auf grün stehen bei geschlossenem Schalter dann aber auf Rot springen bzw. Aufblinken. Dazu vielleicht in der Mitte noch ein Logo/Bild und eine Digital Uhr. Letzteres aber erst, wenn ich mal so weit bin.

    Nun meine Fragen:

    1. Kann ich das als Anfänger hinbekommen?
    2. Welche Programmiersprache ist da von vorteil? Gehts mit Python (lern ich gerade)
    3. GUI und Linux - hatte ich im Grunde noch nie was mit zu tun, ich min Consolen-Fan ;)
    4. Kann mir hierbei wer unter die Arme greifen bzw am Anfang "Schützenhilfe" geben?
    5. Muss ich auf nem RPI programmieren oder kann ich es auch am Laptop unter VMWare und einer anderen Linux Distribution? (Wie gesagt, was das angeht absoluter Anfänger)


    Würde mich über Infos freuen

    Frannek

  • Hallo erstmal.

    Also wenn du noch Anfänger bist, ist das eine nicht zu unterschätzende Aufgabe.
    Ich persönlich würde das nicht mit Python realisieren.
    Aber das ist reine Geschmackssache.

    Zumindest wenn du es mit Python machst,
    kannst du es direkt auf dem Board machen.

    Ich würde dir zu C,C++ raten, erstens gibt es Toolchains für Windows,
    z.B. hier Toolchain und hier ein tutorial dazu LINK

    und es bringt dir für die zukunft mehr, den dann erlernst du
    grundlegende Konzepte der Entwicklung, die du auf jeder Platform anwenden kannst.

    Auf jeden Fall, da werden mir auch andere hier zustimmen, solltest du
    Dich noch mehr in die Thematik einarbeiten,
    bevor du loslegst.


    Grüße und viel Erfolg …
    Andreas

    Einmal editiert, zuletzt von Teamdevel (6. August 2013 um 11:37)

  • Moin Frannek,

    das kommt jetzt darauf an, was genau Deine Zielsetzung ist.
    Wenn es nur um die Anzeige der GPIOs geht, kannst Du genauso gut webiopi verwenden oder Teile davon abkupfern.
    Du kannst auch das gpio Programm von wiringPi verwenden, um IOs auszulesen bzw. zu setzen. das ist ein ganz normaler Kommandozeilen-Befehl, den Du z.B. mit exec() aus PHP aufrufen kannst.

    Also: wenn es drum geht, dem Hype zu folgen um das, was der Nachbar hat (nämlich einen RPi der seine GPIOs auf den BS ausgibt) auch zu haben - und zwar noch schöner und besser, dann setz auf vorhandene Tools und lass das mit dem Programmieren.

    Wenn es drum geht, mal schnell was zusammen zu zaubern, dann lass das mit dem Programmieren. Lern nebenbei ein paar script- oder was weiss ich Grundlagen, und versuch einfach mit Unterstützung der Community irgendwas zusammen zu frickeln.

    Wenn es Dir ernsthaft darum geht, in die Programmierung einzusteigen, dann hatte ich vor längerer Zeit hier mal einen ellenlangen Vortrag geschrieben. Der könnte evtl. ganz interessant für Dich sein. Zudem wirst Du im Forum zu diesem Thema noch jede Mange andere Statements und Meinungen finden (Suchfunktion -> Einsteiger).

    Doch zu Deinen Fragen:
    1) das hängt nur von Dir selbst ab.
    2) s.o.
    3) wie kann man konsolen-fan sein, wenn man nie damit zu tun hatte?
    4) hier gibt es sicherlich genügend schlaue Köpfe
    5) du kannst alles sonstwo programmieren ... aber GPIOs sind RPi spezifisch

    cu,
    -ds-

  • Sorry, aber um einfach nur bunte Kästchen auf den Schirm zu bringen braucht man kein c++ zu studieren oder fünf Libraries zu installieren.
    Den Zustand der IOs kann man aus der Shell abfragen, farbige Kästchen mit echo auf den Schirm bringen. Die gestellte Aufgabe läßt sich schon mit Shell-Script erledigen.

    Es ist auch unsinnig bei solchen Projekten nach dem Grund oder Sinn zu fragen, 'weil man wissen will ob es geht' ist für ein Hobby ein ausreichender Grund, sonst währen wir hier alle falsch.
    Ich find es gut, wenn sich hier mal jemand nach den Hintergründen erkundigt statt sich nur aufzuregen, daß irgendein gefundenes Script bei Ihm nicht funktioniert.

  • Hallo und vielen Dank für die ausführlichen Antworten!

    Zum Thema Programmieren:

    Ich habe in weiter Vergangenheit einiges mit PHP und MySQL gemacht. Das ist allerding schon wieder so lange her, dass das "learning by doing" in Vergessenheit geraten ist und ich im Grunde wieder weiter vorne Anfangen müsste, als ich es damals gewohnt war. Sehr ärgerlich aber so ist es bei Fremdsprachen ja auch - wird sie nicht verwendet, wird sie vergessen. Nun habe ich mir einen Pi zugelegt, weil dieser genau für meine geplanten "Spielereien" ausgelegt ist und zudem auch endlich eine Hardware bietet, wo ich früher noch nen ganzen PC nutzen musste. Jetzt geht alles in ein 1HE 19 Zoll Gehäuse und verbraucht zudem auch nicht viel Strom. Da ich gerne aber auch so kleinere Dinge umsetzeten möchte, komme ich am "lernen" nicht mehr vorbei. Dafür sind meine geplanten Projekte einfach zu spezifisch. Weiter möchte ich das Wissen von User nicht ausnutzen, um meine Ziele zu erreichen. Diese Einstellung mag nicht jeder haben. In der Wirtschaft wird ein Auftrag erteilt und dann fließen die Dollars. Da mein(e) Projekte aber eher dem Nutzen im eigenen Hause bzw. Betrieb dienen sollen, stehen hier keine Budgets zur Verfügung, die ich durch einen Auftrag rauskloppen kann (würde ich jedoch sehr gerne machen). Daher - selbst lernen ;) (Ich hoffe es kam jetzt so verständlich rüber, wie ich es auch meine *g*)

    Zum momentanen Projekt mit der GPI:

    Es geht im Grunde um eine Visualisierung in einem Radio Studio wo auf einem Flatscreen die momentanen Stadien im Studio ganz einfach angezeigt werden.
    Sprich es soll einfach angezeigt werden, ob ein Mikrofon offen ist, ob das Telefon "klingelt", ob der Verkehrsfunk aktiv ist... Diese werden momentan (im Grunde schon seit 20 Jahren ;) ) mit einer Ampel signalisiert. Das ist natürlich völlig altbacken und große Sender besitzen bereits solch einen Monitor (Jedoch ist der Preis hierfür völlig überdimensioniert und für kleine Sender ein großes Hindernis). Dazu in der Mitte noch das Logo und eben eine Uhr.
    Ihr seht, im Grunde ist es kein Zugewinn da die Ampel diese Funktion bereits übernimmt aber es macht natürlich schon mehr her, wenn man solch ein System besitzt und mit den "großen" mithalten kann.
    Genau soetwas wollte ich jetzt mal umsetzen. Leider ist das ganze so spezifisch, dass es für mich keine "Vorlage" gibt, in der ich rumwurschteln kann. Klar freu ich mich über Hilfe, kann das aber schwer mit meinem Gewissen vereinbaren.

    Zum Consolen-Fan:

    Ich arbeite schon länger unter Linux aber das eben nur mit den vorhandenem. Also Webserver config, Backup, Programme installieren... Das hat leider wenig mit Programmieren zu tun;-) Console ist für mich deswegen so genial, weil ich bislang auf keine GUI angewiesen war und Programme und Funktionen einfach kombinieren konnte. Aber auch dem ist irgendwann mal ein Ende gesetzt - jetzt habe ich das Beispiel. Ich kann ja schwer nullen und einsen auf nen Flat anzeigen lassen ;)

    Deswegen benötige ich jetzt quasi den Anfang, welcher es mit ermöglicht diese nullen und einser als Bild darzustellen.


    Schöne Grüße

    Frannek

    Nachttrag:

    Einmal editiert, zuletzt von frannek1 (6. August 2013 um 13:25)

  • Hallo Frannek,

    danke für Deine ausführliche Antwort.
    Aus meiner Sicht ist es einfach besser von Anfang an zu wissen, worauf es hinauslaufen soll.
    Ich für meinen Teil nutze den RPi, weil er für mich eine grenzenlose Spielwiese in Sachen µController, Bussyssteme, Digital-Elektronik darstellt und weil ich meinem Hang zu C und Assembler ungebremst frönen kann.

    Mit Deinem Posting hast Du Deine Fragen imho schon selber beantwortet.
    Da Du nicht vorhast, tiefer in die Programmierung einzusteigen und auch jetzt keine hardware-nahen Dinge erstellen musst, würde ich mir eine zsätzliche "Low-Level-" Programmiersprache nicht antun.
    Wenn Du schon PHP Know-How hast, würde ich an Deiner Stelle erstmal dabei bleiben. Parallel dazu ist es ja kein Problem, die entsprechenden Funktionen in Python nachzuvollziehen. Somit lernst Du quasi Python durch das Arbeiten mit PHP.

    Es gibt im Umfeld des RPi eine Menge Tools und Libraries die den Zugriff auf die GPIOs aus script-Sprachen (Python, PHP, ...) möglich machen.
    Die imho bekanntesten sind wohl wiringPi und pigpio.

    Was GUIs betrifft, so habe ich da leider auch keine Erfahrung. Wir hatten damals als Testoberfläche TCL/TK genutzt - da war es relativ easy eine Oberfläche zu basteln. Ich kann mir gut vorstellen, dass das auch in Python möglich ist.
    Die Alternative, die ich jetzt bevorzugen würde, wäre eine lokale Weboberfläche mit PHP.

    Was die Entwicklungsgeschichte betrifft: ich schreibe zunächst alles, so weit es nicht RPi spezifisch ist, unter Ubuntu. Die Zugriffe auf z.B. GPIOs simuliere ich einfach. Zum Schluss geht's dann auf die Zielhardware, den RPi.

    Und zum Schluss vielleicht noch was zum Thema Forum, andere User, ...

    Sinn und Zweck eines solchen Forums ist doch, anderen möglichst zu helfen. Und die Menschlein im Netz, die z.B. wiringPi usw. zur Verfügung stellen, machen das meist, weil es ihnen ein Anliegen ist.
    Ich habe auch kein Problem damit, wenn andere die Sourcen nutzen, die ich hierher hochlade.
    Es ist einfach nicht notwendig, das Rad dauernd neu zu erfinden. Und wenn es sich endlich mal in den Köpfen der Unternehmen festgesetzt hat, dass Kooperation effektiver ist als Konkurrenz, dann ist das in meinen Augen ein grosser Schritt für die Menscheit (wobei ich dazu sagen muss, dass schon ein ziemlicher Umdenkprozess in dieser Richtung stattgefunden hat).

    Grüsse aus dem Bayernland,
    -ds-

  • Ui ui ui, jetzt bin ich erstmal durch im Kopf und muss diese Informationen erstmal sortieren.

    Eine frage habe ich jedoch noch. Das mit dem GUI geht mir nicht aus dem Kopf. Ist es richtig, dass ich das ganze dann nur unter xWindow (oder eben den ganzen Abklatsch davon) machen kann oder ist es rein aus der konsole heraus möglich das ganze zu starten? Ich hoffe, mich hat jetzt jemand verstanden ;) Denn genau da liegt im Moment meine große Schwachstelle des Verständnisses da ich eben noch nie mit GUI zu tun hatte. Denn am liebsten wäre es mir, ersteinmal das zu Verstehen...quasi einfach mal was Programmieren, wo ein Bild auf dem Monitor erscheint. Sollten sich meine Fragen gerade irgendwo wiederholt haben - sorry, ich arbeite am Verständnis :)

    Gruß Franz


    PS: Ex-Schongauer ;)

  • Hi Frannek,

    also die einfachste Methode wäre m.E., wie schon gesagt, eine Weboberfläche.
    Eine HTML- bzw. PHP-Seite, die Du beliebig gestalten kannst und dann mit den Infos der GPIOs etc. aufpeppst.
    Dann kannst Du jede Änderung sofort anschauen.

    Ansonsten muss ich, wie gesagt, was eine GUI für dein Programm betrifft, passen.
    Sicher, das läuft im Prinzip dann über den Displaymanager und irgendwie auch X11.
    Ein Stichwort, das mir dazu einfällt, ist GTK ...
    Da gibts auch nette IDEs zu ... aber mal schnell vom bash-Prompt aufrufen ... ich denke, eher nicht.
    Das wäre evtl. mit Python möglich.


    BTW: ich glaube mich zu erinnern, dass man PHP und Python auch "mischen" kann - also die interagieren miteinander.

    cu,
    -ds-

  • Kannst du mal schildern wie hoch deine Ansprüche
    an die Grafische Ausgabe sind!?

    Wenn du was Anspruchsvolles willst, wirst du um X11 libraries oder Opengl ES nicht herum kommen.
    Da ist viel programmier Arbeit gefragt.
    Hier mal ein kleiner denk ansatz.


    [font="Courier New"]#include <stdio.h>[/font]
    [font="Courier New"]#include <stdlib.h>[/font]
    [font="Courier New"]#include <string.h>[/font]
    [font="Courier New"]#include <X11/Xlib.h>

    [/font]
    [font="Courier New"]int main(void) {[/font]
    [font="Courier New"] Display *d;[/font]
    [font="Courier New"] Window w;[/font]
    [font="Courier New"] XEvent e;[/font]
    [font="Courier New"] char *msg = "Hello World!";[/font]
    [font="Courier New"] int s;[/font]
    [font="Courier New"] [/font]
    [font="Courier New"] d = XOpenDisplay(NULL);[/font]
    [font="Courier New"] if (d == NULL) {[/font]
    [font="Courier New"] fprintf(stderr, "Cannot open display\n");[/font]
    [font="Courier New"] exit(1);[/font]
    [font="Courier New"] }[/font]
    [font="Courier New"] [/font]
    [font="Courier New"] s = DefaultScreen(d);[/font]
    [font="Courier New"] w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1,[/font]
    [font="Courier New"] BlackPixel(d, s), WhitePixel(d, s));[/font]
    [font="Courier New"] XSelectInput(d, w, ExposureMask | KeyPressMask);[/font]
    [font="Courier New"] XMapWindow(d, w);[/font]
    [font="Courier New"] [/font]
    [font="Courier New"] while (1) {[/font]
    [font="Courier New"] XNextEvent(d, &e);[/font]
    [font="Courier New"] if (e.type == Expose) {[/font]
    [font="Courier New"] XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10);[/font]
    [font="Courier New"] XDrawString(d, w, DefaultGC(d, s), 10, 50, msg, strlen(msg));[/font]
    [font="Courier New"] }[/font]
    [font="Courier New"] if (e.type == KeyPress)[/font]
    [font="Courier New"] break;[/font]
    [font="Courier New"] }[/font]
    [font="Courier New"] [/font]
    [font="Courier New"] XCloseDisplay(d);[/font]
    [font="Courier New"] return 0;[/font]
    [font="Courier New"]}

    [/font]


    Wenn du dich mit einer Terminal Ausgabe begnügen solltest.
    Ist das in ein paar Minuten erledigt…
    Hier mal ein Beispiel für ein Menü...

    [font="Courier New"]
    #!/bin/sh[/font]

    [font="Courier New"]TIME=$(date -u)[/font]

    [font="Courier New"]# Bildschirm löschen[/font]
    [font="Courier New"]tput clear[/font]

    [font="Courier New"]# Cursor nach y:2,x:4[/font]
    [font="Courier New"]tput cup 2 4[/font]

    [font="Courier New"]# Vordergrund Farbe setzen[/font]
    [font="Courier New"]tput setaf 3[/font]

    [font="Courier New"]echo "${TIME}"[/font]
    [font="Courier New"]tput sgr0[/font]

    [font="Courier New"]tput cup 5 17[/font]

    [font="Courier New"]# Setze reverse video mode[/font]
    [font="Courier New"]tput rev[/font]
    [font="Courier New"]echo "Meine Anwendung"[/font]

    [font="Courier New"]tput sgr0[/font]

    [font="Courier New"]tput cup 7 15[/font]
    [font="Courier New"]echo "1. Auswahl 1"[/font]

    [font="Courier New"]tput cup 8 15[/font]
    [font="Courier New"]echo "2. Auswahl 2"[/font]

    [font="Courier New"]tput cup 9 15[/font]
    [font="Courier New"]echo "3. Auswahl 3"[/font]

    [font="Courier New"]tput cup 10 15[/font]
    [font="Courier New"]echo "4. Auswahl 4"[/font]

    [font="Courier New"]# Schriftart bold[/font]
    [font="Courier New"]tput bold[/font]

    [font="Courier New"]# Cursor nach x:12,y:15[/font]
    [font="Courier New"]tput cup 12 15[/font]

    [font="Courier New"]read -p "Auswahl [1-4] " choice[/font]

    [font="Courier New"]# Bildschirm löschen[/font]
    [font="Courier New"]tput clear[/font]
    [font="Courier New"]tput sgr0[/font]
    [font="Courier New"]tput rc

    [/font]
    Würde dir gern mehr helfen, hab jedoch zurzeit eine menge zu tun.


    Grüße
    Andreas

    Einmal editiert, zuletzt von Teamdevel (6. August 2013 um 14:38)

  • @Dream

    Nun, du hast vermutlich Recht. Für den Anfang sind meine Ansprüche an mich selbst sicher etwas zu hoch geschraubt was ein eigenes Programm angeht und ich werde mal sehen, wie weit ich hier mit PHP komme. Das ganze dann im X11 als Vollbild laufen lassen und gucken was passiert. Somit wäre das Problem des GUI erstmal umgangen. Aber motiviert, es zu lernen, bin ich dennoch :)


    Andreas

    Danke für den Gedanken. Das werde ich mal ausprobieren. Nun, die Ansprüche in der Grafik sind insoweit so hoch, dass es dem oberen Beispiel recht nahe kommt. Sprich eine reine Konsolenausgabe ist dann doch wieder zu altbacken. Aber es ist ja auch durchaus ein Anfang.. .denke ich jedenfalls. Zumindest hab ich jetzt einen Anhaltspunkt, wie etwas geht.
    PS: gehe ich recht in der Annahme dass es sich bei deinem obrigen Beispiel um c++ handelt?

    Vielen Dank an alle!

    Schöne Grüße

    Frannek

    Einmal editiert, zuletzt von frannek1 (6. August 2013 um 14:45)


  • @Dream

    Nun, du hast vermutlich Recht. Für den Anfang sind meine Ansprüche an mich selbst sicher etwas zu hoch geschraubt was ein eigenes Programm angeht und ich werde mal sehen, wie weit ich hier mit PHP komme. Das ganze dann im X11 als Vollbild laufen lassen und gucken was passiert. Somit wäre das Problem des GUI erstmal umgangen. Aber motiviert, es zu lernen, bin ich dennoch :)

    Na dann Frannek ...

    ach ja: Qt wäre noch so eine Grafikgeschichte. Das läuft auch unter Windows ;)

    Und die Webbrowser-Geschichte geht übrigens auch im Vollbild-Modus: Stichwort Kioskmode

    ciao,
    -ds-

  • Nein das ist gutes und reines C ... :thumbs1:
    Dann zeig ich dir schnell noch was...


    [font="Courier New"]#include <stdio.h>[/font]
    [font="Courier New"]#include <stdlib.h>[/font]
    [font="Courier New"]#include <string.h>[/font]
    [font="Courier New"]#include <X11/Xlib.h>

    [/font]
    [font="Courier New"]int main(void)
    {[/font]
    [font="Courier New"] Window win;
    Window root;
    [font="Courier New"] XWindowAttributes root_attr;[/font]
    [font="Courier New"] Display *display;[/font]
    [/font]
    [font="Courier New"] XEvent e;[/font]
    [font="Courier New"] char *msg = "Hello World!";[/font]
    [font="Courier New"] int screen;[/font]
    [font="Courier New"] [/font]
    [font="Courier New"] display = XOpenDisplay(NULL);[/font]
    [font="Courier New"] if (display == NULL)
    {[/font]
    [font="Courier New"] fprintf(stderr, "Cannot open display\n");[/font]
    [font="Courier New"] exit(1);[/font]
    [font="Courier New"] }[/font]
    [font="Courier New"] [/font]
    [font="Courier New"] screen = DefaultScreen(display);

    root = RootWindow(display, screen);

    XGetWindowAttributes(display, root, &root_attr);

    /* So erstellst du ein fenster das die gleiche größe wie das display, der bildschirm hat */
    [/font]
    [font="Courier New"] win = XCreateSimpleWindow(display, root, 0, 0, [font="Courier New"]root_attr[/font].width, [font="Courier New"]root_attr[/font].height, 1, [/font]
    [font="Courier New"] BlackPixel(display, screen), WhitePixel(display, screen));

    /* Input Events setzen. */
    [/font][font="Courier New"]XSelectInput(display, win, ExposureMask | KeyPressMask);[/font]
    [font="Courier New"]
       /* Fenster Anzeigen */
    XMapWindow(display, win);[/font]
    [font="Courier New"] [/font]
    [font="Courier New"] while (1)
    {[/font]
    [font="Courier New"] XNextEvent(display, &e);[/font]
    [font="Courier New"] if (e.type == Expose)
    {[/font]
    [font="Courier New"] XFillRectangle(display, win, DefaultGC(display, screen), 20, 20, 10, 10);

    [/font]
    [font="Courier New"] XDrawString(display, win, DefaultGC(display, screen), 10, 50, msg, strlen(msg));[/font]
    [font="Courier New"] }[/font]
    [font="Courier New"] if (e.type == KeyPress)[/font]
    [font="Courier New"] break;[/font]
    [font="Courier New"] }[/font]
    [font="Courier New"] [/font]
    [font="Courier New"] XCloseDisplay(display);[/font]
    [font="Courier New"] return 0;[/font]
    [font="Courier New"]}[/font]


    Und noch viel erfolg!
    grüße

    Einmal editiert, zuletzt von Teamdevel (6. August 2013 um 15:35)

  • Hallo Hallo :)

    Ich bin ein ganz einfacher Mensch, ich mache nur einfache Sachen.

    Es ist schon so geschrieben worden und ich schreibe es auch noch mal: Der Raspberry sollte meiner Ansicht nach nur der Sensor und das Interface sein, ohne X11 ohne GTK oder QT, sondern er macht einfach eine HTML-Seite auf der der Status zu sehen ist. Diese HTML-Seite muss dann aber auf einem anderen Gerät angesehen werden, immerhin ist die Anzahl dieser Sichtgeräte prinzipiell beliebig.

    Da ich definitiv zu blöd für jede Art von C bin, käme das bei mir nie in die Tüte. Phyton? HTML macht man mit perl!

    Denk das Ding vom Ende her, wie soll es aussehen? Und dann nach dem Prinzip der größtmöglichen Faulheit verfahren.

    Übrigens könnte man HTML-Seiten auch ohne X11 darstellen, es gibt so Browser wie Lynx, wenn die Seite darauf abgestimmt ist, kann das schon ganz ordentlich aussehen (sofern denn der Raspberry auch als Anzeigegerät dienen muss).

    Und Bye

Jetzt mitmachen!

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