Съдържание:

Accel Writing (Magic Hand): 4 стъпки (със снимки)
Accel Writing (Magic Hand): 4 стъпки (със снимки)

Видео: Accel Writing (Magic Hand): 4 стъпки (със снимки)

Видео: Accel Writing (Magic Hand): 4 стъпки (със снимки)
Видео: Какого числа от 1 до 31, родился человек, такая у него и вся жизнь 2024, Ноември
Anonim
Accel Writing (Magic Hand)
Accel Writing (Magic Hand)
Accel Writing (Magic Hand)
Accel Writing (Magic Hand)
Accel Writing (Magic Hand)
Accel Writing (Magic Hand)

Въведение

Вълшебната ръка позволява на хората с увреждания и двигателни увреждания да се насладят на творчеството на рисуване и писане в симулирана среда. Вълшебната ръка е носеща ръкавица, която усеща движението на показалеца ви и го превежда в изчертаване на линии на компютърен екран.

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

LSM9DOF Breakout Board --- $ 24.95 ---

Адафрутно перо с Wifi --- $ 18,95 ---

Женски/женски проводници --- $ 1.95 ---

Ленти/велкро ленти --- $ 3

Два магнита с еднаква сила --- Цените варират

Как работи

С помощта на акселерометър можем да съберем данни за ускорението за оста y, което ще ни помогне да определим кога пръстът на потребителя се движи нагоре и надолу. Поради факта, че нашият акселерометър измерва ускорението по отношение на центъра на Земята, не можем да определим ускорението на оста x (вляво или вдясно). За щастие пробивната платка LSM9DOF съдържа и магнитометър, който ни позволява да събираме данни за магнитните полета. Поставяме два магнита на 30 см един от друг и ръкавицата е между тях. Ако магнитните данни се четат положително, тогава знаем, че ръкавицата се движи надясно и обратно. След като всички данни бъдат събрани в акселерометъра/магнитометъра, той изпраща данните по проводник към перото, което е свързано към компютър с wifi и след това препраща данните към компютъра, който след това можем да използваме в нашия код.

Стъпка 1: Физически прототип 1

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

Този прототип е предназначен да бъде пришит свободно ръкавици на ръката, за да може да се плъзне по електронните устройства. След това електронното устройство ще бъде прикрепено с велкро към основата на бронята под бронята, комбинирано с основна ръкавица на ръката. Тогава зелената ръкавица ще се плъзне върху основата и електронните устройства….

Стъпки при изработката на прототипната ръкавица:

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

Стъпка 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: Ако показанието не е нула или е близо до нула, тогава трябва да регулирате разстоянието на магнитите. Ако показанието е отрицателно, преместете левия магнит на cm или 2 наляво или докато отчитането е нула. Ако е положителен, направете същото, освен с десния магнит.

Стъпка 5: Напишете код, който приема данните от магнитометъра и чете дали е положителен или отрицателен. Ако кодът е положителен, изчертайте линия вдясно, а ако отрицателен - линия вляво.

Стъпка 4: Код

Код
Код

github.iu.edu/ise-e101-F17/MuscleMemory-Sw…

Въведение:

За да се обработват данни от акселерометъра, трябва да се установи връзка клиент/сървър между перата на Adafruit и сървъра, който обработва данните (работещ на лаптоп/десктоп). Ще трябва да бъдат създадени два кодови файла: единият за клиента (перата на Adafruit), а другият за сървъра (в този случай лаптопа на Jarod). Клиентът е написан на C ++, а сървърът е написан на python. Езикът, използван за клиента, има значение, тъй като Arduino е предимно език на C ++ и промяната му с друг език е трудна. Сървърът може да бъде написан на всеки език, стига да има мрежови функции.

Настройка на клиента:

Първо ще настроим клиентския код. Повечето от кода за WiFi връзка са лесно достъпни чрез библиотеките на Adafruit. Започваме с включване на съответните класове.

#включи #включи #включи #включи #включи

Задайте някои променливи, които ще се използват в кода.

// Свързване към мрежа const char* ssid = "MMServer"; const char* password = "MMServer-Password"; // IP и порт на сървъра, който ще получава данни const char* host = "149.160.251.3"; const int порт = 12347; bool connected = false;

// Инициализиране на детектор на движение

Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0 (1000);

Клиент WiFiClient;

Създайте функция setup (), която ще се стартира веднага щом перото започне.

// Настройка на WiFi връзка и свързване към servervoid setup () {Serial.begin (9600); забавяне (100);

Serial.println ();

Serial.println (); Serial.print ("Свързване към"); Serial.println (ssid); // Стартирайте WiFi WiFi.begin (ssid, парола); // Свързване … while (WiFi.status ()! = WL_CONNECTED) {забавяне (500); Serial.print ("."); } // Успешно свързан с WiFi Serial.println (""); Serial.println ("WiFi свързан"); Serial.println ("IP адрес:"); Serial.println (WiFi.localIP ());

#ifndef ESP8266

while (! Сериен); #endif Serial.begin (9600); Serial.println ("Тест на сензора");

// Инициализиране на сензора

if (! lsm.begin ()) {// Възникна проблем при откриването на LSM9DS0 Serial.print (F ("Опа, не е открит LSM9DS0 … Проверете кабелите или I2C ADDR!")); докато (1); } Serial.println (F ("Намерено LSM9DS0 9DOF")); // Започнете свързване към сървъра Serial.print ("Свързване към"); Serial.println (хост);

// Проверете за успешна връзка. Ако не успеете, прекратете

if (! client.connect (хост, порт)) {Serial.println ("връзката е неуспешна"); свързан = невярно; връщане; } else {connected = true; }

// Настройка на усилването на сензора и времето за интегриране

configureSensor (); }

След това се нуждаем от циклична функция, която ще се повтаря многократно. В този случай се използва за многократно изпращане на данни от акселерометъра към сървъра под формата на „[z_accel]: [y_mag]: [z_mag]”. Client.print (числа); функция е това, което изпраща данни към сървъра.

void loop () {забавяне (250); if (connected) {// Това ще изпрати данни към сървъра sensors_event_t accel, mag, gyro, temp; lsm.getEvent (& ускорение, & mag, & жироскоп, & temp); Номера на низове; числа += ускорение.ускорение.z; числа += ":"; числа += mag.magnetic.y; числа += ":"; числа += mag.magnetic.z; Serial.print (числа); client.print (числа); Serial.println (); } else {installConnection (); }}

За някои помощни функции се нуждаем от такава, за да установим връзката между перото и сървъра.

void installConnection () {if (! client.connect (хост, порт)) {Serial.println ("връзката е неуспешна"); свързан = невярно; връщане; } 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 re импортиране pyautogui

гнездото се използва за работа в мрежа. re се използва за regex или низови манипулации. pyautogui е библиотека на python, която ще позволи рисуването да се случи (обсъдено по -късно).

След това трябва да дефинираме някои променливи. Това ще бъдат глобални променливи, така че те ще бъдат достъпни в множество функции. Те ще бъдат използвани по -късно в кода.

i = 0n = 0 ред = 1

списък с данни =

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 = False

first_data = Вярно

Сега се нуждаем от функция за създаване на сървър и отваряне за входящи връзки.

def startServer (): глобален i глобален first_data # инициализира сокет сървър serversocket = socket.socket (socket. AF_INET, socket. SOCK_STREAM) serversocket.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEADDR, 1) # IP адрес на сървъра и порт хост = " 149.160.251.3 "порт = 12347 server_address = (хост, порт) # Отворете сървъра и слушайте за входящи връзки печат (" Стартиране на сървъра на %s порт %s " %server_address) serversocket.bind (server_address) serversocket.listen (5) # Изчакайте връзки … докато True: print ('Изчакване на връзка …') # Приемете входяща връзка (clientsocket, адрес) = serversocket.accept () # Опитайте да анализирате получените данни try: print ('Връзка установена от', адрес) while True: # Получете данните и ги изпратете за обработка на данни = 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 накрая: # Затворете сокета, за да предотвратите ненужно изтичане на данни clientsocket.close ()

Сега се нуждаем от функциите, които ще обработват всички данни. Първата стъпка, която трябва да се предприеме, и първата извикана функция е калибрирането на сензора за целите на изчислението.

def calibData (списък): глобален z_calib глобален z_offset глобален mag_data глобален mag_calib_y глобален mag_offset_y z_calib += float (списък [0]) mag_calib_y += float (списък [1]) if (i == 50): z_offset = z_calib / 50 mag_off_ = mag_calib_y / 50 z_calib = 0 mag_calib_y = 0 mag_data.append (mag_offset_y)

След това създаваме движещо се отместване на ускорението. Това прави така, че програмата разпознава, когато някой спре да движи пръста си, защото всички стойности за ускорение, които се изпращат към сървъра, трябва да бъдат еднакви по това време.

Def z_diff = 0 data_list = break, ако не 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 = False keep_offset = False

След това правим основната тежест на математиката. Това включва преобразуване на данните за ускорението в данни за позиция, което ще ни позволи да кажем посоката, в която потребителят движи пръста си.

def processData (списък): #[accel.z, mag.y] глобален z_offset глобален z_real глобален z_velo глобален z_pos глобален first_data глобален 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 #Begin интеграции за намиране на позиция 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 (вдясно): движение (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 ()

Препоръчано: