Si necesita que su PC (particularmente una computadora portátil corporativa de su trabajo) lo vea como activo incluso cuando se aleja, un jiggler de mouse es su mejor opción. La mayoría de las computadoras proporcionadas por la compañía no le permiten instalar software ni espiar qué aplicaciones está ejecutando, por lo que usar un dispositivo que mueve el puntero automáticamente pero se presenta al sistema operativo como un mouse resuelve el problema. Puede dirigirse a Amazon y comprar un dispositivo USB que cuesta entre $ 7 y $ 40, o puede hacer su propio mouse jiggler de bricolaje usando el Pico de frambuesa de $4.
En este tutorial, construiremos un jiggler de mouse de bricolaje usando Raspberry Pi Pico y CircuitPython. No se requiere nada más, ni siquiera conductores, lo que hace que este proyecto de $4 sea un gran ahorro de tiempo y dinero. Tenga en cuenta que, aunque usamos un Pico, estas instrucciones funcionarán para cualquier microcontrolador alimentado por RP2040 que sea compatible con CircuitPython (casi todos ellos). Un tablero como el Adafruit Trinkey QT2040otro microcontrolador alimentado por RP2040 que cuesta $ 8, sería incluso mejor que el Pico porque tiene un USB tipo A incorporado, por lo que ni siquiera requiere un cable para conectarse a su PC.
Configuración de CircuitPython para Mouse Jiggler
1. Vaya a la página oficial de CircuitPython para Raspberry Pi Pico y descargue la imagen de firmware de la versión más reciente de UF2. En el momento de redactar este documento, se trataba de CircuitPython 8 Beta 6. Si está utilizando una placa con tecnología RP2040 diferente, encuentre su Página de UF2 en Circuitpython.org.
2. Mientras mantiene presionado el botón BOOTSEL, conecte el Raspberry Pi Pico a su computadora. Aparecerá una nueva unidad, RPI-RP2
3. Copie el archivo CircuitPython UF2 descargado a RPI-RP2. Esto escribirá CircuitPython en el almacenamiento flash interno del Pico. Aparecerá una nueva unidad, CIRCUITPY.
Necesitamos varias bibliotecas de CircuitPython antes de poder continuar. Estas bibliotecas de código preescrito agregan características adicionales a un proyecto.
1. Descargar el paquete de bibliotecas para la misma versión de CircuitPython que está instalada en el Pico. Instalamos CircuitPython 8, así que descargamos el paquete para la versión 8.x.
2. Extraiga el paquete a su escritorio y luego abre la carpeta lib contenido dentro de.
3. Copie la carpeta adafruit_hid de esta carpeta lib a la carpeta lib en la unidad CIRCUITPY.
Escribir código CircuitPython para Mouse Jiggler
1. Descargue e instale Thonny si aún no lo tiene. Thonny es un editor de Python que cubre Python 3, MicroPython y CircuitPython.
2. Abra Thonny y vaya a Herramientas >> Opciones.
3. Seleccione Intérprete, luego configure el intérprete como CircuitPython, transfiéralo a automático y haga clic en Aceptar. Thonny ahora se conectará al Pico W con CircuitPython.
4. Haga clic en Archivo >> Abrir y abra code.py en el dispositivo CircuitPython (nuestro Raspberry Pi Pico).
5. Elimine cualquier código que ya esté en el archivo.
6. Importar la biblioteca USB_HID, seguido de la biblioteca de soporte de Mouse de Adafruit.
import usb_hid
from adafruit_hid.mouse import Mouse
7. Importe la función de suspensión de la biblioteca de tiempo. Usaremos esto para agregar un breve retraso entre cada movimiento.
from time import sleep
8. Crea un objeto, m, para controlar el ratón virtual.
m = Mouse(usb_hid.devices)
9. Cree un bucle para ejecutar continuamente el código que contiene. Para fines de prueba, este ciclo se puede reemplazar con un ciclo for, de lo contrario, el código nos impediría trabajar.
while True:
Prueba alternativa de bucle
for i in range(2):
10 Use «mover» para mover el cursor 100 píxeles a la izquierda.
m.move(-100, 0, 0)
11 Imprima un mensaje en el shell de Python y haga una pausa de medio segundo. La impresión nos ayuda a depurar el código.
print("I am working")
12 Ahora mueva el mouse 100 píxeles a la derecha, imprima otro mensaje y haga una pausa de medio segundo más.
m.move(100, 0, 0)
print("I am so busy")
sleep(0.5)
13 Mueva el mouse hacia abajo 100 píxeles, imprima un mensaje y luego otra pausa.
m.move(0, -100, 0)
print("So much to do")
sleep(0.5)
14 Mueva el mouse hacia arriba 10 píxeles, imprima un mensaje y luego vuelva a hacer una pausa.
m.move(0, 100, 0)
print("I need a vacation")
sleep(0.5)
15. Guarde el código como code.py en su Raspberry Pi Pico (dispositivo CircuitPython). CircuitPython ejecutará automáticamente code.py (MicroPython también puede hacer esto con main.py y boot.py) cuando el Pico esté conectado a la computadora. Como el sistema operativo cree que esto es «solo un mouse», el proyecto se puede usar en cualquier sistema operativo.
Listado completo de códigos
import usb_hid
from adafruit_hid.mouse import Mouse
from time import sleep
m = Mouse(usb_hid.devices)
while True:
m.move(-100, 0, 0)
print("I am working")
sleep(0.5)
m.move(100, 0, 0)
print("I am so busy")
sleep(0.5)
m.move(0, -100, 0)
print("So much to do")
sleep(0.5)
m.move(0, 100, 0)
print("I need a vacation")
sleep(0.5)
Agregar un botón al Jiggler DIY
Un jiggler de mouse plug and play es útil, pero más útil es uno que podemos activar con solo presionar un botón. Aquí modificamos el código para incluir un botón en GPIO12 que activará o desactivará el jiggler.
Para este proyecto necesitarás
- Un pico de frambuesa pi
- Protoboard de tamaño medio
- Presionar el botón
- 2 cables macho a macho.
El circuito es extremadamente simple, solo necesitamos conectar un botón pulsador a GPIO 12 y GND. GPIO 12 se configurará para tirar alto, y cuando se presiona el botón, conectará el pin a GND. Esto hará que el pin cambie de estado a bajo, y lo usamos como un interruptor para el código jiggler. Este proyecto se basará en el código de la versión anterior.
1. Agregue dos importaciones adicionales para tablero y digitalio. Estas dos bibliotecas brindan acceso al GPIO y nos permiten establecer el estado de los pines GPIO.
import usb_hid
from adafruit_hid.mouse import Mouse
from time import sleep
import board
from digitalio import DigitalInOut, Direction, Pull
2. Cree un objeto, botón y configúrelo para que sea GPIO12.
m = Mouse(usb_hid.devices)
button = DigitalInOut(board.GP12)
3. Configure GPIO 12 para que sea una entrada y levante el pin. Algunos pines GPIO tienen una resistencia interna que podemos subir a 3,3 V o bajar a GND.
button.direction = Direction.INPUT
button.pull = Pull.UP
4. Cree dos variables, active y button_press y almacene 0 en cada una. Estas dos variables almacenarán un 0 o un 1, identificando si el jiggler está activo y se ha presionado el botón. Al comienzo del código, ambos están configurados como inactivos usando 0.
active = 0
button_press = 0
5. Agregue un ciclo while True para ejecutar el código.
while True:
6. Cree una declaración condicional que verifique el estado del botón y el valor almacenado en activo. Cuando se presiona el botón, el estado de GPIO 12 cambia de alto (Verdadero) a bajo (Falso). Cuando se presiona, la declaración condicional verificará el valor almacenado en activo. El valor predeterminado es 0, lo que significa que el jiggler no está activo.
if button.value == False and active == 0:
7. Actualice las variables a 1 y luego imprima un mensaje en el shell de Python.
active = 1
button_press = 1
print("Turning on")
8. Agregue una pausa de cinco segundos para esta condición. Esto nos da tiempo para presionar el botón y para que el código registre la presión y ofrezca mucho tiempo de rebote que evita que se presionen varios botones.
sleep(5)
9. Use una condición else if para verificar que el botón no se esté presionando actualmente y que los valores almacenados en active y button_press sean 1. Esto significa que hemos presionado el botón y queremos que se ejecute el código del jiggler del mouse.
elif button.value == True and active == 1 and button_press == 1:
10 Reutilice el código del jiggler del mouse para mover el mouse por la pantalla.
m.move(-100, 0, 0)
print("I am working")
sleep(0.5)
m.move(100, 0, 0)
print("I am so busy")
sleep(0.5)
m.move(0, -100, 0)
print("So much to do")
sleep(0.5)
m.move(0, 100, 0)
print("I need a vacation")
sleep(0.5)
11 Cree otra declaración condicional para comprobar que se ha pulsado el botón y que active y button_press almacenan el valor 1. Esto significa que el usuario quiere desactivar el código jiggler.
elif button.value == False and active == 1 and button_press == 1:
12 Imprima un mensaje para el usuario, luego restablezca los valores almacenados en las variables antes de hacer una pausa de cinco segundos.
print("Turning off")
active = 0
button_press = 0
sleep(5)
13 Guarde el proyecto como code.py en Raspberry Pi Pico y la placa se restablecerá y ejecutará el código. Pulse el botón para activar y desactivar el código jiggler.
Listado completo de códigos
import usb_hid
from adafruit_hid.mouse import Mouse
from time import sleep
import board
from digitalio import DigitalInOut, Direction, Pull
m = Mouse(usb_hid.devices)
button = DigitalInOut(board.BUTTON)
button.direction = Direction.INPUT
button.pull = Pull.UP
active = 0
button_press = 0
while True:
if button.value == False and active == 0:
active = 1
button_press = 1
print("Turning on")
sleep(5)
elif button.value == True and active == 1 and button_press == 1:
m.move(-100, 0, 0)
print("I am working")
sleep(0.5)
m.move(100, 0, 0)
print("I am so busy")
sleep(0.5)
m.move(0, -100, 0)
print("So much to do")
sleep(0.5)
m.move(0, 100, 0)
print("I need a vacation")
sleep(0.5)
elif button.value == False and active == 1 and button_press == 1:
print("Turning off")
active = 0
button_press = 0
sleep(5)
Versión especial de Adafruit Trinket QT2040
Trinkey QT2040 de Adafruit es una placa con forma de dongle USB alimentada por RP2040 de Raspberry Pi. No tiene un GPIO tradicional per se, sino que usa un conector StemmaQT para usar con placas de conexión compatibles.
Esta versión especial del código de alternancia de botón utiliza el botón de usuario (BOOT) incorporado en las placas para activar/desactivar el código y el NeoPixel para indicar si el jiggler está activo. El código es prácticamente el mismo que el código de alternancia del botón anterior, solo que se modificó para usar la referencia del botón (una abstracción de CircuitPython) y para configurar NeoPixels.
1. Descargar el paquete de bibliotecas para la misma versión de CircuitPython que está instalada en el Pico. Instalamos CircuitPython 8, así que descargamos el paquete para la versión 8.x.
2. Extraiga el paquete a su escritorio y luego abre la carpeta lib contenido dentro de.
3. Copie los siguientes archivos/carpetas de esta carpeta lib a la carpeta lib en la unidad CIRCUITPY.
adafruit_hid
adafruit_pixelbuf.mpy
neopixel.mpy
4. Abra un nuevo archivo en Thonny y copie el código del ejemplo anterior.
5. En las importaciones agregue una línea para importar la biblioteca NeoPixel.
import neopixel
6. Después de configurar el botón, agregue una nueva línea para crear una conexión con el único NeoPixel en el Trinkey QT2040.
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
7. Desplácese hacia abajo hasta la condición else if que activa el jiggler. Aquí es donde presionamos el botón, y las variables active y button_press se establecen en 1. Agregue una línea para establecer el píxel en rojo, con un cuarto de brillo.
pixel.fill((32, 0, 0))
8. Desplácese hacia abajo hasta donde se desactiva el código jiggler. Aquí es donde se presiona el botón y las variables active y button_press se establecen en 1. Cambia el color del NeoPixel a verde, con un cuarto de brillo.
pixel.fill((0, 32, 0))
9. Guarde el código como code.py en Adafruit Trinkey QT2040. La placa se reiniciará y el código comenzará. Pulse el botón para alternar el código.
Listado completo de códigos
import usb_hid
from adafruit_hid.mouse import Mouse
from time import sleep
import board
from digitalio import DigitalInOut, Direction, Pull
import neopixel
m = Mouse(usb_hid.devices)
button = DigitalInOut(board.BUTTON)
button.direction = Direction.INPUT
button.pull = Pull.UP
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
active = 0
button_press = 0
while True:
if button.value == False and active == 0:
active = 1
button_press = 1
print("Turning on")
sleep(5)
elif button.value == True and active == 1 and button_press == 1:
pixel.fill((32, 0, 0))
m.move(-100, 0, 0)
print("I am working")
sleep(0.5)
m.move(100, 0, 0)
print("I am so busy")
sleep(0.5)
m.move(0, -100, 0)
print("So much to do")
sleep(0.5)
m.move(0, 100, 0)
print("I need a vacation")
sleep(0.5)
elif button.value == False and active == 1 and button_press == 1:
pixel.fill((0, 32, 0))
print("Turning off")
active = 0
button_press = 0
sleep(5)