Мазмуну:

Accel жазуусу (сыйкырдуу кол): 4 кадам (сүрөттөр менен)
Accel жазуусу (сыйкырдуу кол): 4 кадам (сүрөттөр менен)

Video: Accel жазуусу (сыйкырдуу кол): 4 кадам (сүрөттөр менен)

Video: Accel жазуусу (сыйкырдуу кол): 4 кадам (сүрөттөр менен)
Video: 60 МИНУТ ПРО ТЕСЛУ - TESLA MODEL 3 2024, Ноябрь
Anonim
Accel жазуусу (сыйкырдуу кол)
Accel жазуусу (сыйкырдуу кол)
Accel жазуу (сыйкырдуу кол)
Accel жазуу (сыйкырдуу кол)
Accel жазуу (сыйкырдуу кол)
Accel жазуу (сыйкырдуу кол)

Киришүү

Magic Hand мүмкүнчүлүгү чектелген жана моторикасынын бузулган адамдарына окшоштурулган чөйрөдө сүрөт тартуу жана жазуу чыгармачылыгынан ырахат алууга мүмкүнчүлүк берет. Сыйкырдуу кол - бул сөөмөйүңүздүн кыймылын сезүүчү жана аны компьютер экранындагы сызыктардын чиймесине которгон тагынуучу мээлей.

Керектүү материалдар

LSM9DOF Breakout Board --- $ 24.95 ---

Wifi менен Adafruit Feather --- $ 18.95 ---

Аял/Аял зымдары --- $ 1.95 ---

Тасма/Velcro тилкелери --- $ 3

Бирдей күчтүн эки магнити --- Баалар ар кандай

Бул кантип иштейт

Акселерометрди колдонуу менен, биз y огунун ылдамдануу маалыматын чогулта алабыз, бул колдонуучунун манжасы качан өйдө жана ылдый жылып жатканын аныктоого жардам берет. Биздин акселерометрибиз жердин борборуна карата ылдамдатууну өлчөгөндүктөн, биз х огунун ылдамдыгын аныктай албайбыз (солго же оңго). Бактыга жараша LSM9DOF сынык тактасында магнитометр бар, ал бизге магнит талаалары боюнча маалыматтарды чогултууга мүмкүндүк берет. Биз эки магнитти 30 см аралыкта жайгаштырып, ортосунда колкап бар. Эгерде магниттик маалыматтар оң окулса, анда мээлей оңго жана тескерисинче жылып жатканын билебиз. Бардык маалыматтар акселерометрде/магнитометрде чогултулгандан кийин, ал маалыматты зым аркылуу wifi компьютерине туташкан канатка жөнөтөт, андан кийин маалыматты компьютерибизге жөнөтөт, аны биз кодубузда колдоно алабыз.

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

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

Бул прототип электрондук түзүлүштөрдүн үстүнөн тайып кетиши үчүн колго бошоп тигилген мээлейди билдирет. Электрондук түзмөк колунда негизги мээлей менен айкалышкан куралдын астына велкро менен бекитилет. Андан кийин жашыл мээлей базанын жана электрондук түзүлүштөрдүн үстүнөн тайып кетет ….

Мээлейдин прототипин жасоодогу кадамдар:

  • Колго байкоо жүргүзүү үчүн эки чоң кездеме алыңыз
  • Колуңузду кездеменин эки бөлүгүнө караңыз жана кесип алыңыз
  • Эки кол менен кесилген жерлерди бириктирип коюңуз, ошондо алар эң сонун тегизделет
  • Андан кийин, тигүүчү машинаны даярдоо үчүн жипти машинанын көрсөтүлгөн жерлеринен өткөрүңүз
  • Тигүүчү машина орнотулганда, ийнени көтөрүп, бириктирилген эки кездемени ийненин астына коюңуз
  • Ийне кездеменин эң четине тизилгенин текшериңиз, машинаны ишке киргизиңиз жана кездеменин четине тигип бериңиз, эки бөлүгүн билекке такалбаган бойдон калтырыңыз, ошондо колго батат.

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

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

Биздин акыркы прототипибиз - бул Velcro боосу менен айкалышкан кадимки кол кап. Мээлей менен кайыш биригип тигилет, ал эми электрондук түзүлүштөр колкапка Velcro аркылуу бекитилет.

Мээлейдин 2 -прототибин жасоо кадамдары:

  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 -кадам: Код

Code
Code

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

Киришүү:

Акселерометрден маалыматтарды иштетүү үчүн, Adafruit жүнү менен маалыматтарды иштетүүчү сервердин ортосунда (ноутбукта/рабочийде) кардар/сервер мамилеси түзүлүшү керек. Эки код файлын түзүү керек болот: бири кардар үчүн (Adafruit жүнү), экинчиси сервер үчүн (бул учурда Жароддун ноутбугу). Кардар C ++ тилинде, ал эми сервер python тилинде жазылган. Кардар үчүн колдонулган тил маанилүү, анткени Arduino негизинен C ++ тили, жана аны башка тилди колдонуу үчүн өзгөртүү кыйын. Сервер каалаган тармакта жазылышы мүмкүн, эгерде ал тармактын өзгөчөлүктөрүнө ээ болсо.

Кардарды орнотуу:

Биринчиден, биз кардар кодун орнотобуз. WiFi туташуу кодунун көбү Adafruit китепканалары аркылуу жеткиликтүү. Биз тиешелүү класстарды кошуу менен баштайбыз.

#кошуу #кошуу #кошуу #кошуу #кошуу

Код боюнча колдонула турган кээ бир өзгөрмөлөрдү коюңуз.

// Тармакка туташуу char* ssid = "MMServer"; const char* password = "MMServer-Password"; // IP const жана char const* "149.160.251.3" маалыматтарын ала турган сервердин порту; const int порт = 12347; bool туташкан = жалган;

// Кыймыл детекторун баштоо

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, сырсөз); // Туташууда… while (WiFi.status ()! = WL_CONNECTED) {кечигүү (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 табууда көйгөй келип чыкты (F ("Ой, LSM9DS0 табылган жок … Зымдарды же I2C ADDRди текшериңиз!")); while (1); } Serial.println (F ("LSM9DS0 9DOF табылды")); // Serial.print серверине туташууну баштаңыз ("Туташуу"); Serial.println (кабыл алуучу);

// Ийгиликтүү туташууну текшериңиз. Эгер ишке ашпаса, анда токтотуңуз

if (! client.connect (хост, порт)) {Serial.println ("туташуу ишке ашпай калды"); туташкан = жалган; кайтуу; } else {connected = true; }

// Орнотуу сенсор пайда жана интеграция убактысы

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); String сандары; сандар += 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 {connected = true; }}

Биз ошондой эле сенсорду конфигурациялап, ага окула турган баалуулуктардын диапазонун беришибиз керек. Мисалы, ылдамдануунун диапазону үчүн 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 файлы болот. Баштоо үчүн керектүү класстарды импорттоңуз.

импорт сокетимпорт кайра импорттоо

розетка тармак үчүн колдонулат. re rexeks же сап манипуляциялары үчүн колдонулат. 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) # Server IP дареги жана порт хост = " 149.160.251.3 "port = 12347 server_address = (host, port) # Серверди ачыңыз жана кирүүчү туташууларды угуңуз (' %s портунда %s' %server_address'ти иштетүү) serversocket.bind (server_address) serversocket.listen (5) # Байланыштарды күтө туруңуз … Чынында: басып чыгаруу ('Байланыш күтүлүүдө…') # Кирүүчү байланышты кабыл алуу (clientsocket, address) = serversocket.accept () # Алынган маалыматтарды талдоого аракет кылыңыз: 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 = Акырында жалган: # Кереги жок маалыматтын чыгышына жол бербөө үчүн socket жабыңыз clientsocket.close ()

Биз азыр бардык маалыматтарды иштете турган функцияларды талап кылабыз. Биринчи кадам, жана биринчи функция деп аталат, эсептөө максатында сенсордун калибрлөөсү.

def calibData (тизме): глобалдык z_calib глобалдык z_offset дүйнөлүк mag_data global mag_calib_y глобалдык mag_offset_y z_calib += калкып чыгуу (тизме [0]) mag_calib_y += калкып чыгуу (тизме [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 глобалдык data_list глобалдык n глобалдык keep_offset эгерде (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 коюңуз ("New z_offset:") басып чыгаруу (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] глобалдык z_offset глобалдык 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 #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): кыймылы (50, int (z_pos*) 1000)) элиф (солдо): кыймыл (-50, int (z_pos*1000)) z_velo = 0 z_pos = 0

Эми, акыры, курсорду жылдырабыз! Бул үчүн биз боектор терезесин ачып, аны толук экранга чыгардык. Pyautogui китепканасында pyautogui.dragRel (x, y) деп аталган функция бар; биз чычкан курсорун бир чекиттен экинчи чекитке сүйрөө үчүн колдонобуз. Бул салыштырмалуу позиция маалыматын колдонот, андыктан кыймыл курсордун акыркы абалына салыштырмалуу болот.

def кыймылы (x, y): басып чыгаруу ("to move", x, -y) pyautogui.dragRel (x, -y)

Акыр -аягы, биз бул функциянын бардыгын иштетүү үчүн негизги функцияны чакырышыбыз керек.

# Функцияны чакырат serverstartServer ()

Сунушталууда: