Агуулгын хүснэгт:

Уоллес - DIY автономит робот - 5 -р хэсэг - IMU нэмэх: 9 алхам
Уоллес - DIY автономит робот - 5 -р хэсэг - IMU нэмэх: 9 алхам

Видео: Уоллес - DIY автономит робот - 5 -р хэсэг - IMU нэмэх: 9 алхам

Видео: Уоллес - DIY автономит робот - 5 -р хэсэг - IMU нэмэх: 9 алхам
Видео: Карл Фристон: «Мета» принцип свободной энергии [ЧАСТЬ 1!] 2024, Арваннэгдүгээр
Anonim
Image
Image

Бид Уоллестай хамт явж байна. Уоллес нэр нь "Wall-E" -ийн холимогоос гаралтай бөгөөд өмнөх төслөөс (дуу хоолой таних) ирсэн бөгөөд "espeak" хэрэгслийг ашиглахад энэ нь жаахан англи хэл шиг сонсогдож байсан. Яг л малчин эсвэл хөлчний нэгэн адил. Энэ бол эцсийн зорилго: энэ төслийг ашигтай зүйл болгон хувиргах явдал юм. Тиймээс "Уоллес".

Уоллес эргэн тойрондоо хөдөлж чаддаг, тэрээр хэт улаан туяаны зайны мэдрэгч ашиглан саад бэрхшээлээс зайлсхийж чаддаг (саяхан тэд ямар нэгэн байдлаар шарсан (?) (Надад боломж олдвол үүнийг анхаарч үзэх хэрэгтэй), мөн акустик зайны мэдрэгчтэй (эдгээрийн гурав нь муу байсан) цаг, MCP23017 өргөтгөлийн хамт), мөн эцэст нь ямар нэгэн зүйлд мөргөлдөхийг мэдэхийн тулд моторын гүйдлийн өөрчлөлтийг илрүүлж чаддаг.

Мэдрэгчээс гадна Уоллес 100 хөдөлгөөнийг "санаж", хөдөлгөөний түүхийг ашиглан анхан шатны анализ хийдэг.

Уоллесийн зорилго бол зөвхөн урагшлахыг хичээх бөгөөд энэ нь хэзээ нэгэн цагт давтагдах хэв маягаар (жишээлбэл буланд) гацчихаад үнэхээр урагшлахгүй байхыг мэдэх явдал юм.

Би хөдөлгөөн, навигацийн хувьд хэд хэдэн давталт хийсэн бөгөөд толгой эргэх үед тогтмол толгой өвдөж байсан.

Уоллес бол хянадаг робот тул би програм хангамжид илүү хялбар байлгахыг хүссэн (дараа нь), түүнийг эргүүлэхийн тулд би түүнийг зүгээр л эргүүлэх/эргүүлэхийг хүссэн. Тиймээс моторуудад тэнцүү боловч эсрэг хүч / үүргийн мөчлөгийг хэрэглэнэ.

Асуудал нь Agent 390 робот платформыг зохион бүтээсэнтэй холбоотой юм. Замын бүс нь хажуу тийшээ үрэх хандлагатай байдаг. Хамгийн муу нь нэг тал нөгөөгөөсөө илүү ихийг хийдэг.

Шал, шулуун явахад энэ нь ямар ч асуудалгүй байсан. Энэ нь хивсэн дээр харагдаж байна. Би Уоллесыг хивсэнцэрээс нь барзгар болгосноос нь хол байлгахыг сонгосон (тэд маш амархан шороо авдаг).

Бодит асуудал бол шалан дээр эргэлдэх явдал юм.

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

Асуудал нь навигацийн явцад гарч, саад бэрхшээлээс холуур эсвэл хол явах үед гарч ирдэг. Энэ нь хэтэрхий зэрлэг хол зугтах, эсвэл үнэхээр хөдлөхгүйгээр маш бага ээлжийн ээлжинд гацах болно.

Дээрх тайлбар нь энэхүү зааварчилгааг өдөөсөн юм.

Эхэндээ би хөдөлгөөн мэдрэгч төхөөрөмж (IMU) нэвтрүүлэхээс татгалзах эсвэл хойшлуулахыг хүсч байсан, учир нь тэд A) төвөгтэй, B) чимээ шуугиантай, C) алдаануудыг цаг хугацааны явцад нэвтрүүлж болно гэх мэт. нисэх үеийн IR лазер мэдрэгч рүү үсрэх замаар бид маш сайн ажиллаж чадна. Мөн бид лазер ашиглан робот эргэж байгаа эсэхийг эргүүлэн харж, зайны өөрчлөлтийг ажиглаж болно.

Үнэн хэрэгтээ бид үүнийг акустик мэдрэгчтэйгээр одоо хийж болно.

Гэсэн хэдий ч энэ бүхэн бол "бид сэлгээ хийсэн үү, үгүй юу?" Гэсэн нэг энгийн асуултанд хариулах маш шууд бус, төвөгтэй арга юм.

ToF лазер мэдрэгчийг ашиглахын тулд үсрэх нь намайг дараагийн програм хангамжийн түвшинд хүргэх болно гэж надад санагдсан; тухайлбал, SLAM (нэгэн зэрэг нутагшуулалт ба зураглал). Би тийшээ очиход хараахан бэлэн болоогүй байна.

Эхний (доод) давхаргууд нь илүү хялбар, сүүлийн (дээд) давхаргууд нь илүү хийсвэр байж, илүү төвөгтэй асуудлыг шийдвэрлэх замаар роботын төслийг давхаргаар хийх нь сайн хэрэг юм.

Давхаргыг дараах байдлаар бодож болно.

  1. роботын физик хүрээ / механик бүтцийн үндэс
  2. энгийн хөтөч систем (Raspberry, Roboclaw, мотор, кабель гэх мэт, үндсэн програм хангамж, гар дээр ажилладаг)
  3. мэдрэгчийг дэмжих чухал хэлхээ (хоёр чиглэлтэй хүчдэл шилжүүлэгч, порт өргөтгөгч, E-Stop, цахилгаан хуваарилах гэх мэт)
  4. саад бэрхшээлээс зайлсхийх мэдрэгч (акустик, IR)
  5. чухал, үндсэн байршил ба хөдөлгөөн - илрүүлэх (акселерометр, гиро, соронз хэмжигч, мотор кодлогч, дугуй кодлогч)

Та өөрийн жагсаалтаа гаргаж болно. Энэ жагсаалтын гол зүйл бол та эдгээр дарааллыг бага багаар хийх ёстой бөгөөд хэрэв та давхарга бүрт хэсэг хугацаанд сайн ажиллах төлөвт оруулах юм бол бүх зүйл илүү төвөгтэй болох тусам энэ нь танд туслах болно.

Дээрх жагсаалтыг програм хангамжийн эдгээр ойлголтын давхаргуудтай их бага хэмжээгээр харьцуулж болно.

  • SLAM (нэгэн зэрэг нутагшуулалт ба зураглал)
  • Хөдөлгөөний хяналт ба ухамсар, эргэлт
  • Саад бэрхшээлээс зайлсхийх үндсэн зарчим
  • Мэдрэгчийн өгөгдлийг хянах, илрүүлэх
  • Үндсэн хөдөлгөөн урагш, хойш, зүүн, баруун, хурдасгах, удаашруулах, зогсоох

Таны харж байгаагаар энэ жагсаалтын хувьд эхний зүйлүүд нь "Би хаана байна", "Би хаашаа явж байна" гэх мэт илүү хийсвэр асуудал, асуултуудыг шийдвэрлэх дээд, илүү төвөгтэй давхаргууд байх болно. "А мэдрэгчийг хэрхэн ярих/сонсох" эсвэл "энэ хүрдийг хэрхэн хөдөлгөх" -ийг зохицуулдаг програм хангамжийн доод давхаргууд.

Одоо, хэрэв та давхаргаас эхэлмэгц үүнийг дуусгаад дараа нь өмнөх давхаргад хэзээ ч эргэж орохгүй бол дараагийн давхарга дээр байна гэж би хэлэхгүй байна. Роботын төсөл нь орчин үеийн, давтагддаг програм хангамж хөгжүүлэх аргуудтай (уян хатан, SCRUM гэх мэт) төстэй байж болно.

Би тус бүрдээ цаг гаргаарай гэж хэлээд байгаа юм. Та тус бүрдээ хичнээн ихийг хийхээ тэнцвэржүүлж, тодорхой давхаргад цаг хугацаа, зовлон зүдгүүрээр юу хийх гэж байгаагаа шийдэх хэрэгтэй болно.

Өрсөлдөж буй хоёр санаа, чиглэл хооронд тодорхой "зөрчилдөөн" эсвэл "хурцадмал байдал" байдаг.

А асуудлыг шийдэхийн тулд би үүнийг "plug-n-play" гэж нэрлэх болно.

Нөгөөх нь DIY (өөрөө хий). Энэ нь энэ санааны хамгийн сайн шошго биш байж магадгүй юм.

Тус бүрийн жишээ энд байна, та хоёр сонголтын хоорондох хурцадмал байдал эсвэл зөрчилдөөнийг харах болно гэж найдаж байна.

Энэ жишээн дээр SLAM, саад бэрхшээлээс зайлсхийх, үндсэн хөдөлгөөнийг нэг дор шийдэх нэг асуудлыг шийдье.

  1. Хэрэв бид plug-n-play маршрутаар явахаар шийдсэн бол тэр даруйдаа (төсвөөс хамаарч) тэдгээрт суурилагдсан эргэдэг лазер, талбайн гүнзгийрүүлсэн камер, ToF лазер, IMU гэх мэт зүйл рүү шууд ордог. Зааварлах боломжтой).
  2. Хэрэв бид нөгөө замаар явахыг хүсч байвал зарим акустик мэдрэгч эсвэл хэт улаан туяаны мэдрэгч, эсвэл огт мэдрэгчгүй байж болох бүх мэдээллийг гаргаж авахыг оролдож магадгүй - бид зөвхөн моторын гүйдлийн хяналтыг ашигладаг.

#1 ба #2 -ийн талаар юу хэлэх вэ? 2 -р зүйлийг хийснээр бид илүү их зүйлийг сурч мэдэх болно. Зөвхөн акустик мэдрэгчтэй ажиллах хязгаарлалт нь биднийг өөр олон зүйлийн талаар бодоход хүргэдэг.

Нөгөө талаар, хэрэв бид 2 -р зүйлээр дамжуулан хэт их анхаарлаа төвлөрүүлж чадвал бид акустик мэдрэгчээс илүү ихийг хүсч байгаа тул цаг алдаж магадгүй юм.

Бодох бас нэг ойлголт эсвэл санаа: Техник хангамж, програм хангамжийн аль холимог нь "яаж" гэсэн асуултанд хамгийн сайн хариулдаг, ямар програм хангамж (ба техник хангамж?) Нь "юу", "хэзээ", "хаана" гэсэн асуултанд хамгийн сайн хариулдаг.. Яагаад гэвэл "яаж хийх вэ" гэдэг нь хариулт авахын тулд "юу", "хэзээ", "хаана" гэсэн асуултаас хамаардаг доод түвшний асуулт юм.

Юутай ч дээр дурдсан бүхэн зүгээр л бодох ёстой зүйл байв.

Миний хувьд, маш их хүчин чармайлт гаргаж, тууштай үрэлтийн асуудалтай тулгарч, тууштай хяналт, хөдөлгөөнийг авч чадахгүй байгаа бол өөр зүйл хийх цаг болжээ.

Тиймээс энэ зааварчилгаа нь IMU юм.

Зорилго нь хэрэв ОУХБ -аас робот эргэдэггүй гэж хэлвэл бид ажлын мөчлөгийг нэмэгдүүлэх болно. Хэрэв бид хэт хурдан эргэж байвал бид ажлын мөчлөгийг бууруулдаг.

Алхам 1: IMU мэдрэгч

IMU мэдрэгч
IMU мэдрэгч
IMU мэдрэгч
IMU мэдрэгч

Тиймээс Уоллест нэмж оруулах бидний дараагийн мэдрэгч бол ОУХБ юм. Бага зэрэг судалж үзээд би MPU6050 дээр суурьшиж байлаа. Гэхдээ энэ үед MPU9050 (тэр ч байтугай саяхан MPU9250) нь бүр илүү сайн санаа мэт санагдсан.

Миний очих эх сурвалж бол Амазон (АНУ-д) байсан. Тиймээс би хоёрыг захиалсан.

Миний олж авсан зүйл бол (үүнд хяналт байхгүй юм шиг байна, энэ бол Амазоны надад таалагдахгүй байгаа зүйл) хоёр MPU92/65 байсан. Тэмдэгтийн талаар би жаахан гайхаж байна. Зургийг анхаарч үзээрэй; Энэ нь "гэр бүлийн" нэр томъёо юм шиг байна. Ямар ч байсан энэ л миний гацсан зүйл.

Үүнийг нэмэх нь маш энгийн -холбох замтай прото самбар авах, мэдрэгчийг гагнах, 10 зүү шураг терминал блок нэмэх (би Пололугаас авсан).

Аливаа хөндлөнгийн оролцоог багасгахын тулд би эдгээр мэдрэгчүүдийг бусад бүх зүйлээс хол байрлуулахыг хичээсэн.

Энэ нь мөн Nylon боолт/самар ашиглах гэсэн үг юм.

Би I2C протоколыг ашиглах болно. Нийт утасны урт тийм ч муу биш байх гэж найдаж байна.

Үндсэн холболт, хүчдэлийн түвшин гэх мэт бусад олон мэдээлэл байгаа тул би үүнийг энд давтахгүй.

Алхам 2: Аливаа зүйл үргэлж цэвэрхэн байдаггүй

Энэ бичлэг дээр энэ тодорхой MPU-92/65-ийн хувьд онлайнаар тийм ч их байдаггүй бололтой. Ихэнх мэдрэгчтэй адил боломжтой зүйл бол Arduino -ийг ашигладаг жишээ юм шиг санагддаг.

Би эдгээр зааварчилгааны хэрэгслүүдийг арай өөр болгохыг хичээдэг, учир нь бүх зүйл тэр дороо ажилладаггүй.

Эдгээр зааварчилгаа нь A-B-C гэхээсээ илүү блогтой илүү төстэй гэж би бодож байна, 1-2-3 "үүнийг ингэж хийдэг".

Алхам 3: Анхны шалгалт

Анхны шалгалт
Анхны шалгалт
Анхны шалгалт
Анхны шалгалт

Өмнөх алхам дээрх зургуудаас харахад мэдрэгч рүү чиглэсэн улаан, хар утас нь мэдээж VCC (5V) ба GND юм. Ногоон, шар өнгийн утаснууд нь I2C холболтууд юм.

Хэрэв та I2C -ийн бусад төслүүдийг хийж байсан эсвэл эдгээр цувралыг дагаж байсан бол та "i2cdetect" -ийн талаар аль хэдийн мэдэж байсан бөгөөд энэ нь Raspberry шинэ мэдрэгчийг харж чадах эсэхийг мэдэх эхний алхам юм.

Энэ алхам дээрх зургуудаас харахад бидний анхны оролдлого амжилтгүй болсон. IMU харагдахгүй байна (төхөөрөмжийн ID 0x68 байх ёстой).

Гэсэн хэдий ч I2C автобус ажиллаж байгаа нь сайн мэдээ юм. Бид 0x20 гэсэн нэг төхөөрөмжийг харж байгаа бөгөөд энэ нь MCP23017 порт өргөтгөгч юм (одоогоор HCSR04 акустик мэдрэгчийг хариуцдаг).

Зураг дээр харахад тийм ч хялбар биш, гэхдээ би ижил өнгийн ногоон, шар өнгийн утаснуудыг IMU -аас MCP23017 руу холбосон (зурагны зүүн доод хэсгийг үзнэ үү)

Бид зарим алдааг олж засварлах хэрэгтэй болно.

Алхам 4: Алдааг олж засварлах

Image
Image
Алдааг олж засварлах
Алдааг олж засварлах
Алдааг олж засварлах
Алдааг олж засварлах

Вольтметр (өндөр давтамжтай) дээрх тасралтгүй байдлын тохиргоог ашиглан би VCC (5V), GND, SDA, SCL холболтыг туршиж үзсэн. Эдгээр нь сайн байсан.

Дараагийн оролдлого нь MCP23017-ийг I2C автобуснаас салгаж, зөвхөн MPU-92/65 автобусанд үлдээх явдал байв. Энэ нь үр дүнгүй болсон нь "i2cdetect" дараа нь ямар ч төхөөрөмж харуулаагүй болно.

Тиймээс, дараа нь би мэдрэгчийг тотем шонгоос салгаж, 5В-аас 3В хүртэл хоёр чиглэлтэй автобус руу шууд холбов. өөрөөр хэлбэл шууд бөөрөлзгөнө рүү. (богино утас?).

Мөн voila. Энэ удаад амжилт байна. "I2cdetect" ашиглан 0x68 гарч ирэхийг бид харж байна.

Гэхдээ энэ удаад яагаад ажилласныг бид одоогоор мэдэхгүй байна. Утасны урт байж болох уу? Өмнөх байршил?

Тэмдэглэл: ADO нь газардсан эсэхээс үл хамаарна. Самбар дээр татах ба татах резистор байж болно. Үүнтэй ижил зүйл FSYNC -ийн хувьд үнэн байж магадгүй юм.

Дараа нь би MCP23017-ийг дахин холбосон. Тиймээс одоо I2C автобусанд хоёр төхөөрөмж байна. (зургийг үзнэ үү). Амжилттай, одоо бид 0x20 болон 0x68 хоёуланг нь i2cdetect ашиглан харж байна.

Видео бичлэгүүд нь алдааг олж засварлах явцад болсон үйл явдлын талаар илүү дэлгэрэнгүй өгүүлдэг.

Алхам 5: Мэдрэгчийн өгөгдлийг унших

Image
Image
Мэдрэгчийн өгөгдлийг унших
Мэдрэгчийн өгөгдлийг унших
Мэдрэгчийн өгөгдлийг унших
Мэдрэгчийн өгөгдлийг унших

Янз бүрийн хандлага

Мэдрэгчээс хэрэгтэй мэдээлэл авахын тулд би олон аргыг ашиглахаар шийдсэн. Энд тэд ямар ч дарааллаар биш байна:

  1. үндсэн програмчлалыг туршиж үзээрэй
  2. Бүртгэлийн талаархи зарим онлайн баримт бичгийг үзнэ үү
  3. Бусдын жишээ болон / эсвэл кодыг үзээрэй

Эдгээр хандлага яагаад? Яагаад одоо байгаа номын сан эсвэл код хайж болохгүй гэж?

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

Түүнчлэн, бид өөрсдийн санаа бодлоороо тоглож, туршиж үзээд, ойлголттой болсныхоо дараа бид хэн нэгний код эсвэл номын санг үнэлэх боломжтой болно.

Жишээлбэл, github дахь MPU9250 -ийн C ++ кодыг хараад энэ нь намайг хийхийг хүсээгүй байгаа тасалдал ашиглахад хүргэж байгааг би ойлгосон.

Түүнчлэн, энэ нь шалгалт тохируулга гэх мэт нэмэлт зүйлүүд дагалддаг; Дахин хэлэхэд миний хараахан сонирхдоггүй зүйл.

Магадгүй "робот тийм эсвэл үгүй эргэдэг" гэсэн энгийн асуултанд хариулахын тулд миний хийх ёстой зүйл бол зарим бүртгэлийг уншихад л маш энгийнээр хариулж болох юм.

Бүртгүүлэх

Энэ бичлэг дээр энэ мэдрэгч дээр тийм ч их боломж байхгүй юм шиг байна. Үнэн хэрэгтээ, хэрэв та энэхүү зааварчилгааны хамт ирдэг зургуудыг хараад, бодит чип дээрх бичээсүүдийг сайтар ажиглавал энэ нь тогшсон зүйл биш гэж үү гэсэн бодол надад төрүүлнэ. Би харсан зүйлээ Invense -ээс ямар нэгэн зүйлтэй холбоогүй юм. Гэсэн хэдий ч би олсон загваруудын бүртгэлийн мэдээллийг харахыг сонгосон: MPU-6050 ба MPU-9250.

Аль ч тохиолдолд дараахь зүйл хоёуланд нь адилхан байна. Эхлээд энэ MPU-92/65-тэй ижил байх болно гэж бид бодож байна.

59 -аас 64 хүртэл - акселерометрийн хэмжилт

65, 66 - температурын хэмжилт 67-72 - гироскопын хэмжилт 73-96 - гадаад мэдрэгчийн мэдээлэл

Анхаарах зүйл: MPU-6050 нь соронзон хэмжүүргүй юм шиг харагдаж байгаа бол MPU-9250 (мөн бид үүнийг бас тооцдог) төхөөрөмжтэй.

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

Магнитометрийн мэдээлэл:

соронзон хэмжүүрийн id: 0x48 00 -ээс 09: 00 хүртэл бүртгэдэг WIA 0 1 0 0 1 0 0 0 01H INFO INFO7 INFO6 INFO5 INFO4 INFO3 INFO2 INFO2 INFO1 INFO0 02H ST1 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 Hz8 HZ8 HZ8 HZ8 HZ1 ST2 0 0 0 BITM HOFL 0 0 0 Бүртгэл бүрийн утгыг задлах: HXL [7: 0]: X тэнхлэгийн хэмжилтийн өгөгдөл 8bit HXH [15: 8]: X тэнхлэгийн хэмжилтийн өгөгдөл илүү өндөр 8bit HYL [7: 0]: Y тэнхлэгийн хэмжилтийн өгөгдөл доогуур 8bit HYH [15: 8]: Y тэнхлэгийн хэмжилтийн өгөгдөл өндөр 8bit HZL [7: 0]: Z тэнхлэгийн хэмжилтийн өгөгдлийн доод 8bit HZH [15: 8]: Z тэнхлэгийн хэмжилтийн өгөгдөл илүү өндөр 8 бит

Програмчлал

Бүртгэлийн баримт бичгийн өөр нэг мэдээлэл бол ердөө 100 орчим бүртгэл байгаа юм шиг санагддаг. Тиймээс нэг тактик нь төхөөрөмжид ханддаг энгийн програм бичих (0x68) бөгөөд ямар өгөгдлийг харж болохыг харахын тулд хэд хэдэн бүртгэлийг дараалан уншихыг оролдож болно.

Дараа нь ижил кодыг ашиглан дараалсан дамжуулалт хийж, нэг дамжуулалтаас авсан өгөгдлийг дараагийнхтай харьцуулж үзээрэй.

Бид ямар ч өгөгдөлгүй (тэг эсвэл FF?) Эсвэл огт өөрчлөгддөггүй бүх бүртгэлийг устгаж магадгүй юм.

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

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

Би wiringPi номын санг аль болох ашиглах дуртай. Энэ нь I2C -ийг дэмждэг.

Эхний гүйлт:

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

* барих: gcc first.test.mpu9265.c -o first.test.mpu9265 -lwiringPi * * ажиллуулах: sudo./first.test.mpu9265 * * энэ програм нь MCP23017 -аас хэд хэдэн (боломжтой) регистрүүдийг гаргадаг., *, дараа нь MPU9265 (эсвэл өөр 0x68 хаяг дээрх бусад MPU) * * * Би MCP23017 -д итгэж байсан болохоор мэдрэгчээс унших боломжтой эсэхийг баталгаажуулахад ашигласан. ************************************************ ****************************/ #include #include #include #include #include int main (int argc, char ** argv) {put ("MCP23017 @ 0x20 юу гэж хэлснийг харцгаая:"); errno = 0; int deviceId1 = 0x20; int fd1 = wiringPiI2CSetup (deviceId1); if (-1 == fd1) {fprintf (stderr, "WiringPi I2C төхөөрөмжийг нээж чадахгүй байна: %s / n", strerror (errno)); буцах 1; } (int reg = 0; reg <300; reg ++) {fprintf (stderr, "%d", wiringPiI2CReadReg8 (fd1, reg)); fflush (stderr); саатал (10); } тавьдаг (""); put ("MPU9265 @ 0x20 юу гэж хэлснийг харцгаая:"); errno = 0; int deviceId2 = 0x68; int fd2 = wiringPiI2CSetup (deviceId2); if (-1 == fd2) {fprintf (stderr, "WiringPi I2C төхөөрөмжийг нээж чадахгүй байна: %s / n", strerror (errno)); буцах 1; } (int reg = 0; reg <300; reg ++) {fprintf (stderr, "%d", wiringPiI2CReadReg8 (fd2, reg)); fflush (stderr); саатал (10); } тавьдаг (""); буцаах 0; }

Хоёр дахь гүйлт:

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

* to build: gcc second.test.mpu9265.c -o second.test.mpu9265 -lwiringPi * * ажиллуулах: sudo./second.test.mpu9265 * * Энэ програм нь уншсан утгын хамт регистрийн дугаарыг гаргадаг. * * Энэ нь гаралтыг файл руу дамжуулах (дахин чиглүүлэх) ач холбогдолтой бөгөөд дараа нь харьцуулахын тулд хэд хэдэн гүйлт хийж болно. Энэ нь ямар бүртгэл чухал болохыг, өгөгдөл хэрхэн ажиллах талаар тодорхой ойлголт өгөх болно. ************************************************ ****************************/ #include #include #include #include #include #include int main (int argc, char **) argv) {int deviceId = -1; if (0) {} if if (! strncmp (argv [1], "0x20", strlen ("0x20"))) {deviceId = 0x20; } өөр бол (! strncmp (argv [1], "0x68", strlen ("0x68"))) {deviceId = 0x68; } өөр бол (! strncmp (argv [1], "0x69", strlen ("0x69"))) {deviceId = 0x69; } put ("MPU9265 @ 0x20 юу гэж хэлснийг харцгаая:"); errno = 0; int fd = wiringPiI2CSetup (deviceId); if (-1 == fd) {fprintf (stderr, "WiringPi I2C төхөөрөмжийг нээж чадахгүй байна: %s / n", strerror (errno)); буцах 1; } for (int reg = 0; reg <300; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); саатал (10); } буцаах 0; }

Гурав дахь гүйлт:

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

* to build: gcc third.test.mpu9265.c -o гурав дахь.test.mpu9265 -lwiringPi * * ажиллуулах: sudo./third.test.mpu9265 * * Энэ програм нь хоёр дахь програмын үр дүн юм. Энэ нь зөвхөн нэг бүртгэлээс нөгөө гүйлтийн хоорондох ялгааг харуулсан * бүртгэлээс уншдаг.************************************************ ****************************/ #include #include #include #include #include #include int main (int argc, char **) argv) {int deviceId = -1; if (0) {} if if (! strncmp (argv [1], "0x68", strlen ("0x68"))) {deviceId = 0x68; } өөр бол (! strncmp (argv [1], "0x69", strlen ("0x69"))) {deviceId = 0x69; } put ("MPU9265 @ 0x20 юу гэж хэлснийг харцгаая:"); errno = 0; int fd = wiringPiI2CSetup (deviceId); if (-1 == fd) {fprintf (stderr, "WiringPi I2C төхөөрөмжийг нээж чадахгүй байна: %s / n", strerror (errno)); буцах 1; } for (int reg = 61; reg <= 73; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); саатал (10); } for (int reg = 111; reg <= 112; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); саатал (10); } for (int reg = 189; reg <= 201; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); саатал (10); } for (int reg = 239; reg <= 240; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); саатал (10); } буцаах 0; }

Тэгэхээр бид одоог хүртэл юу сурсан бэ? Өнгөөр тодруулсан хэсгүүдтэй хүснэгтийн зураг нь гаралт нь эхний регистрүүдийн багцтай тохирч байгааг харуулж байна.

Одоогийн үр дүн нь шинэ асуулт үүсгэж болзошгүй юм.

Асуулт: яагаад "гадаад" бүлгийн бүртгэлийн ганцхан үр дүн байдаг вэ?

Асуулт: эдгээр үл мэдэгдэх бүртгэлүүд юу вэ? "??????"

Асуулт: Хөтөлбөр нь тасалдалгүй тул өгөгдлийг хэт удаан шаардсан уу? хэтэрхий хурдан?

Асуулт: Мэдрэгч ажиллаж байх үед ямар нэгэн зүйлийг туршиж үзэх замаар бид үр дүнд нөлөөлж чадах уу?

Алхам 6: Уншлага / өгөгдлийг илүү нарийвчлан судалж үзье

Бусад зүйлээс өмнө хийх дараагийн алхам бол програмыг сайжруулах явдал юм.

  • хэр их гогцоо саатах уян хатан байх (ms)
  • Нэг бүртгэлд хичнээн уншилт өгөх талаар уян хатан байх

(Би програмыг файл хэлбэрээр хавсаргах ёстой байсан. Үүнийг энд оруулахад асуудал гарсан юм шиг санагдсан. "4th.test.mpu9265.c")

Сүүлийн 10 уншилтыг дунджаар 10 мс -ийн давталтаар ашигласан гүйлт:

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

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

61, 69, 71, 189, 197, 199 регистрүүд нь зөвхөн хоёртын хэлбэртэй, эсвэл бэлэн / бэлэн биш эсвэл 16 битийн утгын өндөр байт (сөрөг?) Юм шиг харагдаж байна.

Бусад сонирхолтой ажиглалтууд:

  • бүртгэлүүд 65, 193 - маш тогтвортой, ижил утгатай
  • бүртгэл 63, 191 - маш тогтвортой, ижил утгатай
  • бүртгэл 73, 112, 195, 201, 240 - бүгд тэг байна

Эдгээр ажиглалтыг өмнөх олон өнгийн, тодруулсан хүснэгтийн зурагтай холбож үзье.

Бүртгүүлэх 65 - температур

Бүртгүүлэх 193 - ??????

Бүртгүүлэх 63 - хурдасгуур

Бүртгүүлэх 191 - ??????

Бүртгүүлэх 73 - гадаад

112 ба түүнээс хойш бүртгүүлэх - ??????

Бидэнд үл мэдэгдэх зүйл байсаар байгаа боловч бид хэрэгтэй зүйлийг сурсан.

Бүртгүүлэх 65 (температур) ба бүртгэл 63 (акселерометр) хоёулаа маш тогтвортой байсан. Энэ бол бидний хүлээж байсан зүйл юм. Би мэдрэгч дээр гар хүрээгүй; робот миний компьютертэй нэг ширээн дээр амарч байгаа тул санамсаргүй чичиргээнээс өөр хөдөлгөөн хийхгүй байна.

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

Алхам 7: Бид температур ба хурдатгалд нөлөөлөх чадвартай

Өмнөх алхамуудад бид дор хаяж нэг температур, хурдатгалын бүртгэлийг багасгасан.

Хөтөлбөрийн энэ дараагийн хувилбарыг ("5th.test.mpu9265.c") ашигласнаар бид хоёр бүртгэлийн хувьд өөрчлөлт гарч байгааг харж байна. Видео бичлэгүүдийг үзээрэй.

Илүү ухах

Хэрэв бид буцаж очоод бүртгэлийн мэдээллийг харвал дараахь зүйлс байгааг бид харж байна.

  • гироскопын 16 битийн гурван гаралт
  • хурдатгал хэмжигчийн 16 битийн гурван гаралт
  • соронзон хэмжигчийн 16 битийн гурван гаралт
  • температурын хувьд 16 битийн гаралт

Гэсэн хэдий ч бидний энгийн туршилтын програмуудын олж авсан үр дүн нь дан ганц 8 битийн гаралт байв. (ганц бүртгэл).

Тиймээс ижил аргыг илүү их туршиж үзье, гэхдээ энэ удаад 8 биш 16 битийг уншаарай.

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

// файлын тодорхойлогч fd авах …

int tempRegHi = 65; int tempRegLo = 66; int hiByte = wiringPiI2CReadReg8 (fd, tempRegHi); int loByte = wiringPiI2CReadReg8 (fd, tempRegLo); int үр дүн = hiByte << 8; // Сайн байна уу 8 битийг 16 битийн үр дүнгийн дээд хэсэгт оруулна уу = = loByte; // одоо дарааллаар нь 8 бит нэмж, 16 битийн бүрэн тоог гаргана // энэ дугаарыг хэвлэх эсвэл дэлгэцийн хэвтээ график функцийг ашиглах.

Өмнөх алхмуудаас харахад бүртгэл 65 нь нэлээд тогтвортой, харин регистр 66 нь маш их чимээ шуугиантай байгааг бид харсан. 65 нь сайн захиалгын байт, 66 нь бага захиалгын байт тул утга учиртай болно.

Уншихын тулд бид бүртгэлийн 65-ийн өгөгдлийг байгаагаар нь авч болох боловч бүртгэлийн 66-ийн утгыг дунджаар гаргаж авах боломжтой.

Эсвэл бид бүхэл бүтэн үр дүнг дундажлаж чадна.

Энэ хэсгийн сүүлийн видеог үзээрэй; Энэ нь 16 битийн температурын утгыг бүхэлд нь уншиж байгааг харуулж байна. Код нь "зургаа дахь.test.mpu9265.c"

Алхам 8: Акселерометр ба гироскоп

Image
Image

Энэ хэсгийн видеонууд нь "seventh.test.mpu9265.c" тестийн програм ашиглан акселерометр болон гироскопын гаралтыг харуулдаг. Энэ код нь 1, 2, 3 дараалсан байт-хосыг (hi болон lo байт) уншиж, утгыг нэг 16 битийн утга болгон хөрвүүлдэг. Тиймээс бид ямар ч нэг тэнхлэгийг уншиж болно, эсвэл бид хоёуланг нь хамт уншиж болно (мөн өөрчлөлтийг нэгтгэдэг), эсвэл бид гурвыг нь уншиж болно (мөн өөрчлөлтийг нэгтгэдэг).

Дахин хэлэхэд, энэ үе шатанд, энэ зааварчилгааны хувьд би "робот эргэлдэж/эргэсэн үү?" Гэсэн энгийн асуултанд хариулахыг хүсч байна. Би 90 градус эргэсэн гэх мэт нарийн утгыг хайдаггүй. Энэ нь SLAM-ийг хийж эхлэхэд л ирэх болно, гэхдээ энэ нь энгийн саад бэрхшээлээс зайлсхийх, санамсаргүй хөдөлгөөн хийхэд шаардлагагүй юм.

Алхам 9: (ажиллаж байна) соронзон хэмжигч

i2cdetect хэрэгслийг ашиглах үед MPU9265 нь хүснэгтэд 0x68 хэлбэрээр харагдана.

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: -- -- -- -- -- -- -- --

IMU -ийн соронзон хэмжигч хэсгийг уншихын тулд нэмэлт алхамуудыг хийх шаардлагатай байна.

PDF doc -ийг Invesense бүртгэлээс:

БҮРТГЭГЧИД 37-39 - I2C БОЛ 0 ХЯНАЛТ

  • БҮРТГЭХ 37 - I2C_SLV0_ADDR
  • БҮРТГЭХ 38 - I2C_SLV0_REG
  • БҮРТГЭХ 39 - I2C_SLV0_CTRL

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