Mundarija:

Tez yozish (sehrli qo'l): 4 qadam (rasmlar bilan)
Tez yozish (sehrli qo'l): 4 qadam (rasmlar bilan)

Video: Tez yozish (sehrli qo'l): 4 qadam (rasmlar bilan)

Video: Tez yozish (sehrli qo'l): 4 qadam (rasmlar bilan)
Video: Barmoq matorika uchun ajoyib mashq 2024, Noyabr
Anonim
Accel yozuvi (sehrli qo'l)
Accel yozuvi (sehrli qo'l)
Accel yozuvi (sehrli qo'l)
Accel yozuvi (sehrli qo'l)
Accel yozuvi (sehrli qo'l)
Accel yozuvi (sehrli qo'l)

Kirish

"Sehrli qo'l" nogironligi va harakat qobiliyati buzilgan odamlarga simulyatsiya qilingan muhitda rasm chizish va yozish ijodidan bahramand bo'lish imkonini beradi. Sehrli qo'l - barmog'ingizning harakatini sezadigan va uni kompyuter ekranidagi chiziqlar chizig'iga aylantiradigan qo'lqopli qo'lqop.

Kerakli materiallar

LSM9DOF Breakout Board-$ 24.95 ---

Wi-Fi bilan Adafruit patlari --- $ 18.95 ---

Ayol/ayol simlari-$ 1.95 ---

Tasma/Velcro chiziqlar-3 dollar

Bir xil kuchga ega ikkita magnit --- Narxlar turlicha

U qanday ishlaydi

Akselerometr yordamida biz y o'qi uchun tezlashuv ma'lumotlarini to'plashimiz mumkin, bu esa foydalanuvchining barmog'i qachon yuqoriga va pastga harakatlanishini aniqlashga yordam beradi. Bizning akselerometrimiz erning markaziga nisbatan tezlanishni o'lchaganligi sababli, biz x o'qining (chap yoki o'ng) tezlanishini aniqlay olmaymiz. Yaxshiyamki, LSM9DOF uzilish taxtasida magnit maydonlar haqida ma'lumot to'plash imkonini beradigan magnitometr ham mavjud. Biz ikkita magnitni bir -biridan 30 sm masofada joylashtiramiz va ularning o'rtasida qo'lqop bor. Agar magnitli ma'lumotlar ijobiy o'qilsa, biz bilamizki, qo'lqop o'ng tomonga harakat qiladi va aksincha. Barcha ma'lumotlar akselerometrda/magnitometrda yig'ilgandan so'ng, u ma'lumotlarni simli Wi -Fi tarmog'iga ulangan tukga yuboradi va keyin ma'lumotlarni kompyuterga yuboradi, biz uni kodimizda ishlatamiz.

1 -qadam: jismoniy prototip 1

Jismoniy prototip 1
Jismoniy prototip 1
Jismoniy prototip 1
Jismoniy prototip 1

Ushbu prototip elektron qurilmalar ustidan sirg'alib o'tishi uchun qo'lda erkin tikilgan qo'lqop bo'lishi kerak. Keyin elektron qurilma qo'ltiq ostidagi qo'lqop bilan birlashtirilgan zirhli taglik tagiga velkro bilan biriktiriladi. Keyin yashil qo'lqop taglik va elektron qurilmalar ustidan siljiydi.

Qo'lqop prototipini yaratish bosqichlari:

  • Qo'lni kuzatish uchun etarlicha katta ikkita matoni oling
  • Qo'lni matoning ikkala bo'lagiga qo'ying va kesib oling
  • Ikkita qo'lda kesilgan qismlarni bir -biriga qo'ying, shunda ular mukammal tekislanadi
  • Keyinchalik, tikuv mashinasini tayyorlash uchun ipni mashinada ko'rsatilgan joylardan o'tkazing
  • Tikuv mashinasi o'rnatilgach, ignani ko'taring va birlashtirilgan ikkita matoni igna ostiga qo'ying
  • Igna matoning eng chetiga joylashtirilganligiga ishonch hosil qiling, dastgohni ishga tushiring va matoning chetlari bo'ylab tikib qo'ying, shu bilan birga bilakka tikilmagan ikkita bo'lakni qo'lning ichiga kirishi uchun qoldiring.

2 -qadam: 2 -jismoniy prototip

Jismoniy prototip 2
Jismoniy prototip 2
Jismoniy prototip 2
Jismoniy prototip 2

Bizning yakuniy prototipimiz - har qanday bilagiga sozlanishi Velcro tasmasi bilan birlashtirilgan oddiy qo'lqop. Qo'lqop va tasma bir -biriga tikilgan, elektron qurilmalar esa qo'lqopga Velcro orqali biriktirilgan.

Qo'lqopning ikkinchi prototipini yaratish bosqichlari:

  1. Qo'lqop sotib oling, qo'lqopning materiali muhim emas.
  2. Velcro bilaguzuk sotib oling
  3. Portativ batareyani sotib oling
  4. Sticky Velcro sotib oling
  5. Tikuv ignasi bilan velkro bilaguzukni qo'lqop tagiga mahkamlang
  6. Bilak tasmasi har xil bilak o'lchovlariga moslashtirilishi kerak.
  7. Yopishqoq lentani akselerometr tagiga mahkamlang va qo'lqop ko'rsatkich barmog'iga mahkamlang
  8. Tukka yopishqoq lentani mahkamlang va qo'lqopning yuqori qismiga mahkamlang.
  9. Simlar yordamida tukdagi 3V3 pinni akselerometrdagi VIN piniga ulang
  10. Simlar yordamida tukdagi GND pinini akselerometrga GND piniga ulang.
  11. Simlar yordamida tukdagi SCL pinini akselerometrning SCL piniga ulang.
  12. Simlar yordamida tukdagi SDA pinini akselerometrga SDA piniga ulang.
  13. Quvvat berish uchun kamida 5 voltli batareyani usb orqali tukga ulang.

3 -qadam: magnitlar

Magnitlar
Magnitlar

1 -qadam: Ikkita teng magnitni bir -biriga qarama -qarshi qilib qo'ying.

2 -qadam: Ikkita magnit orasidagi 30 sm bo'shliqni o'lchang

3 -qadam: Magnitometrni ikkita magnitning o'rtasiga qo'ying. Ma'lumotlar 0 atrofida bo'lishi kerak, ular o'rtada. Agar siz nol o'qiyotgan bo'lsangiz, 5 -bosqichga o'ting.

4 -qadam: Agar o'qish nolga teng bo'lmasa yoki nolga yaqin bo'lsa, siz magnitlarning masofasini sozlashingiz kerak. Agar o'qish manfiy bo'lsa, chap magnitni bir sm yoki 2 ga chapga yoki o'qish nol bo'lguncha harakatlantiring. Agar ijobiy bo'lsa, xuddi shu narsani to'g'ri magnitdan tashqari qiling.

5 -qadam: Ma'lumotni magnitometrdan qabul qiladigan kod yozing va u ijobiy yoki salbiy bo'lsa o'qiladi. Ijobiy bo'lsa, kod o'ngga, manfiy esa chapga chiziladi.

4 -qadam: kod

Kod
Kod

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

Kirish:

Akselerometrdan ma'lumotlarni qayta ishlash uchun Adafruit patlari va ma'lumotlarni qayta ishlaydigan server (noutbukda/ish stolida) o'rtasida mijoz/server aloqasi o'rnatilishi kerak. Ikkita kodli faylni yaratish kerak bo'ladi: biri mijoz uchun (Adafruit patlari), ikkinchisi server uchun (bu holda Jarodning noutbukida). Mijoz C ++ da, server esa pythonda yozilgan. Mijoz uchun ishlatiladigan til muhim, chunki Arduino asosan C ++ tili bo'lib, uni boshqa tildan foydalanishga o'zgartirish qiyin. Server har qanday tilda yozilishi mumkin, agar u tarmoq xususiyatlariga ega bo'lsa.

Mijozni sozlash:

Birinchidan, biz mijoz kodini o'rnatamiz. Wi -Fi ulanish kodining ko'p qismi Adafruit kutubxonalari orqali mavjud. Biz tegishli sinflarni qo'shishdan boshlaymiz.

#qo'shish #qo'shish #qo'shish #qo'shish #qo'shish

Kod davomida ishlatiladigan ba'zi o'zgaruvchilarni o'rnating.

// Tarmoqqa ulanish char* ssid = "MMServer"; const char* password = "MMServer-Password"; // ma'lumotni oladigan serverning IP va porti char* host = "149.160.251.3"; const int port = 12347; bool ulangan = noto'g'ri;

// Harakat detektorini ishga tushiring

Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0 (1000);

WiFiClient mijozi;

Tuk ishga tushishi bilan ishga tushadigan setup () funktsiyasini yarating.

// Wi -Fi ulanishini sozlang va servervoid setup () {Serial.begin (9600) ga ulaning; kechikish (100);

Serial.println ();

Serial.println (); Serial.print ("Ulanish"); Serial.println (ssid); // WiFi WiFi.begin -ni ishga tushiring (ssid, parol); // Ulanmoqda… while (WiFi.status ()! = WL_CONNECTED) {kechiktirish (500); Serial.print ("."); } // WiFi Serial.println ("") ga muvaffaqiyatli ulandi; Serial.println ("Wi -Fi ulangan"); Serial.println ("IP -manzil:"); Serial.println (WiFi.localIP ());

#ifndef ESP8266

while (! Seriyali); #endif Serial.begin (9600); Serial.println ("Sensor testi");

// Sensorni ishga tushiring

if (! lsm.begin ()) {// LSM9DS0 Serial.printni aniqlashda muammo yuz berdi (F ("Voy, LSM9DS0 aniqlanmadi … Elektr simlarini yoki I2C ADDRni tekshiring!")); vaqt (1); } Serial.println (F ("LSM9DS0 9DOF topildi")); // Serial.print serveriga ulanishni boshlang ("Ulanish"); Serial.println (mezbon);

// Muvaffaqiyatli ulanishni tekshiring. Agar muvaffaqiyatsiz bo'lsa, uni bekor qiling

if (! client.connect (host, port)) {Serial.println ("ulanish muvaffaqiyatsiz tugadi"); ulangan = noto'g'ri; qaytish; } else {ulangan = to'g'ri; }

// Sensorning kuchayishi va integratsiya vaqtini sozlash

configureSensor (); }

Keyin bizga qayta -qayta aylanadigan loop funktsiyasi kerak. Bunday holda, akselerometrdan ma'lumotlarni "[z_accel]: [y_mag]: [z_mag]" shaklida serverga qayta -qayta yuborish uchun ishlatiladi. Client.print (raqamlar); Funktsiya - bu ma'lumotlarni serverga yuborish.

void loop () {kechiktirish (250); if (ulangan) {// Bu ma'lumotlarni sensorlar_event_t accel, mag, gyro, temp serveriga yuboradi; lsm.getEvent (& accel, & mag, & gyro, & temp); String raqamlari; raqamlar += accel.acceleration.z; raqamlar += ":"; raqamlar += mag.magnetic.y; raqamlar += ":"; raqamlar += mag.magnetic.z; Serial.print (raqamlar); client.print (raqamlar); Serial.println (); } boshqa {installConnection (); }}

Ba'zi yordamchi funktsiyalar uchun biz tuklar va server o'rtasidagi aloqani o'rnatishimiz kerak.

void installConnection () {if (! client.connect (host, port)) {Serial.println ("ulanish muvaffaqiyatsiz tugadi"); ulangan = noto'g'ri; qaytish; } else {ulangan = to'g'ri; }}

Shuningdek, biz sensorni sozlashimiz va unga o'qiladigan qiymatlar oralig'ini berishimiz kerak. Masalan, tezlashtirish diapazoni uchun 5 ta variant mavjud: 2g, 4g, 6g, 8g va 16g.

void configureSensor (void) {// Akselerometr oralig'ini o'rnating //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); // magnitometr sezgirligini o'rnating //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_2GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_4GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_8GAUSS); lsm.setupMag (lsm. LSM9DS0_MAGGAIN_12GAUSS);

// Giroskopni o'rnating

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

Serverni sozlash:

Server kompyuterning buyruq satrida ishlaydigan python fayli bo'ladi. Boshlash uchun kerakli sinflarni import qiling.

import socketimport re import pyautogui

soket tarmoqqa ulanish uchun ishlatiladi. re rex yoki mag'lubiyatli manipulyatsiyalar uchun ishlatiladi. pyautogui - bu piton kutubxonasi bo'lib, u rasm chizishga imkon beradi (keyinroq muhokama qilinadi).

Keyinchalik, ba'zi o'zgaruvchilarni aniqlashimiz kerak. Bu global o'zgaruvchilar bo'ladi, shuning uchun ularga bir nechta funktsiyalarda kirish mumkin bo'ladi. Ular keyinchalik kodda ishlatiladi.

i = 0n = 0 qator = 1

ma'lumotlar ro'yxati =

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 = noto'g'ri

first_data = To'g'ri

Bizga server yaratish va uni kiruvchi ulanishlar uchun ochish funksiyasi kerak.

def startServer (): global i global first_data # server soket serverini ishga tushirish = socket.socket (socket. AF_INET, socket. SOCK_STREAM) serversocket.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEADDR, 1) # Server IP -manzili va port xost = " 149.160.251.3 "port = 12347 server_address = (xost, port) # Serverni oching va kiruvchi ulanishlarni tinglang (" %s portda %s serverini ishga tushiring ' %server_adressi) serversocket.bind (server_adress) serversocket.listen (5) # Ulanishlarni kuting … rost bo'lsa: chop eting ('Ulanish kutilmoqda …') # Kiruvchi ulanishni qabul qiling (mijozlar rozetkasi, manzil) = serversocket.accept () # Qabul qilingan ma'lumotlarni tahlil qilishga urinib ko'ring: chop etish ('Aloqa o'rnatildi', manzil)) True bo'lsa: # Ma'lumotlarni oling va ma'lumotlarni qayta ishlash uchun yuboring = clientsocket.recv (25) accel_data = re.split ('[:]', str (ma'lumotlar)) 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 = Oxirida yolg'on: # Keraksiz ma'lumotlar oqishini oldini olish uchun rozetkani yopamiz clientocket.close ()

Endi biz barcha ma'lumotlarni qayta ishlaydigan funktsiyalarni talab qilamiz. Hisoblash uchun sensorni kalibrlash birinchi qadam va birinchi vazifa deb ataladi.

def calibData (ro'yxat): global z_calib global z_offset global mag_data global mag_calib_y global mag_offset_y z_calib += float (ro'yxat [0]) mag_calib_y += float (ro'yxat [1]) agar (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)

Keyinchalik, biz harakatlanuvchi tezlashuv ofsetini yaratamiz. Bu shuni anglatadiki, kimdir barmog'ini qimirlatishni to'xtatganda, dastur taniydi, chunki serverga yuboriladigan tezlashtirishning barcha qiymatlari o'sha paytda bir xil bo'lishi kerak.

def moveAccel (num): 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 yoki z_diff <-0.2): # harakat ichida ma'lumotlar aniqlansa, keep_offset = True n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 data_list = break_offset bo'lmasa: # statsionar ma'lumotlar, yangi z_offsetni o'rnating 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 = False keep_offset = Noto'g'ri

Keyinchalik, biz matematikaning asosiy qismini qilamiz. Bu tezlashuv ma'lumotlarini joylashuv ma'lumotlariga tarjima qilishni o'z ichiga oladi, bu bizga foydalanuvchi barmog'ini qanday yo'nalishda harakat qilishini aytib beradi.

def processData (ro'yxat): #[accel.z, mag.y] global z_offset global z_real global z_velo global z_pos global birinchi_data global mag_data

z_real = float (ro'yxat [0]) - z_offset

mag_y = ro'yxat [1] mag_z = ro'yxat [2] chap = Noto'g'ri o'ng = Yolg'on # Tezlashuv aniqlanmaguncha tezlikni qayta ishlamang # Agar mexanik shovqin pozitsiyaga qo'shilishining oldini oladi, agar (z_real -0.20): z_real = 0 #Begin agar (birinchi_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) boshqa: 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): o'ng = Haqiqiy elif (float (mag_data [1]) - suzish (mag_data [0]) <-0.03): chap = To'g'ri bo'lsa (o'ngda): harakat (50, int (z_pos*) 1000)) elif (chapda): harakat (-50, int (z_pos*1000)) z_velo = 0 z_pos = 0

Endi, nihoyat, biz kursorni harakatlantiramiz! Buning uchun biz bo'yoq oynasini ochdik va uni to'liq ekranga aylantirdik. Pyautogui kutubxonasida pyautogui.dragRel (x, y) deb nomlangan funksiya mavjud; Biz sichqoncha kursorini bir nuqtadan ikkinchisiga siljitish uchun foydalanamiz. U nisbiy joylashuv ma'lumotlarini ishlatadi, shuning uchun harakat kursorning oxirgi holatiga nisbatan bo'ladi.

def harakati (x, y): chop etish ("ga o'tish", x, -y) pyautogui.dragRel (x, -y)

Va nihoyat, biz ushbu funktsiyani ishga tushirish uchun asosiy funktsiyani chaqirishimiz kerak.

# ServerstartServer () funktsiyasini ishga tushirish uchun funktsiyani chaqiradi

Tavsiya: