Raspberry am E-Rollstuhl steuern - Menüstruktur für 3.2" Display

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

    wir benötigen mal wieder euren fachlichen Rat :)

    Ich arbeite aktuell an einem Projekt den E-Rollstuhl eines sehr guten Freundes mit einem Raspberry auszustatten.
    Das ganze läuft auch schon allerdings bisher ohne Display.
    Die Steuerung läuft aktuell über die Bedieneinheit des Rollstuhls welches über eine Infrarot Steuerung für z.B. Fernseher verfügt.
    Die Infrarot Signale werden vom Raspberry abgefangen und dem entsprechend Befehle ausgeführt (Sprachausgabe, Licher schalten, Whatsapp Nachrichten verschicken, MP3 Player Steuerung).

    Inzwischen haben wir das Sainsmart 3.2" LCD zum laufen bekommen.
    Ziel ist nun, die Steuerung des Raspberrys mehr auf den Raspberry zu verlagern.
    Also nicht mehr je Rollstuhl Command ein Befehl auf dem Raspberry auszuführen, sondern per Rollstuhl Command auf dem Raspberry durch ein Menü zu blättern und Befehle direkt auszuwählen.

    Im ersten Schritt dachten wir hierbei an ein einfaches Menü, welches auf einem 3.2" Display gut zu erkennen ist, über Unterkategorien verfügt und nach dem auswählen eines Unterpunktes ein Befehl aufruft (z.B. ein Python Script).

    Zuerst dachten wir daran, das Menü komplett selbst zu schreiben. Einfach eine Liste von Menüpunkten bei deinen durch ein Tastatur Befehl (Pfeil hoch - Pfeil runter) ein anderer Menüpunkt hervorgerufen wird. Das Python Script müsste hierbei immer wissen, welcher Punkt gerade markiert ist um bei der Auswahl den korrekten Befehl auszuführen. Etwas ähnliches habe ich schon mal mit einem 16x2 Zeichen Display gemacht. Die Schwierigkeit wäre hierbei nur das Menü auf dem Display anzuzeigen. Bei dem 16x2 Display war dies ja sehr einfach.

    Sicher gibt es aber auch wesentlich einfachere Möglichkeiten das Menü aufzubauen.
    Hat jemand eventuell Erfahrungen mit PyGame?
    Nach meinen ersten Erkenntnissen sollte es auch damit möglich sein...
    Oder eventuell noch ganz andere Vorschläge?

    Wir sind für eure Unterstützung sehr dankbar!

    Viele Grüße

    bigdane

  • Raspberry am E-Rollstuhl steuern - Menüstruktur für 3.2" Display? Schau mal ob du hier fündig wirst!

    • Offizieller Beitrag

    Hallo bigdane69,


    sehr schönes Projekt :thumbs1:
    läuft auf dem Pi ein X-Server (welchen du für pygame brauchen würdest) oder hast du nur ne Serverinstallation (nur console)?
    Mit pygame ist das auf jedenfall machbar. ich würde mir aber zuerst tkinter oder wx anschauen.

  • Hallo dbv,

    ist das reguläre Raspbian drauf installiert.
    Wir können bereits die Console und die grafische Oberfläche auf dem LCD aufrufen.

    Wichtig ist bei dem Projekt, dass die Steuerung des Menüs rein über "Tastatur Befehle" funktionieren muss. (Wir werden über Lirc Infrarot Signale in Tastatur Befehle umwandeln)
    Auch muss das Menü möglichst den ganzen 3,2" LCD abdecken und max. 3-5 Menüpunkte zeigen, damit man es gut lesen kann.
    Das Menü von Raspi-config beispielweiße wäre zu klein...

    • Offizieller Beitrag

    Wenn du mit tkinter halbwegs gleichmäßige knöpfe bastelst sollte das doch noch gut auf dem Display lesbar sein (wie ist die Auflösung?). Die Steuerung kann, afaik, auch über die Pfeiltasten gemacht werden, somit steht einer Lirc-Umwandlung nichts im Wege.

  • Wenn ich das richtig sehe, ist tkinter vergleichbar mit visual basic bei Windows? (Da habe ich noch Erfahrungen von früher ;))
    Gut ist auf jedenfall, dass Python verwendet wird...

    Es muss dann allerdings immer bei dem Boot des Raspberrys die grafische Oberfläche gestartet werden und das tkinter Programm im Autostart aufgerufen werden, oder?

    Gibt es einen empfehlenswerten Editor, mit dem ich das Menü grafisch erstellen kann, oder empfiehlt sich die Programmierung per Hand?

    Ich gehe mal davon aus, dass man die Kopfzeile bei dem tkinter Fenster ausblenden kann, oder?

    Es handelt sich um das folgende Display mit einer Auflösung von 320x240: Sainsmart 3.2"

    • Offizieller Beitrag

    Der X-Server muss laufen, sonst kann er keine Fenster darstellen :)
    Ein Menü-Creator-Tool ist mir nicht bekannt, aber das muss ja nicht heissen das es sowas nicht gibt. ;)

    Zum thema Kopfzeile hab ich auf die Schnelle nur das

    Zitat von https://mail.python.org/pipermail/tkinter-discuss/2008-March/001326.html

    You could try widget.overrideredirect(True) which takes all of the window
    decorations away.

    gefunden.

  • Ok, ich habe im Internet ein paar sehr gute Einführungen in tkinter gefunden.
    Ich glaube damit lässt sich wirklich recht einfach arbeiten!! (Danke für den Tipp!)
    Hier ein meiner Meinung gutes Einstiegstutorial falls es mal jemand braucht: Tutorial

    Aber nochmal eine Frage zum X-Server.
    Ich muss also auf dem LCD den X-Server (grafische Benutzeroberfläche) laden und dort einrichten, dass mein Python Programm automatisch gestartet wird?

    Werd mich heute Abend mal daran versuchen und die Erfolge / Misserfolge anschließend posten ;)

  • Der erste Lauf hat schon mal sehr gut geklappt ;)

    12756d08deb295ee1f9a64ad0f358e14

    597f925701e63edade12ace33834c5ff


    Vielleicht kann nochmal jemand über den Code schauen... soll ja auch zuverlässig laufen :)


    Die Frage ist auch, wie ich die Steuerung im Menü weiter programmiere.
    Es gibt sicherlich einen eleganteren Weg, als über die Background farbe durch das Menü zu blättern und auszuwerten, welcher Punkt gerade aktiv ist.
    Außerdem sollen in einigen Untermenüs mehr Buttons zur Auswahl stehen, als auf das Display passen.
    Meine erste Idee war hierbei, einfach den Text der Buttons entsprechend zu ändern damit es so aussieht, also würde man durch das Menü scrollen...

    Grüße

    Daniel


  • Inzwischen haben wir das Sainsmart 3.2" LCD zum laufen bekommen.
    bigdane

    kann man mehr darüber erfahren ? es gibt ja mehrere LCD, parallele Ansteuerung, oder SPI , wie angeschlossen ? wie die SW angepasst, auch gerne über touch da ich das auch vorhabe, aber nicht alles selber rausfinden kann (Zeit).

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)


  • Moin,

    ich funk nur kurz mal wegen einer Frage rein:

    Ihr setzt diesen Toch ein?
    Wie habt ihr den angesteuert?

    cheers und danke,
    -ds-

    Jo genau das Sainsmart 3.2"
    Wir haben uns für die 16 bit parallel Verkabelung entschieden.
    Nachteil:
    - von den 21 GPIOs werden 19 für die Verkabelung des Displays verbraucht und das Touchpanel kann nicht mit angeschlossen werden.
    Vorteil:
    - Es werden keine zusätzlichen Bauteile benötigt
    - Display baut sich schneller auf / mehr fps

    Ich kann die Tage auch mal eine Anleitung posten, wie man das Display auf diese Art anschließt und was softwareseitig benötigt wird!?

    Gruß

    Daniel

    kann man mehr darüber erfahren ? es gibt ja mehrere LCD, parallele Ansteuerung, oder SPI , wie angeschlossen ? wie die SW angepasst, auch gerne über touch da ich das auch vorhabe, aber nicht alles selber rausfinden kann (Zeit).

    Es handelt sich um genau dieses 3.2" LCD Sainsmart 3.2 mit SSD1289 Controller und 40 Pins.
    Wir haben es wie gesagt parallel angeschlossen, um auf zusätzliche Bauteile zu verzichten.
    Als Treiber wird FBTFT benötigt. Dieser kann in die Module eingetragen werden, damit das Display beim Boot initialisiert wird.
    Anschließend kann je nach Anforderung der x-server oder die Console gestartet werden.

    Detaillierte Anleitung kann ich gerne nachreichen.

    Wie bereits geschrieben kann über diese Anschlussmethode der Touchscreen nicht angeschlossen werden.
    (Für uns nicht notwendig, da der Touchscreen aufgrund des Handicaps meines Kumpels nicht in Frage kommt)

    Gruß

    bigdane

    Einmal editiert, zuletzt von bigdane69 (21. November 2013 um 15:42)


  • Ich kann die Tage auch mal eine Anleitung posten, wie man das Display auf diese Art anschließt und was softwareseitig benötigt wird!?

    das wäre super.....


    Es handelt sich um genau dieses 3.2" LCD Sainsmart 3.2 mit SSD1289 Controller und 40 Pins.
    Wir haben es wie gesagt parallel angeschlossen, um auf zusätzliche Bauteile zu verzichten.

    interessant ! weil

    ich habe das gleiche offensichtlich und mich gewundert warum keine SPI nach parallel Umsetzung vorhanden ist, im Netz gibt es da eine Anleitung, aber über SPI zu parallel mit extra Hardware, viele Leitungen, aber ich sehe nun das auf dem Shield ja auch min 2x 8 Bit genutzt werden also des Arduinos Ports angezapft wird, ist aber auch heftig alle GPIO dafür zu verbraten, aber als SPI Umsetzung auch nicht einfacher......

    ich hätte schwören können das Display beherrscht auch SPI als Sprache......das wäre dann wirklich eine Vereinfachung....

    btw. wie siehts mit Spannung aus, alles 3,3V ? oder LED für Beleuchtung an 5V ?

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Jo, integriertes SPI würde wirklich einiges vereinfachen... eventuell verwechselst du es mit dem Touchscreen des Displays. Das kann über SPI angesteuert werden... allerdings nur wenn nicht bereits alle GPIOs (bis auf 4) belegt sind.

    Du brauchst auf jedenfall 3,3V und 5V für das Display... vermute für die Beleuchtung... habe den Anschlussplan aber gerade nicht da.

  • Hallo Daniel,

    das wäre nett, wenn Du das machen würdest.

    Wir haben da auch diese Schieberegister-Geschichte gesehen - mir gefällt das irgendwie nicht so.
    Ich denke derzeit darüber nach die Umsetzung mit einem µController zu realisieren.
    Wenn schon eine etwas umfangreichere Schaltung, dann gleich was flexibles.
    Ich habe allerdings noch Zweifel, ob er µC das packt und ob es nicht auch zu langsam ist.

    Wird sich zeigen,
    salü,
    -ds-

  • Hallo Daniel,

    um mal wieder auf Dein Thema zurück zu kommen:
    willst Du das unbedingt in Python machen?
    Ich kann jetzt den Umfang und den sinnvollen Einsatz in Rahmen Deines Vorhabens nicht einschätzen, aber ich bin vor Kurzen über das Paket Dialog gestolpert und da bist Du mir spontan eingefallen.

    cheers,
    -ds-

  • Hallo ds,

    Leider konnte ich aufgrund einer Grippe in letzter Zeit nicht weiter machen, aber schön das du an das Projekt gedacht hast ;)

    Habe mich für Python entschieden, da ich für diese Sprache die besten Kenntnisse habe (zwar nur rudimentär, aber im Vergleich zu den anderen).

    Letztendlich muss nach der Menüstruktur nach Auswahl eines Befehls immer ein anderes Script aufgerufen werden bzw ein Programm gestartet werden. Also immer os.system() in Python.
    Da wäre ich also denke ich von der Sprache flexibel. Auf den ersten Blick sieht Dialog aber immer nach kleinerer Schrift bzw kleineren Buttons aus.
    Weißt du zufällig, ob man damit auch einfach 4 große Buttons im Vollbild darstellen kann?

    Danke & Gruss

    Daniel

  • Hallo Daniel,

    ich kann Dir leider zu dialog nichts weiter sagen. Aber wenn Du dem Link mal folgst, dann landest Du auf der entsprechenden Ubuntu-Seite.
    Es ist jedenfalls als package für den RPi verfügbar.
    Wenn ich mir das so anschaue, dann denke ich, dass viele generische Installations-Programme (wie z.B. raspi-config) dialog verwenden.
    Das ist imho eine Möglichkeit aus shell-scripten eben solche Dialoge, Menüs oder Messageboxen zu erzeugen.

    Und wenn ich mir die Options-Liste anschaue

    Spoiler anzeigen

    dirk@saturn:~$ dialog
    cdialog (ComeOn Dialog!) version 1.1-20111020
    Copyright 2000-2008,2011 Thomas E. Dickey
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    * Display dialog boxes from shell scripts *

    Usage: dialog <options> { --and-widget <options> }
    where options are "common" options, followed by "box" options

    Special options:
    [--create-rc "file"]
    Common options:
    [--ascii-lines] [--aspect <ratio>] [--backtitle <backtitle>]
    [--begin <y> <x>] [--cancel-label <str>] [--clear] [--colors]
    [--column-separator <str>] [--cr-wrap] [--date-format <str>]
    [--default-item <str>] [--defaultno] [--exit-label <str>]
    [--extra-button] [--extra-label <str>] [--help-button]
    [--help-label <str>] [--help-status] [--hfile <str>] [--hline <str>]
    [--ignore] [--input-fd <fd>] [--insecure] [--item-help] [--keep-tite]
    [--keep-window] [--max-input <n>] [--no-cancel] [--no-collapse]
    [--no-kill] [--no-label <str>] [--no-lines] [--no-mouse]
    [--no-nl-expand] [--no-ok] [--no-shadow] [--nook] [--ok-label <str>]
    [--output-fd <fd>] [--output-separator <str>] [--print-maxsize]
    [--print-size] [--print-version] [--quoted] [--scrollbar]
    [--separate-output] [--separate-widget <str>] [--shadow]
    [--single-quoted] [--size-err] [--sleep <secs>] [--stderr] [--stdout]
    [--tab-correct] [--tab-len <n>] [--time-format <str>] [--timeout <secs>]
    [--title <title>] [--trace <file>] [--trim] [--version] [--visit-items]
    [--yes-label <str>]
    Box options:
    --calendar <text> <height> <width> <day> <month> <year>
    --checklist <text> <height> <width> <list height> <tag1> <item1> <status1>...
    --dselect <directory> <height> <width>
    --editbox <file> <height> <width>
    --form <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...
    --fselect <filepath> <height> <width>
    --gauge <text> <height> <width> [<percent>]
    --infobox <text> <height> <width>
    --inputbox <text> <height> <width> [<init>]
    --inputmenu <text> <height> <width> <menu height> <tag1> <item1>...
    --menu <text> <height> <width> <menu height> <tag1> <item1>...
    --mixedform <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1> <itype>...
    --mixedgauge <text> <height> <width> <percent> <tag1> <item1>...
    --msgbox <text> <height> <width>
    --passwordbox <text> <height> <width> [<init>]
    --passwordform <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...
    --pause <text> <height> <width> <seconds>
    --prgbox <text> <command> <height> <width>
    --programbox <text> <height> <width>
    --progressbox <text> <height> <width>
    --radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...
    --tailbox <file> <height> <width>
    --tailboxbg <file> <height> <width>
    --textbox <file> <height> <width>
    --timebox <text> <height> <width> <hour> <minute> <second>
    --yesno <text> <height> <width>

    Auto-size with height and width = 0. Maximize with height and width = -1.
    Global-auto-size if also menu_height/list_height = 0.
    dirk@saturn:~$


    dann denke ich, dass man damit eine Menge abdecken kann.

    Und sonst wieder fit?

    cheers,
    -ds-

  • Hallo bigdane,

    Du hast sicherlich schon viel Arbeit in Dein Projekt investiert, sodaß Du vielleicht schon nicht mehr die Ohren offen haben kannst für alternative Umsetzungsvorschläge.

    Ich selbst bin dabei, eine Art Hifi-Internet-Radio mit einem 2,8''-Touchscreen (320x240 Pixel) und Fernbedienungsunterstützung (Hama MCE Remote Control PC-Fernbedienung) zu basteln. Sowohl die Touchscreen-, als auch die Fernbedienungsunterstützung funktionieren bereits. Dabei habe ich sehr gute Erfahrungen mit Pygame gemacht. Ein paar Zeilen reichen, und schon sieht die Welt ganz anders aus. ;)
    Pygame kann z.B. mit transparenten Bildern (PNGs) umgehen, kommt mit Tastatur- UND Touchscreen-Abfragen klar, etc. pp. Das sieht entschieden besser aus, als es tkinter je können wird (denke ich jedenfalls):

    Die Buttons sind hier schon relativ groß (84x84px) und könnten noch kleiner gestaltet werden.

    Python-Pygame-Code-Ausschnitt zum Abfragen, ob auf Bild1 (am Touchscreen) oder die Taste "Pfeil runter" auf der Tastatur bzw. der Fernbedienung gedrückt wurde:

    4drq

    Einmal editiert, zuletzt von 4drq (25. Januar 2014 um 19:40)

  • Hey 4drq,

    vielen Dank für dein Tipp!
    Bisher haben wir hauptsächlich an den Funktionen des Raspberrys gearbeitet (Fotos machen, Nachrichten in Whatsapp verschicken...) und noch nicht so viel an der Tkinter Oberfläche.
    Ich habe leider erst jetzt wieder mehr Zeit für das Projekt.
    Dein Tipp kommt also zeitlich noch passen ;)

    Ich muss sagen, dein Screenshot sieht schon schick aus.
    Es macht schon wesentlich mehr her, mit Icons zu arbeiten...

    Wir haben uns schon mal an dem Hauptmenü ausgetobt... Dabei sind aber schon die ersten Fragen aufgekommen :)

    Wie hast du denn bei dir die Keyboard (Fernbedienung) Steuerung gelöst?
    In deinem Screen sieht es so aus, als wären die Symbole ausgegraut und das aktuell aktivierte Symbol farbig?
    Wie steuerst du, welches Icon gerade aktiv ist und bei der Taste "Enter" geklickt wird?
    Lädst du die Icons jedes mal neu und woher weiß dein Programm, welches Icon aktiv ist?

    Bisher haben wir den folgenden Code aus deinem abgeleitet ;)

    Über ein paar weitere Tipps sind wir dankbar

    Grüße

    bigdane

Jetzt mitmachen!

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