Оглавление:
Видео: Accel Writing (Magic Hand): 4 шага (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:53
Вступление
Волшебная рука позволяет людям с ограниченными возможностями и нарушениями моторики наслаждаться творческими способностями рисования и письма в смоделированной среде. Magic Hand - это носимая перчатка, которая ощущает движение указательного пальца и преобразует его в рисование линий на экране компьютера.
Необходимые материалы
Коммутационная плата LSM9DOF --- $ 24,95 ---
Adafruit Feather с Wi-Fi --- 18,95 $ ---
Женский / женский провод --- $ 1,95 ---
Лента / липучка --- $ 3
Два магнита одинаковой силы --- Цены различаются
Как это работает
Используя акселерометр, мы можем собрать данные об ускорении по оси Y, которые помогут нам определить, когда палец пользователя движется вверх и вниз. Из-за того, что наш акселерометр измеряет ускорение относительно центра Земли, мы не можем определить ускорение по оси x (слева или справа). К счастью, коммутационная плата LSM9DOF также содержит магнитометр, который позволяет нам собирать данные о магнитных полях. Мы размещаем два магнита на расстоянии 30 см друг от друга, а перчатка между ними. Если магнитные данные положительны, мы знаем, что перчатка движется вправо и наоборот. После того, как все данные собраны в акселерометре / магнитометре, он отправляет данные по проводу в перо, которое подключено к компьютеру Wi-Fi, а затем пересылает данные на компьютер, который мы затем можем использовать в нашем коде.
Шаг 1: физический прототип 1
Этот прототип предназначен для сшивания перчаток на руке, чтобы она могла скользить по электронным устройствам. Затем электронное устройство будет прикреплено на липучке к основанию рукава под броней в сочетании с основной перчаткой на руке. Тогда зеленая перчатка скользит по основанию и электронным устройствам….
Этапы изготовления прототипа перчатки:
- Возьмите два куска ткани достаточного размера, чтобы их можно было провести по руке.
- Проведите рукой по обеим кускам ткани и вырежьте их.
- Соедините два выреза для рук вместе, чтобы они идеально совпали.
- Затем, чтобы подготовить швейную машину, пропустите нить через указанные места на машине.
- Когда швейная машина настроена, поднимите иглу и поместите два сложенных куска ткани под иглу.
- Убедитесь, что игла выровнена по самому краю ткани, включите машину и прошейте по краям ткани, оставляя две части несшитыми на запястье, чтобы рука могла войти внутрь.
Шаг 2: физический прототип 2
Наш последний прототип - это обычная перчатка в сочетании с ремешком на липучке, который можно регулировать на любом запястье. Перчатка и ремешок сшиты вместе, а электронные устройства прикреплены к перчатке с помощью липучки.
Этапы изготовления 2-го прототипа перчатки:
- Купите перчатку, материал перчатки значения не имеет.
- Купите браслет на липучке.
- Купите портативный аккумулятор
- Купить липкую липучку
- С помощью швейной иглы прикрепите ремешок на липучке к основанию перчатки.
- Ремешок для запястья должен адаптироваться к разным размерам запястья.
- Прикрепите липкую ленту к основанию акселерометра и прикрепите ее к указательному пальцу перчатки.
- Прикрепите к перышку липкую ленту и прикрепите ее к верхней части перчатки.
- С помощью проводов соедините контакт 3V3 в перо с контактом VIN акселерометра.
- С помощью проводов соедините контакт GND в перышке с контактом GND акселерометра.
- Используя провода, соедините контакт SCL в перышке с контактом SCL акселерометра.
- С помощью проводов соедините штырь SDA в перышке с штырем SDA акселерометра.
- Подключите хотя бы батарею на 5 вольт через usb к перу для обеспечения питания.
Шаг 3: Магниты
Шаг 1: Поместите два магнита одинаковой силы друг напротив друга.
Шаг 2: Измерьте зазор 30 см между двумя магнитами.
Шаг 3: поместите магнитометр точно посередине двух магнитов. Вы должны получить данные около 0, пока они находятся посередине. Если вы получаете нулевое значение, переходите к шагу 5.
Шаг 4: Если показание не равно нулю или близко к нулю, вы должны отрегулировать расстояние между магнитами. Если показание отрицательное, переместите левый магнит на см или 2 влево или до тех пор, пока показание не станет нулевым. Если положительный, сделайте то же самое, но с правым магнитом.
Шаг 5: Напишите код, который принимает данные от магнитометра и считывает их положительные или отрицательные. Если положительный, пусть код проведет линию вправо, а если отрицательный, проведет линию влево.
Шаг 4: Код
github.iu.edu/ise-e101-F17/MuscleMemory-Sw…
Вступление:
Чтобы обрабатывать данные с акселерометра, необходимо установить отношения клиент / сервер между пером Adafruit и сервером, обрабатывающим данные (работающим на ноутбуке / настольном компьютере). Необходимо будет создать два файла кода: один для клиента (перо Adafruit), а другой - для сервера (в данном случае ноутбук Джарода). Клиент написан на C ++, а сервер написан на python. Язык, используемый для клиента, имеет значение, поскольку Arduino в основном является языком C ++, и изменить его для использования другого языка сложно. Сервер может быть написан на любом языке, если он имеет сетевые функции.
Настройка клиента:
Сначала мы настроим клиентский код. Большая часть кода подключения к Wi-Fi доступна в библиотеках Adafruit. Начнем с включения соответствующих классов.
#include #include #include #include #include
Установите некоторые переменные, которые будут использоваться во всем коде.
// Подключение к сети const char * ssid = "MMServer"; const char * password = "Пароль сервера MMS"; // IP и порт сервера, который будет получать данные const char * host = "149.160.251.3"; const int port = 12347; bool connected = false;
// Инициализировать детектор движения
Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0 (1000);
Клиент WiFiClient;
Создайте функцию setup (), которая будет запускаться при запуске пера.
// Устанавливаем соединение WiFi и подключаемся к серверуvoid setup () {Serial.begin (9600); задержка (100);
Serial.println ();
Serial.println (); Serial.print («Подключение к»); Serial.println (ssid); // Запускаем WiFi WiFi.begin (ssid, пароль); // Подключение… while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } // Успешно подключился к WiFi Serial.println (""); Serial.println («WiFi подключен»); Serial.println ("IP-адрес:"); Serial.println (WiFi.localIP ());
#ifndef ESP8266
в то время как (! серийный); #endif Serial.begin (9600); Serial.println («Тест сенсора»);
// Инициализируем датчик
if (! lsm.begin ()) {// При обнаружении LSM9DS0 Serial.print возникла проблема (F («Ой, LSM9DS0 не обнаружен… Проверьте проводку или АДРЕС I2C!»)); в то время как (1); } Serial.println (F ("Найдено LSM9DS0 9DOF")); // Начинаем подключение к серверу Serial.print ("Подключение к"); Serial.println (хост);
// Проверяем успешное соединение. Если не удалось, то отменить
if (! client.connect (хост, порт)) {Serial.println ("соединение не удалось"); connected = false; возвращение; } else {connected = true; }
// Устанавливаем коэффициент усиления датчика и время интегрирования
configureSensor (); }
Затем нам нужна функция цикла, которая будет повторять цикл. В этом случае он используется для многократной отправки данных с акселерометра на сервер в форме «[z_accel]: [y_mag]: [z_mag]». Client.print (числа); функция - это то, что отправляет данные на сервер.
void loop () {задержка (250); if (connected) {// Это отправит данные на сервер sensor_event_t Accel, mag, gyro, temp; lsm.getEvent (& Accel, & Mag, & gyro, & temp); Строковые числа; числа + = excl.acceleration.z; числа + = ":"; числа + = mag.magnagnet.y; числа + = ":"; числа + = mag.magnagnet.z; Serial.print (числа); client.print (числа); Serial.println (); } else {installConnection (); }}
Для некоторых служебных функций нам нужна одна для установления связи между пером и сервером.
void installConnection () {if (! client.connect (хост, порт)) {Serial.println ("соединение не удалось"); connected = false; возвращение; } else {connected = true; }}
Нам также необходимо настроить датчик и указать диапазон значений, которые он будет считывать. Например, у ускорения есть 5 вариантов диапазона: 2g, 4g, 6g, 8g и 16g.
void configureSensor (void) {// Установить диапазон акселерометра //lsm.setupAccel(lsm. LSM9DS0_ACCELRANGE_2G); lsm.setupAccel (lsm. LSM9DS0_ACCELRANGE_4G); //lsm.setupAccel(lsm. LSM9DS0_ACCELRANGE_6G); //lsm.setupAccel(lsm. LSM9DS0_ACCELRANGE_8G); //lsm.setupAccel(lsm. LSM9DS0_ACCELRANGE_16G); // Устанавливаем чувствительность магнитометра //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_2GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_4GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_8GAUSS); lsm.setupMag (lsm. LSM9DS0_MAGGAIN_12GAUSS);
// Настраиваем гироскоп
lsm.setupGyro (lsm. LSM9DS0_GYROSCALE_245DPS); //lsm.setupGyro(lsm. LSM9DS0_GYROSCALE_500DPS); //lsm.setupGyro(lsm. LSM9DS0_GYROSCALE_2000DPS); }
Настройка сервера:
Сервером будет файл Python, который будет запускаться в командной строке компьютера. Для начала импортируйте необходимые классы.
импортировать socketimport повторно импортировать pyautogui
сокет используется для работы в сети. re используется для регулярных выражений или манипуляций со строками. pyautogui - это библиотека Python, которая позволяет рисовать (обсуждается позже).
Затем мы должны определить некоторые переменные. Это будут глобальные переменные, поэтому доступ к ним будет осуществляться в нескольких функциях. Они будут использоваться позже в коде.
i = 0n = 0 строка = 1
data_list =
mag_data =
mag_calib_y = 0 mag_offset_y = 0
z_calib = 0
z_offset = 0 z_moving_offset = 0 z_diff = 0 z_real = 0 z_velo = 0 z_pos = 0
keep_offset = Ложь
first_data = Верно
Теперь нам нужна функция для создания сервера и открытия его для входящих подключений.
def startServer (): global i global first_data # инициализировать серверный сокет serversocket = socket.socket (socket. AF_INET, socket. SOCK_STREAM) serversocket.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEADDR, 1) # IP-адрес сервера и порт host = " 149.160.251.3 "port = 12347 server_address = (host, port) # Откройте сервер и прослушайте входящие соединения print ('Запуск сервера на% s порт% s'% server_address) serversocket.bind (server_address) serversocket.listen (5) # Ждать соединений… while True: print ('Waiting for connection…') # Принять входящее соединение (clientocket, address) = serversocket.accept () # Попытаться проанализировать полученные данные try: print ('Connection connected from', address) while True: # Принимаем данные и отправляем их на обработку data = clientsocket.recv (25) Accel_data = re.split ('[:]', str (data)) Accel_data [0] = Accel_data [0] [2:] Accel_data [1] = Accel_data [1] Accel_data [2] = Accel_data [2] [1: -1] print (Accel_data) i + = 1 if (i <51): calibData (Accel_data) else: movingAcce l (Accel_data [0]) processData (Accel_data) first_data = False finally: # Закройте сокет, чтобы предотвратить ненужную утечку данных. clientsocket.close ()
Теперь нам нужны функции, которые будут обрабатывать все данные. Первый шаг и первая вызываемая функция - это калибровка датчика для целей расчета.
def calibData (list): global z_calib global z_offset global mag_data global mag_calib_y global mag_offset_y z_calib + = float (list [0]) mag_calib_y + = float (list [1]) if (i == 50): z_offset = z_calib / 50 mag_offset_y = mag_calib_y / 50 z_calib = 0 mag_calib_y = 0 mag_data.append (mag_offset_y)
Затем мы создаем смещение ускорения движения. Благодаря этому программа распознает, когда кто-то перестает двигать пальцем, потому что все значения для ускорения, которые отправляются на сервер, должны быть одинаковыми в это время.
def movingAccel (num): global z_calib global z_diff global z_moving_offset global z_offset global data_list global n global keep_offset if (n 0.2 или z_diff <-0.2): # обнаружено движение внутри данных, перезапустить keep_offset = True n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 data_list = break if not keep_offset: # стационарный в данных, установить новый z_offset z_offset = z_moving_offset print ("Новый z_offset:") print (z_offset) n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 data_list = keep_offset = Ложь keep_offset = Ложь
Затем мы делаем основную часть математики. Это включает в себя перевод данных об ускорении в данные о положении, которые позволят нам определить направление, в котором пользователь двигает пальцем.
def processData (list): # [Accel.z, mag.y] global z_offset global z_real global z_velo global z_pos global first_data global mag_data
z_real = float (список [0]) - z_offset
mag_y = list [1] mag_z = list [2] left = False right = False # Не обрабатывать ускорение, пока не будет абсолютно уверено, что оно ускорено # Предотвращает влияние механического шума на положение if (z_real -0.20): z_real = 0 # Начать интеграции для поиска позиции if (first_data): mag_data.append (mag_y) z_pos = (0,5 * z_real * 0,25 * 0,25) + (z_velo * 0,25) + z_pos z_velo = z_real * 0,25 pyautogui.moveTo (1500, 1000) else: z_pos = (0,5 * z_real * 0,25 * 0,25) + (z_velo * 0,25) + z_pos z_velo = (z_real * 0,25) + z_velo del mag_data [0] mag_data.append (mag_y) if (float (mag_data [1]) - float (mag_data [0])> 0,03): right = True elif (float (mag_data [1]) - float (mag_data [0]) <-0.03): left = True if (right): motion (50, int (z_pos *) 1000)) elif (слева): движение (-50, int (z_pos * 1000)) z_velo = 0 z_pos = 0
Теперь, наконец, перемещаем курсор! Для этого мы открыли окно рисования и сделали его полноэкранным. Библиотека pyautogui содержит функцию pyautogui.dragRel (x, y); который мы используем для перетаскивания курсора мыши из одной точки в другую. Он использует данные относительного положения, поэтому движение происходит относительно последней позиции курсора.
def движение (x, y): print ("перемещение в", x, -y) pyautogui.dragRel (x, -y)
Наконец, нам нужно вызвать основную функцию, чтобы разрешить запуск всего этого кода.
# Вызывает функцию для запуска serverstartServer ()
Рекомендуемые:
Magic Button 4k: беспроводной пульт дистанционного управления BMPCC 4k (или 6k) за 20 долларов США: 4 шага (с изображениями)
Magic Button 4k: беспроводной пульт дистанционного управления BMPCC 4k (или 6k) за 20 долларов США: Многие люди просили меня поделиться некоторыми подробностями о моем беспроводном контроллере для BMPCC4k. Большинство вопросов касалось управления bluetooth, поэтому я упомяну несколько подробностей об этом. Я предполагаю, что вы знакомы со средой ESP32 Arduino
Easy Crawling Zombie Hand .: 15 шагов (с изображениями)
Easy Crawling Zombie Hand: для этой инструкции не нужен сварочный пистолет. Безопасно для детей практиковаться, чтобы создать простую схему. Но остерегайтесь небольших предметов, которые могут быть случайно проглочены. Необходимые материалы: -Вибрационный двигатель (1,5 ~ 3В, с проводом) -Проводящая лента (10 мм, односторонняя, квасцы
Home Made - One Hand - Анализатор найтрокса на базе Arduino: 4 шага
Самоделка - одна рука - анализатор нитрокса на основе Arduino: Здравствуйте, читатели! В этой инструкции я покажу вам, как я построил этот анализатор кислорода на базе Arduino. *** ВНИМАНИЕ - Это тип материала, который можно использовать для управления вашим погружением. состав смеси. Дайвинг может быть опасным, и все, что вы делаете с
Пульт дистанционного управления Magic Button: 3 шага (с изображениями)
Дистанционный переключатель «Волшебная кнопка»: ПРОБЛЕМА: Светодиодная панель («сделай сам», конечно же!), Установленная на потолке моей мастерской / гаража, подключена к розетке на потолке. Мне нужен был способ удаленно включать и выключать его от того места, где расположены основные выключатели света. РЕШЕНИЕ:
Как вытряхнуть iPod Hand-Me-Down с неловкой гравировкой на спине: 3 шага
Как накачать IPod Hand-Me-Down с неловкой гравировкой на спине: Недавно моя мама купила новый iPod Nano в модных штанах. Так что я купил ее старый iPod. К сожалению, на нем была мягкая гравировка, так как это был подарок моего отца. Итак, я решил добавить на него немного рок-н-ролла