Мазмуну:

Уоллес - DIY автономдуу роботу - 5 -бөлүк - ӨИК кошуу: 9 кадам
Уоллес - DIY автономдуу роботу - 5 -бөлүк - ӨИК кошуу: 9 кадам

Video: Уоллес - DIY автономдуу роботу - 5 -бөлүк - ӨИК кошуу: 9 кадам

Video: Уоллес - DIY автономдуу роботу - 5 -бөлүк - ӨИК кошуу: 9 кадам
Video: Почему вам стоит захотеть беспилотные автомобили на дорогах уже сейчас 2024, Ноябрь
Anonim
Image
Image

Биз Уоллес менен бирге бара жатабыз. Уоллес аты "Wall-E" аралашмасынан жана мурунку долбоордон (үн таануу) келип чыккан жана "espeak" утилитасын колдонгондо, ал бир аз британдык болуп чыкты. Жана валет же батлер сыяктуу. Жана бул акыркы максат: бул долбоор пайдалуу нерсеге айланышы үчүн. Ошентип "Уоллес".

Уоллес айлана алат, ал IR аралык сенсорлорун колдонуп тоскоолдуктардан кача алат (жакында, кандайдыр бир жол менен алар куурулган (?) (Мүмкүнчүлүк болгондо муну караш керек), ошондой эле кээ бир акустикалык аралык сенсорлору бар (ошол эле учурда үчөө начар кетти) убакыт, MCP23017 экспантери менен бирге), жана акыры, бир нерсеге урунганын билүү үчүн мотор токунун өзгөрүшүн аныктай алат.

Сенсорлордон тышкары, Уоллес 100 кыймылын "эстеп", кыймылдын тарыхын колдонуп, анча -мынча анализге ээ.

Уоллестин максаты азырынча алдыга карай умтулуу жана анын кайталануучу калыпка (мисалы, бурчка) илинип калганын жана чындыгында алдыга жылбай турганын билүү.

Мен кыймыл жана чабыттоо үчүн бир нече жолу кайталап көрдүм жана ырааттуу баш оору айлануу учурунда болду.

Уоллес көзөмөлгө алынган робот болгондуктан, мен программалык камсыздоону (кийинчерээк) жөнөкөйлөтүүнү каалагандыктан, буруш үчүн, мен аны буруп/буруп койгом. Ошентип, моторлорго бирдей, бирок карама -каршы күч / милдет циклин колдонуңуз.

Түшкөн көйгөй Agent 390 робот платформасынын дизайнына байланыштуу. Трассанын курлары эки жакты сүртөт. Андан да жаманы, бир тарап экинчи тарапка караганда көбүрөөк иш кылат.

Полдо жана түз бара жатканда, бул көйгөй болгон жок. Бул килемде көрүнөт. Мен Уоллести тректери караңгылап кеткенден кийин килемден алыс кармоону чечтим (алар кирди абдан оңой алышат).

Чыныгы көйгөй - полго бурулуп жатканда.

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

Көйгөй навигация учурунда жана тоскоолдуктардан айланып же алыстап кетүүдө көрүнөт. Ал өтө эле алыстап кетиши мүмкүн, же чын эле кыймылдабай туруп, өтө кичине жылыштарга аракет кылып тыгылып калышы мүмкүн.

Ошентип, жогорудагы түшүндүрмө бул Нускамага түрткү болду.

Башында мен кыймыл сезгичти (IMU) киргизүүдөн баш тартууну же кечиктиргим келген, анткени алар A) татаал, B) ызы-чуу, C) каталар убакыттын өтүшү менен киргизилиши мүмкүн, ж.б. Учуу убактысынын IR лазердик сенсорлоруна секирүү менен биз абдан жакшы иштей алдык. Жана биз лазерди колдонуп, роботтун айланганын же айланбаганын алыстагы өзгөрүүлөрдү байкоо аркылуу биле алабыз.

Чынында, биз муну акустикалык сенсорлор менен азыр да жасай алмакпыз.

Бирок, мунун баары бир жөнөкөй суроого жооп берүүнүн өтө кыйыр жана татаал жолу: "биз ротация кылдыкпы же жокпу?"

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

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

Катмарлар мындай нерсе жөнүндө ойлонсо болот:

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

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

Жогорудагы тизме программалык камсыздоонун ушул концептуалдык катмарларына аздыр -көптүр картага түшүшү мүмкүн.

  • SLAM (Бир убакта локалдаштыруу жана картага түшүрүү)
  • Кыймылды көзөмөлдөө жана маалымдоо, ротация
  • Негизги тоскоолдуктардан качуу
  • Сенсордук маалыматтарды көзөмөлдөө жана аныктоо
  • Негизги Кыймыл Алга, Артка, Солго жана Оңго, Ылдамдатуу, Акырындатуу, Токтоо

Көрүнүп тургандай, бул тизмеде биринчи пункттар "мен кайдамын" жана "мен кайда баратам" сыяктуу абстракттуу маселелерди жана суроолорду чечүүчү жогорку, татаал катмарлар болмок, ал эми акыркы нерселер "А сенсорун кантип сүйлөө/угуу" же "бул дөңгөлөктү кантип жылдыруу керек" дегенди камтыган төмөнкү программалык катмарлар.

Эми, мен сиз катмарда баштаганда, сиз аны бүтүрдүңүз деп айтпайм жана ал кийинки катмарда, эч качан мурункусуна кайтпайт. Робот долбоору заманбап, кайталануучу программалык камсыздоону иштеп чыгуу ыкмаларына окшош болушу мүмкүн (шамдагай, SCRUM ж. Б.).

Мен ар бирине убакыт бөлүүнү айтып жатам. Сиз ар биринде канча жасоо керектигин таразалашыңыз керек, жана сиз убакыт жана кыйынчылыкка татыктуу болгон кайсы бир катмарда аракет кылып жатканыңызды чечишиңиз керек.

Атаандаш эки идея же багыттын ортосунда белгилүү бир "конфликт" же "чыңалуу" бар.

Мен A маселесин чечүү үчүн "plug-n-play" деп атайт элем.

Экинчиси - DIY (муну өзүңүз жасаңыз). Жана бул башка идея үчүн эң жакшы энбелги да болбошу мүмкүн.

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

Бул мисал үчүн SLAMды, тоскоолдуктарды болтурбоону жана негизги негизги кыймылды бир эле учурда бир көйгөй катары чечели.

  1. Эгерде биз plug-n-play маршруту боюнча кетүүнү чечсек, биз дароо секиребиз (бюджетке жараша), ошол чокуга орнотулган айлануучу лазерлер, же тереңдик камерасы, же ToF лазерлери жана IMU (бул тема) Инструкция).
  2. Эгерде биз экинчи жолго түшкүбүз келсе, анда биз кээ бир акустикалык сенсорлордон же IR сенсорлорунан мүмкүн болгон маалыматты алып салууга аракет кылышыбыз мүмкүн, же сенсорлор жок - биз мотордун учурдагы мониторингин колдонобуз.

#1 жана #2 жөнүндө эмне айтууга болот? Бир нерсе, биз #2 кылуу менен көп нерсеге үйрөнө алабыз. Бир гана акустикалык сенсорлор менен иштөөнүн чектөөлөрү бизди дагы көп маселелер жөнүндө ойлонууга мажбурлайт.

Экинчи жагынан, эгер биз #2 аркылуу бир нерселерди жасоого өтө көңүл бурсак, анда убакытты текке кетирип коюшубуз мүмкүн, анткени биз акустикалык сенсорлордон талап кылгандан да көптү талап кылабыз.

Дагы бир түшүнүк же идея жөнүндө ойлонуу керек: "Кантип" деген суроолорго аппараттык жана программалык камсыздоонун кайсы аралашмасы эң жакшы жооп берет, жана программалык камсыздоонун кайсы аралашмасы (жана жабдык?) "Эмне", "качан", "кайда" деген суроолорго жооп берет. Анткени "кантип" деген жооп алуу үчүн адатта "эмне", "качан" жана "кайда" көз каранды болгон төмөнкү деңгээлдеги суроо.

Эмнеси болсо да, жогоруда айтылгандардын баары жөн эле ойлонуу керек болчу.

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

Ошентип, бул көрсөтмө - ӨИК.

Максат - эгер ӨИК робот бурулбайт деп айтса, биз кызмат циклин көбөйтөбүз. Эгерде биз өтө тез бурула турган болсок, анда биз кызмат циклин азайтабыз.

1 -кадам: IMU Sensor

IMU сенсору
IMU сенсору
IMU сенсору
IMU сенсору

Ошентип, Уоллеске кошула турган кийинки сенсорубуз - ӨИК. Бир аз изилдөөлөрдөн кийин, мен MPU6050 менен эсептешип жаттым. Бирок, бул учурда, MPU9050 (жана дагы жакында, MPU9250) андан да жакшы идея болуп көрүндү.

Менин бара турган булагым Amazon (АКШда) болгон. Ошентип мен экөөнө заказ бергем.

Чындыгында мен алган нерсе (бул боюнча эч кандай көзөмөл жок окшойт; мага Amazon жөнүндө жаккан жок) эки MPU92/65 болгон. Мен белгилөө жөнүндө бир аз ойлонуп жатам. Сүрөттөрдү карап көрүңүз; Бул "үй -бүлөлүк" белгиси окшойт. Кандай болгон күндө да мен ушуга такалып калдым.

Аны кошуу өтө жөнөкөй -туташтыруучу тректери бар прото тактаны алыңыз, сенсорду тактага кошуп, 10 -шиштүү бурамалуу терминалдык блокту кошуңуз (меники Пололудан).

Ар кандай кийлигишүүнү азайтуу үчүн, мен бул сенсорлорду башка нерселерден алысыраак жайгаштырууга аракет кылдым.

Бул ошондой эле кээ бир нейлон болт/гайкаларды колдонууну билдирет.

Мен I2C протоколун колдоном. Жалпы зымдын узундугу жаман болбойт деп үмүттөнөбүз.

Башка жерде негизги байланыштар жана чыңалуу деңгээли ж.

2 -кадам: Ар дайым нерселер таза эмес, оңой

Бул жазууда, бул өзгөчө MPU-92/65 үчүн онлайнда көп нерсе жок окшойт. Жеткиликтүү болгон нерселер, көпчүлүк сенсорлор сыяктуу эле, Arduino колдонулган мисалдар окшойт.

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

Менин оюмча, бул көрсөтмөлөр A-B-Cге караганда блогго көбүрөөк окшош, 1-2-3 "муну ушундай кыласың".

3 -кадам: Баштапкы тест

Баштапкы тест
Баштапкы тест
Баштапкы тест
Баштапкы тест

Мурунку кадамдагы сүрөттөрдөн сенсорлорго бараткан кызыл жана кара зымдар албетте VCC (5V) жана GND. Жашыл жана сары зымдар I2C байланыштары.

Эгерде сиз башка I2C долбоорлорун аткарган болсоңуз же бул серияларды ээрчип жүргөн болсоңуз, анда сиз "i2cdetect" жөнүндө билесиз жана бул Малинанын жаңы сенсорду көрө аларын билүү үчүн биринчи кадам.

Бул кадамдагы сүрөттөрдөн көрүнүп тургандай, биздин биринчи аракетибиз ийгиликсиз болгон. IMU көрүнбөйт (0x68 түзмөк id болушу керек).

Бирок, жакшы кабар I2C автобусу иштеп жатат. Биз 0x20 бир түзүлүштү көрөбүз жана бул MCP23017 портун кеңейтүүчү (учурда HCSR04 акустикалык сенсорлору үчүн жооптуу).

Сүрөттө көрүү оңой эмес, бирок мен ошол эле түстүү жашыл жана сары зымдарды IMUдан MCP23017ге туташтырдым (сүрөттүн төмөнкү солун караңыз)

Биз кээ бир көйгөйлөрдү чечүү үчүн керек болот.

4 -кадам: Мүчүлүштүктөрдү оңдоо

Image
Image
Мүчүлүштүктөрдү оңдоо
Мүчүлүштүктөрдү оңдоо
Мүчүлүштүктөрдү оңдоо
Мүчүлүштүктөрдү оңдоо

Вольтметрдеги үзгүлтүксүздүк жөндөөсүн колдонуу менен (жогорку тон менен), мен VCC (5V), GND, SDA жана SCL туташууларын сынап көрдүм. Булар жакшы болчу.

Кийинки аракет MCP23017ди I2C автобусунан ажыратып, автобуста MPU-92/65ти гана калтыруу болгон. Бул натыйжасыз болду - "i2cdetect" андан кийин эч кандай түзмөк көрсөткөн жок.

Ошентип, мен сенсорду тотем түркүгүнөн ажыратып, кайра 5В-3В эки багыттуу автобуска кайра туташтырдым; башкача айтканда, түз эле Малинага. (кыска зымдар?).

Жана voila. Бул жолу ийгилик бар. Биз 0x68 "i2cdetect" аркылуу көрсөтүлөрүн көрөбүз.

Бирок биз бул жолу эмне үчүн иштегенин азырынча билбейбиз. Бул зымдардын узундугу болушу мүмкүнбү? Мурунку жайгашкан жери?

Эскертүү: ADO негизделгенби же жокпу айырмасы жок. Балким, бортто тартылуучу жана түшүүчү резисторлор болушу мүмкүн. Ошол эле FSYNC үчүн да ушундай болушу мүмкүн.

Андан кийин, мен MCP23017ди кайра туташтырдым. Ошентип, азыр I2C шинасында эки түзмөк бар. (сүрөттү караңыз). Ийгилик, биз азыр 0x20 менен 0x68ди i2cdetect менен көрөбүз.

Видеолордо көйгөйлөрдү чечүү учурунда болгон окуялар тууралуу көбүрөөк айтылат.

5 -кадам: Сенсордун маалыматтарын окуу

Image
Image
Сенсордун маалыматын окуу
Сенсордун маалыматын окуу
Сенсордун маалыматын окуу
Сенсордун маалыматын окуу

Ар кандай ыкмалар

Мен сенсордон пайдалуу маалыматты алуу үчүн бир нече ыкмаларды колдонууну чечтим. Бул жерде алар эч кандай тартипте эмес:

  1. кээ бир негизги программалоо аракет
  2. реестрдеги кээ бир онлайн документтерди караңыз
  3. башкалардын мисалдарын жана / же кодун карап көрүңүз

Эмне үчүн бул ыкмалар? Эмне үчүн бар китепкананы же кодду издебейсиз?

Эксперимент жүргүзүп, кээ бир идеяларды сынап көрүү менен, биз бул сенсор жөнүндө гана эмес, ошондой эле кээ бир техниканы, көндүмдөрдү жана жаңы нерсени чечүү жөнүндө ойлонуу ыкмаларын жана документтери көп болбогон нерсени жакшыраак сиңире алабыз; белгисиз нерселер көп болушу мүмкүн.

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

Мисалы, githubдагы MPU9250 үчүн кээ бир C ++ коддорун карап чыккандан кийин, бул мени азырынча кылгым келбеген үзгүлтүктөрдү колдонууга мажбурлап жатканын түшүндүм.

Ошондой эле, ал калибрлөө сыяктуу кошумча нерселер менен келет; дагы бир нерсе, мен азырынча кызыкпайм.

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

Регистрлер

Бул жазууда бул сенсордо көп нерсе жок окшойт. Чындыгында, эгер сиз ушул Нускамалык менен келген сүрөттөрдү карап көрсөңүз жана чыныгы чиптердеги жазууларды жакшылап карап көрсөңүз, анда бул нокаут эмеспи деген ойго түртөт. Мен көргөндөрүмдү Инвенстен эч нерсе менен байланыштырбайм. Кандай болбосун, мен тапкан моделдердин регистр-маалыматын кароону туура көрдүм: 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 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 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 огунун өлчөө маалыматтары жогору 8bit

Программалоо

Документтердин дагы бир маалыматы - болжол менен 100гө жакын регистр болгон окшойт. Ошентип, бир тактика - бул түзмөккө кире турган жөнөкөй программаны жазуу (0x68) жана кандай маалыматтарды көрүүгө болорун көрүү үчүн, алардын маанисине карабай, бир катар регистрлерди ырааттуу окууга аракет кылуу.

Анан, ошол эле кодду колдонуп, удаалаш өтүүлөрдү жасаңыз жана бир өтүүдөн кийинки маалыматты салыштырыңыз.

Идея, биз, балким, эч кандай маалыматтары жок (нөлдөр же ФФ?) Реестрлерди жок кыла алабыз, же такыр өзгөрбөйт, жана биз да өзгөргөндөргө көңүл бура алабыз.

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

Акыр -аягы, биз сенсордун жардамы менен нерселерди акырын сынап көрө алабыз, мисалы, аны жылдыруу (акселерометр, гиро), же ага үйлөө (температура), же аны айлантуу (мурунку эки плюс магнитометр) жана анын маанилерге кандай таасир этерин көрүү.

Мүмкүн болушунча wiringPi китепканасын колдонгум келет. Бул I2C колдоосуна ээ.

Биринчи чуркоо:

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

* куруу үчүн: gcc first.test.mpu9265.c -o first.test.mpu9265 -lwiringPi * * иштетүү үчүн: sudo./first.test.mpu9265 * * бул программа MCP23017ден бир катар (мүмкүн) регистрлерди чыгарат., * анан MPU9265тен (же 0x68 дарегиндеги башка MPUдан) * * Мен аны сенсордон окуй алсам ырастоо үчүн колдондум, анткени менде * MCP23017ге болгон ишеним бар болчу. ************************************************ ****************************/ #кошуу #кошуу #кошуу #кошуу #кошуу 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)); return 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)); return 1; } үчүн (int reg = 0; reg <300; reg ++) {fprintf (stderr, "%d", wiringPiI2CReadReg8 (fd2, reg)); fflush (stderr); кечигүү (10); } коёт (""); return 0; }

Экинчи чуркоо:

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

* куруу үчүн: gcc second.test.mpu9265.c -o second.test.mpu9265 -lwiringPi * * иштетүү үчүн: sudo./second.test.mpu9265 * * Бул программа окулган маанинин жанында регистрдин номерин чыгарат. * * Бул чыгууну файлга өткөрүүнү (кайра багыттоону) пайдалуу кылат, андан кийин * салыштыруу үчүн бир нече жолу аткарууга болот. Бул кайсы реестр маанилүү экенин жана маалымат кандайча иштеши мүмкүн экенин түшүнүүгө жардам берет. ************************************************ ****************************/ #кошуу #кошуу #кошуу #кошуу #кошуу #кошуу #кошуу int main (int argc, char **) argv) {int deviceId = -1; if (0) {} else if (! strncmp (argv [1], "0x20", strlen ("0x20"))) {deviceId = 0x20; } else if (! strncmp (argv [1], "0x68", strlen ("0x68"))) {deviceId = 0x68; } else if (! 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)); return 1; } үчүн (int reg = 0; reg <300; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); кечигүү (10); } return 0; }

Үчүнчү чуркоо:

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

* куруу үчүн: gcc Third.test.mpu9265.c -o Third.test.mpu9265 -lwiringPi * * иштетүү үчүн: sudo./third.test.mpu9265 * * Бул программа экинчисинин натыйжасы. Ал * регистрлерден гана бир жүгүрүү менен экинчисинин айырмасын көрсөтөт.************************************************ ****************************/ #кошуу #кошуу #кошуу #кошуу #кошуу #кошуу #кошуу int main (int argc, char **) argv) {int deviceId = -1; if (0) {} else if (! strncmp (argv [1], "0x68", strlen ("0x68"))) {deviceId = 0x68; } else if (! 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)); return 1; } үчүн (int reg = 61; reg <= 73; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); кечигүү (10); } үчүн (int reg = 111; reg <= 112; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); кечигүү (10); } үчүн (int reg = 189; reg <= 201; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); кечигүү (10); } үчүн (int reg = 239; reg <= 240; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); кечигүү (10); } return 0; }

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

Азырынча жыйынтыктар жаңы суроолорду жаратышы мүмкүн.

Суроо: эмне үчүн "тышкы" топтун бир гана реестринин натыйжасы бар?

Суроо: бул белгисиз реестрлердин баары "??????"

Суроо: программа үзгүлтүккө учурабагандыктан, ал өтө жай маалыматтарды сурадыбы? өтө тез?

Суроо: биз иштеп жатканда сенсордун өзү менен бир нерселерди сынап көрүп, натыйжаларга таасир эте алабызбы?

6 -кадам: Келгиле, Окууларга / Маалыматтарга Көбүрөөк Кирип Келиңиз

Менин оюмча, дагы бир нерседен мурун, кийинки кадам - бул программаны жакшыртуу:

  • ийкемдүү болгула, канча цикл кечигет (мс)
  • бир реестрге орточо жүгүртүү үчүн канча окууда ийкемдүү болуңуз

(Программаны файл катары тиркөөгө туура келди. Аны бул жерге киргизүү көйгөйү болуп көрүндү. "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

Бул бөлүмдүн видеолору акселерометр менен гироскоптун "жетинчи.тест.mpu9265.c" сыноо программасын колдонуп көрсөтөт. Бул код 1, 2 же 3 катары менен байт-жуптарды (салам жана ло байт) окуй алат жана баалуулуктарды бир 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: -- -- -- -- -- -- -- --

ӨИКтин магнитометринен окуу үчүн кошумча кадамдар керек.

PDF doc Invesense реестринен:

Каттоочулар 37ден 39га чейин - I2C КУЛ 0 көзөмөлдөө

  • КАТТАЛУУ 37 - I2C_SLV0_ADDR
  • КАТТАЛУУ 38 - I2C_SLV0_REG
  • КАТТАЛУУ 39 - I2C_SLV0_CTRL

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