Протез шестого пальца V2 - С ЭЛЕКТРОПРИВОДОМ............
Использует микросервопривод, датчик изгиба и Arduino Nano для питания связки пальца.
ИСПОЛЬЗУЕМЫЕ ВНЕШНИЕ ЧАСТИ:
Ардуино Нано
Микросервопривод MG90S
Гибкий датчик SpectraFlex от Spectra Symbol (55 мм)
Перчатка художника HUION
Леска (плетеная, 60 фунтов)
Резистор 10К
Аппаратное обеспечение М3
Схема подключения (подключите GND к GND на Nano и VIN к 5 В на Nano):
Кредит:
Связка собирается с использованием обрезанного рожка сервопривода (чтобы осталась только та часть, которая скользит по сервоприводу) и приклеенной вокруг него катушки сервопривода (деталь шкива).
Датчик горячего клея внутри перчатки для отслеживания изгиба мизинца.
ВОПРОСЫ? Пожалуйста, напишите в Директ. В следующем обновлении будет использоваться специальная печатная плата, чтобы устранить недостаток питания сервопривода и повысить стабильность системы (ОТКРЫТО ДЛЯ СОТРУДНИЧЕСТВА ДЛЯ ЭТОГО).
КОД Arduino (включает 3-секундную калибровку для выдвижения и втягивания):
#include
Сервопривод myServo;
const int flexsensor = A0;
const int servoPin = 11;
плавающее значение emaValue = 0;
константное плавающее альфа = 0,15; // Сглаживание
int SensorMin = 0;
INT SensorMax = 1023;
const unsigned long sampleDuration = 3000; // 3 секунды
// === Нелинейное отображение ===
floatnonlinearMap(float x) {
float нормализованный = constrain((x — SensorMin) / float(sensorMax — SensorMin), 0.0, 1.0);
float изогнутый = pow(нормализованный, 1,5); // Экспоненциальный ответ
возврат изогнутый * 180,0;
}
недействительная настройка() {
Серийный.начало(9600);
myServo.attach(servoPin);
// === ШАГ 1 КАЛИБРОВКИ ===
Serial.println(«Калибровка: выпрямите палец...»);
мойСерво.запись(0); // Переходим в открытую позицию
задержка(3000); // Даём пользователю время
SensorMin = средний датчик (sampleDuration);
Serial.print(«Датчик МИН: „); Serial.println(sensorMin);
// === ШАГ 2 КАЛИБРОВКИ ===
Serial.println(“Теперь полностью согните палец...»);
мойСерво.запись(180); // Переходим в закрытую позицию
задержка(3000); // Даём пользователю время
SensorMax = AverageSensor(sampleDuration);
Serial.print(«Датчик MAX: „); Serial.println(sensorMax);
emaValue = AnalogRead(flexsensor); // Инициализируем EMA
}
недействительный цикл() {
int rawValue = AnalogRead(flexsensor);
emaValue = альфа * rawValue + (1 — альфа) * emaValue;
float servoAngle =nonlinearMap(emaValue);
servoAngle = constrain (servoAngle, 0, 180);
myServo.write((int)servoAngle);
// Отладочный вывод
Serial.print(“Необработанное: „); Serial.print(rawValue);
Serial.print(“ | EMA: „); Serial.print((int)emaValue);
Serial.print(“ | Сервопривод: „); Serial.println((int)servoAngle);
задержка(10);
}
// === Помощник: усреднение датчика ===
int AverageSensor(длинная длительность без знака) {
беззнаковый длинный старт = миллис();
длинная сумма = 0;
число интервалов = 0;
while (миллис() — начало <продолжительность) {
int val = AnalogRead (flexsensor);
сумма += значение;
считать++;
задержка(10);
}
возвращаемая сумма/счет;
}






