Мазмұны:

Accel жазу (сиқырлы қол): 4 қадам (суреттермен)
Accel жазу (сиқырлы қол): 4 қадам (суреттермен)
Anonim
Аксель жазу (сиқырлы қол)
Аксель жазу (сиқырлы қол)
Аксель жазу (сиқырлы қол)
Аксель жазу (сиқырлы қол)
Аксель жазу (сиқырлы қол)
Аксель жазу (сиқырлы қол)

Кіріспе

«Сиқырлы қол» мүмкіндігі шектеулі жандар мен моторикасының бұзылуы бар адамдарға модельдеу ортасында сурет салу мен жазу шығармашылықтарынан ләззат алуға мүмкіндік береді. Сиқырлы қол - бұл саусағыңыздың қозғалысын сезетін және оны компьютер экранындағы сызықтарға аударатын киетін қолғап.

Қажетті материалдар

LSM9DOF Breakout Board-$ 24.95 ---

Wifi қосылған Adafruit қауырсыны --- $ 18.95 ---

Әйел/аналық сымдар-$ 1.95 ---

Таспа/желім таспалар-3 доллар

Бірдей күштегі екі магнит --- Бағалар әр түрлі

Бұл қалай жұмыс істейді

Акселерометрді қолдана отырып, біз y осі бойынша үдеу туралы деректерді жинай аламыз, бұл пайдаланушының саусағының қашан жоғары және төмен жылжитынын анықтауға көмектеседі. Біздің акселерометр жердің центріне қатысты үдеуді өлшейтіндіктен, біз х осінің үдеуін (солға немесе оңға) анықтай алмаймыз. Бақытымызға орай, LSM9DOF сыну тақтасында магнит өрісі туралы мәліметтерді жинауға мүмкіндік беретін магнитометр бар. Біз екі магнитті 30 см қашықтықта орналастырамыз және олардың арасында қолғап бар. Егер магниттік мәліметтер оң болса, онда біз қолғаптың оңға және керісінше қозғалатынын білеміз. Барлық деректер акселерометрде/магнитометрде жиналғаннан кейін, ол деректерді сым арқылы Wi -Fi желісіне қосылған қауырсынға жібереді, содан кейін деректерді компьютерге жібереді, оны біз өз кодымызда қолдана аламыз.

1 -қадам: физикалық прототип 1

Физикалық прототип 1
Физикалық прототип 1
Физикалық прототип 1
Физикалық прототип 1

Бұл прототип электронды құрылғылардың үстінен сырғып кетуі үшін қолға біркелкі тігілген қолғапқа арналған. Содан кейін электронды құрылғы велкро көмегімен броньды астыңғы қапсырманың негізіне қолғаппен бекітіледі. Содан кейін жасыл қолғап негіз мен электронды құрылғылардың үстінен сырғып өтеді.

Қолғаптың прототипін жасау қадамдары:

  • Қолды іздеуге жеткілікті үлкен екі мата алыңыз
  • Қолды матаның екі бөлігіне түсіріп, кесіңіз
  • Қолдың екі қиығын бір -біріне қойыңыз, сонда олар біркелкі болады
  • Содан кейін, тігін машинасын дайындау үшін жіпті машинадағы көрсетілген нүктелерден өткізіңіз
  • Тігін машинасы орнатылған кезде, инені көтеріп, матаның екі бөлігін иненің астына қойыңыз
  • Иненің матаның ең шетіне тігілгеніне көз жеткізіңіз, машинаны іске қосыңыз және матаның жиектерін тігіңіз, ал екі бөлікті білекке тігілмеген күйде қалдырыңыз, сонда қол сайып кетеді.

2 -қадам: Физикалық прототип 2

Физикалық прототип 2
Физикалық прототип 2
Физикалық прототип 2
Физикалық прототип 2

Біздің соңғы прототип - кез келген білекке реттелетін Velcro белбеуімен біріктірілген қарапайым қолғап. Қолғап пен белдік тігілген, ал электронды құрылғылар қолғапқа Velcro арқылы бекітілген.

Қолғаптың екінші прототипін жасау қадамдары:

  1. Қолғап сатып алыңыз, қолғаптың материалы маңызды емес.
  2. Велкро білезік сатып алыңыз
  3. Портативті батареяны сатып алыңыз
  4. Sticky Velcro сатып алыңыз
  5. Тігін инесімен велкро білезікті қолғаптың негізіне бекітіңіз
  6. Білезік білезіктің әр түрлі мөлшеріне бейімделуі керек.
  7. Жабысқақ таспаны акселерометрдің негізіне бекітіп, қолғаптың сұқ саусағына бекітіңіз
  8. Қауырсынға жабысқақ таспаны бекітіп, қолғаптың жоғарғы жағына бекітіңіз.
  9. Сымдардың көмегімен қауырсындағы 3V3 түйреуішті акселерометрдегі VIN түйреуішіне қосыңыз
  10. Сымдардың көмегімен қауырсындағы GND түйреуішін акселерометрге GND түйреуішіне қосыңыз.
  11. Сымдарды пайдаланып, қауырсындағы SCL түйреуішін акселерометрге SCL түйреуішіне қосыңыз.
  12. Сымдардың көмегімен қауырсындағы SDA түйреуішін акселерометрге SDA түйреуішіне қосыңыз.
  13. Қуат беру үшін кемінде 5 вольтты батареяны қауырсынға USB арқылы қосыңыз.

3 -қадам: магниттер

Магниттер
Магниттер

1 -қадам: Бір -біріне қарама -қарсы екі магнит күшін салыңыз.

2 -қадам: Екі магниттің арасындағы 30 см бос орынды өлшеңіз

3 -қадам: магнитометрді екі магниттің дәл ортасына қойыңыз. Деректерді 0 ортасында алу керек, ол ортасында. Егер сіз нөлдік көрсеткішті алсаңыз, 5 -қадамға өтіңіз.

4 -қадам: Егер көрсеткіш нөлге тең болмаса немесе нөлге жақын болса, онда магниттердің қашықтығын реттеу керек. Егер көрсеткіш теріс болса, сол магнитті бір см немесе 2 солға немесе нөлге дейін жылжытыңыз. Егер оң болса, дәл сол магниттен басқа нәрсені жасаңыз.

5 -қадам: магнитометрден деректерді қабылдайтын кодты жазыңыз және ол оң немесе теріс болса оқыңыз. Егер оң болса, код оңға, ал теріс болса солға сызық сызыңыз.

4 -қадам: код

Код
Код

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

Кіріспе:

Акселерометрден деректерді өңдеу үшін Adafruit қауырсыны мен деректерді өңдейтін сервер арасында клиент/сервер байланысы орнатылуы керек (ноутбукта/жұмыс үстелінде). Екі код файлын жасау қажет: біреуі клиентке (Adafruit қауырсыны), екіншісі серверге (бұл жағдайда Jarod ноутбукіне). Клиент C ++ тілінде, ал сервер python тілінде жазылған. Клиент үшін қолданылатын тіл маңызды, себебі Arduino негізінен C ++ тілі болып табылады және оны басқа тілге өзгерту қиын. Сервер кез келген тілде жазылуы мүмкін, егер оның желілік мүмкіндіктері болса.

Клиентті орнату:

Алдымен біз клиент кодын орнатамыз. WiFi байланыс кодының көп бөлігі Adafruit кітапханалары арқылы қол жетімді. Біз тиісті сыныптарды қосудан бастаймыз.

#қосу #қосу #қосу #қосу #қосу

Код бойынша қолданылатын айнымалыларды орнатыңыз.

// Желіге қосылыңыз char* ssid = «MMServer»; const char* password = «MMServer-Password»; // деректерді алатын char* host = «149.160.251.3» серверінің IP және порты; const int порт = 12347; bool қосылған = жалған;

// Қозғалыс детекторын іске қосыңыз

Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0 (1000);

WiFiClient клиенті;

Орнату () функциясын жасаңыз, ол қауырсын бастала салысымен іске қосылады.

// WiFi қосылымын орнатыңыз және servervoid setup () {Serial.begin (9600) қосылыңыз; кешіктіру (100);

Serial.println ();

Serial.println (); Serial.print («Қосылу»); Serial.println (ssid); // WiFi WiFi.begin іске қосыңыз (ssid, құпия сөз); // Қосылу… while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print («.»); } // WiFi Serial.println («») сәтті қосылды; Serial.println («WiFi қосылған»); Serial.println («IP мекенжайы:»); Serial.println (WiFi.localIP ());

#ifndef ESP8266

while (! сериялық); #endif Serial.begin (9600); Serial.println («Сенсорлық тест»);

// Сенсорды инициализациялаңыз

if (! lsm.begin ()) {// LSM9DS0 Serial.print анықталмады кезінде (1); } Serial.println (F («LSM9DS0 9DOF табылды»)); // Serial.print серверіне қосылуды бастаңыз («Қосылу»); Serial.println (хост);

// Сәтті қосылуды тексеріңіз. Егер сәтсіз болса, тоқтатыңыз

if (! client.connect (хост, порт)) {Serial.println («байланыс үзілді»); қосылған = жалған; қайтару; } else {қосылған = ақиқат; }

// Сенсордың кіру уақытын және интеграция уақытын орнатыңыз

configureSensor (); }

Бізге бірнеше рет айналатын цикл функциясы қажет. Бұл жағдайда акселерометрден «[z_accel]: [y_mag]: [z_mag]» түріндегі деректерді бірнеше рет серверге жіберу үшін қолданылады. Client.print (сандар); функция - бұл деректерді серверге жібереді.

void loop () {delay (250); if (қосылған) {// Бұл деректерді sensors_event_t accel, mag, gyro, temp серверіне жібереді; lsm.getEvent (& accel, & mag, & gyro, & temp); Жол сандары; сандар += accel.acceleration.z; сандар += «:»; сандар += mag.magnetic.y; сандар += «:»; сандар += mag.magnetic.z; Serial.print (сандар); client.print (сандар); Serial.println (); } else {installConnection (); }}

Кейбір қызметтік функциялар үшін қауырсын мен сервер арасындағы байланысты орнату қажет.

void installConnection () {if (! client.connect (хост, порт)) {Serial.println («байланыс үзілді»); қосылған = жалған; қайтару; } else {қосылған = ақиқат; }}

Біз сондай -ақ сенсорды конфигурациялап, оған оқылатын мәндер диапазонын беруіміз керек. Мысалы, акселерацияда диапазон үшін 5 нұсқа бар: 2g, 4g, 6g, 8g және 16g.

void configureSensor (void) {// Акселерометр диапазонын орнату //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); // Магнитометр сезімталдығын орнату //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_2GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_4GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_8GAUSS); lsm.setupMag (lsm. LSM9DS0_MAGGAIN_12GAUSS);

// Гироскопты орнату

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

Серверді орнату:

Сервер компьютердің пәрмен жолында жұмыс істейтін python файлы болады. Бастау үшін қажетті сыныптарды импорттаңыз.

импорт socketimport қайта импорттау

розетка желіге қосылу үшін қолданылады. re rex немесе жол манипуляциялары үшін қолданылады. pyautogui - бұл сурет салуға мүмкіндік беретін питон кітапханасы (кейінірек талқыланатын болады).

Әрі қарай, біз кейбір айнымалыларды анықтауымыз керек. Бұл жаһандық айнымалылар болады, сондықтан оларға көптеген функцияларда қол жеткізіледі. Олар кейінірек кодта қолданылады.

i = 0n = 0 жол = 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 = жалған

first_data = Дұрыс

Бізге сервер құру және оны кіретін қосылымдар үшін ашу функциясы қажет.

def startServer (): global i global first_data # server socket serversocket = socket.socket (socket. AF_INET, socket. SOCK_STREAM) serversocket.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEADDR, 1) # Сервердің IP мекенжайы мен порт хост = « 149.160.251.3 «port = 12347 server_address = (хост, порт) # Серверді ашыңыз және кіріс қосылымдарын тыңдаңыз (' %s портында %s' %server_address сервері) serversocket.bind (server_address) serversocket.listen (5) # Қосылымдарды күтіңіз … ал True: басып шығару ('Байланыс күтілуде …') # Кіріс байланысты қабылдаңыз (клиенттер ұясы, мекенжай) = serversocket.accept () # Алынған деректерді талдауға тырысыңыз try: print ('Байланыс орнатылды', мекен -жай)) True кезінде: # Деректерді алыңыз және деректерді өңдеуге жіберіңіз = 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: moveAcce l (accel_data [0]) processData (accel_data) first_data = Ақырында жалған: # Қажет емес мәліметтердің ағып кетуін болдырмау үшін ұяшықты жабыңыз clientocket.close ()

Енді бізге барлық деректерді өңдейтін функциялар қажет. Алғашқы қадам және шақырылатын бірінші функция - бұл есептеу мақсатында сенсорды калибрлеу.

def calibData (тізім): жаһандық z_calib z_offset ғаламдық mag_data global mag_calib_y жаһандық mag_offset_y z_calib += float (тізім [0]) mag_calib_y += float (тізім [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)

Әрі қарай, біз қозғалатын үдеудің ығысуын жасаймыз. Бұл бағдарлама біреу саусақпен қозғалуды тоқтатқан кезде таниды, себебі серверге жіберілетін жеделдетудің барлық мәндері сол уақытта бірдей болуы керек.

def moveAccel (num): жаһандық z_calib z_diff жаһандық z_moving_offset жаһандық z_offset жаһандық деректер_листі жаһандық n_болсын_жалпы, егер (n 0.2 немесе z_diff <-0.2): деректер ішінде # қозғалыс анықталды, keep_offset = True n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 data_list = break_offset сақталмаса: үзілісте: деректерде # стационарлық, жаңа z_offset z_offset = z_moving_offset басып шығаруды орнатыңыз («Жаңа z_offset:») басып шығару (z_offset) n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 деректер_ тізімі = keep_offset = Жалған keep_offset = Жалған

Әрі қарай, біз математиканың негізгі жұмысын жасаймыз. Бұл жеделдету деректерін пайдаланушы саусақпен қозғалатын бағытты айтуға мүмкіндік беретін позиция деректеріне аударуды қамтиды.

def processData (тізім): #[accel.z, mag.y] жаһандық z_ офсет жаһандық z_real жаһандық z_velo жаһандық z_pos жаһандық бірінші_мәліметтер жаһандық mag_data

z_real = float (тізім [0]) - z_offset

mag_y = list [1] mag_z = list [2] left = False right = False # Жылдамдығына толық сенімді болмайынша үдеуді өңдемеңіз # Механикалық шуылдың позицияға үлес қосуын болдырмайды, егер (z_real -0.20): z_real = 0 #Begin егер (бірінші_мәліметтер): 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), егер: 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): оң = Нағыз элиф (float (mag_data [1]) - float (mag_data [0]) <-0.03): left = Егер дұрыс болса (оңға): қозғалыс (50, int (z_pos*) 1000)) элиф (сол жақта): қозғалыс (-50, int (z_pos*1000)) z_velo = 0 z_pos = 0

Енді, ақырында, курсорды жылжытамыз! Ол үшін біз бояу терезесін ашып, оны толық экранға айналдырдық. Pyautogui кітапханасында pyautogui.dragRel (x, y) деп аталатын функция бар; біз тышқан курсорын бір нүктеден екіншісіне апару үшін қолданамыз. Ол салыстырмалы позиция деректерін қолданады, сондықтан қозғалыс курсордың соңғы орнына қатысты болады.

def қозғалысы (x, y): басып шығару («көшу», x, -y) pyautogui.dragRel (x, -y)

Ақырында, біз осы кодтың барлығын іске қосуға мүмкіндік беру үшін негізгі функцияны шақыруымыз керек.

# ServerstartServer () функциясын бастау үшін функцияны шақырады

Ұсынылған: