Mundarija:
Video: Tez yozish (sehrli qo'l): 4 qadam (rasmlar bilan)
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:28
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
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
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:
- Qo'lqop sotib oling, qo'lqopning materiali muhim emas.
- Velcro bilaguzuk sotib oling
- Portativ batareyani sotib oling
- Sticky Velcro sotib oling
- Tikuv ignasi bilan velkro bilaguzukni qo'lqop tagiga mahkamlang
- Bilak tasmasi har xil bilak o'lchovlariga moslashtirilishi kerak.
- Yopishqoq lentani akselerometr tagiga mahkamlang va qo'lqop ko'rsatkich barmog'iga mahkamlang
- Tukka yopishqoq lentani mahkamlang va qo'lqopning yuqori qismiga mahkamlang.
- Simlar yordamida tukdagi 3V3 pinni akselerometrdagi VIN piniga ulang
- Simlar yordamida tukdagi GND pinini akselerometrga GND piniga ulang.
- Simlar yordamida tukdagi SCL pinini akselerometrning SCL piniga ulang.
- Simlar yordamida tukdagi SDA pinini akselerometrga SDA piniga ulang.
- Quvvat berish uchun kamida 5 voltli batareyani usb orqali tukga ulang.
3 -qadam: 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
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:
Namlik va haroratni real vaqtda Arduino UNO va SD-karta yordamida qanday yozish mumkin - DHT11 Proteusda ma'lumotlarni yozish simulyatsiyasi: 5 qadam
Namlik va haroratni real vaqtda Arduino UNO va SD-karta yordamida qanday yozish mumkin | DHT11 Proteusda ma'lumotlarni yozish simulyatsiyasi: Kirish: salom, bu Liono Maker, bu erda YouTube havolasi. Biz Arduino bilan ijodiy loyihani amalga oshirmoqdamiz va ko'milgan tizimlar ustida ishlayapmiz. Ma'lumotlarni yozuvchi: Ma'lumotlarni yozuvchi (shuningdek, ma'lumotlarni yozuvchi yoki ma'lumotlarni yozuvchi)-vaqt o'tishi bilan ma'lumotlarni yozib oladigan elektron qurilma
Og'iz sichqonchasi bilan tilni yozish: 11 qadam (rasmlar bilan)
Og'iz sichqonchasi bilan tilni terish: Makey Makey taxtasi, shubhasiz, kompyuter yoki noutbuk bilan ishlash uchun ko'plab imkoniyatlarni ochib berdi. Pianino banan va kumush plyonkali tetiklarni o'ynatganda, men qiziqarli va o'qituvchi bo'lsam -da, men boshqacha dastur topishni xohlardim va umid qilamanki
Makey Makey bilan yozish amaliyoti: 7 qadam (rasmlar bilan)
Makey Makey bilan yozish amaliyoti: Bizning Musiqa talabalarimiz qora belbog'li maqomga ega bo'lguncha kamar (rangli iplar) olish uchun ovoz yozish moslamasidagi qo'shiqlarni to'ldirishlari kerak. Ba'zida ular barmoqlarning joylashishi va " eshitish " qo'shiq hayotga kiradi
Keling, sehrli sehrli billur to'p yasaylik! ~ Arduino ~: 9 qadam
Sehrli afsun bilan sehrli billur to'p yasaylik! ~ Arduino ~: Bunda biz harakat sensori va RFID skaneridan foydalanib, ichidagi LED chiroqlar animatsiyasini boshqaradigan sehrli to'p yasaymiz
Tez, tez, arzon, yaxshi ko'rinadigan LED xonali yorug'lik (hamma uchun): 5 qadam (rasmlar bilan)
Tez, tez, arzon, yaxshi ko'rinadigan LED xonali yorug'lik (hamma uchun): Hammaga xush kelibsiz :-) Bu mening birinchi ko'rsatmam, shuning uchun sharhlar qabul qilinadi :-) Men sizga ko'rsatmoqchi bo'lgan narsam-tez LED yoritgichini qanday qilish kerak. TINY buget. Sizga kerak bo'lgan narsa: CableLEDsRezistorlar (12V uchun 510 Ohm) Stapellar Lehimlash dazmollari Kesgichlar va boshqa tagliklar