1

I'm reasonably familiar with software, and wanted to help my friend with their cosplay project, which was using this RGB matrix and toggling between different images using this mini three-key keyboard. I have a working program, everything works fine. The only problem is that we want the script to automatically run at boot, without a monitor plugged in. I didn't think too much about this during the planning stage because it seemed like it should be something that a raspberry pi is designed for, but we've run into a lot more trouble than I've expected.

Originally, I used the pynput module to poll for user input, but that seems to have a dependency on X, so we were unable to get it to work without a module plugged in.

I also found this question which mentions using the keyboard module, but I keep getting raise ImportError('You must be root to use this library on linux.') even after installing the module with sudo pip install, running the script with sudo, even doing sudo su to actually change the user to root user, so that was a dead end.

Finally, we switched to sshkeyboard which seemed to not have a dependency on anything like that, and the actual code that reads input isn't all that complicated:

import threading
from sshkeyboard import listen_keyboard

def keys(key):
    print("key {key} pressed")
    # Do additional work.

def poll():
    listen_keyboard(
        on_press=keys,
        debug=True
    )

poll_thread = threading.Thread(target=poll)
poll_thread.start()

In terms of automatically running on boot, I've considered I think everything that's possible:

  • crontab is a no-go because it doesn't seem to work for interactive scripts.
  • We were able to start the program by putting it in .bashrc, and even tried explicitly redirecting input with < /dev/tty1, but in both cases the buttons didn't do anything.
  • Same with using rc.local -- it has to be run in the background for booting to continue, so getting input to there seems to be a dead end.

The most promising has been systemd with the following service:

[Unit]
Description=Interactive script
[email protected]

[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi/
StandardInput=ttfy-force
ExecStart=/home/pi/script.sh

[Install]
WantedBy=multi-user.target

It's not closer in the sense that the behavior is any different from the other methods, but it feels like it should work. I also tried using openvt as described in this answer and this answer, but neither of those seemed to make a difference -- still no input.

The other option I've considered is manually polling /dev/input for keypresses (like the keyboard module is supposed to do), but that seems like overkill given that seems like something that should be a solved problem.

Things are made slightly harder because I'm helping my friend remotely over a discord call, so I can't manually fiddle with things myself. But I'd appreciate any help that people have for how to get a script that runs on boot and can poll for keyboard input.

6
  • A "auto login" and a service starting your program at login should do it? Have you tried that?
    – MatsK
    May 16, 2023 at 6:37
  • Add to program to the LXDE startup and it will run after you login.
    – Dougie
    May 16, 2023 at 6:45
  • @MatsK I've been able to get the program running using multiple methods (bashrc, systemd); the issue is having the program successfully recieve keyboard input. May 16, 2023 at 16:12
  • I've considered is manually polling /dev/input ... if that works, then why is that a problem?
    – jsotola
    May 17, 2023 at 15:29
  • you're doing yourself a dis-service by limiting yourself to Raspberry Pi ... your question is really Linux related ... you may get a faster answer at a Linux site ... ask only about the keyboard, the LED display is irrelevant
    – jsotola
    May 17, 2023 at 15:33

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.