Brzo pisanje (čarobna ruka): 4 koraka (sa slikama)
Brzo pisanje (čarobna ruka): 4 koraka (sa slikama)
Anonim
Accel Writing (Magična ruka)
Accel Writing (Magična ruka)
Accel Writing (Magična ruka)
Accel Writing (Magična ruka)
Accel Writing (Magična ruka)
Accel Writing (Magična ruka)

Uvod

Čarobna ruka omogućava osobama sa invaliditetom i motoričkim sposobnostima da uživaju u kreativnosti crtanja i pisanja u simuliranom okruženju. Čarobna ruka je rukavica koja se može nositi i koja osjeća kretanje kažiprsta i to prevodi u crtanje linija na ekranu računara.

Potrebni materijali

LSM9DOF ploča za razbijanje --- 24,95 USD ---

Adafruit pero s Wifi --- 18,95 USD ---

Ženske/ženske žice --- 1,95 USD ---

Trake/čičak trake --- 3 USD

Dva magneta jednake snage --- Cijene se razlikuju

Kako radi

Pomoću akcelerometra možemo prikupiti podatke o ubrzanju za y-osu koji će nam pomoći da odredimo kada se prst korisnika pomiče gore-dolje. Zbog činjenice da naš akcelerometar mjeri ubrzanje u odnosu na središte zemlje, ne možemo odrediti ubrzanje osi x (lijevo ili desno). Srećom, ploča za probijanje LSM9DOF također sadrži magnetometar koji nam omogućava prikupljanje podataka o magnetskim poljima. Postavljamo dva magneta udaljena 30 cm jedan od drugog, a rukavicu imamo između. Ako su magnetski podaci pozitivni, onda znamo da se rukavica pomiče udesno i obrnuto. Nakon što se svi podaci prikupe na mjeraču ubrzanja/magnetometru, oni šalju podatke žicom do pera koje je spojeno na bežični računar, a zatim prosljeđuje podatke računaru koje tada možemo koristiti u svom kodu.

Korak 1: Fizički prototip 1

Fizički prototip 1
Fizički prototip 1
Fizički prototip 1
Fizički prototip 1

Ovaj prototip je namijenjen za labavo ušivenu rukavicu na ruci kako bi mogao skliznuti preko elektroničkih uređaja. Elektronički uređaj će se tada čičak trakom pričvrstiti na područni omotač rukava u kombinaciji s osnovnom rukavicom na ruci. Tada će zelena rukavica skliznuti preko baze i elektronskih uređaja….

Koraci u izradi prototipa rukavice:

  • Nabavite dva komada tkanine dovoljno velika da ih možete pratiti
  • Rukom ocrtajte oba komada tkanine i izrežite ih
  • Sastavite dvije ručne izreze tako da budu savršeno poravnate
  • Zatim, za pripremu šivaće mašine, provucite konac kroz označena mjesta na mašini
  • Kad je šivaća mašina postavljena, podignite iglu i stavite dva složena komada tkanine ispod igle
  • Uvjerite se da je igla poredana na samom rubu tkanine, pokrenite mašinu i šivajte po rubovima tkanine, a dva komada ostavite nešivenim na ručnom zglobu kako bi se mogla uklopiti ruka.

Korak 2: Fizički prototip 2

Fizički prototip 2
Fizički prototip 2
Fizički prototip 2
Fizički prototip 2

Naš posljednji prototip je obična rukavica u kombinaciji s čičak trakom koja se može prilagoditi svakom zglobu. Rukavica i remen su ušiveni zajedno, a elektronički uređaji su pričvršćeni na rukavicu pomoću čičak trake.

Koraci u izradi drugog prototipa rukavice:

  1. Kupite rukavicu, materijal rukavice nije bitan.
  2. Kupite čičak narukvicu
  3. Kupite prenosivu bateriju
  4. Kupite ljepljivi čičak
  5. Šivaćom iglom pričvrstite velcro narukvicu na podnožje rukavice
  6. Traka za nošenje oko zgloba trebala bi se moći prilagoditi različitim veličinama zgloba.
  7. Pričvrstite ljepljivu traku na podnožje akcelerometra i pričvrstite je na kažiprst rukavice
  8. Pričvrstite ljepljivu traku na pero i pričvrstite je na vrh rukavice.
  9. Pomoću žica spojite pin 3V3 u perju na pin VIN u mjeraču ubrzanja
  10. Pomoću žica spojite GND iglu u pero s GND iglom akcelerometra.
  11. Pomoću žica spojite SCL iglu u pero na SCL iglu akcelerometra.
  12. Pomoću žica spojite SDA iglu u pero na SDA iglu akcelerometra.
  13. Spojite barem 5 voltnu bateriju preko USB-a na pero radi napajanja.

Korak 3: Magneti

Magneti
Magneti

Korak 1: Postavite dva magneta jednake jačine jedan preko drugog.

Korak 2: Izmjerite razmak od 30 cm između dva magneta

Korak 3: Postavite magnetometar točno u sredinu dva magneta. Trebali biste primati podatke oko 0 dok su oni u sredini. Ako primite očitanje nule, prijeđite na korak 5.

Korak 4: Ako očitanje nije nula ili blizu nule, morate prilagoditi udaljenost magneta. Ako je očitanje negativno, pomaknite lijevi magnet za cm ili 2 ulijevo ili dok očitanje ne bude nula. Ako je pozitivan, učinite isto osim s desnim magnetom.

Korak 5: Napišite kôd koji prihvaća podatke s magnetometra i čita ako su pozitivni ili negativni. Ako je kod pozitivan, povucite liniju desno, a ako je negativan povucite liniju lijevo.

Korak 4: Kodirajte

Kod
Kod

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

Uvod:

Da bi se obrađivali podaci sa mjerača ubrzanja, mora se uspostaviti odnos klijent/poslužitelj između Adafruit pera i poslužitelja koji obrađuje podatke (radi na prijenosnom računaru/radnoj površini). Morat će se stvoriti dvije datoteke koda: jedna za klijenta (Adafruit pero), a druga za server (u ovom slučaju, Jarodov laptop). Klijent je napisan na C ++, a server je napisan na pythonu. Jezik koji se koristi za klijenta bitan je jer je Arduino uglavnom C ++ jezik, pa je teško promijeniti ga tako da koristi drugi jezik. Poslužitelj se može pisati na bilo kojem jeziku, sve dok ima mrežne mogućnosti.

Postavljanje klijenta:

Prvo ćemo postaviti šifru klijenta. Većina koda za WiFi vezu lako je dostupna putem biblioteka Adafruit. Počinjemo uključivanjem odgovarajućih časova.

#include #include #include #include #include

Postavite neke varijable koje će se koristiti u kodu.

// povezivanje na mrežu const char* ssid = "MMServer"; const char* password = "MMServer-lozinka"; // IP i port servera koji će primati podatke const char* host = "149.160.251.3"; const int port = 12347; bool connected = false;

// Pokretanje detektora pokreta

Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0 (1000);

WiFiClient klijent;

Kreirajte funkciju setup () koja će se pokrenuti čim pero počne.

// Postavljanje WiFi veze i povezivanje sa servervoid setup () {Serial.begin (9600); kašnjenje (100);

Serial.println ();

Serial.println (); Serial.print ("Povezivanje sa"); Serial.println (ssid); // Pokretanje WiFi WiFi.begin (ssid, lozinka); // Povezivanje… while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } // Uspješno spojen na WiFi Serial.println (""); Serial.println ("WiFi povezan"); Serial.println ("IP adresa:"); Serial.println (WiFi.localIP ());

#ifndef ESP8266

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

// Inicijalizacija senzora

if (! lsm.begin ()) {// Došlo je do problema pri otkrivanju serijskog ispisa LSM9DS0 (F ("Ups, nije otkriven LSM9DS0 … Provjerite ožičenje ili I2C ADDR!")); while (1); } Serial.println (F ("Pronađeno LSM9DS0 9DOF")); // Počni povezivanje sa serverom Serial.print ("Povezivanje sa"); Serial.println (host);

// Provjerite uspješnu vezu. Ako ne uspije onda prekinuti

if (! client.connect (host, port)) {Serial.println ("povezivanje nije uspjelo"); povezan = netačno; return; } else {connected = true; }

// Postavljanje pojačanja senzora i vremena integracije

configureSensor (); }

Zatim nam je potrebna funkcija petlje koja će se ponavljati. U ovom slučaju, koristi se za višekratno slanje podataka sa mjerača ubrzanja na poslužitelj u obliku “[z_accel]: [y_mag]: [z_mag]”. Client.print (brojevi); funkcija šalje podatke serveru.

void loop () {kašnjenje (250); if (connected) {// Ovo će poslati podatke na server sensors_event_t accel, mag, gyro, temp; lsm.getEvent (& accel, & mag, & gyro, & temp); Brojevi nizova; brojevi += ubrzanje.ubrzanje.z; brojevi += ":"; brojevi += mag.magnetic.y; brojevi += ":"; brojevi += mag.magnetic.z; Serial.print (brojevi); client.print (brojevi); Serial.println (); } else {installConnection (); }}

Za neke pomoćne funkcije potrebna nam je jedna za uspostavljanje veze između perja i poslužitelja.

void installConnection () {if (! client.connect (host, port)) {Serial.println ("povezivanje nije uspjelo"); povezan = netačno; return; } else {connected = true; }}

Također moramo konfigurirati senzor i dati mu raspon vrijednosti koje će čitati. Na primjer, ubrzanje ima 5 opcija za raspon: 2g, 4g, 6g, 8g i 16g.

void configureSensor (void) {// Postavi raspon 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); // Postavljanje osjetljivosti 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);

// Postavljanje žiroskopa

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

Postavljanje servera:

Poslužitelj će biti python datoteka koja će se izvršavati u komandnoj liniji računara. Za početak uvezite potrebne klase.

import socketimport re import pyautogui

utičnica se koristi za umrežavanje. re se koristi za regex ili nizove. pyautogui je python biblioteka koja će omogućiti crtanje (o čemu će biti riječi kasnije).

Zatim bismo trebali definirati neke varijable. To će biti globalne varijable, pa će im se moći pristupiti u više funkcija. Oni će se kasnije koristiti u kodu.

i = 0n = 0 linija = 1

lista podataka =

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 = Netačno

first_data = Tačno

Sada nam je potrebna funkcija za stvaranje poslužitelja i njegovo otvaranje za dolazne veze.

def startServer (): globalno i globalno first_data # inicijalizira socket servera serversocket = socket.socket (socket. AF_INET, socket. SOCK_STREAM) serversocket.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEADDR, 1) # IP adresa servera i port host = " 149.160.251.3 "port = 12347 server_address = (host, port) # Otvorite server i slušajte dolazne veze ispis ('Pokretanje servera na %s portu %s' %server_address) serversocket.bind (server_address) serversocket.listen (5) # Sačekajte veze… dok je True: print ('Čekanje na vezu …') # Prihvatite dolaznu vezu (clientsocket, adresa) = serversocket.accept () # Pokušajte raščlaniti primljene podatke try: print ('Veza je uspostavljena sa', adresa) while True: # Primite podatke i pošaljite ih na obradu podataka = 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] ispis (accel_data) i+= 1 if (i <51): calibData (accel_data) else: movingAcce l (accel_data [0]) processData (accel_data) first_data = Netačno konačno: # Zatvorite utičnicu kako biste spriječili nepotrebno curenje podataka clientsocket.close ()

Sada su nam potrebne funkcije koje će obraditi sve podatke. Prvi korak i prva pozvana funkcija je kalibracija senzora za potrebe izračuna.

def calibData (list): global z_calib global z_offset global mag_data global mag_calib_y global mag_offset_y z_calib += float (lista [0]) mag_calib_y += float (lista [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)

Zatim stvaramo pomak ubrzanja u pokretu. Zbog toga program prepoznaje kada netko prestane pomicati prst jer bi sve vrijednosti ubrzanja koje se šalju poslužitelju u tom trenutku trebale biti iste.

def movingAccel (num): globalni z_calib globalni z_diff globalni z_moving_offset globalni z_offset globalni spisak podataka globalni n globalni keep_offset ako (n 0,2 ili z_diff <-0,2): # pokret otkriven unutar podataka, restart keep_offset = True n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 data_list = break if not keep_offset: # stacionarno u podacima, postavite novi z_offset z_offset = z_moving_offset print ("Novi z_offset:") print (z_offset) n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 data_list = keep_offset = Netačno keep_offset = Netačno

Zatim radimo najveći teret matematike. To uključuje prevođenje podataka o ubrzanju u podatke o položaju koji će nam omogućiti da odredimo smjer u kojem korisnik pomiče prst.

def processData (lista): #[accel.z, mag.y] globalni z_offset globalni z_real globalni z_velo globalni z_pos globalni prvi_dati globalni mag_data

z_real = float (lista [0]) - z_offset

mag_y = lista [1] mag_z = lista [2] lijevo = Netačno desno = Netačno # Ne obrađujte ubrzanje sve dok niste potpuno sigurni da je ubrzano # Sprječava mehaničku buku da doprinosi položaju ako (z_real -0,20): z_real = 0 #Begin integracije za pronalaženje položaja 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 (desno): pokret (50, int (z_pos* 1000)) elif (lijevo): kretanje (-50, int (z_pos*1000)) z_velo = 0 z_pos = 0

Sada, konačno, pomičemo kursor! Da bismo to učinili, otvorili smo prozor sa bojom i učinili ga cijelim ekranom. Biblioteka pyautogui sadrži funkciju koja se zove pyautogui.dragRel (x, y); koji koristimo za prevlačenje kursora miša od jedne do druge tačke. Koristi podatke o relativnoj poziciji pa je kretanje relativno u odnosu na posljednju poziciju kursora.

def motion (x, y): print ("premještanje u", x, -y) pyautogui.dragRel (x, -y)

Na kraju, moramo pozvati glavnu funkciju da bismo čak dopustili da se izvrši sav ovaj kôd.

# Poziva funkciju za pokretanje serverstartServer ()