Sisällysluettelo:

Accel Writing (Magic Hand): 4 vaihetta (kuvilla)
Accel Writing (Magic Hand): 4 vaihetta (kuvilla)

Video: Accel Writing (Magic Hand): 4 vaihetta (kuvilla)

Video: Accel Writing (Magic Hand): 4 vaihetta (kuvilla)
Video: ZEITGEIST: MOVING FORWARD | OFFICIAL RELEASE | 2011 2024, Heinäkuu
Anonim
Accel Writing (maaginen käsi)
Accel Writing (maaginen käsi)
Accel Writing (maaginen käsi)
Accel Writing (maaginen käsi)
Accel Writing (maaginen käsi)
Accel Writing (maaginen käsi)

Johdanto

Magic -käden avulla vammaiset ja liikuntarajoitteiset voivat nauttia piirtämisen ja kirjoittamisen luovuudesta simuloidussa ympäristössä. Maaginen käsi on puettava käsine, joka tunnistaa etusormesi liikkeen ja muuntaa sen viivoiksi tietokoneen näytöllä.

Tarvittavat materiaalit

LSM9DOF Breakout Board --- 24,95 dollaria ---

Adafruit Feather with Wifi --- 18,95 dollaria ---

Naaras-/naarasjohdot --- 1,95 dollaria ---

Nauha-/tarranauhat --- 3 dollaria

Kaksi yhtä voimakasta magneettia --- Hinnat vaihtelevat

Kuinka se toimii

Kiihtyvyysmittarin avulla voimme kerätä y-akselin kiihtyvyystietoja, joiden avulla voimme määrittää, milloin käyttäjän sormi liikkuu ylös ja alas. Koska kiihtyvyysmittarimme mittaa kiihtyvyyttä suhteessa maan keskipisteeseen, emme voi määrittää x-akselin (vasen tai oikea) kiihtyvyyttä. Onneksi LSM9DOF -murtokortti sisältää myös magnetometrin, jonka avulla voimme kerätä tietoja magneettikentistä. Asetamme kaksi magneettia 30 cm: n etäisyydelle toisistaan ja pidä käsine välissä. Jos magneettiset tiedot näyttävät positiivisia, tiedämme, että käsine liikkuu oikealle ja päinvastoin. Kun kaikki tiedot on kerätty kiihtyvyysmittariin/magnetometriin, se lähettää tiedot langan välityksellä höyhenelle, joka on yhdistetty wifi -tietokoneeseen, ja lähettää sitten tiedot tietokoneelle, jota voimme sitten käyttää koodissamme.

Vaihe 1: Fyysinen prototyyppi 1

Fyysinen prototyyppi 1
Fyysinen prototyyppi 1
Fyysinen prototyyppi 1
Fyysinen prototyyppi 1

Tämä prototyyppi on tarkoitettu käsineeksi ommeltavaksi löysästi käteen, jotta se liukuu elektronisten laitteiden yli. Elektroninen laite kiinnitetään tarranauhalla panssarihihan pohjaan yhdistettynä käsineeseen. Sitten vihreä käsine liukuu alustan ja elektronisten laitteiden yli….

Prototyyppikäsineen valmistusvaiheet:

  • Hanki kaksi kangaskappaletta, jotka ovat riittävän suuria käden jäljittämiseksi
  • Vedä käsi molemmille kankaalle ja leikkaa ne pois
  • Laita kaksi käsin leikattua kohtaa yhteen niin, että ne ovat täysin kohdakkain
  • Seuraavaksi valmistele ompelukone vetämällä lanka koneessa olevien kohtien läpi
  • Kun ompelukone on asennettu, nosta neula ja aseta ne kaksi kangaskappaletta neulan alle
  • Varmista, että neula on linjassa kankaan reunaan, käynnistä kone ja ompele kankaan reunoja pitkin jättäen kaksi kappaletta ommeltamatta ranteeseen, jotta käsi mahtuu sisään.

Vaihe 2: Fyysinen prototyyppi 2

Fyysinen prototyyppi 2
Fyysinen prototyyppi 2
Fyysinen prototyyppi 2
Fyysinen prototyyppi 2

Viimeinen prototyyppimme on tavallinen käsine, johon on yhdistetty tarranauha, joka on säädettävissä mihin tahansa ranteeseen. Käsine ja hihna on ommeltu yhteen, ja elektroniset laitteet on kiinnitetty käsineeseen tarranauhalla.

Käsineen toisen prototyypin valmistusvaiheet:

  1. Osta käsine, käsineen materiaalilla ei ole väliä.
  2. Osta velcro -rannehihna
  3. Osta kannettava akku
  4. Osta Sticky Velcro
  5. Kiinnitä ompeluneulalla tarranauharannehihna käsineen pohjaan
  6. Rannehihnan pitäisi pystyä sopeutumaan eri kokoisiin ranteisiin.
  7. Kiinnitä teippi kiihtyvyysmittarin pohjaan ja kiinnitä se käsineen etusormeen
  8. Kiinnitä teippi höyhenen ja kiinnitä se käsineen yläosaan.
  9. Yhdistä höyhen 3V3 -nasta johtojen avulla kiihtyvyysmittarin VIN -nastaan
  10. Yhdistä höyhenen GND -nasta johtojen avulla kiihtyvyysmittarin GND -nastaan.
  11. Yhdistä höyhenen oleva SCL -nasta johtojen avulla kiihtyvyysmittarin SCL -nastaan.
  12. Yhdistä höyhenen SDA -nasta johtojen avulla kiihtyvyysmittarin SDA -nastaan.
  13. Kytke vähintään 5 voltin akku USB: n kautta höyheniin virran saamiseksi.

Vaihe 3: Magneetit

Magneetit
Magneetit

Vaihe 1: Aseta kaksi yhtä voimakasta magneettia vastakkain.

Vaihe 2: Mittaa 30 cm: n rako kahden magneetin välillä

Vaihe 3: aseta magneettimittari täsmälleen kahden magneetin keskelle. Sinun pitäisi vastaanottaa tietoja noin 0, kun se on keskellä. Jos lukema on nolla, siirry vaiheeseen 5.

Vaihe 4: Jos lukema ei ole nolla tai lähellä nollaa, sinun on säädettävä magneettien etäisyyttä. Jos lukema on negatiivinen, siirrä vasenta magneettia cm tai 2 vasemmalle tai kunnes lukema on nolla. Jos se on positiivinen, tee sama paitsi oikealla magneetilla.

Vaihe 5: Kirjoita koodi, joka hyväksyy tiedot magnetometristä ja lukee, onko se positiivinen vai negatiivinen. Jos positiivinen, anna koodin vetää viiva oikealle ja jos negatiivinen, piirrä viiva vasemmalle.

Vaihe 4: Koodi

Koodi
Koodi

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

Johdanto:

Kiihtyvyysmittarin tietojen käsittelemiseksi asiakkaan ja palvelimen välinen suhde on luotava Adafruit -höyhenen ja tietoja käsittelevän palvelimen (käynnissä kannettavalla/pöytäkoneella) välille. Kaksi kooditiedostoa on luotava: toinen asiakkaalle (Adafruit -sulka) ja toinen palvelimelle (tässä tapauksessa Jarodin kannettava tietokone). Asiakas on kirjoitettu C ++: lla ja palvelin pythonilla. Asiakkaan kieli on tärkeä, koska Arduino on pääasiassa C ++ -kieli, ja sen vaihtaminen käyttämään toista kieltä on vaikeaa. Palvelin voidaan kirjoittaa millä tahansa kielellä, kunhan sillä on verkko -ominaisuuksia.

Asiakkaan määrittäminen:

Asennamme ensin asiakaskoodin. Suurin osa WiFi -yhteyskoodista on helposti saatavilla Adafruit -kirjastojen kautta. Aloitamme sisällyttämällä asiaankuuluvat luokat.

#Sisällytä #Sisällytä #Sisällytä #Sisällytä #Sisällytä

Aseta muutamia muuttujia, joita käytetään koko koodissa.

// Yhdistä verkkoon const char* ssid = "MMServer"; const char* password = "MMS-palvelimen salasana"; // Palvelimen IP ja portti, joka vastaanottaa dataa const char* host = "149.160.251.3"; const int portti = 12347; bool kytketty = epätosi;

// Alusta liiketunnistin

Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0 (1000);

WiFiClient -asiakas;

Luo setup () -toiminto, joka suoritetaan heti, kun sulka käynnistyy.

// Määritä WiFi -yhteys ja muodosta yhteys palvelimeenvoid setup () {Serial.begin (9600); viive (100);

Sarja.println ();

Sarja.println (); Serial.print ("Yhdistäminen"); Sarja.println (ssid); // Käynnistä WiFi WiFi.begin (ssid, salasana); // Yhdistetään… while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } // Yhdistetty onnistuneesti WiFi -sarjaan.println (""); Serial.println ("WiFi -yhteys"); Serial.println ("IP -osoite:"); Serial.println (WiFi.localIP ());

#ifndef ESP8266

while (! Sarja); #endif Serial.begin (9600); Serial.println ("Anturitesti");

// Alusta anturi

if (! lsm.begin ()) {// LSM9DS0 Serial.print -tunnistuksessa oli ongelma (F ("Hups, LSM9DS0 ei havaittu… Tarkista johdot tai I2C ADDR!"); kun taas (1); } Serial.println (F ("Löytyi LSM9DS0 9DOF")); // Aloita yhdistäminen palvelimeen Serial.print ("Yhdistäminen"); Serial.println (isäntä);

// Tarkista yhteyden muodostaminen. Jos epäonnistuu, keskeytä

if (! client.connect (isäntä, portti)) {Serial.println ("yhteys epäonnistui"); kytketty = epätosi; palata; } else {connected = true; }

// Määritä anturin vahvistus ja integrointiaika

configureSensor (); }

Tarvitsemme sitten silmukkafunktion, joka silmukkaa toistuvasti. Tässä tapauksessa sitä käytetään toistuvasti lähettämään tietoja kiihtyvyysmittarista palvelimelle muodossa "[z_accel]: [y_mag]: [z_mag]". Asiakas.jälki (numerot); toiminto lähettää tietoja palvelimelle.

tyhjä silmukka () {viive (250); if (connected) {// Tämä lähettää tietoja palvelimelle sensors_event_t accel, mag, gyro, temp; lsm.getEvent (& accel, & mag, & gyro, & temp); Merkkijononumerot; numerot += kiihtyvyys.z; numerot += ":"; numerot += mag.magneettinen.y; numerot += ":"; numerot += mag.magnetic.z; Serial.print (numerot); client.print (numerot); Sarja.println (); } else {createConnection (); }}

Joitakin apuohjelmia varten tarvitsemme sellaisen yhteyden muodostamiseksi höyhenen ja palvelimen välille.

void createConnection () {if (! client.connect (isäntä, portti)) {Serial.println ("yhteys epäonnistui"); kytketty = epätosi; palata; } else {connected = true; }}

Meidän on myös määritettävä anturi ja annettava sille lukema arvoalue. Esimerkiksi kiihdytyksellä on 5 vaihtoehtoa alueelle: 2g, 4g, 6g, 8g ja 16g.

void configureSensor (void) {// Aseta kiihtyvyysmittarin alue //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); // Aseta magnetometrin herkkyys //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_2GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_4GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_8GAUSS); lsm.setupMag (lsm. LSM9DS0_MAGGAIN_12GAUSS);

// Asenna gyroskooppi

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

Palvelimen asentaminen:

Palvelin on python -tiedosto, joka suoritetaan tietokoneen komentorivillä. Aloita tuomalla tarvittavat luokat.

tuonti pistorasia tuonti uudelleen tuonti pyautogui

pistorasiaa käytetään verkostoitumiseen. re käytetään lausekkeisiin tai merkkijonon käsittelyihin. pyautogui on python -kirjasto, joka mahdollistaa piirtämisen (keskustellaan myöhemmin).

Seuraavaksi meidän on määriteltävä muutamia muuttujia. Nämä ovat globaaleja muuttujia, joten niitä käytetään useissa toiminnoissa. Niitä käytetään myöhemmin koodissa.

i = 0n = 0 rivi = 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 = Väärä

first_data = Totta

Tarvitsemme nyt toiminnon palvelimen luomiseksi ja sen avaamiseksi saapuville yhteyksille.

def startServer (): global i global first_data # formatize server socket serverocket = socket.socket (socket. AF_INET, socket. SOCK_STREAM) serverocket.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEADDR, 1) # Palvelimen IP -osoite ja portti isäntä = " 149.160.251.3 "port = 12347 server_address = (isäntä, portti) # Avaa palvelin ja kuuntele saapuvat yhteydet tulostus ('Palvelimen käynnistäminen %s portissa %s' %server_address) serverocket.bind (server_address) serverocket.listen (5) # Odota yhteyksiä… kun True: print ('Odotetaan yhteyttä …') # Hyväksy saapuva yhteys (clientocket, osoite) = serverocket.accept () # Yritä jäsentää vastaanotetut tiedot try: print ('Yhteys muodostettu', osoite) kun Tosi: # Vastaanota tiedot ja lähetä ne tietojen käsittelyä varten = customersocket.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] tulosta (accel_data) i+= 1 if (i <51): calibData (accel_data) else: moveAcce l (accel_data [0]) processData (accel_data) first_data = Väärä lopulta: # Sulje pistorasia estääksesi tarpeettomat tietovuodot customersocket.close ()

Tarvitsemme nyt toimintoja, jotka käsittelevät kaikki tiedot. Ensimmäinen askel ja ensimmäinen kutsuttu toiminto on anturin kalibrointi laskentatarkoituksia varten.

def calibData (lista): 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)

Seuraavaksi luomme liikkuvan kiihtyvyyspoikkeaman. Tämä tekee siitä niin, että ohjelma tunnistaa, kun joku lopettaa sormensa liikuttamisen, koska kaikkien palvelimelle lähetettävien kiihtyvyysarvojen on oltava samat tuolloin.

def moveAccel (numero): 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): # liike havaittu tiedoissa, käynnistä keep_offset = True n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 data_list = tauko, jos ei pidä off_offset: # paikallaan tiedoissa, aseta uusi 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 = Väärä keep_offset = Väärä

Seuraavaksi teemme matematiikan. Tähän sisältyy kiihdytystietojen kääntäminen sijaintitietoihin, joiden avulla voimme kertoa suunnan, johon käyttäjä liikuttaa sormeaan.

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

mag_y = list [1] mag_z = list [2] left = False right = False # Älä käsittele kiihdytystä, ennen kuin olet täysin varma, että se on kiihtynyt # Estää mekaanista kohinaa vaikuttamasta paikkaan, jos (z_real -0,20): z_real = 0 # Begin integraatiot paikan löytämiseksi, jos (ensimmäinen_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 (oikea): liike (50, int (z_pos*) 1000)) elif (vasen): liike (-50, int (z_pos*1000)) z_velo = 0 z_pos = 0

Nyt vihdoin siirretään kohdistinta! Tätä varten avasimme maalausikkunan ja teimme siitä koko näytön. Pyautogui -kirjasto sisältää funktion nimeltä pyautogui.dragRel (x, y); jota käytämme vetäessämme hiiren osoitinta pisteestä toiseen. Se käyttää suhteellisia sijaintitietoja, joten liike on suhteessa kohdistimen viimeiseen sijaintiin.

def liike (x, y): print ("siirtymässä", x, -y) pyautogui.dragRel (x, -y)

Lopuksi meidän on kutsuttava päätoiminto, jotta koko koodi voidaan suorittaa.

# Kutsuu toimintoa käynnistämään palvelimentartServer ()

Suositeltava: