Точное EMG-управление роботизированной рукой: интеграция с InMoov и руководство по сборке
Компоненты и материалы
| Компонент | Количество | Примечание |
|---|---|---|
| Устройство uECG | 3 | Регистрация EMG-сигналов (3 канала) |
| Рука InMoov | 1 | Открытый 3D-печатный протез |
| Arduino Nano R3 | 1 | Управление сервоприводами |
| Драйвер PWM PCA9685 (16 каналов, Adafruit) | 1 | I2C-управление сервоприводами |
| Модуль nRF24L01+ | 1 | Приём данных от uECG по радио |
О проекте
Наша команда давно работает с роботизированными руками. Долгое время пытались создать надёжный протез, но для этого проекта используем проверенный открытый проект InMoov. Сборка руки подробно описана на сайте проекта — она сложная, поэтому здесь фокус на системе управления, которая полностью нова. Также рекомендую посмотреть эволюцию этой технологии в следующем проекте: 8-канальный EMG с LED-индикацией.
1. Обработка сигналов
Управление основано на ЭМГ — электрической активности мышц. EMG-сигнал снимается тремя устройствами uECG (хотя они позиционируются как ECG-мониторы, их АЦП позволяет регистрировать любые биосигналы, включая EMG). В специальном режиме uECG передаёт 32-биновый спектр и усреднённое значение «мышечного окна» (средняя спектральная интенсивность 75–440 Гц). Спектрограммы выглядят так: частота по вертикали (0–488 Гц, шаг ~15 Гц), время по горизонтали (~10 сек), интенсивность — цветом (синий — низко, зелёный — средне, жёлтый/красный — высоко).
Для надёжного распознавания жестов нужна обработка спектрограмм на ПК/смартфоне. Но для простого управления пальцами достаточно усреднённых значений по 3 каналам, которые uECG удобно предоставляет в пакете данных. Сырые значения по трём каналам при сжатии большого, безымянного и среднего пальцев показывают смешанные сигналы: например, сигналы 1-го и 3-го каналов похожи по синему, но отличаются по красному и зелёному.
Для разделения («размешивания») сигналов использована формула:
S0 = V0² / ((V1 × a0 + b0) × (V2 × c0 + d0))
где S0 — оценка для канала 0, V0, V1, V2 — сырые значения каналов, a, b, c, d — коэффициенты, подобранные вручную (a, c: 0.3–2.0; b, d: 15–20; требуют индивидуальной настройки под размещение датчиков). Аналогично считаются S1 и S2. После этого графики становятся чётко разделёнными — каждый жест даёт пик на своём канале, что позволяет легко преобразовать в движения сервоприводов по пороговому принципу.
2. Схема подключения
Схема простая: нужен только nRF24, PCA9685 (или аналогичный I2C PWM-контроллер) и мощный 5В источник питания (минимум 5А для одновременного движения всех сервоприводов).
Список соединений:
- nRF24 GND → Arduino GND
- nRF24 Vcc → Arduino 3.3V
- nRF24 CE → Arduino D9
- nRF24 CSN → Arduino D8
- nRF24 SCK → Arduino D13
- nRF24 MOSI → Arduino D11
- nRF24 MISO → Arduino D12
- PCA9685 SDA → Arduino A4
- PCA9685 SCL → Arduino A5
- PCA9685 Vcc → Arduino 5V
- PCA9685 GND → Arduino GND
- PCA9685 V+ → Мощный 5V (минимум 5А)
- PCA9685 GND → GND мощного источника
- Сервоприводы пальцев: каналы PCA 0–4 (0 — большой палец, 1 — указательный и т.д.)
3. Размещение EMG-датчиков
Для качественных показаний важно правильно разместить uECG. Много вариантов возможны, каждый требует своей обработки — делюсь рабочим вариантом:
Может показаться контрпрятным, но сигнал большого пальца лучше виден на противоположной стороне предплечья. Все датчики размещены ближе к локтю (мышцы имеют основную массу там, но точное местоположение индивидуально — нужно проверять).
4. Программный код
Перед запуском нужно узнать уникальные ID своих uECG-устройств (раскомментировать строку 101 и включать устройства по одному) и записать их в массив unit_ids (строка 37).
Код (emg_hand_control2.ino) включает:
- Настройку nRF24 (1 Мбит/с, канал 22, 4-байтовый адрес, CRC отключён)
- Приём 32-байтовых пакетов от uECG (ID устройства в байтах 3–6, тип пакета в байте 7 = 32 для EMG-режима, значение мышцы в байтах 10–11 дублировано для защиты от шумов)
- Экспоненциальное сглаживание значений (коэф. 0.7/0.3)
- Расчёт оценок (scores) по формуле разделения сигналов
- Пороговое управление целевыми углами 5 пальцев (30° — открыт, 150° — закрыт)
- Плавное перемещение сервоприводов (скорость 15°/шаг, обновление не чаще 20 мс)
- Вывод отладочных оценок в Serial Monitor
Важно: uECG должно быть переключено в «raw data mode» (длинное нажатие кнопки), по умолчанию оно работает в BLE-режиме, несовместимом с nRF24.
5. Результаты
После ~2 часов экспериментов достигнута довольно надёжная работа (видео показывает типичный случай). Система распознаёт только сжатые/раскрытые пальцы и не все 5 по отдельности — только 3 мышечные группы: большой палец, указательный+средний вместе, безымянный+мизинец вместе. «ИИ» занимает 3 строки кода и использует одно значение на канал. Анализ 32-биновых спектрограмм на ПК/смартфоне даст гораздо больше возможностей. Использовано только 3 канала EMG — с большим числом каналов можно распознавать сложные паттерны. Проект даёт отправную точку для заинтересованных — управление рукой далеко не единственное применение.
Исходный код
Полный скетч emg_hand_control2.ino в разделе Code.
Схемы
Файл схемы для Fritzing: nrf24_hand_control_5jcEeCP8a3.fzz
Производственный процесс
- Противозачаточные таблетки: история, польза, риски и производство
- Создание беспроводного робототехнического автомобиля с ИК-сенсорами
- Trinamic и Maxim Integrated выпускают референс-дизайн для ускорения end-of-arm tooling в промышленной робототехнике
- Система управления температурой на базе LM35 с микроконтроллером AT89S52
- ИИ-управляемые фотонные чипы формируют широкополосный свет для умной оптики
- Оптимизация роботизированной автоматизации с передовым ПО для симуляции роботов 3DG
- Автоматическое управление модельной железной дорогой на Arduino — DIY-контроллер поезда
- Универсальный Android-пульт на Arduino, 1Sheeld и ИК-управлении
- Удаленное IoT-управление самодельной манипулятором
- Студенты строят передовиую роботизированную систему сортировки мусора на базе B&R