Оглавление:

Accel Writing (Magic Hand): 4 шага (с изображениями)
Accel Writing (Magic Hand): 4 шага (с изображениями)

Видео: Accel Writing (Magic Hand): 4 шага (с изображениями)

Видео: Accel Writing (Magic Hand): 4 шага (с изображениями)
Видео: Угадай по ЭМОДЖИ Челлендж ! 2024, Ноябрь
Anonim
Accel Writing (Волшебная рука)
Accel Writing (Волшебная рука)
Accel Writing (Волшебная рука)
Accel Writing (Волшебная рука)
Accel Writing (Волшебная рука)
Accel Writing (Волшебная рука)

Вступление

Волшебная рука позволяет людям с ограниченными возможностями и нарушениями моторики наслаждаться творческими способностями рисования и письма в смоделированной среде. Magic Hand - это носимая перчатка, которая ощущает движение указательного пальца и преобразует его в рисование линий на экране компьютера.

Необходимые материалы

Коммутационная плата LSM9DOF --- $ 24,95 ---

Adafruit Feather с Wi-Fi --- 18,95 $ ---

Женский / женский провод --- $ 1,95 ---

Лента / липучка --- $ 3

Два магнита одинаковой силы --- Цены различаются

Как это работает

Используя акселерометр, мы можем собрать данные об ускорении по оси Y, которые помогут нам определить, когда палец пользователя движется вверх и вниз. Из-за того, что наш акселерометр измеряет ускорение относительно центра Земли, мы не можем определить ускорение по оси x (слева или справа). К счастью, коммутационная плата LSM9DOF также содержит магнитометр, который позволяет нам собирать данные о магнитных полях. Мы размещаем два магнита на расстоянии 30 см друг от друга, а перчатка между ними. Если магнитные данные положительны, мы знаем, что перчатка движется вправо и наоборот. После того, как все данные собраны в акселерометре / магнитометре, он отправляет данные по проводу в перо, которое подключено к компьютеру Wi-Fi, а затем пересылает данные на компьютер, который мы затем можем использовать в нашем коде.

Шаг 1: физический прототип 1

Физический прототип 1
Физический прототип 1
Физический прототип 1
Физический прототип 1

Этот прототип предназначен для сшивания перчаток на руке, чтобы она могла скользить по электронным устройствам. Затем электронное устройство будет прикреплено на липучке к основанию рукава под броней в сочетании с основной перчаткой на руке. Тогда зеленая перчатка скользит по основанию и электронным устройствам….

Этапы изготовления прототипа перчатки:

  • Возьмите два куска ткани достаточного размера, чтобы их можно было провести по руке.
  • Проведите рукой по обеим кускам ткани и вырежьте их.
  • Соедините два выреза для рук вместе, чтобы они идеально совпали.
  • Затем, чтобы подготовить швейную машину, пропустите нить через указанные места на машине.
  • Когда швейная машина настроена, поднимите иглу и поместите два сложенных куска ткани под иглу.
  • Убедитесь, что игла выровнена по самому краю ткани, включите машину и прошейте по краям ткани, оставляя две части несшитыми на запястье, чтобы рука могла войти внутрь.

Шаг 2: физический прототип 2

Физический прототип 2
Физический прототип 2
Физический прототип 2
Физический прототип 2

Наш последний прототип - это обычная перчатка в сочетании с ремешком на липучке, который можно регулировать на любом запястье. Перчатка и ремешок сшиты вместе, а электронные устройства прикреплены к перчатке с помощью липучки.

Этапы изготовления 2-го прототипа перчатки:

  1. Купите перчатку, материал перчатки значения не имеет.
  2. Купите браслет на липучке.
  3. Купите портативный аккумулятор
  4. Купить липкую липучку
  5. С помощью швейной иглы прикрепите ремешок на липучке к основанию перчатки.
  6. Ремешок для запястья должен адаптироваться к разным размерам запястья.
  7. Прикрепите липкую ленту к основанию акселерометра и прикрепите ее к указательному пальцу перчатки.
  8. Прикрепите к перышку липкую ленту и прикрепите ее к верхней части перчатки.
  9. С помощью проводов соедините контакт 3V3 в перо с контактом VIN акселерометра.
  10. С помощью проводов соедините контакт GND в перышке с контактом GND акселерометра.
  11. Используя провода, соедините контакт SCL в перышке с контактом SCL акселерометра.
  12. С помощью проводов соедините штырь SDA в перышке с штырем SDA акселерометра.
  13. Подключите хотя бы батарею на 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 ()

Рекомендуемые: