Accel бичих (Шидэт гар): 4 алхам (зурагтай)
Accel бичих (Шидэт гар): 4 алхам (зурагтай)
Anonim
Accel бичих (Шидэт гар)
Accel бичих (Шидэт гар)
Accel бичих (Шидэт гар)
Accel бичих (Шидэт гар)
Accel бичих (Шидэт гар)
Accel бичих (Шидэт гар)

Танилцуулга

Шидэт гар нь хөгжлийн бэрхшээлтэй болон моторт бэрхшээлтэй хүмүүст загварчилсан орчинд зурах, бичих бүтээлч сэтгэлгээг мэдрэх боломжийг олгодог. Шидэт гар бол долоовор хурууныхаа хөдөлгөөнийг мэдэрч, компьютерийн дэлгэцэн дээрх зураас болгон хөрвүүлдэг бээлий юм.

Шаардлагатай материалууд

LSM9DOF Breakout Board-$ 24.95 ---

Wifi бүхий Adafruit Feather --- $ 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 -ээр холбодог.

Бээлийний 2 дахь загварыг хийх алхамууд:

  1. Бээлий худалдаж аваарай, бээлийний материал хамаагүй.
  2. Velcro бугуйвч худалдаж аваарай
  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 өд), нөгөө нь серверд (энэ тохиолдолд Жародын зөөврийн компьютер). Үйлчлүүлэгчийг C ++ хэл дээр бичсэн бөгөөд сервер нь python хэл дээр бичигдсэн болно. Arduino нь ихэвчлэн C ++ хэл байдаг тул өөр хэл ашиглахаар өөрчлөх нь хэцүү байдаг. Серверийг сүлжээний онцлогтой л бол ямар ч хэлээр бичиж болно.

Үйлчлүүлэгчийг тохируулах:

Нэгдүгээрт, бид үйлчлүүлэгчийн кодыг тохируулна. WiFi холболтын ихэнх кодыг Adafruit номын сангаар дамжуулан авах боломжтой. Бид холбогдох ангиудыг оруулж эхэлнэ.

#оруулах #оруулах #оруулах #оруулах #оруулах

Кодын туршид юу ашиглахыг зарим хувьсагчаар тохируулна уу.

// Сүлжээний const char* ssid = "MMServer" -д холбогдох; const char* password = "MMServer-Password"; // өгөгдөл хүлээн авах серверийн IP ба порт char* host = "149.160.251.3"; const int порт = 12347; bool холбогдсон = худал;

// Хөдөлгөөн илрүүлэгчийг эхлүүлэх

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, нууц үг); // Холбогдож байна… while (WiFi.status ()! = WL_CONNECTED) {саатал (500); Serial.print ("."); } // WiFi Serial.println ("") руу амжилттай холбогдсон; Serial.println ("WiFi холбогдсон"); Serial.println ("IP хаяг:"); Serial.println (WiFi.localIP ());

#ifndef ESP8266

байхад (! Цуваа); #endif Serial.ben эхлэх (9600); Serial.println ("Мэдрэгчийн тест");

// Мэдрэгчийг эхлүүлэх

if (! lsm.begin ()) {// LSM9DS0 Serial.print -ийг илрүүлэхэд асуудал гарлаа (F ("Өө, LSM9DS0 илрээгүй байна … Утас эсвэл I2C ADDR -ээ шалгаарай!")); байхад (1); } Serial.println (F ("LSM9DS0 9DOF олдсон")); // Serial.print серверт холбогдож эхлэх ("Холбогдож байна"); Serial.println (хост);

// Амжилттай холболт байгаа эсэхийг шалгана уу. Хэрэв бүтэлгүйтсэн бол цуцална уу

if (! client.connect (host, port)) {Serial.println ("холболт амжилтгүй болсон"); холбогдсон = худал; буцах; } өөр {холбогдсон = үнэн; }

// Мэдрэгчийн ололт ба нэгтгэх хугацааг тохируулна уу

configureSensor (); }

Дараа нь бидэнд давталт хийх давталтын функц хэрэгтэй болно. Энэ тохиолдолд акселерометрээс өгөгдлийг "[z_accel]: [y_mag]: [z_mag]" хэлбэрээр сервер рүү дахин дахин илгээхэд ашигладаг. Үйлчлүүлэгч.хэвлэх (тоо); функц нь өгөгдлийг сервер рүү илгээдэг.

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.println (); } өөр {installConnection (); }}

Зарим хэрэгслийн функцүүдийн хувьд өд ба сервер хоёрын хооронд холбоо тогтоох шаардлагатай байна.

void installConnection () {if (! client.connect (host, port)) {Serial.println ("холболт амжилтгүй болсон"); холбогдсон = худал; буцах; } өөр {холбогдсон = үнэн; }}

Бид мөн мэдрэгчийг тохируулж, унших утгын хүрээг өгөх хэрэгтэй. Жишээлбэл, хурдатгал нь 2g, 4g, 6g, 8g, 16g гэсэн 5 сонголттой.

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 файл байх болно. Эхлэхийн тулд шаардлагатай ангиудыг импортлох хэрэгтэй.

импорт сокетимпорт дахин импортлох

сокетийг сүлжээнд ашиглахад ашигладаг. 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 # 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 = (host, port) # Серверийг нээж, ирж буй холболтуудыг сонсоорой (' %s порт %s дээр сервер эхлүүлж байна' %server_address) serversocket.bind (server_address) serversocket.listen (5) # Холболтыг хүлээнэ үү … үнэн байхад: хэвлэх ('Холболтыг хүлээж байна …') # Ирж буй холболтыг хүлээн авах (клиентийн залгуур, хаяг) = serversocket.accept () # Хүлээн авсан өгөгдлийг задалж үзээрэй try: print ('Холболт байгуулагдсан', хаяг)) үнэн байхад: # Өгөгдлийг хүлээн авч өгөгдөл боловсруулахад илгээнэ үү = 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) өөр: 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)

Дараа нь бид хөдөлгөөнт хурдатгалын офсет үүсгэдэг. Энэ нь хэн нэгэн хуруугаа хөдөлгөхөө болих үед програмыг таних боломжийг олгодог бөгөөд ингэснээр сервер рүү илгээгдсэн хурдатгалын бүх утга ижил байх ёстой.

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 эсвэл 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 = хөвөх (жагсаалт [0]) - z_offset

mag_y = list [1] mag_z = list [2] left = False right = False # Хурдасгасан эсэхээ бататгах хүртэл хурдатгалыг бүү боловсруул # Механик дуу чимээг байршилд хувь нэмэр оруулахаас сэргийлнэ, хэрэв (z_real -0.20): z_real = 0 # Эхлэ Хэрэв (эхний_ өгөгдөл): 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 = Үнэн бол (баруун): хөдөлгөөн (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): хэвлэх ("рүү шилжих", x, -y) pyautogui.dragRel (x, -y)

Эцэст нь хэлэхэд бид энэ бүх кодыг ажиллуулахын тулд үндсэн функцийг дуудах хэрэгтэй.

# ServerstartServer () -ийг эхлүүлэхийн тулд функцийг дуудна.

Зөвлөмж болгож буй: