Obsah:

Accel Writing (Magic Hand): 4 kroky (s obrázkami)
Accel Writing (Magic Hand): 4 kroky (s obrázkami)

Video: Accel Writing (Magic Hand): 4 kroky (s obrázkami)

Video: Accel Writing (Magic Hand): 4 kroky (s obrázkami)
Video: CS50 2013 - Week 9 2024, Júl
Anonim
Písanie Accel (Magic Hand)
Písanie Accel (Magic Hand)
Písanie Accel (Magic Hand)
Písanie Accel (Magic Hand)
Písanie Accel (Magic Hand)
Písanie Accel (Magic Hand)

Úvod

Kúzelná ruka umožňuje ľuďom so zdravotným postihnutím a poruchou motoriky využívať kreativitu pri kreslení a písaní v simulovanom prostredí. Magic Hand je nositeľná rukavica, ktorá sníma pohyb ukazováka a prekladá ju do kreslenia čiar na obrazovke počítača.

Potrebné materiály

LSM9DOF Breakout Board --- 24,95 dolárov ---

Adafruitové perie s Wifi --- 18,95 dolárov ---

Ženské/ženské drôty --- 1,95 dolárov ---

Pásky/pásky na suchý zips --- 3 doláre

Dva magnety rovnakej sily --- Ceny sa líšia

Ako to funguje

Pomocou akcelerometra môžeme zhromažďovať údaje o zrýchlení pre os y, ktoré nám pomôžu určiť, kedy sa prst používateľa pohybuje hore a dole. Pretože náš akcelerometer meria zrýchlenie vzhľadom na stred zeme, nemôžeme určiť zrýchlenie osi x (vľavo alebo vpravo). Našťastie prelomová doska LSM9DOF obsahuje aj magnetometer, ktorý nám umožňuje zhromažďovať údaje o magnetických poliach. Dva magnety od seba umiestnime 30 cm a medzi nimi máme rukavicu. Ak sú magnetické údaje načítané pozitívne, vieme, že sa rukavice pohybujú doprava a naopak. Potom, čo sú všetky údaje zhromaždené v akcelerometri/magnetometri, pošle údaje pomocou drôtu do peria, ktoré je pripojené k počítaču s wifi, a potom pošle údaje do počítača, ktorý potom môžeme použiť v našom kóde.

Krok 1: Fyzický prototyp 1

Fyzický prototyp 1
Fyzický prototyp 1
Fyzický prototyp 1
Fyzický prototyp 1

Tento prototyp je určený na to, aby bol rukavicou šitý voľne na ruku, aby skĺzol cez elektronické zariadenia. Elektronické zariadenie bude potom pripevnené suchým zipsom k spodnej časti panciera v kombinácii so základnou rukavicou na ruke. Potom zelená rukavica prevlečie základňu a elektronické zariadenia …

Kroky pri výrobe prototypu rukavice:

  • Získajte dva kusy látky, ktoré sú dostatočne veľké na to, aby vystopovali ruku
  • Rukou obkreslite oba kusy látky a vystrihnite ich
  • Spojte dva ručne vystrihnuté výrezy tak, aby boli dokonale zarovnané
  • Ďalej, aby ste pripravili šijací stroj, prevlečte niť označenými miestami na stroji
  • Keď je šijací stroj nastavený, zdvihnite ihlu a umiestnite dva spojené kusy látky pod ihlu
  • Uistite sa, že ihla je zarovnaná na samom okraji látky, spustite stroj a zošite pozdĺž okrajov látky, pričom dva kusy ponechajte na zápästí nešité, aby sa do nich zmestila ruka.

Krok 2: Fyzický prototyp 2

Fyzický prototyp 2
Fyzický prototyp 2
Fyzický prototyp 2
Fyzický prototyp 2

Našim posledným prototypom sú bežné rukavice v kombinácii so suchým zipsom, ktoré je možné nastaviť na akékoľvek zápästie. Rukavica a remienok sú zošité a elektronické zariadenia sú k rukavici pripevnené suchým zipsom.

Kroky pri výrobe druhého prototypu rukavice:

  1. Kúpte si rukavicu, na materiáli rukavice nezáleží.
  2. Kúpte si remienok na zápästie na suchý zips
  3. Kúpte si prenosnú batériu
  4. Kúpte si lepivý suchý zips
  5. Ihlou na šitie pripevnite remienok na zápästie na suchý zips k spodnej časti rukavice
  6. Remienok na zápästie by sa mal dať prispôsobiť rôznym veľkostiam zápästia.
  7. Lepiacu pásku pripevnite k základni akcelerometra a pripevnite k ukazováku rukavice
  8. Na pierko pripevnite lepiacu pásku a pripevnite ju na vrch rukavice.
  9. Pomocou drôtov spojte kolík 3V3 v perí s kolíkom VIN na akcelerometri
  10. Pomocou drôtov spojte kolík GND v perí s kolíkom GND akcelerometra.
  11. Pomocou drôtov pripojte kolík SCL v perí k kolíku SCL akcelerometra.
  12. Pomocou drôtov spojte kolík SDA v pierku s kolíkom SDA na akcelerometri.
  13. Pripojte k periu aspoň 5 voltovú batériu cez USB, aby ste získali energiu.

Krok 3: Magnety

Magnety
Magnety

Krok 1: Položte dva magnety rovnakej sily oproti sebe.

Krok 2: Odmerajte 30 cm medzeru medzi dvoma magnetmi

Krok 3: umiestnite magnetometer presne do stredu dvoch magnetov. Mali by ste prijímať údaje okolo 0, kým sú v strede. Ak dostanete nulu, preskočte na krok 5.

Krok 4: Ak hodnota nie je nulová alebo sa blíži nule, musíte nastaviť vzdialenosť magnetov. Ak je nameraná hodnota záporná, posuňte ľavý magnet o cm alebo 2 doľava alebo dovtedy, kým nie je nameraná hodnota nula. Ak je kladný, urobte to isté, okrem pravého magnetu.

Krok 5: Napíšte kód, ktorý prijíma údaje z magnetometra a číta, či sú pozitívne alebo negatívne. Ak je kladný, kód nakreslite čiaru doprava a ak negatívny nakreslite čiaru doľava.

Krok 4: Kód

Kód
Kód

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

Úvod:

Aby bolo možné spracovávať údaje z akcelerometra, musí byť medzi perom Adafruit a serverom, ktorý údaje spracováva (na prenosnom počítači/počítači), vytvorený vzťah klient/server. Bude potrebné vytvoriť dva súbory s kódom: jeden pre klienta (perie Adafruit) a druhý pre server (v tomto prípade Jarodov prenosný počítač). Klient je napísaný v jazyku C ++ a server je napísaný v jazyku python. Jazyk používaný pre klienta je dôležitý, pretože Arduino je hlavne jazyk C ++ a jeho zmena na používanie iného jazyka je náročná. Server môže byť napísaný v akomkoľvek jazyku, ak má sieťové funkcie.

Nastavenie klienta:

Najprv nastavíme klientsky kód. Väčšina kódu pripojenia WiFi je ľahko dostupná prostredníctvom knižníc Adafruit. Začíname zaradením príslušných tried.

#include #include #include #include #include

Nastavte niektoré premenné, ktoré budú použité v celom kóde.

// Pripojenie k sieti const char* ssid = "MMServer"; const char* heslo = "Heslo MMS servera"; // IP a port servera, ktorý bude prijímať údaje const char* host = "149.160.251.3"; const int port = 12347; bool spojený = nepravda;

// Inicializácia detektora pohybu

Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0 (1000);

Klient WiFiClient;

Vytvorte funkciu setup (), ktorá bude spustená ihneď po spustení peria.

// Nastavte WiFi pripojenie a pripojte sa k serveru vyhnite sa setup () {Serial.begin (9600); oneskorenie (100);

Serial.println ();

Serial.println (); Serial.print („Pripojenie k“); Serial.println (ssid); // Spustite WiFi WiFi.begin (ssid, heslo); // Pripojenie … while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } // Úspešne pripojené k WiFi Serial.println (""); Serial.println ("WiFi pripojené"); Serial.println ("IP adresa:"); Serial.println (WiFi.localIP ());

#ifndef ESP8266

while (! Serial); #endif Serial.begin (9600); Serial.println ("Test senzora");

// Inicializujte snímač

if (! lsm.begin ()) {// Vyskytol sa problém s detekciou LSM9DS0 Serial.print (F („Oops, nebol zistený žiadny LSM9DS0 … Skontrolujte zapojenie alebo ADR I2C!“)); pričom (1); } Serial.println (F ("Nájdený LSM9DS0 9DOF")); // Začnite sa pripájať k serveru Serial.print ("Pripojenie k"); Serial.println (hostiteľ);

// Skontrolujte úspešné pripojenie. Ak zlyhalo, potom prerušiť

if (! client.connect (hostiteľ, port)) {Serial.println ("pripojenie zlyhalo"); spojený = nepravda; návrat; } else {pripojeny = true; }

// Nastavte zisk a čas integrácie senzora

configureSensor (); }

Potom potrebujeme funkciu slučky, ktorá bude opakovane cyklovať. V tomto prípade sa používa na opakované odosielanie údajov z akcelerometra na server vo forme „[z_accel]: [y_mag]: [z_mag]“. The client.print (čísla); funkcia je to, čo odosiela údaje na server.

void loop () {oneskorenie (250); if (connected) {// Toto odošle údaje na server sensor_event_t accel, mag, gyro, temp; lsm.getEvent (& accel, & mag, & gyro, & temp); Reťazcové čísla; čísla += accel.acceleration.z; čísla += ":"; čísla += mag.magnetic.y; čísla += ":"; čísla += mag.magnetic.z; Serial.print (čísla); client.print (čísla); Serial.println (); } else {estabConnection (); }}

Pri niektorých pomocných funkciách potrebujeme jeden na vytvorenie spojenia medzi perom a serverom.

void institConnection () {if (! client.connect (host, port)) {Serial.println ("spojenie zlyhalo"); spojený = nepravda; návrat; } else {pripojeny = true; }}

Musíme tiež nakonfigurovať snímač a poskytnúť mu rozsah hodnôt, ktoré bude čítať. Zrýchlenie má napríklad 5 možností pre rozsah: 2g, 4g, 6g, 8g a 16g.

void configureSensor (void) {// Nastavenie rozsahu akcelerometra //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); // Nastavenie citlivosti magnetometra //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_2GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_4GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_8GAUSS); lsm.setupMag (lsm. LSM9DS0_MAGGAIN_12GAUSS);

// Nastavte gyroskop

lsm.setupGyro (lsm. LSM9DS0_GYROSCALE_245DPS); //lsm.setupGyro(lsm. LSM9DS0_GYROSCALE_500DPS); //lsm.setupGyro(lsm. LSM9DS0_GYROSCALE_2000DPS); }

Nastavenie servera:

Server bude súbor python, ktorý bude spustený na príkazovom riadku počítača. Ak chcete začať, importujte požadované triedy.

import socketimport re import pyautogui

zásuvka sa používa na vytváranie sietí. re sa používa na regulárny výraz alebo manipuláciu so reťazcom. pyautogui je knižnica pythonu, ktorá umožní kresbu (diskutované neskôr).

Ďalej by sme mali definovať niektoré premenné. Budú to globálne premenné, takže k nim bude prístup vo viacerých funkciách. Budú použité neskôr v kóde.

i = 0n = 0 riadok = 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 = Nepravda

first_data = Pravda

Teraz potrebujeme funkciu na vytvorenie servera a jeho otvorenie pre prichádzajúce pripojenia.

def startServer (): global i global first_data # initialize server socket socketocket = socket.socket (socket. AF_INET, socket. SOCK_STREAM) serversocket.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEADDR, 1) # IP adresa servera a port hostiteľ = " 149.160.251.3 "port = 12347 server_address = (hostiteľ, port) # Otvorte server a počúvajte prichádzajúce pripojenia vytlačte („ Spustenie servera na %s porte %s ' %server_address) serverocket.bind (server_address) serverocket.listen (5) # Počkajte na pripojenia … kým je pravda: print („Čaká sa na pripojenie…“) # Prijmite prichádzajúce pripojenie (clientsocket, adresa) = serverocket.accept () # Skúste analyzovať prijaté údaje try: print („Pripojenie nadviazané od“, adresa) while True: # Prijmite údaje a odošlite ich na spracovanie údajov = 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] tlač (accel_data) i+= 1 if (i <51): calibData (accel_data) else: movingAcce l (accel_data [0]) processData (accel_data) first_data = Nakoniec nepravda: # Zatvorte soket, aby ste predišli zbytočnému úniku dát clientsocket.close ()

Teraz požadujeme funkcie, ktoré budú spracovávať všetky údaje. Prvým krokom, ktorý je potrebné urobiť, a prvou volanou funkciou je kalibrácia senzora na účely výpočtu.

def calibData (zoznam): global z_calib global z_offset global mag_data global mag_calib_y global mag_offset_y z_calib += float (zoznam [0]) mag_calib_y += float (zoznam [1]) if (i == 50): z_offset = z_calib / 50 mag_offset_ = mag_calib_y / 50 z_calib = 0 mag_calib_y = 0 mag_data.append (mag_offset_y)

Ďalej vytvoríme posunutie zrýchlenia v pohybe. Vďaka tomu program rozpozná, keď niekto zastaví pohyb prstom, pretože všetky hodnoty zrýchlenia odoslané na server by mali byť v tom čase rovnaké.

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 or z_diff <-0.2): # motion identified within data, restart keep_offset = True n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 data_list = prestávka, ak nie keep_offset: # stacionárne v dátach, nastaviť nový z_offset z_offset = z_moving_offset print ("New z_offset:") print (z_offset) n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 data_list = keep_offset = False keep_offset = Nepravda

Ďalej sa budeme venovať matematike. To zahŕňa preklad údajov o zrýchlení do údajov o polohe, ktoré nám umožnia určiť smer, v ktorom používateľ pohybuje prstom.

def processData (zoznam): #[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 (zoznam [0]) - z_offset

mag_y = zoznam [1] mag_z = zoznam [2] vľavo = nepravda vpravo = nepravda # Nespracovávajte zrýchlenie, kým si nie ste úplne istí, že sa zrýchlil # Zabraňuje mechanickému hluku prispievať k polohe, ak (z_real -0,20): z_real = 0 # Začať integrácie na nájdenie polohy, ak (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): pohyb (50, int (z_pos* 1000)) elif (vľavo): pohyb (-50, int (z_pos*1000)) z_velo = 0 z_pos = 0

Teraz konečne pohneme kurzorom! Aby sme to urobili, otvorili sme okno s farbami a zmenili ho na celú obrazovku. Knižnica pyautogui obsahuje funkciu nazývanú pyautogui.dragRel (x, y); pomocou ktorého ťaháme kurzor myši z jedného bodu do druhého. Využíva údaje o relatívnej polohe, takže pohyb je relatívny k poslednej pozícii kurzora.

def pohyb (x, y): print ("presun na", x, -y) pyautogui.dragRel (x, -y)

Nakoniec musíme zavolať hlavnú funkciu, aby dokonca umožnil spustenie celého tohto kódu.

# Volá funkciu na spustenie serverstartServer ()

Odporúča: