Мазмұны:

MPU 6050 Gyro, Arduino көмегімен акселерометр байланысы (Atmega328p): 5 қадам
MPU 6050 Gyro, Arduino көмегімен акселерометр байланысы (Atmega328p): 5 қадам

Бейне: MPU 6050 Gyro, Arduino көмегімен акселерометр байланысы (Atmega328p): 5 қадам

Бейне: MPU 6050 Gyro, Arduino көмегімен акселерометр байланысы (Atmega328p): 5 қадам
Бейне: gy-521 mpu 6050 гироскоп для arduino обзор 2024, Қараша
Anonim
MPU 6050 Gyro, акселерометр Arduino -мен байланыс (Atmega328p)
MPU 6050 Gyro, акселерометр Arduino -мен байланыс (Atmega328p)
MPU 6050 Gyro, акселерометр Arduino -мен байланыс (Atmega328p)
MPU 6050 Gyro, акселерометр Arduino -мен байланыс (Atmega328p)
MPU 6050 Gyro, акселерометр Arduino -мен байланыс (Atmega328p)
MPU 6050 Gyro, акселерометр Arduino -мен байланыс (Atmega328p)

MPU6050 IMU 3 осьтік акселерометр мен 3 осьті гироскопты бір чипке біріктіреді.

Гироскоп X, Y және Z осі бойымен уақыт бойынша бұрыштық позицияның айналу жылдамдығын немесе өзгеру жылдамдығын өлшейді.

Гироскоптың шығысы секундына градуспен есептеледі, сондықтан бұрыштық позицияны алу үшін бізге бұрыштық жылдамдықты интеграциялау қажет.

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

3 осьті гироскоп MPU-6050 3 осьті гироскоптан тұрады, ол x, y, z осінің айналу жылдамдығын микроэлемеханикалық жүйе технологиясымен (MEMS) анықтай алады. Сенсор кез келген ось бойымен айналдырылған кезде Coriolis әсерінен діріл пайда болады, оны MEMS анықтайды. 16-разрядты ADC әр осьті іріктеу үшін кернеуді цифрландыру үшін қолданылады. +/- 250, +/- 500, +/- 1000, +/- 2000- бұл шығудың толық шкаласы. Бұрыштық жылдамдық әр ось бойымен секундына бірлікпен өлшенеді.

Пайдалы сілтеме: …………….

Arduino тақтасы: ……….

MPU6050 IMU ……………

1-қадам: MPU-6050 модулі

MPU-6050 модулі
MPU-6050 модулі

MPU-6050 модулінде 8 түйреуіш бар,

INT: цифрлық шығыс үзу.

AD0: I2C Slave Address LSB түйреуіші. Бұл құрылғының 7-биттік қосалқы мекен-жайындағы 0-ші бит. Егер VCC қосылған болса, ол логикалық және қосалқы мекенжайдың өзгеруі ретінде оқылады.

XCL: Қосымша сериялық сағатты түйреуіш. Бұл түйін басқа I2C интерфейсі қосылған SCL түйреуіштерін MPU-6050-ге қосу үшін қолданылады.

XDA: қосалқы сериялық деректер түйреуі. Бұл түйін басқа I2C интерфейсі қосылған SDA түйреуіштерін MPU-6050-ге қосу үшін қолданылады.

SCL: Сериялық сағат штыры. Бұл түйреуішті микроконтроллерлерге қосыңыз. SDA: Сериялық деректер түйреуі. Бұл түйреуішті микроконтроллер SDA түйреуішіне қосыңыз.

GND: жерге тұйықталу. Бұл түйреуішті жерге қосуға қосыңыз.

VCC: қуат көзінің түйреуіші. Бұл істікті +5В тұрақты ток көзіне қосыңыз. MPU-6050 модулінде Slave мекенжайы бар (AD0 = 0 болғанда, яғни ол Vcc-ке қосылмаған), Slave Write address (SLA+W): 0xD0

Құлды оқу мекенжайы (SLA+R): 0xD1

2 -қадам: Есептеулер

Есептеулер
Есептеулер

MPU6050 модулінің гироскоп пен акселерометр датчиктерінің мәліметтері 2-қосымша формасындағы 16-разрядты шикі деректерден тұрады.

MPU6050 модулінің температура сенсорының деректері 16 биттік мәліметтерден тұрады (2 қосымша түрінде емес).

Енді біз таңдадық делік,

  • - сезімталдық шкаласы факторы 16, 384 LSB (санау)/г бар +/- 2g акселерометрдің толық шкаласы.
  • - Гироскоптың толық ауқымы +/- 250 °/с, сезімталдық шкаласы факторы 131 LSB (Count)/°/с. содан кейін,

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

Акселерометрдің мәндері g (g күші)

  • Х осі бойымен үдеу = (Акселерометр X осінің шикі деректері/16384) g.
  • Y осінің бойымен үдеу = (Y осінің акселерометрі шикі деректер/16384) g.
  • Z осі бойымен үдеу = (З осі акселерометрінің шикі деректері/16384) г.

Гироскоптың мәні °/с (секундына градус)

  • Х осі бойындағы бұрыштық жылдамдық = (гироскоп X осінің бастапқы деректері/131) °/с.
  • Y осі бойындағы бұрыштық жылдамдық = (гироскоп Y осінің шикі деректері/131) °/с.
  • Z осі бойынша бұрыштық жылдамдық = (гироскоп Z осінің шикі деректері/131) °/с.

Температураның мәні °/с (Цельсий бойынша градус)

Температура градус C = ((температура сенсорының деректері)/340 + 36,53) °/с.

Мысалға, Мысалы, 2 'толықтырудан кейін біз X осьтерінің шикізат мәні = +15454 аламыз

Содан кейін Ax = +15454/16384 = 0,94 г.

Көбірек,

Біз +/- 2G және +/- 250deg/s сезімталдығымен жұмыс істейтінімізді білеміз, бірақ біздің мәндер осы үдеулерге/бұрыштарға қалай сәйкес келеді.

Бұл екеуі де түзу сызықтар, және біз олардың көмегімен 1G үшін 16384 оқимыз, ал 1 градус/секунд үшін 131.07 оқимыз (.07 екілікке байланысты еленбейді), бұл мәндер сызбаны сызу арқылы жасалған. 32767 -де 2G және -32768 және -2G -де бірдей мәндерде 250/-250 болатын түзу сызықты график.

Енді біз сезімталдықтың мәндерін білеміз (16384 және 131.07), біз жай ғана құндылықтарымыздың орнын азайтуымыз керек, содан кейін сезімталдыққа қарай бөлуіміз керек.

Бұл X және Y мәндері үшін жақсы жұмыс істейді, бірақ Z 0 -де емес, 1G -де жазылғандықтан, біз сезімталдығымызға бөлінбестен бұрын 1G (16384) өшіруіміз керек.

3-қадам: MPU6050-Atmega328p қосылымдары

MPU6050-Atmega328p қосылымдары
MPU6050-Atmega328p қосылымдары
MPU6050-Atmega328p қосылымдары
MPU6050-Atmega328p қосылымдары
MPU6050-Atmega328p қосылымдары
MPU6050-Atmega328p қосылымдары

Барлығын диаграммада көрсетілгендей қосыңыз …

Қосылымдар келесі түрде беріледі:-

MPU6050 Arduino Nano

VCC 5V шығыс сымдары

GND жерге тұйықталуы

SDA A4 түйреуіші // сериялық деректер

SCL A5 істікшесі // сериялық сағат

Қадам мен орамның есебі: Ролл-осьтің айналуы, ал қадам-ось бойымен айналу.

Нәтиже радиан түрінде болады. (180 -ге көбейту және пи -ге бөлу арқылы градусқа айналдыру)

4 -қадам: кодтар мен түсініктемелер

Кодтар мен түсініктемелер
Кодтар мен түсініктемелер

/*

Arduino және MPU6050 акселерометр мен гироскоп сенсорының оқулығы Dejan, https://howtomechatronics.com */#include const int MPU = 0x68; // MPU6050 I2C адрестер қалқымалы AccX, AccY, AccZ; float GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; қалқымалы орам, қадам, иіру; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; int c = 0; void setup () {Serial.begin (19200); Wire.begin (); // Wire.beginTransmission (MPU) байланысын бастау; // MPU6050 -мен байланысты бастау // MPU = 0x68 Wire.write (0x6B); // 6B Wire.write регистрімен сөйлесу (0x00); // Қалпына келтіру - 6B Wire.endTransmission регистріне 0 қойыңыз (ақиқат); // берілуді тоқтату/* // Акселерометрдің сезімталдығын конфигурациялау - Толық масштабты ауқым (әдепкі +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // ACCEL_CONFIG регистрімен сөйлесіңіз (1C hex) Wire.write (0x10); // Регистр биттерін 00010000 (+/- 8g толық шкаласы ауқымы) ретінде орнатыңыз Wire.endTransmission (ақиқат); // Gyro сезімталдығын конфигурациялау - Толық ауқымды ауқым (әдепкі +/- 250deg/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // GYRO_CONFIG регистрімен сөйлесіңіз (1В он алтылық) Wire.write (0x10); // Регистр биттерін 00010000 (1000deg/s толық шкаласы) ретінде орнатыңыз Wire.endTransmission (ақиқат); кешіктіру (20); */ // Бұл функцияға қоңырау шалыңыз, егер сізде IM_U_error () модулінің IMU қателік мәндерін алу қажет болса; кешіктіру (20); } void loop () {// === Acceleromter деректерін оқу === // Wire.beginTransmission (MPU); Wire.write (0x3B); // 0x3B регистрінен бастаңыз (ACCEL_XOUT_H) Wire.endTransmission (жалған); Wire.requestFrom (MPU, 6, шын); // Барлығы 6 регистрді оқыңыз, әрбір ось мәні 2 регистрде сақталады // +-2g диапазоны үшін бізге AccX = (Wire.read () << 8 деректер кестесіне сәйкес шикі мәндерді 16384-ке бөлу қажет. | Wire.read ()) / 16384.0; // X осінің мәні AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Y осінің мәні AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Z осінің мәні // AccAngleX акселерометр деректерінен орама мен қадамды есептеу accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~ (0.58) Қосымша мәліметтер алу үшін calc_IMU_error () реттелетін функциясын қараңыз accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~ (-1.58) // === Гироскоп мәліметтерін оқу === // алдыңғыTime = currentTime; // Алдыңғы уақыт нақты уақытқа дейін сақталады, readTime = millis (); // Ағымдағы уақыт оқылған нақты уақыт elapsedTime = (currentTime - previousTime) / 1000; // секундқа жету үшін 1000 -ға бөліңіз Wire.beginTransmission (MPU); Wire.write (0x43); // Gyro деректерінің бірінші регистрі 0x43 Wire.endTransmission (жалған); Wire.requestFrom (MPU, 6, шын); // Барлығы 4 регистрді оқу, әрбір ось мәні 2 регистрде сақталады GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // 250deg/ s диапазоны үшін GyroY = (Wire.read () << 8 | Wire.read ())/ 131.0 деректер кестесіне сәйкес алдымен шикі мәнді 131.0 -ге бөлуіміз керек; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Шығуларды GyroX = GyroX + 0.56 есептелген қате мәндерімен түзетіңіз; // GyroErrorX ~ (-0.56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8) // Қазіргі уақытта шикізат мәндері секундына градуспен, град/с, сондықтан бұрышты gyroAngleX = gyroAngleX + GyroX * elapsedTime градуспен алу үшін сендондтармен көбейту керек; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; yaw = yaw + GyroZ * elapsedTime; // Қосымша сүзгі - үдеткіш пен гиро бұрышының мәндерін біріктіреді = 0,96 * gyroAngleX + 0,04 * accAngleX; қадам = 0.96 * gyroAngleY + 0.04 * accAngleY; // Сериялық мониторда мәндерді басып шығару Serial.print (ролл); Serial.print («/»); Serial.print (қадам); Serial.print («/»); Serial.println (иә); } void calc_IMU_error () {// Біз бұл функцияны баптау бөлімінде акселерометр мен гиро деректерінің қатесін есептеу үшін атай аламыз. Осы жерден біз сериялық мониторда басылған жоғарыдағы теңдеулерде қолданылатын қате мәндерін аламыз. // Дәл мәндерді алу үшін біз ИҚА -ны тегіс орналастыруымыз керек екенін ескеріңіз, сонда біз дұрыс мәндерді аламыз // Акселерометр мәндерін 200 рет оқу кезінде (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (жалған); Wire.requestFrom (MPU, 6, шын); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Барлық оқуларды жинақтау AccErrorX = AccErrorX + ((atan ((AccY) / sqrt (pow ((AccX), 2) + pow ((AccZ), 2)))) * 180 / PI)); AccErrorY = AccErrorY + ((атан (-1 * (AccX) / sqrt (pow ((AccY), 2) + pow ((AccZ), 2))) * 180 / PI)); c ++; } // Қателік мәнін алу үшін қосынды 200 -ге бөлу AccErrorX = AccErrorX /200; AccErrorY = AccErrorY / 200; c = 0; // гиро мәндерін 200 рет оқу кезінде (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (жалған); Wire.requestFrom (MPU, 6, шын); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Барлық оқуларды жинақтау GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // GyroErrorX = GyroErrorX /200 қате мәнін алу үшін соманы 200 -ге бөліңіз; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Қате мәндерін Serial Monitor Serial.print («AccErrorX:») басып шығарыңыз; Serial.println (AccErrorX); Serial.print («AccErrorY:»); Serial.println (AccErrorY); Serial.print («GyroErrorX:»); Serial.println (GyroErrorX); Serial.print («GyroErrorY:»); Serial.println (GyroErrorY); Serial.print («GyroErrorZ:»); Serial.println (GyroErrorZ); } ------------------------------------------------- ---------------------------------------------- Нәтижелер:-X = Y = Z = --------------------------------------------- ----------------------------------------------- Маңызды ескерту: -----------------

Цикл бөлімінде біз акселерометр деректерін оқудан бастаймыз. Әр ось бойынша деректер 2 байтта немесе регистрде сақталады және сенсордың мәліметтер парағынан осы регистрлердің мекен -жайларын көре аламыз.

Барлығын оқу үшін біз бірінші регистрден бастаймыз, және RequestFrom () функциясын қолдана отырып, X, Y және Z осьтері үшін барлық 6 регистрді оқуды сұраймыз. Содан кейін біз әр регистрден деректерді оқимыз, және шығыс екі қосымша болғандықтан, біз оларды дұрыс біріктіріп, дұрыс мәндерді аламыз.

5 -қадам: көлбеу бұрышты түсіну

Акселерометр

Жердің тартылыс күші - бұл үнемі Жердің центріне қарай бағытталған тұрақты үдеу.

Акселерометр ауырлық күшіне параллель болғанда өлшенген үдеу 1G болады, акселерометр ауырлық күшіне перпендикуляр болғанда 0G өлшейді.

Көлбеу бұрышын мына теңдеу арқылы өлшенген үдеуден есептеуге болады:

θ = sin-1 (Өлшенген үдеу / гравитациялық үдеу)

GyroGyro (жылдамдық сенсоры) бұрыштық жылдамдықты (ω) өлшеу үшін қолданылады.

Роботтың көлбеу бұрышын алу үшін біз төмендегі теңдеуде көрсетілгендей гиродан алынған мәліметтерді біріктіруіміз керек:

ω = dθ / dt, θ = ∫ ω dt

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

Жақсырақ түсіну үшін сілтеме: мына жерді басыңыз

Ұсынылған: