Если вам нужно, чтобы ваш компьютер - особенно корпоративный ноутбук на вашей работе - видел вас активным, даже когда вы отходите от него, лучшим выбором будет устройство для перемещения мыши. Большинство компьютеров, выданных компанией, либо не позволяют устанавливать программное обеспечение, либо шпионят за тем, какие приложения вы запускаете, поэтому использование устройства, которое автоматически перемещает указатель, но представляется ОС как мышь, решает проблему. Вы можете отправиться на Amazon и купить USB-устройство стоимостью от $7 до $40, а можете сделать свой собственный джиглер для мыши, используя Raspberry Pi Pico за $4.
В этом руководстве мы построим самодельный джиглер для мыши, используя Raspberry Pi Pico и CircuitPython. Больше ничего не требуется, даже драйверов, что делает этот проект стоимостью $4 отличной экономией вашего времени и денег. Обратите внимание, что, хотя мы использовали Pico, эти инструкции подойдут для любого микроконтроллера с RP2040, имеющего поддержку CircuitPython (почти для всех). Такая плата, как Adafruit Trinkey QT2040, еще один микроконтроллер с питанием от RP2040, который стоит 8 долларов, будет даже лучше, чем Pico, потому что она имеет встроенный USB Type-A, поэтому даже не требует провода для подключения к компьютеру.
Настройка CircuitPython для мышиного джигглера
1. Перейдите на официальную страницу CircuitPython для Raspberry Pi Pico и загрузите образ прошивки UF2 последней версии. На момент написания статьи это была версия CircuitPython 8 Beta 6. Если вы используете другую плату с питанием от RP2040, найдите ее страницу UF2 на сайте Circuitpython.org.
2. Удерживая кнопку BOOTSEL, подключите Raspberry Pi Pico к компьютеру. Появится новый диск RPI-RP2.
3. Скопируйте загруженный файл CircuitPython UF2 в RPI-RP2. Это запишет CircuitPython во внутреннюю флэш-память Pico. Появится новый диск, CIRCUITPY.
Прежде чем мы сможем продолжить, нам понадобится ряд библиотек CircuitPython. Эти библиотеки с заранее написанным кодом добавляют дополнительные возможности проекту.
1. Скачайте пакет библиотек для той же версии CircuitPython, которая установлена на Pico. Мы установили CircuitPython 8, поэтому скачали пакет для версии 8.x.
2. Распакуйте пакет на рабочий стол, а затем откройте содержащуюся в нем папку lib.
3. Скопируйте папку adafruit_hid из этой папки lib в папку lib на диске CIRCUITPY.
Написание кода CircuitPython для мышиного джигглера
1. Скачайте и установите Thonny, если у вас его еще нет. Thonny - это редактор Python, который охватывает Python 3, MicroPython и CircuitPython.
2. Откройте Thonny и перейдите в меню Инструменты >> Параметры.
3. Выберите Интерпретатор, затем установите интерпретатор как CircuitPython, порт - автоматический, и нажмите OK. Теперь Thonny подключится к Pico W, на котором запущен CircuitPython.
4. Нажмите Файл >> Открыть и откройте файл code.py на устройстве CircuitPython (наш Raspberry Pi Pico).
5. Удалите любой код, уже содержащийся в файле.
6. Импортируйте библиотеку USB_HID, а затем библиотеку Adafruit's Mouse support.
import usb_hid
from adafruit_hid.mouse import Mouse
7. Импортируйте функцию sleep из библиотеки time. Мы будем использовать ее для добавления небольшой задержки между каждым движением.
from time import sleep
8. Создайте объект m для управления виртуальной мышью.
m = Mouse(usb_hid.devices)
9. Создайте цикл для непрерывного выполнения кода. Для целей тестирования этот цикл можно заменить циклом for, иначе код заблокирует нас от работы.
while True:
Альтернативное тестирование цикла for
for i in range(2):
10. Используйте команду "move", чтобы переместить курсор на 100 пикселей влево.
m.move(-100, 0, 0)
11. Выведите сообщение в оболочку Python и сделайте паузу на полсекунды. Печать помогает нам отлаживать код.
print("I am working")
12. Теперь переместите мышь на 100 пикселей вправо, выведите еще одно сообщение и сделайте паузу еще на полсекунды.
m.move(100, 0, 0)
print("Я очень занят")
sleep(0.5)
13. Переместите мышь вниз на 100 пикселей, выведите сообщение и сделайте паузу.
m.move(0, -100, 0)
print("Так много нужно сделать")
sleep(0.5)
14. Переместите мышь на 10 пикселей вверх, выведите сообщение и снова сделайте паузу.
m.move(0, 100, 0)
print("Мне нужен отпуск")
sleep(0.5)
15. Сохраните код как code.py на вашем Raspberry Pi Pico (устройство CircuitPython). CircuitPython автоматически запустит code.py (MicroPython также может сделать это с помощью main.py и boot.py), когда Pico будет подключен к компьютеру. Поскольку ОС считает, что это "просто мышь", проект может быть использован на любой ОС.
Полный листинг кода
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("Я работаю")
sleep(0.5)
m.move(100, 0, 0)
print("Я очень занят")
sleep(0.5)
m.move(0, -100, 0)
print("Мне так много нужно сделать")
sleep(0.5)
m.move(0, 100, 0)
print("Мне нужен отпуск")
sleep(0.5)
Добавление кнопки в DIY Jiggler
Подключаемый и работающий джиглер мыши удобен, но еще полезнее тот, который можно активировать нажатием кнопки. Здесь мы изменили код, чтобы включить кнопку на GPIO12, которая будет включать или выключать джиглер.
Для этого проекта вам понадобятся
Raspberry Pi Pico
Полуформатная плата
Кнопка
2 x провода "мужчина-мужчина
Схема очень проста, нам нужно только подключить кнопку к GPIO 12 и GND. GPIO 12 будет настроен на высокий уровень, а когда кнопка будет нажата, она соединит контакт с GND. Это приведет к изменению состояния контакта на низкий, и мы используем его в качестве переключателя для кода джигглера. Этот проект будет основан на коде из предыдущей версии.
1. Добавьте два дополнительных импорта для board и digitalio. Эти две библиотеки обеспечивают доступ к GPIO и позволяют нам устанавливать состояние пинов GPIO.
import usb_hid
from adafruit_hid.mouse import Mouse
из time import sleep
импортировать плату
from digitalio import DigitalInOut, Direction, Pull
2. Создайте объект, кнопку и установите ее как GPIO12.
m = Mouse(usb_hid.devices)
button = DigitalInOut(board.GP12)
3. Установите GPIO 12 в качестве входа и подтяните вывод к высокому уровню. Некоторые контакты GPIO имеют внутренний резистор, который мы можем подтянуть к высокому уровню 3,3 В или низкому уровню GND.
button.direction = Direction.INPUT
button.pull = Pull.UP
4. Создайте две переменные, active и button_press, и запишите в каждую из них 0. Эти две переменные будут хранить 0 или 1, определяя, активен ли джиглер и была ли нажата кнопка. В начале кода они обе установлены в неактивное состояние с помощью 0.
активный = 0
кнопка_нажата = 0
5. Добавьте цикл while True для выполнения кода.
while True:
6. Создайте условный оператор, который проверяет состояние кнопки и значение, хранящееся в active. Когда кнопка нажата, состояние GPIO 12 меняется с высокого (True) на низкое (False). При нажатии кнопки условный оператор проверяет значение, хранящееся в active. Значение по умолчанию равно 0, что означает, что джиглер не активен.
if button.value == False и active == 0:
7. Обновите переменные до 1, а затем выведите сообщение в оболочку Python.
активный = 1
кнопка_нажатия = 1
print("Включение")
8. Добавьте пятисекундную паузу для этого условия. Это даст нам время для нажатия кнопки и для того, чтобы код зарегистрировал нажатие, а также обеспечит достаточное время отбоя, которое предотвратит многократное нажатие кнопки.
sleep(5)
9. Используйте условие else if для проверки того, что кнопка в данный момент не нажата и что значения, сохраненные в active и button_press, равны 1. Это означает, что мы нажали кнопку и хотим, чтобы был запущен код джигглера мыши.
elif button.value == True и active == 1 и button_press == 1:
10. Повторно используем код мышиного джигглера для перемещения мыши по экрану.
m.move(-100, 0, 0)
print("Я работаю")
sleep(0.5)
m.move(100, 0, 0)
print("Я очень занят")
sleep(0.5)
m.move(0, -100, 0)
print("Мне так много нужно сделать")
sleep(0.5)
m.move(0, 100, 0)
print("Мне нужен отпуск")
sleep(0.5)
11. Создайте еще один условный оператор, чтобы проверить, что кнопка была нажата и что active и button_press сохраняют значение 1. Это означает, что пользователь хочет отключить код джигглера.
elif button.value == False и active == 1 и button_press == 1:
12. Выведите сообщение для пользователя, затем сбросьте значения, хранящиеся в переменных, перед паузой в пять секунд.
print("Выключение")
активный = 0
кнопка_нажатия = 0
sleep(5)
13. Сохраните проект под именем code.py на Raspberry Pi Pico, и плата перезагрузится и запустит код. Нажмите на кнопку, чтобы включить и выключить код джигглера.
Полный листинг кода
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
активный = 0
нажатие_кнопки = 0
while True:
if button.value == False and active == 0:
active = 1
кнопка_нажатия = 1
print("Включение")
sleep(5)
elif button.value == True и active == 1 и button_press == 1:
m.move(-100, 0, 0)
print("Я работаю")
sleep(0.5)
m.move(100, 0, 0)
print("Я очень занят")
sleep(0.5)
m.move(0, -100, 0)
print("Мне так много нужно сделать")
sleep(0.5)
m.move(0, 100, 0)
print("Мне нужен отпуск")
sleep(0.5)
elif button.value == False и active == 1 и button_press == 1:
print("Выключение")
активный = 0
нажатие_кнопки = 0
sleep(5)
Специальная версия Adafruit Trinket QT2040
Trinkey QT2040 от Adafruit - это плата в форме USB-ключа, работающая от Raspberry Pi RP2040. Она не имеет традиционного GPIO как такового, а использует разъем StemmaQT для использования с совместимыми разрывными платами.
Эта специальная версия кода переключения кнопок использует встроенную в плату пользовательскую кнопку (BOOT) для включения/выключения кода и NeoPixel для обозначения того, активен ли джиглер. Код в основном такой же, как и предыдущий код переключения кнопок, только изменен для использования ссылки на кнопку (абстракция CircuitPython) и для настройки NeoPixels.
1. Скачайте пакет библиотек для той же версии CircuitPython, которая установлена на Pico. Мы установили CircuitPython 8, поэтому скачали пакет для версии 8.x.
2. Распакуйте пакет на рабочий стол, а затем откройте содержащуюся в нем папку lib.
3. Скопируйте следующие файлы/папки из этой папки lib в папку lib на диске CIRCUITPY.
adafruit_hid
adafruit_pixelbuf.mpy
neopixel.mpy
4. Откройте новый файл в Thonny и скопируйте код из предыдущего примера.
5. В импорте добавьте строку для импорта библиотеки NeoPixel.
import neopixel
6. После настройки кнопки добавьте новую строку для создания соединения с единственным NeoPixel на Trinkey QT2040.
7. Прокрутите вниз до условия else if, которое включает джиглер. Здесь мы нажимаем кнопку, и переменные active и button_press устанавливаются в 1. Добавьте строку для установки пикселя в красный цвет с яркостью в одну четверть.
pixel.fill((32, 0, 0))
8. Прокрутите вниз до места, где код джигглера выключен. В этом месте кнопка нажата, а переменные active и button_press установлены в 1. Измените цвет NeoPixel на зеленый с яркостью в одну четверть.
pixel.fill((0, 32, 0))
9. Сохраните код как code.py на плате Adafruit Trinkey QT2040. Плата перезагрузится, и начнется выполнение кода. Нажмите на кнопку, чтобы переключить код.
Полный листинг кода
import usb_hid
from adafruit_hid.mouse import Mouse
from time import sleep
импортировать плату
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)
активный = 0
кнопка_нажатия = 0
while True:
if button.value == False and active == 0:
active = 1
кнопка_нажатия = 1
print("Включение")
sleep(5)
elif button.value == True и active == 1 и button_press == 1:
pixel.fill((32, 0, 0))
m.move(-100, 0, 0)
print("Я работаю")
sleep(0.5)
m.move(100, 0, 0)
print("Я очень занят")
sleep(0.5)
m.move(0, -100, 0)
print("Мне так много нужно сделать")
sleep(0.5)
m.move(0, 100, 0)
print("Мне нужен отпуск")
sleep(0.5)
elif button.value == False и active == 1 и button_press == 1:
pixel.fill((0, 32, 0))
print("Выключение")
активный = 0
нажатие_кнопки = 0
sleep(5)