💾 Archived View for gemini.elbinario.net › teclado-personalizado.gmi captured on 2024-05-12 at 15:16:27. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-01-29)
-=-=-=-=-=-=-
Llevaba tiempo teniendo un NeoTrellis (un teclado programable y libre que funciona con una placa Feather de Adafruit, que viene a ser un microcontrolador programable). Me lo compré en su momento para hacer un instrumento musical, cosa que más o menos he hecho como describo aquí usando grabaciones de mi voz y el ukelele. Pero pensé en aprovechar ese mismo código para hacerme un teclado personalizado con cosas que hago normalmente en el PC o que podían ser útiles.
Para empezar ya he dicho que el aparato funciona con arduino, entre otras. He reciclado uno de los programas que vienen por defecto para mostrar colores cada vez que se pulsa una tecla. Para ello he impreso en una consola alternativa que código aparecía cada vez que se seleccionaba una tecla (en el «monitor serie», para la gente que haya jugado con arduino antes) y descubrí el código que usaba para cambiar de color según en qué posición del teclado. Mapeé así cada tecla y les puse un nombre reconocible, de la «A» a la «P» (puesto que es una matriz de 4×4 teclas). De este modo, cada vez que pulsaba una tecla, imprimía en la consola su nombre: «A», «B», …
Aunque desde arduino puedes pulsar «monitor serie» y ver qué sucede, realmente lo que está haciendo es volcar todo un su tty correspondiente. En mi caso /dev/ttyACM0, pero a veces es /dev/ttyUSB0 o en caso de Windows (ew) a veces es COM. Hace ya años aprendí a usar Python para leer las consolas de tty y he estado reusando ese código desde entonces:
device='/dev/ttyACM0'
arduino = serial.Serial(device, 9600,timeout=1)
salir = 0
while not (salir == 1):
valor = arduino.readline()
valor = valor.decode('utf-8')
...
Aquí basicamente me estoy pasando el «monitor serie» de Arduino a python para darme más libertad de acción. Además es escalable porque tan sólo necesito trabajar con un condicional que lea qué tecla estoy pulsando y puedo hacer lo que quiera. En este caso como dije, he hecho una matriz de funciones que quería en mi PC, este es el menú:
menu de la app
Para ello básicamente he creado una mezcla de comandos personalizados en bash que he exportado a /usr/local/bin/ y he ido usando la función subprocess.run de Python para llamarlo. No todas las funciones, sin embargo, necesitaban este proceso. También he hecho funciones en python para abrir las pestañas de Mastodon que quiero:
def open_mastodon():
url = 'mastodon.green'
url2 = 'merveilles.town'
url3 = "todon.nl"
browser = 'firefox'
webbrowser.get(browser)
webbrowser.open(url)
webbrowser.open(url2)
webbrowser.open(url3)
Para abrir el campus de mi universidad:
def open_uoc():
campus = "https://www.uoc.edu/portal/es/index.html"
subprocess.run(["google-chrome",campus])
Me disculpo de antemano que esto de arriba es google chrome, ¡por algún motivo la app de mi uni no va bien en firefox! Finalmente abro mi música preferida:
def open_bandcamp():
fav = 'https://menitrust.bandcamp.com/album/forever-live-sessions'
mainweb = 'https://bandcamp.com/'
browser = 'firefox'
webbrowser.get(browser)
webbrowser.open(fav)
webbrowser.open(mainweb)
Para poder abrir cosas del protocolo Gemini he usado amfora que previamente descargué y configuré. Básicamente descargué el binario de la web de releases la renombré a «amfora» y la exporté a /usr/local/bin/. Del mismo modo para toot, que uso para checkear notificaciones, la he descargado y configurado. Para toot he creado un script que activa la cuenta que paso como parámetro y me lee las primeras cinco líneas (lo justo para enterarme más o menos de lo que va la notificación).
!/bin/bash
check_mastodon
toot activate $1
toot notifications 2>&1 | head -n 5
Y en Python:
elif "J" in valor:
print("Seeing last toot notification in mastodon.green")
subprocess.run(["check_mastodon", "alien@mastodon.green"])
He añadido un script que me mira el tiempo que hace en una ciudad que pasa por parámetro:
!/bin/bash
curl wttr.in/"$1"
Y en Python:
elif "L" in valor:
print("L")
subprocess.run(["weather_report", "Granada"])
Casi todo lo fundamental para comprender como va está en este repo que estoy montando, que inicialmente era para la musiquita.