جدول المحتويات:

تسريع الكتابة (اليد السحرية): 4 خطوات (بالصور)
تسريع الكتابة (اليد السحرية): 4 خطوات (بالصور)

فيديو: تسريع الكتابة (اليد السحرية): 4 خطوات (بالصور)

فيديو: تسريع الكتابة (اليد السحرية): 4 خطوات (بالصور)
فيديو: الطريقة الاحترافية لتسريع كتابتك بست خطوات!!! اكتب بسرعة فائقة وبخط جميل 2024, شهر نوفمبر
Anonim
تسريع الكتابة (اليد السحرية)
تسريع الكتابة (اليد السحرية)
تسريع الكتابة (اليد السحرية)
تسريع الكتابة (اليد السحرية)
تسريع الكتابة (اليد السحرية)
تسريع الكتابة (اليد السحرية)

مقدمة

تتيح اليد السحرية للأشخاص ذوي الإعاقة وضعف المهارات الحركية الاستمتاع بإبداع الرسم والكتابة في بيئة محاكاة. The Magic Hand هو قفاز يمكن ارتداؤه يستشعر حركة إصبعك ويترجم ذلك إلى رسم خطوط على شاشة الكمبيوتر.

المواد المطلوبة

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

ريشة Adafruit مع Wifi - 18.95 دولارًا -

الأسلاك النسائية / النسائية - 1.95 دولار -

شرائط شريطية / فيلكرو - 3 دولارات

مغناطيسان لهما قوة متساوية - تختلف الأسعار

كيف تعمل

باستخدام مقياس التسارع ، يمكننا جمع بيانات التسارع للمحور الصادي والتي ستساعدنا في تحديد متى يتحرك إصبع المستخدم لأعلى ولأسفل. نظرًا لحقيقة أن مقياس التسارع لدينا يقيس التسارع بالنسبة لمركز الأرض ، لا يمكننا تحديد عجلة المحور x (يسارًا أو يمينًا). لحسن الحظ ، تحتوي لوحة الاختراق LSM9DOF أيضًا على مقياس مغناطيسي يسمح لنا بجمع البيانات حول المجالات المغناطيسية. نضع مغناطيسين على بعد 30 سم ونضع القفاز بينهما. إذا كانت البيانات المغناطيسية إيجابية ، فإننا نعلم أن القفاز يتحرك بشكل صحيح والعكس صحيح. بعد أن يتم جمع جميع البيانات في مقياس التسارع / مقياس المغناطيسية ، فإنه يرسل البيانات عبر سلك إلى الريش المتصل بجهاز كمبيوتر مزود بشبكة wifi ثم يعيد توجيه البيانات إلى الكمبيوتر الذي يمكننا استخدامه بعد ذلك في الكود الخاص بنا.

الخطوة 1: النموذج المادي 1

النموذج المادي 1
النموذج المادي 1
النموذج المادي 1
النموذج المادي 1

من المفترض أن يكون هذا النموذج الأولي عبارة عن قفاز يُخيط معًا بشكل غير محكم على اليد حتى ينزلق فوق الأجهزة الإلكترونية. سيتم بعد ذلك توصيل الجهاز الإلكتروني بشريط فيلكرو بقاعدة الأكمام تحت الدرع مع قفاز أساسي في اليد. ثم ينزلق القفاز الأخضر على القاعدة والأجهزة الإلكترونية….

خطوات صنع القفاز النموذجي:

  • احصل على قطعتين من القماش كبيرة بما يكفي لتتبع اليد
  • تتبع اليد على قطعتين من القماش واقطعهما
  • ضع قطعتي اليد معًا بحيث تكون محاذاة تمامًا
  • بعد ذلك ، لتحضير ماكينة الخياطة ، مرري الخيط خلال النقاط المشار إليها على الماكينة
  • عند إعداد ماكينة الخياطة ، ارفع الإبرة وضع قطعتين من القماش المجمعتين تحت الإبرة
  • تأكد من أن الإبرة مبطنة على حافة القماش تمامًا ، وابدأ تشغيل الماكينة ، وقم بالخياطة على طول حواف القماش ، مع ترك القطعتين غير مخيطتين عند الرسغ حتى يمكن احتواء اليد.

الخطوة 2: النموذج المادي 2

النموذج المادي 2
النموذج المادي 2
النموذج المادي 2
النموذج المادي 2

النموذج الأولي النهائي لدينا هو قفاز عادي مع شريط فيلكرو قابل للتعديل لأي معصم. يُخيط القفاز والحزام معًا ، ويتم توصيل الأجهزة الإلكترونية بالقفاز عبر شريط فيلكرو.

خطوات صنع النموذج الأولي الثاني للقفاز:

  1. شراء قفاز ، لا يهم مادة القفاز.
  2. اشترِ حزام معصم من الفيلكرو
  3. قم بشراء بطارية محمولة
  4. قم بشراء شريط لاصق لاصق
  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 feather) والآخر للخادم (في هذه الحالة ، كمبيوتر Jarod المحمول). العميل مكتوب بلغة C ++ ، والخادم مكتوب بلغة Python. اللغة المستخدمة للعميل مهمة لأن Arduino هي لغة C ++ بشكل أساسي ، ومن الصعب تغييرها لاستخدام لغة مختلفة. يمكن كتابة الخادم بأي لغة ، طالما أنه يحتوي على ميزات الشبكة.

إعداد العميل:

أولاً ، سنقوم بإعداد رمز العميل. يتوفر معظم رمز اتصال WiFi بسهولة من خلال مكتبات Adafruit. نبدأ بتضمين الفئات ذات الصلة.

# تضمين # تضمين # تضمين # تضمين # تضمين

قم بتعيين بعض المتغيرات التي سيتم استخدامها في جميع أنحاء الكود.

// الاتصال بشبكة const char * ssid = "MMServer" ؛ const char * password = "MMServer-Password" ؛ // IP ومنفذ الخادم الذي سيتلقى البيانات const char * host = "149.160.251.3" ؛ منفذ const int = 12347 ؛ منطقي متصل = خطأ ؛

// تهيئة كاشف الحركة

Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0 (1000) ،

عميل WiFiClient ؛

قم بإنشاء وظيفة الإعداد () والتي سيتم تشغيلها بمجرد بدء الريشة.

// إعداد اتصال WiFi ، والاتصال بإعداد servervoid () {Serial.begin (9600) ؛ تأخير (100) ؛

Serial.println () ،

Serial.println () ، Serial.print ("الاتصال بـ") ؛ Serial.println (ssid) ؛ // بدء WiFi WiFi.begin (SSID ، كلمة المرور) ؛ // Connecting… while (WiFi.status ()! = WL_CONNECTED) {delay (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 ("Found LSM9DS0 9DOF")) ؛ // بدء الاتصال بالخادم Serial.print ("الاتصال بـ") ؛ Serial.println (مضيف) ؛

// تحقق من الاتصال الناجح. إذا فشلت ثم أجهض

if (! client.connect (host، port)) {Serial.println ("فشل الاتصال")؛ متصل = خطأ ؛ إرجاع؛ } آخر {متصل = صحيح ؛ }

// إعداد كسب المستشعر ووقت التكامل

configSensor () ، }

نحتاج بعد ذلك إلى دالة حلقية ستتكرر بشكل متكرر. في هذه الحالة ، يتم استخدامه لإرسال البيانات بشكل متكرر من مقياس التسارع إلى الخادم في شكل "[z_accel]: [y_mag]: [z_mag]". العميل.طباعة (أرقام) ؛ الوظيفة هي ما يرسل البيانات إلى الخادم.

حلقة باطلة () {delay (250) ؛ إذا (متصل) {// سيرسل هذا البيانات إلى الخادم sensors_event_t accel، mag، gyro، temp؛ lsm.getEvent (& Accel، & mag، & gyro، & temp) ؛ أرقام السلاسل أرقام + = Accceleration.z ؛ أرقام + = ":" ؛ الأرقام + = mag.magnetic.y ؛ أرقام + = ":" ؛ أرقام + = mag.magnetic.z ؛ Serial.print (أرقام) ؛ client.print (أرقام) ؛ Serial.println () ، } else {createConnection ()؛ }}

بالنسبة لبعض وظائف الأداة المساعدة ، نحتاج إلى واحدة لتأسيس الاتصال بين الريشة والخادم.

void fixConnection () {if (! client.connect (host، port)) {Serial.println ("فشل الاتصال") ؛ متصل = خطأ ؛ إرجاع؛ } آخر {متصل = صحيح ؛ }}

نحتاج أيضًا إلى تكوين المستشعر ومنحه نطاق القيم التي سيقرأها. على سبيل المثال ، يحتوي التسريع على 5 خيارات للنطاق: 2g و 4g و 6 g و 8 g و 16 g.

void configSensor (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 يستخدم للتعبير العادي ، أو التلاعب بالسلسلة. pyautogui هي مكتبة بيثون ستسمح بحدوث الرسم (تمت مناقشته لاحقًا).

بعد ذلك ، يجب أن نحدد بعض المتغيرات. ستكون هذه متغيرات عالمية ، لذلك سيتم الوصول إليها في وظائف متعددة. سيتم استخدامها لاحقًا في الكود.

أنا = 0 ن = 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 serverocket = socket.socket (socket. AF_INET، socket. SOCK_STREAM) serverocket.setsockopt (socket. SOL_SOCKET، socket. SO_REUSEADDR، 1) # عنوان IP للخادم ومضيف المنفذ = " 149.160.251.3 "المنفذ = 12347 server_address = (المضيف ، المنفذ) # افتح الخادم واستمع للاتصالات الواردة اطبع ('بدء الخادم على٪ s المنفذ٪ s'٪ server_address) serverocket.bind (server_address) serverocket.listen (5) # انتظر الاتصالات … بينما صحيح: طباعة ('في انتظار الاتصال …') # قبول اتصال وارد (مقبس العميل ، العنوان) = serverocket.accept () # حاول تحليل البيانات المستلمة حاول: طباعة ('تم تأسيس الاتصال من' ، العنوان) بينما صحيح: # استقبل البيانات وأرسلها لمعالجة البيانات = 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] طباعة (Accel_data) i + = 1 if (i <51): calibData (Accel_data) else: moveAcce l (Accel_data [0]) processData (Accel_data) first_data = خطأ أخيرًا: # أغلق المقبس لمنع تسرب البيانات غير الضروري clientsocket.close ()

نطلب الآن الوظائف التي ستعالج جميع البيانات. الخطوة الأولى التي يجب اتخاذها ، وأول وظيفة تسمى ، هي معايرة المستشعر لأغراض الحساب.

def calibData (list): global z_calib 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)

بعد ذلك ، نقوم بإنشاء تعويض تسارع متحرك. هذا يجعل البرنامج يتعرف عندما يتوقف شخص ما عن تحريك إصبعه لأن جميع قيم التسريع التي يتم إرسالها إلى الخادم يجب أن تكون هي نفسها في ذلك الوقت.

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 or z_diff <-0.2): # الحركة المكتشفة داخل البيانات ، أعد تشغيل keep_offset = صحيح n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 data_list = فاصل إن لم يكن keep_offset: # ثابتًا في البيانات ، قم بتعيين 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 = False keep_offset = False

بعد ذلك ، نقوم بالجزء الأكبر من الرياضيات. يتضمن ذلك ترجمة بيانات التسارع إلى بيانات موقع تسمح لنا بإخبار الاتجاه الذي يحرك فيه المستخدم إصبعه.

عملية def processData (قائمة): # [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 #Begin تكاملات للعثور على موضع إذا (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.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): right = True elif (float (mag_data [1]) - float (mag_data [0]) <-0.03): left = True if (right): motion (50، int (z_pos * 1000)) elif (يسار): حركة (-50، int (z_pos * 1000)) z_velo = 0 z_pos = 0

الآن ، أخيرًا ، نحرك المؤشر! للقيام بذلك ، فتحنا نافذة طلاء وجعلناها بملء الشاشة. تحتوي مكتبة pyautogui على وظيفة تسمى pyautogui.dragRel (x، y)؛ التي نستخدمها لسحب مؤشر الماوس من نقطة إلى أخرى. يستخدم بيانات الموضع النسبية بحيث تكون الحركة متعلقة بالموضع الأخير للمؤشر.

def الحركة (x، y): print ("move to"، x، -y) pyautogui.dragRel (x، -y)

أخيرًا ، نحتاج إلى استدعاء الوظيفة الرئيسية للسماح بتشغيل كل هذه التعليمات البرمجية.

# يستدعي الوظيفة لبدء serverstartServer ()

موصى به: