Mundarija:

Uolles - DIY avtonom robot - 5 -qism - O'IH qo'shish: 9 qadam
Uolles - DIY avtonom robot - 5 -qism - O'IH qo'shish: 9 qadam

Video: Uolles - DIY avtonom robot - 5 -qism - O'IH qo'shish: 9 qadam

Video: Uolles - DIY avtonom robot - 5 -qism - O'IH qo'shish: 9 qadam
Video: Assembling 3D printed Spring Bonnie Fnaf Movie Figure 2024, Dekabr
Anonim
Image
Image

Biz Uolles bilan davom etamiz. Uolles nomi "Wall-E" aralashmasidan va oldingi loyihadan (ovozni aniqlash) kelib chiqqan va "espeak" yordam dasturidan foydalanganda, u biroz ingliz tili edi. Va valet yoki butler kabi. Va bu yakuniy maqsad: bu loyihani foydali narsaga aylantirish. Shunday qilib, "Uolles".

Uolles harakatlana oladi, u IR masofali sensorlar yordamida to'siqlardan qochishi mumkin (yaqinda qandaydir tarzda qovurilganmi? vaqt, MCP23017 kengaytirgichi bilan birga) va nihoyat, biror narsaga urilib tushganini bilish uchun vosita oqimining o'zgarishini aniqlay oladi.

Sensorlardan tashqari, Uolles 100 ta harakatni "eslab qoladi" va harakat tarixidan foydalangan holda ba'zi oddiy tahlillarga ega.

Hozircha Uollesning maqsadi - faqat oldinga intilishni davom ettirish va qachondir takrorlanadigan naqshga (masalan, burchakda) qolib ketganini bilish va aslida oldinga siljish emas.

Men harakatlanish va navigatsiya uchun bir necha marta takrorlanganman va doimiy bosh og'rig'i aylanish paytida bo'lgan.

Uolles kuzatiladigan robot bo'lgani uchun, men dasturiy ta'minotda hamma narsani soddalashtirmoqchi bo'ldim (keyinroq), uni aylantirish uchun uni joyida aylantirishim kerak. Shunday qilib, dvigatellarga teng, lekin qarama -qarshi kuch / ish aylanishini qo'llang.

Muammo Agent 390 robot platformasining dizayni bilan bog'liq. Yo'l kamarlari odatda yon tomonlarga ishqalanadi. Va bundan ham yomoni, bir tomon boshqasidan ko'ra ko'proq narsani qiladi.

Zaminda va to'g'ridan -to'g'ri borishda muammo yo'q. Bu gilam ustida ko'rinadi. Men Uollesni izlari xiralashganidan keyin gilamga qo'ymaslikni tanladim (ular kirni juda oson yig'ishadi).

Haqiqiy muammo - polga burilish paytida.

Agar menda dasturiy ta'minot yuqori darajadagi ish tsikli qo'llanilsa, u ko'proq yoki kamroq izchil aylanadi. Biroq, kam ishlaydigan davrda, u aylanishi mumkin yoki bo'lmasligi mumkin. Yoki u biroz burilib, keyin sekinlashishi mumkin. Burilish harakati dasturiy ta'minot orqali boshqarib bo'lmaydigan ko'rinadi yoki eng yaxshi holatda juda qiyin.

Muammo navigatsiya paytida va to'siqlardan uzoqlashish yoki harakatlanish paytida namoyon bo'ladi. U juda yovvoyi burilib ketishi mumkin, yoki hatto juda qimirlamay turib, juda mayda -chuyda siljishga urinib qolishi mumkin.

Va shuning uchun yuqoridagi tushuntirish ushbu ko'rsatmaga turtki bo'ldi.

Dastlab, men harakatni sezish moslamasini (IMU) joriy qilishni kechiktirmoqchi edim, chunki ular A) murakkab, B) shovqinli, C) vaqt o'tishi bilan xatolar kiritilishi mumkin va hokazo. parvoz vaqtida IR lazer datchiklariga o'tish orqali biz juda yaxshi ish qila olardik. Va biz - lazer yordamida, robotning aylanadimi yoki yo'qmi, masofadagi o'zgarishlarni kuzatish orqali bilishimiz mumkin edi.

Darhaqiqat, biz buni hozir (akustik sensorlar yordamida) qila olardik.

Biroq, bularning barchasi bitta oddiy savolga javob berishning bilvosita, murakkab usulidir: "biz aylantirdikmi yoki yo'qmi?"

Menga ToF lazer datchiklaridan sakrash meni dasturiy ta'minotning keyingi bosqichiga olib chiqadigandek tuyuldi; ya'ni SLAM (bir vaqtning o'zida lokalizatsiya va xaritalash). Men u erga borishga hali tayyor emas edim.

Robot loyihasini qatlamlar bilan bajarish yaxshidir, bunda birinchi (pastki) qatlamlar sodda, ikkinchisi (yuqori) qatlamlari mavhumroq bo'lib, murakkabroq masalalarni hal qiladi.

Qatlamlarni quyidagicha o'ylash mumkin:

  1. robot jismoniy ramka / mexanik strukturaviy asos
  2. oddiy haydovchi tizimi (Raspberry, Roboclaw, motorlar, kabellar va boshqalar, asosiy dasturiy ta'minot, klaviatura yordamida)
  3. Sensorlarni qo'llab-quvvatlash uchun muhim elektronlar (ikki tomonlama kuchlanish o'tkazgichi, port kengaytirgichi, E-Stop, quvvat taqsimoti va boshqalar)
  4. to'siqlardan qochish sensori (akustik, IR)
  5. asosiy, asosiy joylashishni aniqlash va harakatlanish - aniqlash (akselerometr, girro, magnitometr, motorli enkoderlar, g'ildirakli enkoderlar)

Siz o'z ro'yxatingiz bilan chiqishingiz mumkin. Bu ro'yxatning asosiy jihatlari shundaki, siz buni oz yoki ko'p tartibda bajarishingiz kerak, shuningdek, agar siz har bir qatlamda yaxshi ish holatiga o'tish uchun biroz vaqt sarflasangiz, bu keyinchalik murakkablashishi bilan sizga yordam berishi kerak.

Yuqoridagi ro'yxat dasturiy ta'minotdagi ushbu kontseptual qatlamlarga ko'proq yoki kamroq mos kelishi mumkin.

  • SLAM (bir vaqtning o'zida lokalizatsiya va xaritalash)
  • Harakat, aylanish haqida nazorat va xabardorlik
  • Asosiy to'siqlardan qochish
  • Sensor ma'lumotlarini nazorat qilish va aniqlash
  • Asosiy harakat oldinga, orqaga, chapga va o'ngga, tezlashtirish, sekinlashtirish, to'xtatish

Ko'rib turganingizdek, bu ro'yxat uchun birinchi elementlar "men qayerdaman" va "men qayerga ketyapman" kabi mavhum masalalar va savollarga javob beradigan yuqori, murakkab qatlamlar bo'ladi, ikkinchisi esa keyingi bo'lar edi. "A sensorini qanday gapirish/tinglash" yoki "bu g'ildirakni qanday harakatlantirish" ni boshqaradigan dasturiy ta'minotning pastki qatlamlari.

Men aytmaymanki, siz qatlamni boshlaganingizda, siz uni tugatgan bo'lasiz, keyin esa keyingi qatlamda, avvalgisiga qaytmaysiz. Robot loyihasi zamonaviy, takrorlanuvchi dasturiy ta'minotni ishlab chiqish usullari (epchil, SCRUM va boshqalar) kabi bo'lishi mumkin.

Men har biriga vaqt ajratishni aytaman. Siz har birida qancha qilish kerakligini muvozanatlashingiz kerak, va siz vaqt va muammoga arziydigan ma'lum bir qatlamda nima qilmoqchi ekanligingizni hal qilasiz.

Raqobat qilayotgan ikkita g'oya yoki yo'nalish o'rtasida ma'lum bir "ziddiyat" yoki "keskinlik" mavjud.

Men A muammoni hal qilish uchun "plug-n-play" deb atagan bo'lardim.

Ikkinchisi - DIY (buni o'zingiz qiling). Va bu boshqa g'oya uchun eng yaxshi belgi bo'lmasligi mumkin.

Mana, har birining namunasi, umid qilamanki, siz ikkita tanlov o'rtasidagi keskinlik yoki ziddiyatni ko'rasiz.

Misol uchun, keling, SLAMni, to'siqlarni chetlab o'tishni va asosiy harakatni bir vaqtning o'zida hal qilish uchun bitta muammo qilib olaylik.

  1. Agar biz plug-n-play marshrutini tanlashga qaror qilsak, biz darhol (byudjetga qarab) yuqoriga o'rnatilgan aylanadigan lazerlar, chuqurlikdagi kamera, ToF lazerlari va IMU (masalaning mavzusi) ga o'tamiz. Ko'rsatmali).
  2. Agar biz boshqa yo'l bilan borishni xohlasak, biz ba'zi akustik sensorlar yoki IQ sensorlaridan, yoki umuman sensorlarsiz, har qanday ma'lumotni olishga harakat qilishimiz mumkin - biz faqat dvigatel oqimi monitorini ishlatamiz.

№1 va №2 haqida nima deyish mumkin? Bir narsa shundaki, biz №2 -ni bajarish orqali ko'p narsalarni o'rgandik. Faqat akustik datchiklar bilan ishlashning cheklanishi bizni boshqa ko'plab masalalar haqida o'ylashga majbur qiladi.

Boshqa tomondan, agar biz 2 -sonli ishlarni bajarishga juda ko'p e'tibor qaratgan bo'lsak, vaqtni behuda sarflashimiz mumkin, chunki biz akustik sensorlardan ko'proq narsani talab qilamiz.

O'ylash kerak bo'lgan yana bir tushuncha yoki g'oya: "Qanday qilish kerak" va qanday dasturiy ta'minot aralashmasi "qanday", "nima", "qachon", "qaerda" degan savollarga javob beradi.. Chunki "qanday qilish kerak", odatda, "nima", "qachon" va "qaerda" javob olish uchun bog'liq bo'lgan past darajadagi savol.

Yaxshiyamki, yuqorida aytilganlarning hammasi o'ylash kerak bo'lgan narsa edi.

Mening holimda, ko'p harakatlardan so'ng va izchil ishqalanish muammosiga duch kelganimdan va izchil nazorat va harakatga ega bo'lolmaganimdan so'ng, boshqa narsa qilish vaqti keldi.

Shunday qilib, bu ko'rsatma - O'IH.

Maqsad shundan iboratki, agar O'IH robot aylanmasligini aytsa, biz ish tsiklini oshiramiz. Agar biz juda tez aylansak, biz ish aylanishini kamaytiramiz.

1 -qadam: IMU sensori

IMU sensori
IMU sensori
IMU sensori
IMU sensori

Va shuning uchun Uollasga qo'shadigan keyingi sensori - bu O'IH. Bir oz tadqiqotdan so'ng, men MPU6050 -ga joylashdim. Ammo bu vaqtda, MPU9050 (va yaqinda, MPU9250) bundan ham yaxshiroq g'oya bo'lib tuyuldi.

Mening asosiy manbam Amazon (AQShda) edi. Shunday qilib, men ulardan ikkitasiga buyurtma berdim.

Men haqiqatan ham olgan narsam (bu menda hech qanday nazorat yo'qdek tuyuladi, bu menga Amazonni yoqtirmaydi) ikkita MPU92/65 edi. Belgilanish haqida biroz hayronman. Rasmlarga qarang; bu "oilaviy" belgi kabi ko'rinadi. Qanday bo'lmasin, men shu narsaga yopishib qoldim.

Uni qo'shish juda oddiy -birlashtiruvchi yo'lli proto -taxtani oling, sensorni taxtaga lehimlang, 10 -pinli vintli terminal blokini qo'shing (meniki Pololudan).

Har qanday aralashuvni minimallashtirish uchun men bu sensorlarni hamma narsadan uzoqroq joylashtirishga harakat qildim.

Bu, shuningdek, bir nechta neylon murvat/yong'oqlardan foydalanishni anglatardi.

Men I2C protokolidan foydalanmoqchiman. Umid qilamanki, umumiy sim uzunligi unchalik yomon bo'lmaydi.

Boshqa joylarda asosiy ulanishlar va kuchlanish darajasi va boshqalar haqida ko'p ma'lumotlar bor, shuning uchun men bu erda takrorlamayman.

2 -qadam: Hamma narsa har doim ham toza emas

Ushbu yozuvda, bu MPU-92/65 uchun Internetda ko'p narsa yo'qdek tuyuladi. Ko'p sensorlar singari, mavjud bo'lgan narsalar Arduino -dan foydalanishga misol bo'la oladi.

Men toza bo'lmagan jarayonni ko'rsatib, bu ko'rsatmalarni biroz boshqacha qilishga harakat qilaman, chunki ishlar har doim ham darhol ishlamaydi.

O'ylaymanki, bu ko'rsatma A-B-C ga qaraganda blogga o'xshaydi, 1-2-3 "buni shunday qilasiz".

3 -qadam: dastlabki sinov

Dastlabki test
Dastlabki test
Dastlabki test
Dastlabki test

Oldingi bosqichdagi tasvirlardan, sensorlarga boradigan qizil va qora simlar, albatta, VCC (5V) va GND. Yashil va sariq simlar I2C ulanishlari.

Agar siz boshqa I2C loyihalarini amalga oshirgan bo'lsangiz yoki ushbu ketma -ketlikni kuzatgan bo'lsangiz, demak siz "i2cdetect" haqida bilgansiz va bu Raspberry yangi sensorni ko'rishi mumkinligini bilish uchun birinchi qadam.

Ushbu qadamdagi tasvirlardan ko'rinib turibdiki, bizning birinchi urinishimiz muvaffaqiyatsiz tugadi. IMU ko'rinmaydi (qurilma identifikatori 0x68 bo'lishi kerak).

Biroq, yaxshi xabar shundaki, I2C avtobusi ishlaydi. Biz bitta qurilmani ko'ramiz 0x20 va bu MCP23017 port kengaytiruvchisi (hozirda HCSR04 akustik sensorlar uchun javobgardir).

Rasmda ko'rish oson emas, lekin men bir xil rangdagi yashil va sariq simlarni IMUdan MCP23017 ga uladim (rasmning pastki chap tomoniga qarang)

Muammolarni bartaraf etish uchun biz bir oz harakat qilishimiz kerak bo'ladi.

4 -qadam: Muammolarni bartaraf etish

Image
Image
Muammolarni bartaraf qilish; nosozliklarni TUZATISH
Muammolarni bartaraf qilish; nosozliklarni TUZATISH
Muammolarni bartaraf qilish; nosozliklarni TUZATISH
Muammolarni bartaraf qilish; nosozliklarni TUZATISH

Voltmetrda uzluksizlik sozlamasidan foydalanib (baland ovozli) VCC (5V), GND, SDA va SCL ulanishlarini sinab ko'rdim. Bular yaxshi edi.

Keyingi urinish MCP23017-ni I2C avtobusidan uzish edi, avtobusda faqat MPU-92/65 qoldi. Bu samarasiz bo'ldi - "i2cdetect" keyin hech qanday qurilmani ko'rsatmadi.

Shunday qilib, men sensorni totem qutbidan uzib tashladim va uni yana 5Vdan 3Vgacha bo'lgan ikki tomonlama avtobusga qayta uladim; ya'ni to'g'ridan -to'g'ri Malinaga. (qisqa simlar?).

Va voila. Bu safar muvaffaqiyat bor. Biz "i2cdetect" yordamida 0x68 ko'rsatilishini ko'ramiz.

Lekin bu safar nima uchun ishlaganini hali bilmaymiz. Bu simlarning uzunligi bo'lishi mumkinmi? Oldingi joy?

Eslatma: ADO asoslanadimi yoki yo'qmi, farq qilmadi. Bortda tortiladigan va tushiriladigan rezistorlar bo'lishi mumkin. Xuddi shu narsa FSYNC uchun ham to'g'ri bo'lishi mumkin.

Keyin MCP23017-ni qayta uladim. Endi bizda I2C avtobusida ikkita qurilma bor. (rasmga qarang). Muvaffaqiyatli, endi biz 0x20 va 0x68 ni i2cdetect bilan ko'ramiz.

Videolarda muammolarni bartaraf etish paytida sodir bo'lgan voqealar haqida ko'proq ma'lumot berilgan.

5 -qadam: Sensor ma'lumotlarini o'qish

Image
Image
Sensor ma'lumotlarini o'qish
Sensor ma'lumotlarini o'qish
Sensor ma'lumotlarini o'qish
Sensor ma'lumotlarini o'qish

Har xil yondashuvlar

Men sensordan foydali ma'lumotlarni olish uchun bir nechta yondashuvlarni qabul qilishga qaror qildim. Bu erda ular hech qanday tartibda emas:

  1. asosiy dasturlashni sinab ko'ring
  2. registrlardagi ba'zi onlayn hujjatlarni ko'rib chiqing
  3. boshqalarning misollarini va / yoki kodini ko'rib chiqing

Nima uchun bu yondashuvlar? Nima uchun faqat mavjud kutubxona yoki kodni qidirmasligingiz kerak?

Tajriba qilish va ba'zi g'oyalarni sinab ko'rish orqali biz nafaqat bu sensor haqida ba'zi bilimlarni yaxshiroq o'zlashtira olamiz, balki qandaydir texnikaga, mahoratga va yangi narsalarga, shuningdek hujjatlari ko'p bo'lmagan narsalarga qarshi kurashish usullariga ega bo'lamiz; ko'p noma'lum bo'lishi mumkin bo'lgan narsa.

Bundan tashqari, biz o'z g'oyalarimiz bilan o'ynadik va sinab ko'rdik va ba'zi tushunchalarga ega bo'ldik, biz boshqa birovning kodini yoki kutubxonasini baholash imkoniyatiga egamiz.

Masalan, github -dagi MPU9250 uchun ba'zi C ++ kodlarini ko'rib chiqib, men buni hali qilishni xohlamagan uzilishlardan foydalanishga majburlayotganini tushundim.

Bundan tashqari, u kalibrlash kabi qo'shimcha narsalar bilan birga keladi; yana, men hali qiziqmagan narsa.

Ehtimol, "ha yoki yo'q robot aylanadimi" degan oddiy savolga javob berish uchun men faqat ba'zi registrlarni o'qib javob berishim mumkin.

Registrlar

Bu yozuvda bu sensorda unchalik ko'p narsa yo'qdek tuyuladi. Aslida, agar siz ushbu ko'rsatma bilan birga kelgan tasvirlarni ko'rib chiqsangiz va haqiqiy chiplardagi yozuvlarni diqqat bilan ko'rib chiqsangiz, bu men uchun nokaut emasmi degan savol tug'diradi. Men ko'rganlarimni Invense -dan hech narsa bilan bog'lamayman. Qanday bo'lmasin, men topgan modellar uchun registr ma'lumotlarini ko'rib chiqishni tanladim: MPU-6050 va MPU-9250.

Ikkala holatda ham, ikkalasi uchun ham bir xil. Va yangi boshlanuvchilar uchun, biz bu MPU-92/65 uchun ham xuddi shunday bo'ladi deb o'ylaymiz.

59 dan 64 gacha - akselerometr o'lchovlari

65, 66 - harorat o'lchovlari 67 dan 72 gacha - giroskop o'lchovlari 73 dan 96 gacha - tashqi sensor ma'lumotlari

Eslatib o'tamiz: MPU-6050 magnitometrga ega emas, MPU-9250 (va biz buni ham taxmin qilamiz) bor.

Hujjatdan yana bir qancha qiziqarli va foydali ma'lumotlar olingan:

Magnitometr haqida ma'lumot:

magnitometr identifikatori: 0x48 registrlari 00 dan 09: 00H gacha WIA 0 1 0 0 1 0 0 0 01H INFO INFO7 INFO6 INFO5 INFO4 INFO3 INFO2 INFO1 INFO0 02H ST1 0 0 0 0 0 0 DOR DRDY 03H HXL HX7 HX6 HX5 HX4 HX4 HXH HX15 HX14 HX13 HX12 HX11 HX10 HX9 HX8 05H HYL HY7 HY6 HY5 HY4 HY3 HY2 HY1 HY0 06H HYH HY15 HY14 HY13 HY12 HY11 HY10 HY9 HY8 Hiz 8 Hz HZ Hz ST2 0 0 0 BITM HOFL 0 0 0 har bir registr nimani anglatishini taqsimlash: HXL [7: 0]: X o'qi o'lchov ma'lumotlari pastroq 8bit HXH [15: 8]: X o'qi o'lchov ma'lumotlari 8bit HYL [7: 0]: Y o'qi o'lchov ma'lumoti past 8bit HYH [15: 8]: Y o'qi o'lchov ma'lumoti yuqori 8bit HZL [7: 0]: Z o'qi o'lchov ma'lumoti past 8bit HZH [15: 8]: Z o'qi o'lchov ma'lumoti yuqori 8 bit

Dasturlash

Ro'yxatdan o'tish hujjatlaridan yana bir ma'lumot shundaki, faqat 100 ga yaqin registr bor edi. Shunday qilib, bitta taktika - bu qurilmaga kiradigan (0x68) oddiy dasturni yozish va bir qator registrlarni, ularning ma'nosiga qaramasdan, o'qishga urinish, faqat qanday ma'lumotlarni ko'rish mumkinligini ko'rish.

Va keyin, xuddi shu kodni ishlatib, ketma -ket o'tishni bajaring va ma'lumotlarni bir pasdan boshqasiga solishtiring.

Gap shundaki, biz hech qanday ma'lumotga ega bo'lmagan (nol yoki FF?) Yoki hech qachon o'zgarmaydigan registrlarni yo'q qilishimiz mumkin, va biz ham o'zgarmaydiganlarga e'tibor qaratishimiz mumkin.

So'ngra, biz faqat o'zgaruvchilarni ko'rib chiqamiz, bu registrning oxirgi N o'qilishini o'rtacha hisoblaydigan o'rtacha funktsiyani qo'shamiz, bu registr uchun ma'lum bir barqaror qiymat bor -yo'qligini bilish uchun. Bu shuni anglatadiki, biz sensorni harakatsiz va bir xil joyda saqlaymiz.

Nihoyat, biz sensorlar yordamida sekin harakat qilib ko'rishimiz mumkin, masalan, uni surish (akselerometr, girro), yoki unga puflash (harorat) yoki aylantirish (oldingi ikkita ortiqcha magnitometr) va bu qiymatlarga qanday ta'sir qilishini ko'rish.

Men iloji boricha wiringPi kutubxonasidan foydalanishni yaxshi ko'raman. I2C -ni qo'llab -quvvatlaydi.

Birinchi yugurish:

/********************************************************************************

* qurish uchun: gcc first.test.mpu9265.c -o first.test.mpu9265 -lwiringPi * * ishga tushirish uchun: sudo./first.test.mpu9265 * * bu dastur MCP23017 dan bir nechta (mumkin) registrlarni chiqaradi., * va keyin MPU9265 (yoki 0x68 manzilidagi boshqa har qanday MPU) * * Men buni sensordan o'qishim mumkinligini tekshirish uchun ishlatardim, chunki menda * MCP23017 -ga ishonch bor edi. ************************************************ ****************************/ #include #include #include #include #include int main (int argc, char ** argv) {put ("MCP23017 @ 0x20 nima deyishini ko'rib chiqaylik:"); errno = 0; int deviceId1 = 0x20; int fd1 = wiringPiI2CSetup (deviceId1); if (-1 == fd1) {fprintf (stderr, "W2Pi I2C qurilmasini ochib bo'lmadi: %s / n", strerror (errno)); qaytarish 1; } uchun (int reg = 0; reg <300; reg ++) {fprintf (stderr, "%d", wiringPiI2CReadReg8 (fd1, reg)); fflush (stderr); kechikish (10); } qo'yadi (""); qo'yadi ("MPU9265 @ 0x20 nima deyishini ko'rib chiqaylik:"); errno = 0; int deviceId2 = 0x68; int fd2 = wiringPiI2CSetup (deviceId2); if (-1 == fd2) {fprintf (stderr, "W2Pi I2C qurilmasini ochib bo'lmadi: %s / n", strerror (errno)); qaytarish 1; } uchun (int reg = 0; reg <300; reg ++) {fprintf (stderr, "%d", wiringPiI2CReadReg8 (fd2, reg)); fflush (stderr); kechikish (10); } qo'yadi (""); qaytarish 0; }

Ikkinchi yugurish:

/********************************************************************************

* qurish uchun: gcc second.test.mpu9265.c -o second.test.mpu9265 -lwiringPi * * ishga tushirish uchun: sudo./second.test.mpu9265 * * Bu dastur o'qilgan qiymat bilan birga registr raqamini chiqaradi. * * Bu chiqishni faylga yo'naltirishni (yo'naltirishni) foydali qiladi, keyin solishtirish uchun * bir necha marta bajarilishi mumkin. Bu qanday registr muhim va ma'lumotlar qanday harakat qilishi mumkinligi haqida bir oz tushuncha berishi mumkin. ************************************************ ****************************/ #include #include #include #include #include #include int main (int argc, char **) argv) {int deviceId = -1; if (0) {} boshqa if (! strncmp (argv [1], "0x20", strlen ("0x20"))) {deviceId = 0x20; } boshqa if (! strncmp (argv [1], "0x68", strlen ("0x68"))) {deviceId = 0x68; } boshqa if (! strncmp (argv [1], "0x69", strlen ("0x69"))) {deviceId = 0x69; } qo'yadi ("MPU9265 @ 0x20 nima deyishini ko'rib chiqaylik:"); errno = 0; int fd = wiringPiI2CSetup (deviceId); if (-1 == fd) {fprintf (stderr, "W2Pi I2C qurilmasini ochib bo'lmadi: %s / n", strerror (errno)); qaytarish 1; } uchun (int reg = 0; reg <300; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); kechikish (10); } qaytarish 0; }

Uchinchi yugurish:

/********************************************************************************

* qurish: gcc uchinchi.test.mpu9265.c -o uchinchi.test.mpu9265 -lwiringPi * * ishga tushirish uchun: sudo./third.test.mpu9265 * * Bu dastur ikkinchisining natijasidir. Bu faqat * registrlardan o'qiladi, bu bir yugurish va ikkinchisi o'rtasidagi farqni ko'rsatdi.************************************************ ****************************/ #include #include #include #include #include #include int main (int argc, char **) argv) {int deviceId = -1; if (0) {} boshqa if (! strncmp (argv [1], "0x68", strlen ("0x68"))) {deviceId = 0x68; } boshqa if (! strncmp (argv [1], "0x69", strlen ("0x69"))) {deviceId = 0x69; } qo'yadi ("MPU9265 @ 0x20 nima deyishini ko'rib chiqaylik:"); errno = 0; int fd = wiringPiI2CSetup (deviceId); if (-1 == fd) {fprintf (stderr, "W2Pi I2C qurilmasini ochib bo'lmadi: %s / n", strerror (errno)); qaytarish 1; } uchun (int reg = 61; reg <= 73; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); kechikish (10); } uchun (int reg = 111; reg <= 112; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); kechikish (10); } uchun (int reg = 189; reg <= 201; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); kechikish (10); } uchun (int reg = 239; reg <= 240; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); kechikish (10); } qaytarish 0; }

Xo'sh, biz hozirgacha nimani o'rgandik? Rangli ajratilgan joylari bo'lgan jadvalning tasviri shuni ko'rsatadiki, chiqish birinchi registrlar to'plamiga to'g'ri keladi.

Hozirgi natijalar yangi savollar tug'dirishi mumkin.

Savol: nima uchun "tashqi" guruh uchun faqat bitta ro'yxatga olish natijasi bor?

Savol: bu noma'lum registrlar nima? "??????"

Savol: dastur uzilishsiz boshqarilgandan so'ng, ma'lumotlar juda sekin so'raganmi? juda tez?

Savol: Sensor ishlayotganda, biz harakat qilib, natijalarga ta'sir qila olamizmi?

6 -qadam: Keling, o'qish / ma'lumotlar haqida ko'proq bilib olaylik

O'ylaymanki, har bir narsadan oldin keyingi qadam dasturni yaxshilashdir:

  • pastadir qancha kechikishiga moslashuvchan bo'ling (ms)
  • har bir registrga o'rtacha o'qish uchun qancha o'qishga moslashuvchan bo'ling

(Men dasturni fayl sifatida biriktirishim kerak edi. Uni bu erga kiritishda muammo bor edi. "4th.test.mpu9265.c")

Mana, oxirgi 10 o'qishdan foydalanib, o'rtacha 10ms tsiklda:

sudo./fourth.test.mpu9265 0x68 10 10

61:255 0 255 0 255 0 255 0 0 0: 102 62:204 112 140 164 148 156 188 248 88 228: 167 63:189 188 189 187 189 188 188 188 188 189: 188 64: 60 40 16 96 208 132 116 252 172 36: 112 65: 7 7 7 7 7 7 7 7 7 7: 7 66:224 224 224 240 160 208 224 208 144 96: 195 67: 0 0 0 0 0 0 0 0 0 0: 0 68:215 228 226 228 203 221 239 208 214 187: 216 69: 0 255 0 255 255 0 255 0 0 0: 102 70:242 43 253 239 239 45 206 28 247 207: 174 71: 0 255 255 0 255 255 255 255 255 255: 204 72: 51 199 19 214 11 223 21 236 193 8: 117 73: 0 0 0 0 0 0 0 0 0 0: 0 111: 46 149 91 199 215 46 142 2 233 199: 132 112: 0 0 0 0 0 0 0 0 0 0: 0 189:255 0 255 0 255 0 0 255 0 255: 127 190: 76 36 240 36 100 0 164 164 152 244: 121 191:188 188 188 188 187 188 187 189 187 189: 187 192: 8 48 48 196 96 220 144 0 76 40: 87 193: 7 7 7 7 7 8 7 7 7 7: 7 194:208 224 144 240 176 240 224 208 240 224: 212 195: 0 0 0 0 0 0 0 0 0 0: 0 196:243 184 233 200 225 192 189 242 188 203: 209 197:255 0 0 0 255 0 255 0 0 255: 102 198:223 39 247 43 245 22 255 221 0 6: 130 199: 0 255 255 255 0 255 255 255 255 0: 178 200:231 225 251 1 252 20 211 216 218 16: 164 201: 0 0 0 0 0 0 0 0 0 0: 0 239: 21 138 196 87 26 89 16 245 187 144: 114 240: 0 0 0 0 0 0 0 0 0 0: 0

Birinchi, eng chap ustun-bu registr raqami. Keyin bu registr uchun oxirgi 10 o'qish keladi. Nihoyat, oxirgi ustun har bir satr uchun o'rtacha.

Ko'rinib turibdiki, 61, 69, 71, 189, 197 va 199-registrlar faqat ikkilik, yoki tayyor / tayyor emas yoki 16-bitli qiymatning yuqori baytidir (manfiy?).

Boshqa qiziqarli kuzatishlar:

  • registrlar 65, 193 - juda barqaror va bir xil qiymat
  • ro'yxatga olish 63, 191 - juda barqaror va bir xil qiymat
  • registrlar 73, 112, 195, 201, 240 - hammasi nolga teng

Keling, bu kuzatuvlarni avvalgi ko'p rangli, ajratilgan stol tasviri bilan bog'laylik.

Ro'yxatdan o'tish 65 - harorat

Ro'yxatdan o'tish 193 - ??????

Ro'yxatdan o'tish 63 - akselerometr

Ro'yxatdan o'tish 191 - ??????

Ro'yxatdan o'tish 73 - tashqi

112 va undan keyin ro'yxatdan o'ting - ??????

Xo'sh, bizda hali noma'lum narsalar bor, lekin biz foydali narsalarni bilib oldik.

Ro'yxatdan o'tish 65 (harorat) va registr 63 (akselerometr) ikkalasi ham juda barqaror edi. Bu biz kutgan narsadir. Men sensorga tegmadim; u hech qanday tasodifiy tebranishlardan boshqa harakat qilmaydi, chunki robot mening kompyuterim bilan bir stolda o'tiribdi.

Har bir harorat/akselerometr registrlari uchun bitta qiziqarli test bor. Sinov uchun bizga dasturning boshqa versiyasi kerak.

7 -qadam: Biz harorat va tezlashuvga ta'sir qila olamiz

Oldingi bosqichlarda biz harorat uchun kamida bitta registrni va tezlashtirish uchun bitta registrni qisqartirdik.

Dasturning keyingi versiyasi ("5th.test.mpu9265.c") yordamida biz har ikkala registrda ham o'zgarishlarni ko'rishimiz mumkin. Iltimos, videolarni ko'ring.

Ko'proq qazish

Agar biz orqaga qaytsak va registr ma'lumotlariga nazar tashlasak, quyidagilar borligini ko'ramiz.

  • giroskop uchun uchta 16 bitli chiqish
  • akselerometr uchun 16 bitli uchta chiqish
  • magnitometr uchun 16 bitli uchta chiqish
  • harorat uchun bitta 16 bitli chiqish

Biroq, bizning oddiy test dasturlari tomonidan olingan natijalar bitta 8 bitli bitta chiqish edi. (yagona registrlar).

Keling, xuddi shu yondashuvni sinab ko'raylik, lekin bu safar 8 o'rniga 16 bitni o'qing.

Ehtimol, biz quyida bo'lgani kabi biror narsa qilishimiz kerak bo'ladi. Misol sifatida haroratni olaylik, chunki bu faqat 16 bitli bitta chiqish.

// fd fayl identifikatorini oling …

int tempRegHi = 65; int tempRegLo = 66; int hiByte = wiringPiI2CReadReg8 (fd, tempRegHi); int loByte = wiringPiI2CReadReg8 (fd, tempRegLo); int natijasi = hiByte << 8; // salom tartibini 8 bitni 16 bitli natijaning yuqori qismiga qo'ying | = loByte; // endi tartibda 8 bitni qo'shing, 16 bitli to'liq raqamni bering // bu raqamni chop eting yoki ekranning gorizontal grafik funktsiyasini oldidan ishlating.

Oldingi qadamlarimizdan ko'rdikki, 65 -registr juda barqaror, 66 -registr esa juda shovqinli. 65 tartibli bayt va 66 past darajali bayt bo'lgani uchun bu mantiqiy.

O'qish uchun biz 65-sonli registr ma'lumotlarini xuddi shunday qabul qilishimiz mumkin, lekin biz 66-sonli ro'yxatga olish qiymatlarini o'rtacha hisobda chiqarishimiz mumkin.

Yoki biz butun natijani o'rtacha hisoblay olamiz.

Bu qism uchun oxirgi videoni ko'ring; u 16 bitli harorat qiymatining to'liq o'qilishini ko'rsatadi. Kod "sixth.test.mpu9265.c"

8 -qadam: akselerometr va giroskop

Image
Image

Ushbu bo'lim uchun videolarda "seventh.test.mpu9265.c" test dasturi yordamida akselerometr va giroskopdan chiqishlar ko'rsatilgan. Bu kod ketma-ket 1, 2 yoki 3 bayt-juftlarni o'qishi mumkin (salom va lo bayt) va qiymatlarni bitta 16 bitli qiymatga o'zgartiradi. Shunday qilib, biz har qanday bitta o'qni o'qiy olamiz yoki ikkitasini birgalikda o'qiy olamiz (va u o'zgarishlarni jamlaydi) yoki biz uchtasini o'qiy olamiz (va u o'zgarishlarni jamlaydi).

Takror aytmoqchimanki, ushbu bosqich uchun, bu ko'rsatma uchun, men oddiy savolga javob izlamoqchiman: robot aylana oldimi? Men aniq qiymatni qidirmayapman, masalan, u 90 gradusga burildi. Bu SLAM bilan shug'ullanishimiz bilan sodir bo'ladi, lekin bu oddiy to'siqlardan qochish va tasodifiy harakat uchun zarur emas.

9 -qadam: (ish davom etmoqda) magnitometr

i2cdetect vositasidan foydalanganda, MPU9265 jadvalda 0x68 ko'rinishida ko'rsatiladi:

0 1 2 3 4 5 6 7 8 9 a b c d e f

00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --

Harakatning magnitometr qismidan o'qish uchun qo'shimcha qadamlar kerak.

PDF doc Invesense registrlaridan:

Ro'yxatga oluvchilar 37 dan 39 gacha - I2C QUL 0 nazorati

  • 37 Ro'yxatdan o'tish - I2C_SLV0_ADDR
  • 38 Ro'yxatdan o'tish - I2C_SLV0_REG
  • 39 Ro'yxatdan o'tish - I2C_SLV0_CTRL

Tavsiya: