Wie "STRG+C" per Arduino an Pi senden?

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

    Ich arbeite gerade an einem Projekt, welches am Ende mal eine Stereoanlage mit integriertem digitalen Bilderrahmen werden soll. Diese soll zum Einen mittels IR-Fernbedienung und lirc, zum Anderen mittels kapazitiver Sensoren als "versteckte" Tasten bedient werden. Als Musik-Player dient mpd mit ncmpcpp als Oberfläche, der Bildbetrachter für den "Bilderrahmen" ist qiv. Zwischen diesen Programmen möchte ich gern per Tastendruck umschalten können, ohne dass die Musikwiedergabe beendet wird (STRG+C beendet ncmpc ohne die Wiedergabe zu stoppen).

    Die Tasten werden über ein Arduino Uno ausgelesen und sollen dann an den Pi übertragen werden. Mein Problem ist jetzt, dass ich nicht weiß wie ich Tastenkombinationen wie z.B. STRG+C so übertragen kann, dass sie auch als solche interpretiert werden.
    Ich habe inzwischen heruasgefunden, dass ich per serial.print() Strings übermitteln kann - z.b. serial.print(8) überträgt eine 8.

    Meine Fragen sind jetzt folgende:

    1) Werden diese Übertragungen wie eine Tastatureingabe behandelt und kann ich damit die oben genannten Programme steuern, oder wird hier einfach nur blanker Text übertragen, mit dem die Programme nichts anfangen können?

    2) Falls die Übertragungen wie Tastatureingaben behandelt werden, wie kann ich dann Tastenkombinationen senden? serial.print("STRG+C") wird ja wohl kaum funktionieren :s

    3) Falls diese Methode nicht funktioniert, wie muss ich dann rangehen?

    Vielen Dank schonmal im Voraus

    Grüb-Lee

    Achja. Ich möchte den Arduino gern per USB verbinden. Fall sich eine andere Verbindung (SPI, I2C) als besser erweist bin ich gern für Vorschläge offen.


  • (STRG+C beendet ncmpc ohne die Wiedergabe zu stoppen).

    Ich denke damit wirst Du mit Strg+C im interaktive Modus der shell, dem (child) process im Vordergrund, ein SIGINT-Signal schicken. Wenn Du die PID des Prozesses kennst bzw. feststellen kannst, dann sollte das auch mit "kill 2 <PID>" (oder gleichwertig) möglich sein. Siehe z. B. die manpage für kill.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Erstmal eine kleine Korrektur:

    Code
    serial.print("8");

    sendet eine acht.. aber okay...

    ich habe in der ascii tabelle leider kein "Strg" gesehen, copy ..oder etwas das mir dafür geeignet scheint... vom Prinzip her könntest du dir vom Arduino einen Befehl senden, sei es ein High oder irgendetwas seriell, welchen du dann verarbeitest und dann dein Programm gestartet oder beendet wird...
    Du nutzt aber bestimmt Raspbian oder wie sich das mediacenter nennt... weiß nicht ob du da z.B. ein Python Programm nutzen kannst..

    aber wenn ja wäre das eine Idee!

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:


  • ...
    Die Tasten werden über ein Arduino Uno ausgelesen und sollen dann an den Pi übertragen werden. Mein Problem ist jetzt, dass ich nicht weiß wie ich Tastenkombinationen wie z.B. STRG+C so übertragen kann, dass sie auch als solche interpretiert werden.
    ...


    Moin,
    das wird imho so nicht funktionieren. Strg+C wird intern in ein Signal umgewandelt (wie auch z.B. Ctrl+Z).
    Da wirst Du vermutlich ein Programm stricken müssen, das ausliest was zu tun ist, "normale" Tasten einfach durchschleust und bei Steuerzeichen (wie eben Ctrl+C oder Ctrl+Z) einen kill() mit dem passenden Signal absetzt.

    cu,
    -ds-


  • Ich denke damit wirst Du mit Strg+C im interaktive Modus der shell, dem (child) process im Vordergrund, ein SIGINT-Signal schicken. Wenn Du die PID des Prozesses kennst bzw. feststellen kannst, dann sollte das auch mit "kill 2 <PID>" (oder gleichwertig) möglich sein. Siehe z. B. die manpage für kill.

    An kill habe ich auch schon gedacht, aber ist die Prozess-ID nicht immer unterschiedlich? Also nach jedem Neustart des Systems?
    Der Pi soll nicht ununterbrochen laufen. 3W max hin oder her, bei 24/7 Betrieb kommt da schon was zusammen und es nützt ja auch nichts, wenn das Ding läuft und keiner zuhause ist.

    Kann man die Prozess-ID irgendwie festlegen, sodass bestimmte Programme bei jedem Aufruf ihre reservierte ID zugewiesen bekommen? Dann wäre "kill" ja die bessere Lösung, welche auch funktionieren sollte.

    Kornfeld: Sorry für die fehlende Info: Ich benutze gewohnheitsmäßig Arch Linux.

    EDIT: Habe gerade mal nachgesehen. PID festlegen geht nicht. Aber mit killall sollte es gehen.
    Jetzt muss ich nur noch herausfinden, ob die Musik dabei auch abgewürgt wird.

    Danke schonmal für die hilfreichen Antworten :bravo2:

    Wer trotzdem noch Ideen hat, darf sie gern zum Besten geben :D

    Einmal editiert, zuletzt von Grüb Lee (29. August 2014 um 13:58)


  • EDIT: Habe gerade mal nachgesehen. PID festlegen geht nicht.

    Mit z. B. pidof kannst Du die aktuelle (gültige) PID bestimmen.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

    Einmal editiert, zuletzt von rpi444 (29. August 2014 um 14:06)

  • In aller Regel schreiben Dienste ihre PID beim Starten in eine Datei. Es gibt einen Shell-Befehl hierzu. Forsch mal in die Richtung - bin leider unterwegs. Ist meiner Meinung nach die sauberste Lösung.


  • Und serial.write(8); sendet ein Backspace
    "8" ist eine Acht, aber 8 ist ein Backspace.
    "3" ist eine Drei, aber 3 ein CTRL-C

    Gibt es irgendwo eine Liste, wo diese Zahlen und die ausgelöste Funktion beschrieben sind? Hört sich nach dem an, wonach ich ursprünglich gesucht habe.
    Ich meine, STRG-C ist damit zwar geklärt :lol: aber es kann nie schaden, auch mal den Rest zu kennen.:danke_ATDE:

Jetzt mitmachen!

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