Найти тему

Получение данных с датчика жестов на Python

Оглавление

Речь пойдёт о достаточно дешёвом, но интересном датчике на микросхеме PAJ7620 и шиной I2C. Он умеет определять движения рукой влево, вправо, вверх, вниз, приближение, отдаление, круговые движения по и против часовой стрелки.

PAJ7620
PAJ7620

Выбрал я его для домашнего проекта (при удачной реализации расскажу про него в дргой заметке). Пока жду доставки платы контроллера, надо бы научиться с ним работать. Как оказалось, это достаточно просто. Хотя и выбрал не очень простой путь.

Теперь о другом железе, которое использовал для экспериментов:

  • ПК с убунтой 22.04;
  • Адаптер USB-I2C на CH341T;

Здесь стоит отметить, что адаптер должен поддерживать режим мастер, так как нам предстоит получать данные из шины I2C

Адаптер I2C на CH341T

-2

Для начала удостоверимся, что перемычки установлены на 3.3V и интерфейс I2C.

lsusb показывает адаптер такой строкой
lsusb показывает адаптер такой строкой

Теперь установим драйвер адаптера. Код драйвера - https://github.com/gschorcht/i2c-ch341-usb

Здесь ждёт небольшой сюрпиз, так как теперь в новых кернелах линукса функция irq_to_desc скрыта и драйвер не скомпилируется. Надо в коде i2c-ch341-usb.c (в моей версии строка 660) заменить

ch341_dev->irq_descs[i] = irq_to_desc(ch341_dev->irq_base + i);

на

ch341_dev->irq_descs[i] = irq_data_to_desc( irq_get_irq_data(ch341_dev->irq_base + i) );

Компилируем, устанавливаем.

Интерфейсов под адаптер на питоне написано достаточно много. Взял такой - https://github.com/RayNieport/ch341-py-smbus.

Здесь тоже меня ожидал небольшой сюрприз. Адаптер определялся отлично, но при попытке сконфигурировать вылетала ошибка о том, что девайс уже используется. Для этого дописал в код инициализации перед установкой конфигурации:

interfaces = dev[0].interfaces()
i = interfaces[0].bInterfaceNumber
if dev.is_kernel_driver_active(i):
dev.detach_kernel_driver(i)

Ура! Адаптер наш!

Теперь дело за малым.

Датчик PAJ7620

Чтобы считать данные о жестах надо совсем немного:

  1. Адрес I2C шины, на котором сидит датчик. Если правильно понимаю, то он по умолчанию всегда 0x73. Думаю, что это можно перепрошить, но отложим на момент, когда понадобится на одной шине несколько датчиков.
  2. Адрес регистра, на котором сидит определение основных жестов - 0x43. На 0x44 сидит определение круговых движений.
  3. Маски самих жестов: вверх - 1, вниз - 2, влево - 4, вправо - 8, вперёд - 16, назад - 32, по часовой - 64, против часовой - 128, волна - 256.

В общем всё. Пишем скрипт опрашивающий датчик - https://gitlab.com/agglutinator/paj7620.