Протез шестого пальца 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);
}

возвращаемая сумма/счет;
}

02:36
10
Нет комментариев. Ваш будет первым!

Ссылка появится после регистрации

Посещая этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.