فهرست مطالب:

نوشتن Accel (دست جادویی): 4 مرحله (همراه با تصاویر)
نوشتن Accel (دست جادویی): 4 مرحله (همراه با تصاویر)

تصویری: نوشتن Accel (دست جادویی): 4 مرحله (همراه با تصاویر)

تصویری: نوشتن Accel (دست جادویی): 4 مرحله (همراه با تصاویر)
تصویری: 15دیمەنی سەرسوڕهێنەرتاکو بە چاوی خۆت نەیانبینی بڕوایان پێ ناکەیت😱 2024, نوامبر
Anonim
نوشتن Accel (دست جادویی)
نوشتن Accel (دست جادویی)
نوشتن Accel (دست جادویی)
نوشتن Accel (دست جادویی)
نوشتن Accel (دست جادویی)
نوشتن Accel (دست جادویی)

معرفی

دست جادویی به افراد دارای معلولیت و نقصان حرکتی اجازه می دهد تا از خلاقیت طراحی و نوشتن در یک محیط شبیه سازی شده لذت ببرند. دست جادویی یک دستکش پوشیدنی است که حرکت انگشت اشاره شما را حس می کند و آن را به ترسیم خطوط روی صفحه کامپیوتر تبدیل می کند.

مواد مورد نیاز

LSM9DOF Breakout Board --- 24.95 دلار ---

پر Adafruit با Wifi --- 18.95 دلار ---

سیم زن/زن --- 1.95 دلار ---

نوار نوار/Velcro --- 3 دلار

دو آهن ربا با قدرت برابر --- قیمتها متفاوت است

چگونه کار می کند

با استفاده از شتاب سنج ، می توانیم داده های شتاب را برای محور y جمع آوری کنیم که به ما در تعیین زمان حرکت انگشت کاربر به بالا و پایین کمک می کند. با توجه به اینکه شتاب سنج ما شتاب را نسبت به مرکز زمین اندازه گیری می کند ، نمی توانیم شتاب محور x (چپ یا راست) را تعیین کنیم. خوشبختانه برد شکست LSM9DOF همچنین دارای مغناطیس سنج است که به ما اجازه می دهد داده های میدان های مغناطیسی را جمع آوری کنیم. ما دو آهن ربا را در فاصله 30 سانتی متری از هم قرار می دهیم و دستکش را بین آنها داریم. اگر داده های مغناطیسی مثبت خوانده شود ، می دانیم که دستکش به سمت راست حرکت می کند و برعکس. پس از جمع آوری تمام داده ها در شتاب سنج/مغناطیس سنج ، داده ها را از طریق سیم به پر می فرستد که به رایانه wifi متصل است و سپس داده ها را به رایانه ارسال می کند که می توانیم در کد خود استفاده کنیم.

مرحله 1: نمونه اولیه فیزیکی 1

نمونه اولیه فیزیکی 1
نمونه اولیه فیزیکی 1
نمونه اولیه فیزیکی 1
نمونه اولیه فیزیکی 1

این نمونه اولیه به این معنی است که دستکش را روی دست می دوزند تا روی دستگاه های الکترونیکی لغزش کند. سپس دستگاه الکترونیکی با استفاده از چکش روی پایه آستین زیر زره با یک دستکش اصلی روی دست وصل می شود. سپس دستکش سبز روی پایه و دستگاه های الکترونیکی می لغزد….

مراحل ساخت نمونه اولیه دستکش:

  • دو تکه پارچه به اندازه ای بزرگ تهیه کنید که دست را ردیابی کند
  • دست را روی هر دو پارچه بکشید و آنها را ببرید
  • دو برش دستی را کنار هم بگذارید تا کاملاً هماهنگ شوند
  • در مرحله بعد ، برای آماده سازی چرخ خیاطی ، نخ را از بین نقاط مشخص شده روی دستگاه عبور دهید
  • هنگامی که چرخ خیاطی راه اندازی شد ، سوزن را بردارید و دو تکه پارچه را روی هم قرار دهید زیر سوزن
  • مطمئن شوید که سوزن روی لبه پارچه ردیف شده است ، دستگاه را راه اندازی کنید و در امتداد لبه های پارچه دوخت کنید ، در حالی که دو قطعه را در مچ دست بدون دوختن بگذارید تا دستی در آن جا شود.

مرحله 2: نمونه اولیه فیزیکی 2

نمونه اولیه فیزیکی 2
نمونه اولیه فیزیکی 2
نمونه اولیه فیزیکی 2
نمونه اولیه فیزیکی 2

نمونه اولیه ما یک دستکش معمولی است که با بند Velcro ترکیب می شود و برای هر مچ دست قابل تنظیم است. دستکش و بند به هم دوخته شده و وسایل الکترونیکی از طریق Velcro به دستکش متصل می شوند.

مراحل ساخت نمونه دوم دستکش:

  1. دستکش بخرید ، جنس دستکش مهم نیست.
  2. یک بند مچ دست Velcro بخرید
  3. یک باتری قابل حمل بخرید
  4. خرید 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 ++ و سرور به زبان پایتون نوشته شده است. زبان مورد استفاده برای مشتری به عنوان آردوینو عمدتا یک زبان C ++ است و تغییر آن برای استفاده از زبان دیگر دشوار است. سرور را می توان به هر زبانی نوشت ، به شرطی که دارای ویژگی های شبکه باشد.

راه اندازی مشتری:

ابتدا کد مشتری را تنظیم می کنیم. بیشتر کد اتصال WiFi به آسانی از طریق کتابخانه های Adafruit در دسترس است. ما با درج کلاسهای مربوطه شروع می کنیم.

#شامل #شامل #شامل #شامل #شامل #شود

برخی از متغیرها را در مورد کد مورد استفاده قرار دهید.

// اتصال به شبکه const char* ssid = "سرور MMS" ؛ const char* رمز عبور = "MMS-server-Password"؛ // IP و پورت سرور که داده ها را دریافت می کند char char* host = "149.160.251.3"؛ const int port = 12347؛ bool متصل = false؛

// راه اندازی اولیه آشکارساز حرکت

Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0 (1000) ؛

مشتری WiFiClient ؛

یک تابع setup () ایجاد کنید که به محض شروع پر اجرا می شود.

// راه اندازی اتصال WiFi و اتصال به servervoid setup () {Serial.begin (9600)؛ تأخیر (100) ؛

Serial.println ()؛

Serial.println ()؛ Serial.print ("اتصال به") ؛ Serial.println (ssid)؛ // شروع WiFi WiFi.begin (ssid ، رمز عبور) ؛ // اتصال … در حالی که (WiFi.status ()! = WL_CONNECTED) {تأخیر (500)؛ Serial.print (".") ؛ } // با موفقیت به WiFi Serial.println ("") متصل شد ؛ Serial.println ("WiFi متصل است") ؛ Serial.println ("آدرس IP:") ؛ Serial.println (WiFi.localIP ()) ؛

#ifndef ESP8266

در حالی که (! سریال) ؛ #endif Serial.begin (9600)؛ Serial.println ("تست سنسور") ؛

// مقداردهی اولیه سنسور

if (! lsm.begin ()) {// مشکلی در تشخیص LSM9DS0 Serial.print وجود داشت (F ("اوه ، هیچ LSM9DS0 شناسایی نشد … سیم کشی یا I2C ADDR خود را بررسی کنید!")) ؛ در حالی که (1) ؛ } Serial.println (F ("LSM9DS0 9DOF Found")) ؛ // شروع اتصال به سرور Serial.print ("اتصال به") ؛ Serial.println (میزبان) ؛

// اتصال موفقیت آمیز را بررسی کنید. اگر شکست خورد ، سقط کنید

if (! client.connect (host، port)) {Serial.println ("اتصال ناموفق بود")؛ متصل = false؛ برگشت؛ } else {متصل = true؛ }

// زمان افزایش سنسور و زمان ادغام را تنظیم کنید

configureSensor ()؛ }

سپس به یک تابع حلقه نیاز داریم که بارها حلقه می شود. در این مورد ، برای ارسال مکرر داده ها از شتاب سنج به سرور به شکل "[z_accel]: [y_mag]: [z_mag]" استفاده می شود. client.print (اعداد) ؛ عملکرد چیزی است که داده ها را به سرور ارسال می کند.

void loop () {تاخیر (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 (host، port)) {Serial.println ("اتصال انجام نشد")؛ متصل = false؛ برگشت؛ } else {متصل = true؛ }}

همچنین باید سنسور را پیکربندی کرده و محدوده مقادیری را که خوانده می شود به آن بدهیم. به عنوان مثال ، شتاب دارای 5 گزینه برای محدوده است: 2 گرم ، 4 گرم ، 6 گرم ، 8 گرم و 16 گرم.

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) ؛ }

راه اندازی سرور:

سرور یک فایل پایتون است که روی خط فرمان رایانه اجرا می شود. برای شروع ، کلاسهای مورد نیاز را وارد کنید.

واردات socketimport دوباره وارد کردن pyautogui

سوکت برای شبکه استفاده می شود. re برای regex یا دستکاری رشته استفاده می شود. pyautogui یک کتابخانه پایتون است که به شما امکان می دهد نقاشی را انجام دهید (بعداً مورد بحث قرار می گیرد).

در مرحله بعد ، ما باید برخی از متغیرها را تعریف کنیم. اینها متغیرهای جهانی خواهند بود ، بنابراین در چندین تابع به آنها دسترسی خواهید داشت. بعداً در کد استفاده خواهند شد.

i = 0n = 0 خط = 1

لیست داده =

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 # مقداردهی اولیه socket server 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 = (host، port) # باز کردن سرور و گوش دادن به اتصالات ورودی چاپ ('راه اندازی سرور در٪ s پورت٪ s'٪ server_address) serversocket.bind (server_address) serversocket.listen (5) # منتظر اتصالات باشید … while True: print ('Waiting for connection…') # اتصال ورودی را قبول کنید (clientocket، address) = serversocket.accept () # سعی کنید داده های دریافت شده را تجزیه کنید try: print ('Connection from' ، آدرس) while True: # داده ها را دریافت کرده و برای پردازش داده ها ارسال کنید = 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] چاپ (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 (list): 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 = mag_calib_y / 50 z_calib = 0 mag_calib_y = 0 mag_data.append (mag_offset_y)

بعد ، ما یک جابجایی شتاب متحرک ایجاد می کنیم. این باعث می شود که برنامه زمانی که کسی حرکت انگشت خود را متوقف می کند تشخیص دهد زیرا همه مقادیر شتاب که به سرور ارسال می شود باید در آن زمان یکسان باشد.

defin z_diff = 0 data_list = break if not keep_offset: # ثابت در داده ها ، z_offset جدید z_offset = z_moving_offset print ("z_offset new:") print (z_offset) n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 data_list = keep_offset = نادرست keep_offset = نادرست

بعد ، ما بیشترین بار ریاضی را انجام می دهیم. این شامل ترجمه داده های شتاب به داده های موقعیتی است که به ما امکان می دهد جهت حرکت کاربر را با انگشت نشان دهیم.

def processData (list): #[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 (لیست [0]) - z_offset

mag_y = list [1] mag_z = list [2] left = False right = False # شتاب را تا زمانی که کاملاً مطمئن نشده باشید شتاب ندهید # مانع از ایجاد سر و صدای مکانیکی در موقعیت (z_real -0.20): z_real = 0 # شروع ادغام برای پیدا کردن موقعیت اگر (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.move به (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 (شناور (mag_data [1]) - شناور (mag_data [0])> 0.03): right = True elif (float (mag_data [1]) - float (mag_data [0]) <-0.03): left = True if (right): Movement (50، int (z_pos* 1000)) elif (چپ): حرکت (-50 ، int (z_pos*1000)) z_velo = 0 z_pos = 0

اکنون ، در نهایت ، ما مکان نما را حرکت می دهیم! برای انجام این کار ، یک پنجره رنگ باز کردیم و آن را تمام صفحه ساختیم. کتابخانه pyautogui شامل تابعی به نام pyautogui.dragRel (x ، y) است. که از آن برای کشیدن نشانگر ماوس از یک نقطه به نقطه دیگر استفاده می کنیم. از داده های موقعیت نسبی استفاده می کند بنابراین حرکت نسبت به آخرین موقعیت مکان نما است.

حرکت دف (x ، y): چاپ ("حرکت به" ، x ، -y) pyautogui.dragRel (x ، -y)

در نهایت ، ما باید تابع اصلی را فراخوانی کنیم تا حتی بتوانیم تمام این کد را اجرا کنیم.

# تابع را برای شروع serverstartServer فراخوانی می کند ()

توصیه شده: