Shkrimi Accel (Dora Magjike): 4 hapa (me fotografi)
Shkrimi Accel (Dora Magjike): 4 hapa (me fotografi)
Anonim
Shkrim Accel (Dora Magjike)
Shkrim Accel (Dora Magjike)
Shkrim Accel (Dora Magjike)
Shkrim Accel (Dora Magjike)
Shkrim Accel (Dora Magjike)
Shkrim Accel (Dora Magjike)

Prezantimi

Dora Magjike u lejon njerëzve me aftësi të kufizuara dhe aftësi të kufizuara motorike të shijojnë krijimtarinë e vizatimit dhe shkrimit në një mjedis të simuluar. Dora Magjike është një dorezë e veshur që ndjen lëvizjen e gishtit tuaj tregues dhe e përkthen atë në vizatimin e linjave në ekranin e kompjuterit.

Materialet e nevojshme

LSM9DOF Breakout Board --- 24,95 dollarë ---

Pendë Adafruit me Wifi --- 18,95 dollarë ---

Telat Femra/Femra --- $ 1.95 ---

Shirita/shirita Velcro --- 3 dollarë

Dy magnetë me forcë të barabartë --- Çmimet ndryshojnë

Si punon

Duke përdorur një akselerometër, ne mund të mbledhim të dhëna përshpejtimi për boshtin y i cili do të na ndihmojë të përcaktojmë kur gishti i përdoruesit lëviz lart e poshtë. Për shkak të faktit se përshpejtuesi ynë mat nxitimin në lidhje me qendrën e tokës, ne nuk mund të përcaktojmë nxitimin e boshtit x (majtas ose djathtas). Për fat të mirë, bordi i shpërthimit LSM9DOF gjithashtu përmban një magnetometër i cili na lejon të mbledhim të dhëna për fushat magnetike. Ne vendosim dy magnete 30 cm larg dhe kemi dorezën në mes. Nëse të dhënat magnetike lexohen pozitive, atëherë ne e dimë që doreza po lëviz drejt dhe anasjelltas. Pasi të gjitha të dhënat të mblidhen në përshpejtuesin/magnetometrin, ai i dërgon të dhënat përmes telit në pendë e cila është e lidhur me një kompjuter wifi dhe më pas i përcjell të dhënat në kompjuter të cilat më pas mund t'i përdorim në kodin tonë.

Hapi 1: Prototipi fizik 1

Prototipi fizik 1
Prototipi fizik 1
Prototipi fizik 1
Prototipi fizik 1

Ky prototip është menduar të jetë i fiksuar me dorë në dorën e tij, në mënyrë që të rrëshqasë mbi pajisjet elektronike. Pajisja elektronike më pas do të ngjitet me velcro në bazën e mëngës nën forca të blinduara të kombinuar me një dorezë bazë në dorë. Pastaj dorashka e gjelbër do të rrëshqasë mbi bazën dhe pajisjet elektronike….

Hapat për të bërë prototipin e dorezës:

  • Merrni dy copa pëlhure mjaft të mëdha për të gjetur dorën
  • Gjurmoni dorën në të dy pjesët e rrobave dhe pritini ato
  • Vendosini të dyja prerjet e dorës së bashku në mënyrë që ato të alinohen në mënyrë perfekte
  • Tjetra, për të përgatitur makinën qepëse, kaloni fijen nëpër pikat e treguara në makinë
  • Kur të vendoset makina qepëse, ngrini gjilpërën dhe vendosni dy copa pëlhure të bashkuara nën gjilpërë
  • Sigurohuni që gjilpëra të jetë e rreshtuar në skajin e pëlhurës, filloni makinën dhe qepni përgjatë skajeve të pëlhurës, ndërsa i lini të dy pjesët të qepura në dore në mënyrë që një dorë të përshtatet.

Hapi 2: Prototipi fizik 2

Prototipi fizik 2
Prototipi fizik 2
Prototipi fizik 2
Prototipi fizik 2

Prototipi ynë përfundimtar është një dorezë e zakonshme e kombinuar me rrip Velcro që mund të rregullohet në çdo dore. Doreza dhe rripi janë të qepura së bashku, dhe pajisjet elektronike janë bashkangjitur në dorezë nëpërmjet Velcro.

Hapat për të bërë prototipin e dytë të dorezës:

  1. Blini një dorezë, materiali i dorezës nuk ka rëndësi.
  2. Blini një rrip dore velcro
  3. Blini një bateri portative
  4. Blini Velcro ngjitëse
  5. Me një gjilpërë qepëse, lidhni rripin e dorës velcro në bazën e dorezës
  6. Rripi i kyçit të dorës duhet të jetë në gjendje të përshtatet me madhësi të ndryshme dore.
  7. Bashkangjiteni shiritin ngjitës në bazën e përshpejtuesit dhe ngjiteni atë në gishtin tregues të dorezës
  8. Bashkangjiteni shiritin ngjitës në pendë dhe ngjiteni në majë të dorezës.
  9. Përdorimi i telave lidhni kunjin 3V3 në pendë me kunjin VIN në përshpejtuesin
  10. Përdorimi i telave lidhni kunjin GND në pendë me kunjin GND përshpejtuesin.
  11. Përdorimi i telave lidhni kunjin SCL në pendë me kunjin SCL përshpejtuesin.
  12. Duke përdorur tela lidhni kunjin SDA në pendë me kunjin SDA përshpejtuesin.
  13. Lidhni të paktën një bateri 5 volt përmes USB me pendën për të siguruar energji.

Hapi 3: Magnet

Magnet
Magnet

Hapi 1: Vendosni dy magnetët me forcë të barabartë përballë njëri -tjetrit.

Hapi 2: Matni hendekun 30 cm midis dy magnetëve

Hapi 3: Vendosni Magnetometrin pikërisht në mes të dy magneteve. Ju duhet të merrni të dhëna rreth 0 ndërsa janë në mes. Nëse merrni një lexim zero kaloni në hapin 5.

Hapi 4: Nëse leximi nuk është zero ose afër zeros atëherë duhet të rregulloni distancën e magneteve. Nëse leximi është negativ lëviz magnetin e majtë një cm ose 2 në të majtë ose derisa leximi të jetë zero. Nëse është pozitive bëni të njëjtën gjë përveç me magnetin e duhur.

Hapi 5: Shkruani kodin që pranon të dhënat nga magnetometri dhe lexon nëse është pozitiv ose negativ. Nëse është pozitiv, kodi vizatoni një vijë në të djathtë dhe nëse negative vizatoni një vijë në të majtë.

Hapi 4: Kodi

Kodi
Kodi

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

Prezantimi:

Për të përpunuar të dhënat nga përshpejtuesi, duhet të krijohet një marrëdhënie klient/server midis pendës Adafruit dhe serverit që përpunon të dhënat (duke punuar në një kompjuter portativ/desktop). Do të duhet të krijohen dy skedarë kodesh: një për klientin (pendën Adafruit), dhe tjetri për serverin (në këtë rast, laptopi i Jarod). Klienti është shkruar në C ++, dhe serveri është shkruar në python. Gjuha e përdorur për klientin ka rëndësi pasi Arduino është kryesisht një gjuhë C ++, dhe ndryshimi i saj për të përdorur një gjuhë tjetër është i vështirë. Serveri mund të shkruhet në çdo gjuhë, për sa kohë që ka veçori të rrjetit.

Konfigurimi i Klientit:

Së pari, ne do të konfigurojmë kodin e klientit. Shumica e kodit të lidhjes WiFi është në dispozicion lehtësisht përmes bibliotekave Adafruit. Ne fillojmë duke përfshirë klasat përkatëse.

#përfshi #përfshi #përfshi #përfshi #përfshi

Vendosni disa ndryshore se çfarë do të përdoret në të gjithë kodin.

// Lidhu me një rrjet const char* ssid = "MMServer"; const char* fjalëkalimi = "MMS-server-Fjalëkalimi"; // IP dhe porti i serverit i cili do të marrë të dhëna const char* host = "149.160.251.3"; const int port = 12347; bool lidhur = false;

// Filloni detektorin e lëvizjes

Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0 (1000);

Klienti WiFiClient;

Krijoni një funksion setup () i cili do të ekzekutohet sapo të fillojë penda.

// Konfiguro lidhjen WiFi dhe lidhe me konfigurimin e servervoid () {Serial.begin (9600); vonesa (100);

Serial.println ();

Serial.println (); Serial.print ("Lidhu me"); Serial.println (ssid); // Filloni WiFi WiFi.begin (ssid, fjalëkalim); // Po lidhet … ndërsa (WiFi.status ()! = WL_CONNECTED) {vonesë (500); Serial.print ("."); } // Lidhur me sukses me WiFi Serial.println (""); Serial.println ("WiFi i lidhur"); Serial.println ("Adresa IP:"); Serial.println (WiFi.localIP ());

#ifndef ESP8266

ndërsa (! Serial); #endif Serial.filloj (9600); Serial.println ("Testi i sensorit");

// Filloni sensorin

nëse (! lsm.begin ()) {// Kishte një problem në zbulimin e LSM9DS0 Serial.print (F ("Ooops, nuk u zbulua LSM9DS0 … Kontrolloni instalimet tuaja elektrike ose I2C ADDR!")); ndërsa (1); } Serial.println (F ("Found LSM9DS0 9DOF")); // Filloni lidhjen me serverin Serial.print ("Lidhja me"); Serial.println (host);

// Kontrolloni për lidhje të suksesshme. Nëse dështon atëherë aborto

if (! client.connect (host, port)) {Serial.println ("lidhja dështoi"); i lidhur = false; kthim; } else {lidhur = e vërtetë; }

// Vendosni fitimin e sensorit dhe kohën e integrimit

configureSensor (); }

Ne pastaj kemi nevojë për një funksion loop që do të lakohet vazhdimisht. Në këtë rast, përdoret për të dërguar në mënyrë të përsëritur të dhëna nga përshpejtuesi në server në formën e "[z_accel]: [y_mag]: [z_mag]". Klienti.print (numrat); funksioni është ai që dërgon të dhëna në server.

lak void () {vonesë (250); nëse (e lidhur) {// Kjo do të dërgojë të dhëna në server sensors_event_t accel, mag, gyro, temp; lsm.getEvent (& accel, & mag, & gyro, & temp); Numrat e vargut; numrat += accel.acceleration.z; numrat += ":"; numrat += mag.magnetic.y; numrat += ":"; numrat += mag.magnetic.z; Serial.print (numrat); klienti.print (numrat); Serial.println (); } else {installConnection (); }}

Për disa funksione të shërbimeve, na duhet një për të vendosur lidhjen midis pendës dhe serverit.

void installConnection () {if (! client.connect (host, port)) {Serial.println ("lidhja dështoi"); i lidhur = false; kthim; } else {lidhur = e vërtetë; }}

Ne gjithashtu duhet të konfigurojmë sensorin dhe t'i japim gamën e vlerave që do të lexojë. Për shembull, përshpejtimi ka 5 mundësi për gamën: 2g, 4g, 6g, 8g dhe 16g.

void configureSensor (void) {// Vendosni gamën e përshpejtuesit //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); // Vendosni ndjeshmërinë e magnetometrit //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_2GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_4GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_8GAUSS); lsm.setupMag (lsm. LSM9DS0_MAGGAIN_12GAUSS);

// Vendosni xhiroskopin

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

Vendosja e serverit:

Serveri do të jetë një skedar python që do të funksionojë në vijën e komandës së një kompjuteri. Për të filluar, importoni klasat e kërkuara.

import socketimport ri import pyautogui

priza përdoret për rrjetëzim. re përdoret për regex, ose manipulime me tela. pyautogui është një bibliotekë python e cila do të lejojë që vizatimi të ndodhë (diskutuar më vonë).

Tjetra, ne duhet të përcaktojmë disa ndryshore. Këto do të jenë ndryshore globale, kështu që ato do të aksesohen në funksione të shumta. Ato do të përdoren më vonë në kod.

i = 0n = 0 rresht = 1

lista e të dhënave =

mag_data =

mag_calib_y = 0 mag_offset_y = 0

z_kalib = 0

z_offset = 0 z_moving_offset = 0 z_diff = 0 z_real = 0 z_velo = 0 z_pos = 0

keep_offset = E gabuar

të dhënat e para = E vërtetë

Tani na duhet një funksion për të krijuar një server dhe për ta hapur atë për lidhjet hyrëse.

def startServer (): global i global_ first_data # inicialize server socket serversocket = socket.socket (socket. AF_INET, socket. SOCK_STREAM) serversocket.setsockopt (socket. SOL_SOCKET, fole. SO_REUSEADDR, 1) # Adresa IP e serverit dhe hosti i portit = " 149.160.251.3 "port = 12347 server_address = (host, port) # Hapni serverin dhe dëgjoni për lidhjet hyrëse printoni ('Fillimi i serverit në %s port %s' %server_address) serversocket.bind (server_address) serversocket.listen (5) # Prisni lidhjet … ndërsa e vërtetë: printoni ("Duke pritur për lidhjen …") # Pranoni një lidhje hyrëse (klientelë, adresë) = serversocket.accept () # Përpiquni të analizoni të dhënat e marra provoni: printoni ('Lidhja e krijuar nga', adresa) ndërsa True: # Merrni të dhënat dhe dërgojini për përpunim të dhënash = customersocket.recv (25) accel_data = re.split ('[:]', str (të dhëna)) 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 nëse (i <51): calibData (accel_data) tjetër: lëvizAcce l (accel_data [0]) processData (accel_data) first_data = E gabuar më në fund: # Mbyllni prizën për të parandaluar rrjedhjen e të dhënave të panevojshme clientocket.close ()

Ne tani kërkojmë funksionet që do të përpunojnë të gjitha të dhënat. Hapi i parë që duhet ndërmarrë, dhe funksioni i parë i quajtur, është kalibrimi i sensorit për qëllimet e llogaritjes.

def calibData (lista): globale z_calib globale z_offset globale mag_data globale mag_calib_y globale mag_offset_y z_calib += noton (lista [0]) mag_calib_y += noton (lista [1]) nëse (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)

Tjetra, ne krijojmë një kompensim lëvizës të nxitimit. Kjo e bën atë që programi të njohë kur dikush ndalon së lëvizuri gishtin sepse të gjitha vlerat e përshpejtimit që dërgohen në server duhet të jenë të njëjta në atë kohë.

def moveAccel (num): global z_calib global z_diff global z_moving_offset globale z_offset globale të të dhënave globale n global keep_offset nëse (n 0.2 ose z_diff <-0.2): # lëvizje e zbuluar brenda të dhënave, rinisni keep_offset = E vërtetë n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 lista e të dhënave = pushim nëse nuk mbahet_offset: # të palëvizshme në të dhëna, vendosni z_offset të ri z_offset = z_moving_offset print ("z_offset i ri:") print (z_offset) n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 lista e të dhënave = keep_offset = E rreme keep_offset = E gabuar

Tjetra, ne bëjmë pjesën më të madhe të matematikës. Kjo përfshin përkthimin e të dhënave të përshpejtimit në të dhëna të pozicionit të cilat do të na lejojnë të tregojmë drejtimin që përdoruesi lëviz me gishtin e tij.

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

z_real = noton (lista [0]) - z_offset

mag_y = lista [1] mag_z = lista [2] majta = E drejtë e rreme = E gabuar # Mos e përpunoni nxitimin derisa të jeni absolutisht i sigurt se ka përshpejtuar # Parandalon zhurmën mekanike të kontribuojë në pozicionin nëse (z_real -0.20): z_real = 0 #Fillo integrimet për të gjetur pozicionin nëse (të dhënat e para): 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) tjetër: 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) nëse (noton (mag_data [1]) - noton (mag_data [0])> 0.03): djathtas = elif i vërtetë (noton (mag_data [1]) - noton (mag_data [0]) <-0.03): majtas = E vërtetë nëse (djathtas): lëvizje (50, int (z_pos* 1000)) elif (majtas): lëvizja (-50, int (z_pos*1000)) z_velo = 0 z_pos = 0

Tani, më në fund, ne lëvizim kursorin! Për ta bërë këtë, ne hapëm një dritare me bojë dhe e bëmë atë në ekran të plotë. Biblioteka pyautogui përmban një funksion të quajtur pyautogui.dragRel (x, y); të cilën e përdorim për të tërhequr kursorin e miut nga një pikë në tjetrën. Ai përdor të dhënat e pozicionit relativ kështu që lëvizja është relative me pozicionin e fundit të kursorit.

def lëvizje (x, y): print ("duke lëvizur në", x, -y) pyautogui.dragRel (x, -y)

Së fundmi, ne duhet të thërrasim funksionin kryesor për të lejuar që të funksionojë i gjithë ky kod.

# Thërret funksionin për të filluar servistartServer ()