Sadržaj:

Accel Writing (Čarobna ruka): 4 koraka (sa slikama)
Accel Writing (Čarobna ruka): 4 koraka (sa slikama)

Video: Accel Writing (Čarobna ruka): 4 koraka (sa slikama)

Video: Accel Writing (Čarobna ruka): 4 koraka (sa slikama)
Video: МАЯТНИК ПОДАЧА ЧЕМПИОНОВ!КАК ОБУЧИТЬСЯ ПОДАЧЕ В НАСТОЛЬНОМ ТЕННИСЕ?#serve #подача #настольныйтеннис 2024, Studeni
Anonim
Accel Writing (Čarobna ruka)
Accel Writing (Čarobna ruka)
Accel Writing (Čarobna ruka)
Accel Writing (Čarobna ruka)
Accel Writing (Čarobna ruka)
Accel Writing (Čarobna ruka)

Uvod

Čarobna ruka omogućuje osobama s 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 osjetiti kretanje kažiprsta te to prevesti u crtanje linija na ekranu računala.

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 os y što ć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ćuje prikupljanje podataka o magnetskim poljima. Postavljamo dva magneta udaljena 30 cm, 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 računalo s wifi mrežom, a zatim podatke prosljeđuje računalu 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 namijenjen je za ručno ušivenu rukavicu kako bi skliznuo preko elektroničkih uređaja. Elektronički uređaj tada će čičak trakom biti pričvršćen na podložak rukavaca ispod oklopa u kombinaciji s osnovnom rukavicom na ruci. Tada će zelena rukavica skliznuti preko baze i elektroničkih uređaja….

Koraci u izradi prototipa rukavice:

  • Nabavite dva komada tkanine dovoljno velika da ih možete pratiti
  • Rukom ucrtajte oba komada tkanine i izrežite ih
  • Sastavite dva ručna izreza tako da budu savršeno poravnati
  • Zatim, za pripremu šivaćeg stroja, provucite konac kroz označena mjesta na stroju
  • Kad je šivaći stroj postavljen, podignite iglu i stavite dva složena komada tkanine ispod igle
  • Provjerite je li igla poredana na samom rubu tkanine, pokrenite stroj i šivajte po rubovima tkanine, a dva komada ostavite nešivenim na zapešću 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 prijenosnu bateriju
  4. Kupite ljepljivi čičak
  5. Šivaćom iglom pričvrstite čičak remen za ručni zglob na podnožje rukavice
  6. Remen za ručni zglob trebao 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 ga 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 pin u perju na GND pin akcelerometra.
  11. Pomoću žica spojite SCL iglu u pero na SCL pin akcelerometra.
  12. Pomoću žica povežite SDA iglu u pero s SDA iglom za ubrzanje.
  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 je li pozitivan ili negativan. Ako je kod pozitivan, povucite liniju desno, a ako je negativan povucite crtu lijevo.

Korak 4: Kodirajte

Kodirati
Kodirati

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

Uvod:

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

Postavljanje klijenta:

Prvo ćemo postaviti kod klijenta. Većina koda za WiFi vezu lako je dostupna u knjižnicama Adafruit. Počinjemo uključivanjem odgovarajućih razreda.

#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 poslužitelja 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;

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

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

Serial.println ();

Serial.println (); Serial.print ("Povezivanje s"); Serijski.println (ssid); // Pokretanje WiFi WiFi.begin (ssid, lozinka); // Povezivanje … while (WiFi.status ()! = WL_CONNECTED) {kašnjenje (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čnite se povezivati sa poslužiteljem Serial.print ("Spajanje na"); Serial.println (host);

// Provjerite uspješnu vezu. Ako ne uspije, poništite

if (! client.connect (host, port)) {Serial.println ("povezivanje nije uspjelo"); spojen = lažno; povratak; } else {connected = true; }

// Postavljanje pojačanja senzora i vremena integracije

configureSensor (); }

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

void loop () {odgoda (250); if (connected) {// Ovo će poslati podatke na poslužitelj sensors_event_t accel, mag, gyro, temp; lsm.getEvent (& accel, & mag, & gyro, & temp); Brojevi niza; brojevi += ubrzanje.ubrzanje.z; brojevi += ":"; brojevi += mag.magnetski.y; brojevi += ":"; brojevi += mag.magnetic.z; Serijski.ispis (brojevi); client.print (brojevi); Serial.println (); } else {installConnection (); }}

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

void installConnection () {if (! client.connect (host, port)) {Serial.println ("povezivanje nije uspjelo"); spojen = lažno; povratak; } else {connected = true; }}

Također moramo konfigurirati senzor i dati mu raspon vrijednosti koje će oč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 poslužitelja:

Poslužitelj će biti python datoteka koja će se izvoditi u naredbenom retku računala. 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 knjižnica 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

popis podataka =

mag_data =

mag_calib_y = 0 mag_offset_y = 0

z_calib = 0

z_pomak = 0 z_mještanje_ pomak = 0 z_diff = 0 z_real = 0 z_velo = 0 z_pos = 0

keep_offset = Netačno

prvi_data = Istina

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

def startServer (): globalno i globalno first_data # inicijalizira socket poslužitelja serversocket = socket.socket (socket. AF_INET, socket. SOCK_STREAM) serversocket.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEADDR, 1) # IP adresa poslužitelja i port host = " 149.160.251.3 "port = 12347 server_address = (host, port) # Otvorite poslužitelj i osluškujte dolazne veze ispis (" Pokretanje poslužitelja na %s portu %s " %server_address) serversocket.bind (server_address) serversocket.listen (5) # Pričekajte povezivanja… 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 s', 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] print (accel_data) i+= 1 if (i <51): calibData (accel_data) else: movingAcce l (accel_data [0]) processData (accel_data) first_data = False 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 (popis): globalni z_calib globalni z_offset globalni mag_data globalni mag_calib_y globalni mag_offset_y z_calib += float (popis [0]) mag_calib_y += float (popis [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 kad netko prestane pomicati prst jer bi sve vrijednosti ubrzanja koje se šalju poslužitelju u tom trenutku trebale biti iste.

Def z_diff = 0 data_list = break if not keep_offset: # stacionaran 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 (popis): #[accel.z, mag.y] globalni z_offset globalni z_real globalni z_velo globalni z_pos globalni prvi_data globalni mag_data

z_real = float (popis [0]) - z_offset

mag_y = popis [1] mag_z = popis [2] lijevo = Netačno desno = Netačno # Ne obrađujte ubrzanje sve dok ne budete sigurni da je ubrzano # Sprječava mehaničku buku da doprinosi položaju ako (z_real -0,20): z_real = 0 #Počnite 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

Konačno, pomičemo pokazivač! Da bismo to učinili, otvorili smo prozor sa bojom i učinili ga cijelim ekranom. Knjižnica pyautogui sadrži funkciju koja se naziva pyautogui.dragRel (x, y); koji koristimo za povlačenje kursora miša s jedne točke na drugu. Koristi podatke o relativnom položaju pa je kretanje relativno u odnosu na posljednji položaj kursora.

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

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

# Poziva funkciju za početak poslužiteljastartServer ()

Preporučeni: