NielsBohr
Posts: 3
Joined: Wed Apr 03, 2019 9:05 am

Problem: Virtuelle Tastatureingaben mit uinput

Wed Apr 03, 2019 9:19 am

Moin,
ich habe ein Projekt "Digitaler Wandkalender" nachgebaut und soweit funktioniert es ganz gut.
Hier mal der Link zum Projekt: https://www.instructables.com/id/Raspbe ... tificatio/
Leider habe ich jetzt ein Problem.
Im letzten Schritt des Projektes werden über Python uinput Taster abgefragt, die auf den GPIOs 19, 20 und 21 liegen.
Damit werden die Tasteneingaben n und p abgefragt, um den eingebundenen Google-Kalender einen Monat vor oder zurück springen zu lassen.
Wenn ich das in der Anleitung gezeigte Python-Script verwende (switch_extend.py) verwende, ist es so, als wenn ich die Taster die ganze Zeit gerückt halte.
Ich habe schon versucht den Fehler zu finden, aber leider hat bisher noch nichts was ich versucht habe funktioniert.

Hier mal das Script:

import RPi.GPIO as GPIO
import time
import uinput
import os

GPIO.setmode(GPIO.BCM)

GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(20, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP)

device = uinput.Device([
uinput.KEY_P,
uinput.KEY_N,
uinput.KEY_F5,
uinput.KEY_M,
uinput.KEY_A
])

view = 'm'

while True:
input_state_back = GPIO.input(19)
input_state_forward = GPIO.input(20)
input_state_multi = GPIO.input(21)

if input_state_back == False:
print('Button P Pressed')
device.emit_click(uinput.KEY_P)
time.sleep(0.5)
if input_state_forward == False:
print('Button N Pressed')
device.emit_click(uinput.KEY_N)
time.sleep(0.5)

if input_state_multi == False and input_state_back == False and input_state_forward == False:
print('All buttons pressed')
os.system('sudo reboot')

if input_state_multi == False:
start = time.time()
time.sleep(0.01)
while input_state_multi == False:
time.sleep(0.01)
print('Multibutton is pressed')
end = time.time()
multi_press_time = end-start
input_state_multi = GPIO.input(21)

if input_state_multi == True or multi_press_time > 5.5:
print('Button press in', multi_press_time)
break


if multi_press_time < 5:
if view == 'm':
device.emit_click(uinput.KEY_A)
view = 'a'
print('keypress A')
time.sleep(0.5)
elif view == 'a':
device.emit_click(uinput.KEY_M)
view = 'm'
print('keypress m')
time.sleep(0.5)
else:
print('Keypress: F5')
device.emit_click(uinput.KEY_F5)
time.sleep(0.5)

if input_state_multi == False and input_state_back == False and input_state_forward == False:
print('All buttons pressed')
os.system('sudo reboot')

ich hoffe, jemand kann mir bei dem Problem helfen. Bin für alle Hilfe dankbar.

gregorp
Posts: 2
Joined: Wed Apr 03, 2019 4:23 pm

Re: Problem: Virtuelle Tastatureingaben mit uinput

Wed Apr 03, 2019 4:26 pm

Probier mal, die Befehle, die durch die if-Anweisung ausgeführt werden sollen, einzurücken.

fbe
Posts: 494
Joined: Thu Aug 17, 2017 9:08 pm

Re: Problem: Virtuelle Tastatureingaben mit uinput

Wed Apr 03, 2019 8:13 pm

Die Einrückungen sind schon da, werden aber nicht gezeigt.
Mit code-tags ([code]Dein code[code/]) würde das so aussehen.
NielsBohr wrote:
Wed Apr 03, 2019 9:19 am
...
Hier mal das Script:

Code: Select all

import RPi.GPIO as GPIO
import time
import uinput
import os

GPIO.setmode(GPIO.BCM)

GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(20, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP)

device = uinput.Device([
        uinput.KEY_P,
        uinput.KEY_N,
	uinput.KEY_F5,
	uinput.KEY_M,
	uinput.KEY_A
        ])

view = 'm'

while True:
    input_state_back = GPIO.input(19)
    input_state_forward = GPIO.input(20)
    input_state_multi = GPIO.input(21)

    if input_state_back == False:
        print('Button P Pressed')
        device.emit_click(uinput.KEY_P)
        time.sleep(0.5)
    if input_state_forward == False:
        print('Button N Pressed')
        device.emit_click(uinput.KEY_N)
        time.sleep(0.5)

    if input_state_multi == False and input_state_back == False and input_state_forward == False:
        print('All buttons pressed')
        os.system('sudo reboot')

    if input_state_multi == False:
	start = time.time()
	time.sleep(0.01)
	while input_state_multi == False:
		time.sleep(0.01)
		print('Multibutton is pressed')
		end = time.time()
		multi_press_time = end-start
		input_state_multi = GPIO.input(21)

		if input_state_multi ==  True or multi_press_time > 5.5:
			print('Button press in', multi_press_time)
			break


	if multi_press_time < 5:
        	if view == 'm':
			device.emit_click(uinput.KEY_A)
			view = 'a'
			print('keypress A')
			time.sleep(0.5)
		elif view == 'a':
			device.emit_click(uinput.KEY_M)
			view = 'm'
			print('keypress m')
			time.sleep(0.5)
	else:
		print('Keypress: F5')
		device.emit_click(uinput.KEY_F5)
		time.sleep(0.5)

    if input_state_multi == False and input_state_back == False and input_state_forward == False:
	print('All buttons pressed')
	os.system('sudo reboot')
...


NielsBohr
Posts: 3
Joined: Wed Apr 03, 2019 9:05 am

Re: Problem: Virtuelle Tastatureingaben mit uinput

Wed Apr 10, 2019 2:39 pm

Irgendjemand ne Idee?

smartifahrer
Posts: 869
Joined: Sat Feb 13, 2016 8:10 am

Re: Problem: Virtuelle Tastatureingaben mit uinput

Wed Apr 10, 2019 2:56 pm

Dein Code habe ich nicht untersucht. Aber könnte es sein das du statt Taster Schalter verwendest oder falls Taster diese klemmen. Hast du ein Verdratungsfehler an den Tastern? Wenn du ein Spannungsmessgerät hast kannst du direkt am GPIO mal messen ob sich die Spannung ändert wenn du den Taster drückst.
PHP-Entwickler, Elektroniker, Technik-Bastler. 5 Raspis mit Rasbian, Retropi und Libreelec.

NielsBohr
Posts: 3
Joined: Wed Apr 03, 2019 9:05 am

Re: Problem: Virtuelle Tastatureingaben mit uinput

Mon Jun 24, 2019 7:20 am

So, ich bin jetzt mal ein wenig weiter.
Der Code funktioniert wenn ich nur einen...maximal 2 Taster angeschlossen habe. Allerdings nur mit den GPIOs 17 & 18.
Ich habe jetzt noch etwas gefunden, wo gesagt wird, das die Taster nicht direkt an die GPIOs und GND angeschlossen werden, sondern das noch ein 10kOhm Widerstand dazwischen geschaltet werden muß.
Hat das schon mal jemand gemacht und könnte mir zeigen wie das am RPi angeschlossen wird (gutes Bild wäre geil..*smile*)

Danke schon mal für die Hilfe

smartifahrer
Posts: 869
Joined: Sat Feb 13, 2016 8:10 am

Re: Problem: Virtuelle Tastatureingaben mit uinput

Mon Jun 24, 2019 1:34 pm

Hier mal die Pin-Belegung https://de.pinout.xyz/ Alle grünen markierte Pins solltest einfach du nutzen können.
Die Anschußmöglichkeiten mit Widerstand werden heir erklärt https://www.elektronik-kompendium.de/si ... 110081.htm

Hier noch der Link zu GPIO Zero mit der sich auch einfach Taster auslesen lassen.
https://gpiozero.readthedocs.io/en/stable/
PHP-Entwickler, Elektroniker, Technik-Bastler. 5 Raspis mit Rasbian, Retropi und Libreelec.

Return to “Deutsch”