Мазмұны:

Уоллес - DIY автономды роботы - 5 -бөлім - ИМУ қосу: 9 қадам
Уоллес - DIY автономды роботы - 5 -бөлім - ИМУ қосу: 9 қадам

Бейне: Уоллес - DIY автономды роботы - 5 -бөлім - ИМУ қосу: 9 қадам

Бейне: Уоллес - DIY автономды роботы - 5 -бөлім - ИМУ қосу: 9 қадам
Бейне: 클레이로 월레스와 그로밋 피규어 만들기 _ Making Wallace and Gromit Figure _ Clay Art _ Clay Tutorial 2024, Қараша
Anonim
Image
Image

Біз Уоллеспен бірге жүреміз. Уоллес атауы «Wall-E» қоспасынан және алдыңғы жобадан (дауысты тану) шыққан, және «espeak» утилитасын қолданғанда, ол біраз британдық болып шықты. Сондай -ақ, велосипедші немесе батлер сияқты. Бұл түпкі мақсат: бұл жобаның пайдалы нәрсеге айналуы. Осылайша «Уоллес».

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

Датчиктерден басқа, Уоллес 100 қозғалысты «есте сақтайды» және қозғалыстың тарихын қолдана отырып, кейбір рудиментарлық талдауға ие.

Әзірге Уоллестің мақсаты - тек алға ұмтылуға тырысу және оның қайталанатын үлгіде (мысалы, бұрышта) тұрып қалғанын білу және шын мәнінде алға жылжу емес.

Мен қозғалыс пен навигация үшін бірнеше қайталауды бастан өткердім және айналу кезінде тұрақты бас ауруы болды.

Уоллес - бақыланатын робот болғандықтан, мен бағдарламалық қамтамасыз етуді (кейінірек) қарапайым етіп сақтағым келді, оны бұру үшін мен оның орнында бұрылуын/айналуын қамтамасыз етемін. Осылайша, қозғалтқыштарға тең, бірақ қарама -қарсы қуат / жұмыс циклын қолданыңыз.

Мәселе Agent 390 робот платформасының дизайнымен байланысты. Жол белдіктері бүйірлерге ысырылады. Ең жаманы, бір жақ екінші жаққа қарағанда көбірек жасайды.

Еденге және түзу жүруге қиындық туғызбады. Ол кілемде көрінеді. Мен Уоллесті кілемнен аулақ ұстауды шештім, себебі оның жолдары күңгірт болды (олар кірді өте оңай жинайды).

Нақты мәселе - еденге бұрылу кезінде.

Егер менде бағдарламалық қамтамасыз ету жоғары деңгейдегі жұмыс циклын қолданса, онда ол азды -көпті тұрақты түрде айналады. Дегенмен, төмен жұмыс циклі кезінде ол айналуы мүмкін немесе болмауы мүмкін. Немесе сәл бұрылып, кейін баяулауы мүмкін. Айналдыру әрекеті бағдарламалық қамтамасыз ету арқылы бақыланбайтын сияқты немесе ең жақсы жағдайда өте қиын болып көрінеді.

Мәселе навигация кезінде және кедергілерден айналып өту кезінде пайда болады. Ол тым алыстап кетуі мүмкін, немесе тіпті қозғалмай -ақ, өте аз ауысым жасауға тырысуы мүмкін.

Жоғарыда келтірілген түсініктеме осы Нұсқаулыққа түрткі болды.

Бастапқыда мен қозғалыс сезгіш қондырғыны енгізуден бас тартқым немесе кешіктіргім келді, себебі олар A) күрделі, B) шулы, C) қателер уақыт өте келе енгізілуі мүмкін және т.с.с. Ұшу уақытында инфрақызыл лазерлік датчиктерге өту арқылы біз өте жақсы жұмыс жасай аламыз. Біз лазердің көмегімен роботтың айналғанын немесе айналмайтынын қашықтықтағы өзгерістерді бақылау арқылы біле аламыз.

Шындығында, біз мұны акустикалық сенсорлармен де жасай аламыз.

Дегенмен, мұның бәрі бір қарапайым сұраққа жауап берудің өте жанама, күрделі әдісі: «біз ротацияладық па, жоқ па?»

Менің ойымша, ToF лазерлік сенсорларын пайдалану үшін секіру мені бағдарламалық қамтамасыз етудің келесі деңгейіне шығарады; атап айтқанда, SLAM (бір мезгілде локализация және картаға түсіру). Мен ол жаққа баруға әлі дайын емес едім.

Бірінші (төменгі) қабаттар қарапайым, ал соңғы (үстіңгі) қабаттар абстрактілі және күрделі мәселелерді шеше отырып, робот жобасын қабаттармен жасау жақсы.

Қабаттарды келесідей ойлауға болады:

  1. роботтың физикалық қаңқасы / механикалық құрылымдық негізі
  2. қарапайым жетек жүйесі (таңқурай, робоклав, қозғалтқыштар, кабельдер және т.
  3. датчиктерді қолдаудың негізгі схемасы (екі бағытты кернеу ауыстырғыш, порт кеңейткіш, E-Stop, қуат тарату және т.
  4. кедергілерді болдырмайтын датчиктер (акустикалық, ИҚ)
  5. негізгі, негізгі орналасу мен қозғалыс - анықтау (акселерометр, гиро, магнитометр, мотор кодерлері, доңғалақ кодерлері)

Сіз өзіңіздің жеке тізіміңізді жасай аласыз. Бұл тізімдегі ұпайлар - сіз оларды азды -көпті ретпен жасауыңыз керек, сонымен қатар, егер сіз әр қабатта жақсы жұмыс күйіне жету үшін біраз уақыт бөлсеңіз, бұл кейінірек жағдай күрделене түскенде сізге көмектеседі.

Жоғарыда келтірілген тізім бағдарламалық жасақтаманың осы тұжырымдамалық қабаттарымен азды -көпті салыстырылуы мүмкін.

  • SLAM (бір мезгілде локализация және картаға түсіру)
  • Қозғалысты бақылау және хабардар ету, ротация
  • Негізгі кедергілерден аулақ болу
  • Сенсорлық мәліметтерді бақылау және анықтау
  • Негізгі қозғалыс Алға, Артқа, Солға және Оңға, Жылдамдату, Баяулау, Тоқтату

Көріп отырғаныңыздай, бұл тізім үшін бірінші элементтер «мен қайдамын» және «мен қайда барамын» сияқты дерексіз мәселелер мен сұрақтарды шешетін жоғарғы, күрделі қабаттар болады, ал соңғы элементтер - «А сенсорын қалай сөйлеуге/тыңдауға» немесе «бұл доңғалақты қалай жылжытуға» болатын бағдарламалық жасақтаманың төменгі қабаттары.

Енді мен сіз қабатты бастаған кезде оны аяқтадыңыз деп айтпаймын, содан кейін ол алдыңғы қабатқа ешқашан оралмайды. Робот жобасы бағдарламалық жасақтаманың заманауи, қайталанатын әдістеріне ұқсас болуы мүмкін (шапшаң, SCRUM және т.б.).

Мен әрқайсысына уақыт бөлуді айтамын. Сіз әрқайсысында қанша істеу керектігін теңестіруіңіз керек, және сіз уақыт пен қиындыққа тұрарлық белгілі бір қабатта не істеп жатқаныңызды шешесіз.

Екі бәсекелес идея немесе бағыт арасында белгілі бір «қақтығыс» немесе «шиеленіс» бар.

Мен А мәселесін шешу үшін «plug-n-play» деп атайтын едім.

Екіншісі - DIY (мұны өзіңіз жасаңыз). Және бұл басқа идея үшін ең жақсы белгі болмауы мүмкін.

Міне әрқайсысының мысалы, сіз екі таңдау арасындағы шиеленісті немесе қақтығысты көресіз деп үміттенеміз.

Бұл мысал үшін SLAM-ды, кедергілерден аулақ болуды және негізгі қозғалысты бір уақытта шешуге болатын бір мәселе ретінде қарастырайық.

  1. Егер біз қосылатын жолмен жүруге шешім қабылдайтын болсақ, біз бірден (бюджетке байланысты) жоғарыға орнатылатын айналмалы лазерлерге, тереңдіктегі камераға, ToF лазерлеріне және IMU-ға секіреміз (бұл тақырып Нұсқауға болады).
  2. Егер біз, керісінше, екінші жолға түскіміз келсе, біз кейбір акустикалық сенсорлардан немесе инфрақызыл сенсорлардан немесе сенсорлардан мүлде мүмкін емес ақпаратты алуға тырысуымыз мүмкін - біз тек қозғалтқыш -ток бақылауын қолданамыз.

№1 мен №2 туралы не айтуға болады? Бір нәрсе, біз №2 арқылы көп нәрсені үйренеміз. Тек акустикалық сенсорлардың жұмыс істеуінің шектеулері бізді көптеген мәселелер туралы ойлануға мәжбүр етеді.

Екінші жағынан, егер біз №2 арқылы бірдеңе жасауға көп көңіл бөлетін болсақ, біз уақытты жоғалтуымыз мүмкін, себебі біз акустикалық сенсорлардан қажет нәрсені көбірек сұраймыз.

Ойлануға болатын тағы бір тұжырымдама немесе идея: «Қалай» деген сұраққа аппараттық және бағдарламалық қамтамасыз етудің қандай қоспасы жақсы жауап береді, ал бағдарламалық қамтамасыз етудің қандай қоспасы (және аппараттық?) «Не», «қашан», «қайда» деген сұрақтарға жауап береді.. Өйткені «қалай»-бұл жауап алу үшін «не», «қашан» және «қайда» тәуелді болатын төменгі деңгейдегі сұрақ.

Қалай болғанда да, жоғарыда айтылғандардың бәрі ойлануға болатын нәрсе болды.

Менің жағдайда, көп күш жұмсағаннан кейін және трек-үйкеліс мәселесі туындағандықтан, тұрақты бақылау мен қозғалысты ала алмайтын болсақ, басқа нәрсе істеу керек.

Осылайша, бұл нұсқаулық - ХБҚ.

Мақсат - егер ИДМ робот айналмайды деп айтса, біз жұмыс циклін арттырамыз. Егер біз өте жылдам айналатын болсақ, онда біз жұмыс циклін төмендетеміз.

1 -қадам: IMU сенсоры

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» туралы білесіз, және бұл Raspberry жаңа сенсорды көре алатынын білудің бірінші қадамы.

Бұл қадамдағы суреттерден көріп отырғанымыздай, біздің бірінші әрекетіміз сәтсіз болды. IMU пайда болмайды (құрылғы идентификаторы 0x68 болуы керек).

Дегенмен, жақсы жаңалық - I2C автобусы жұмыс істейді. Біз 0x20 бір құрылғыны көреміз және бұл MCP23017 портын кеңейтуші (қазіргі уақытта HCSR04 акустикалық сенсорларына жауап береді).

Кескінді көру оңай емес, бірақ мен сол түсті жасыл және сары сымдарды IMU -дан MCP23017 -ге жалғадым (суреттің төменгі сол жағын қараңыз)

Біз кейбір ақауларды жоюға мәжбүр боламыз.

4 -қадам: ақауларды жою

Image
Image
Ақаулық себебін іздеу және түзету
Ақаулық себебін іздеу және түзету
Ақаулық себебін іздеу және түзету
Ақаулық себебін іздеу және түзету

Вольтметрдегі (жоғары тонды) үздіксіздік параметрін қолдана отырып, мен VCC (5V), GND, SDA және SCL қосылыстарын сынап көрдім. Бұлар жақсы болды.

Келесі әрекет MCP23017-ны I2C шинасынан ажырату болды, тек автобуста MPU-92/65 қалды. Бұл нәтижесіз болды - «i2cdetect» содан кейін ешқандай құрылғыларды көрсетпеді.

Сонымен, мен сенсорды тотемдік полюстен алып тастадым және оны қайтадан 5В-тан 3В-қа дейінгі екі бағытты шинаға қайта жалғадым; яғни тікелей таңқурайға. (қысқа сымдар?).

Және воила. Бұл жолы сәттілік бар. Біз 0x68 «i2cdetect» көмегімен көрсетілетінін көреміз.

Бірақ бұл жолы неге жұмыс істегенін әлі білмейміз. Бұл сымдардың ұзындығы болуы мүмкін бе? Алдыңғы орын?

Ескерту: 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-де (және бізде де солай деп ойлаймыз) бар.

Регистр-құжаттан бірнеше қызықты, пайдалы ақпарат алынды:

Магнитометр туралы ақпарат:

магнитометрдің идентификаторы: 0x48 регистрлері 00 -ден 09: 00 -ге дейін 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 Hz 8 Hz HZ8 HZ Hz ST2 0 0 0 BITM HOFL 0 0 0 әрбір регистр нені білдіретінін бөлу: HXL [7: 0]: X осі бойынша өлшеу деректері төмен 8bit HXH [15: 8]: X осінің өлшеу деректері жоғары 8bit HYL [7: 0]: Y осі бойынша өлшеу деректері төмен 8 биттік HYH [15: 8]: Y осі бойынша өлшеу деректері жоғары 8bit HZL [7: 0]: Z осінің өлшеу деректері төмен 8bit HZH [15: 8]: Z осінің өлшеу деректері жоғары 8 бит

Бағдарламалау

Тізілім құжаттарынан тағы бір ақпарат - шамамен 100 -ге жуық регистр бар сияқты. Сонымен, бір тактика - бұл құрылғыға кіретін (0x68) қарапайым бағдарламаны жазу және қандай деректерді көруге болатынын білу үшін, олардың мәніне қарамай, тізілімдер тізбегін тізбектеп оқуға тырысу.

Содан кейін, сол кодты қолдана отырып, кезекті өтулерді жасаңыз және деректерді бір өтуден екіншісіне салыстырыңыз.

Идея - бізде деректері жоқ (нөлдер немесе ФФ?) Немесе мүлдем өзгермейтін кез келген регистрлерді жоюға болады, сонымен қатар біз өзгеретіндерге де тоқтала аламыз.

Содан кейін, біз тек өзгеретіндерді ғана қарастырамыз, бұл регистрдің соңғы N оқуларын орташа алатын функцияны қосыңыз, шын мәнінде бұл регистр үшін белгілі бір тұрақты мән бар -жоғын білу үшін. Бұл сенсорды бір орнында ұстап тұрамыз деп болжауға болады.

Ақырында, біз сенсормен жұмсақ түрде сынап көре аламыз, мысалы, оны итеру (акселерометр, гиро) немесе оған үрлеу (температура) немесе оны айналдыру (алдыңғы екі плюс магнитометр) және оның мәндерге қандай әсер ететінін көру.

Мен wiringPi кітапханасын мүмкіндігінше қолданғанды ұнатамын. Ол I2C қолдауына ие.

Бірінші жүгіру:

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

* құрастыру: gcc first.test.mpu9265.c -o first.test.mpu9265 -lwiringPi * * іске қосу үшін: sudo./first.test.mpu9265 * * бұл бағдарлама MCP23017 -ден (мүмкін) регистрлер диапазонын шығарады., * содан кейін MPU9265 (немесе 0x68 мекенжайындағы кез келген басқа MPU) * * Мен оны сенсордан оқи алатынымды тексеру үшін қолдандым, өйткені менде * MCP23017 -ге сенімділік болды. ************************************************ ****************************/ #қосу #қосу #қосу #қосу #intlude int main (int argc, char ** argv) {put («MCP23017 @ 0x20 не айтатынын көрейік:»); errno = 0; int deviceId1 = 0x20; int fd1 = wiringPiI2CSetup (deviceId1); if (-1 == fd1) {fprintf (stderr, «W2PI 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, «W2Pi I2C құрылғысын ашу мүмкін емес: %s / n», strerror (errno)); қайтару 1; } үшін (int reg = 0; reg <300; reg ++) {fprintf (stderr, «%d», wiringPiI2CReadReg8 (fd2, reg)); fflush (stderr); кешіктіру (10); } қояды («»); қайтару 0; }

Екінші жүгіру:

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

* құрастыру үшін: gcc second.test.mpu9265.c -o second.test.mpu9265 -lwiringPi * * іске қосу үшін: sudo./second.test.mpu9265 * * Бұл бағдарлама оқылатын мәнмен қатар регистр нөмірін шығарады. * * Бұл шығуды файлға жіберу (қайта бағыттау) үшін пайдалы етеді, содан кейін салыстыру үшін * бірнеше іске қосуға болады. Бұл қандай регистр маңызды екенін және мәліметтер қалай әрекет етуі мүмкін екендігі туралы түсінік беруі мүмкін. ************************************************ ****************************/ #қосу #қосу #қосу #қосу #қосу #қосу #intlude 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, «W2PI I2C құрылғысын ашу мүмкін емес: %s / n», strerror (errno)); қайтару 1; } үшін (int reg = 0; reg <300; reg ++) {fprintf (stderr, «%d:%d / n», reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); кешіктіру (10); } 0 қайтару; }

Үшінші жүгіру:

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

* құрастыру: gcc third.test.mpu9265.c -o үшінші.test.mpu9265 -lwiringPi * * іске қосу үшін: sudo./third.test.mpu9265 * * Бұл бағдарлама екіншісінің нәтижесі. Ол тек * регистрлерден бір жүгіру мен келесі арасындағы айырмашылықты көрсетеді.************************************************ ****************************/ #қосу #қосу #қосу #қосу #қосу #қосу #intlude 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, «W2PI I2C құрылғысын ашу мүмкін емес: %s / n», strerror (errno)); қайтару 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); } 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

Бұл бөлімге арналған бейнелерде «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

Ұсынылған: