Si necesita su PC, especialmente una computadora portátil comercial de su trabajo, para verlo activo incluso cuando se está alejando, un movimiento 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 las aplicaciones que está ejecutando, por lo que usar un dispositivo que mueve automáticamente el puntero pero se presenta al sistema operativo como un mouse resuelve el problema. Puedes ir a Amazon y comprar un dispositivo USB que cuesta entre $7 y $40, o puedes hacer tu propio mouse jiggler usando el Raspberry Pi Pico de $4.
En esta guía, construiremos un jiggler de mouse de bricolaje usando Raspberry Pi Pico y CircuitPython. No se requiere nada más, ni siquiera los conductores, lo que hace que este proyecto de $ 4 ahorre mucho tiempo y dinero. Tenga en cuenta que aunque usamos un Pico, estas instrucciones funcionarán para cualquier microcontrolador alimentado por RP2040 que admita CircuitPython (casi todos). Una placa como la Adafruit Trinkey QT2040, otro microcontrolador alimentado por RP2040 que cuesta $8, sería incluso mejor que la Pico porque tiene USB tipo A integrado y ni siquiera requiere un cable para conectarse a su PC.
Contenido del sitio
Configuración de CircuitPython para Mouse Jiggler
1. Vaya a la página oficial de CircuitPython para Raspberry Pi Pico y descargue la última versión de la imagen del firmware UF2. En el momento de escribir este artículo, se trata de CircuitPython 8 Beta 6. Si está utilizando otra placa con tecnología RP2040, 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 de Pico. Aparecerá una nueva unidad, CIRCUITPY.
Necesitamos varias bibliotecas de CircuitPython antes de poder continuar. Estas bibliotecas de códigos preescritos agregan funcionalidad adicional a un proyecto.
1. Descargar el conjunto de biblioteca para la misma versión de CircuitPython instalada en Pico. Hemos instalado 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 contenida en el interior.
3. Copie la carpeta adafruit_hid de esta carpeta lib a la carpeta lib en la unidad CIRCUITPY.
Escriba el código de 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.
(Crédito de la imagen: Hardware de Tom)
3. Seleccione Intérprete, luego configure el intérprete en CircuitPython, cambie el puerto a automático, luego haga clic en Aceptar. Thonny ahora se conectará a Pico W ejecutando 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é presente en el archivo.
6. Importar la biblioteca USB_HID, seguido por 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 el código continuamente. 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 para bucle
for i in range(2):
diez. Use «mover» para mover el control deslizante 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 otro medio segundo.
m.move(100, 0, 0) print("I am so busy") sleep(0.5)
13 Mueva el mouse hacia abajo 100px, imprima un mensaje y luego otra pausa.
m.move(0, -100, 0) print("So much to do") sleep(0.5)
14 Mueva el mouse 10 píxeles hacia arriba, imprima un mensaje, luego haga una pausa nuevamente.
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 Pico esté conectado a la computadora. Dado que el sistema operativo piensa que es «solo un mouse», el proyecto se puede usar en cualquier sistema operativo.
Lista completa 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)
Agregue un botón al Jiggler de bricolaje
(Crédito de la imagen: Hardware de Tom)
Un jiggler de mouse plug and play es útil, pero más útil es uno que podemos activar presionando un botón. Aquí hemos modificado el código para incluir un botón en GPIO12 que habilitará o deshabilitará el jiggler.
Para este proyecto necesitarás
- Un pico de frambuesa pi
- Protoboard de tamaño medio
- Pulsador
- 2 cables macho a macho
(Crédito de la imagen: Hardware de Tom)
El circuito es extremadamente simple, solo conecte un botón pulsador a GPIO 12 y GND. GPIO 12 se configurará para levantarse, y cuando se presione el botón, conectará el pin a GND. Esto activará el pin para cambiar el estado a bajo, y lo estamos usando 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 más para la matriz y el digitalio. Estas dos bibliotecas dan acceso al GPIO y nos permiten definir 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, un botón y configúrelo en GPIO12.
m = Mouse(usb_hid.devices) button = DigitalInOut(board.GP12)
3. Configure GPIO 12 como entrada y tire del pin hacia arriba. Algunos pines GPIO tienen una resistencia interna que podemos llevar a 3,3 V o 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 jigger está activo y si se ha presionado el botón. Al comienzo del código, ambos se configuran 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 del 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, 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 proporciona 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 está presionado actualmente y que los valores almacenados en active y button_press son 1. Esto significa que presionamos 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:
diez. 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 verificar que se presionó el botón y que active y button_press almacenan el valor 1. Esto significa que el usuario quiere deshabilitar el jiggler de código.
elif button.value == False and active == 1 and button_press == 1:
12 Imprime un mensaje al usuario, luego restablece 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 jiggler de código.
Lista completa 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 Adafruit Trinket QT2040
(Crédito de la imagen: Hardware de Tom)
Trinkey QT2040 de Adafruit es una placa tipo dongle USB alimentada por RP2040 de Raspberry Pi. No tiene un GPIO tradicional per se, sino que utiliza un conector StemmaQT para usar con placas de conexión compatibles.
Esta versión especial del código de alternancia de botones utiliza los mapas de botones de usuario integrados (BOOT) para habilitar/deshabilitar el código y el NeoPixel para indicar si el jiggler está activo. El código es en gran medida el mismo que el código de alternancia del botón anterior, solo que modificado para usar la referencia del botón (una abstracción de CircuitPython) y para configurar NeoPixels.
1. Descargar el conjunto de biblioteca para la misma versión de CircuitPython instalada en Pico. Hemos instalado 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 contenida en el interior.
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
(Crédito de la imagen: Hardware de Tom)
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
(Crédito de la imagen: Hardware de Tom)
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)
(Crédito de la imagen: Hardware de Tom)
7. Desplácese hacia abajo hasta la condición else if que activa el jigger. 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))
(Crédito de la imagen: Hardware de Tom)
8. Desplácese hacia abajo hasta donde está deshabilitado Code 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))
(Crédito de la imagen: Hardware de Tom)
9. Guarde el código como code.py en Adafruit Trinkey QT2040. La tarjeta se restablecerá y comenzará el código. Pulse el botón para alternar el código.
Lista completa 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)