Სარჩევი:

MPU 6050 Gyro, ამაჩქარებელი კომუნიკაცია Arduino– სთან (Atmega328p): 5 ნაბიჯი
MPU 6050 Gyro, ამაჩქარებელი კომუნიკაცია Arduino– სთან (Atmega328p): 5 ნაბიჯი

ვიდეო: MPU 6050 Gyro, ამაჩქარებელი კომუნიკაცია Arduino– სთან (Atmega328p): 5 ნაბიჯი

ვიდეო: MPU 6050 Gyro, ამაჩქარებელი კომუნიკაცია Arduino– სთან (Atmega328p): 5 ნაბიჯი
ვიდეო: How to use MPU-6050 Accelerometer and Gyroscope with Arduino code 2024, ივლისი
Anonim
MPU 6050 Gyro, ამაჩქარებელი კომუნიკაცია არდუინოსთან (Atmega328p)
MPU 6050 Gyro, ამაჩქარებელი კომუნიკაცია არდუინოსთან (Atmega328p)
MPU 6050 Gyro, ამაჩქარებელი კომუნიკაცია არდუინოსთან (Atmega328p)
MPU 6050 Gyro, ამაჩქარებელი კომუნიკაცია არდუინოსთან (Atmega328p)
MPU 6050 Gyro, ამაჩქარებელი კომუნიკაცია არდუინოსთან (Atmega328p)
MPU 6050 Gyro, ამაჩქარებელი კომუნიკაცია არდუინოსთან (Atmega328p)

MPU6050 IMU– ს აქვს 3 – ღერძიანი ამაჩქარებელი და 3 – ღერძიანი გიროსკოპი ერთ ჩიპზე.

გიროსკოპი ზომავს ბრუნვის სიჩქარეს ან კუთხის პოზიციის ცვლილების სიჩქარეს დროთა განმავლობაში, X, Y და Z ღერძების გასწვრივ.

გიროსკოპის გამომავალი გრადუსია წამში, ასე რომ კუთხის პოზიციის მისაღებად ჩვენ მხოლოდ კუთხის სიჩქარის ინტეგრირება გვჭირდება.

მეორეს მხრივ, MPU6050 ამაჩქარებელი ზომავს აჩქარებას გრავიტაციული აჩქარების გაზომვით 3 ღერძის გასწვრივ და ზოგიერთი ტრიგონომეტრიული მათემატიკის გამოყენებით შეგვიძლია გამოვთვალოთ სენსორის განლაგების კუთხე. ასე რომ, თუ ჩვენ გავაერთიანებთ, ან გავაერთიანებთ ამაჩქარებლის და გიროსკოპის მონაცემებს, შეგვიძლია მივიღოთ ძალიან ზუსტი ინფორმაცია სენსორის ორიენტაციის შესახებ.

3 ღერძიანი გიროსკოპი MPU-6050 შედგება 3 ღერძიანი გიროსკოპისგან, რომელსაც შეუძლია აღმოაჩინოს ბრუნვის სიჩქარე x, y, z ღერძის გასწვრივ მიკროელექტრო მექანიკური სისტემის ტექნოლოგიით (MEMS). როდესაც სენსორი ბრუნავს ნებისმიერი ღერძის გასწვრივ, ვიბრაცია წარმოიქმნება კორიოლისის ეფექტის გამო, რომელიც გამოვლენილია MEMS– ით. 16 ბიტიანი ADC გამოიყენება ძაბვის ციფრული გასაზომად თითოეული ღერძის შესამოწმებლად. +/- 250, +/- 500, +/- 1000, +/- 2000 არის გამომავალი მთლიანი დიაპაზონი. კუთხის სიჩქარე იზომება თითოეული ღერძის გასწვრივ მეორე ერთეულის ხარისხით.

სასარგებლო ბმული: …………….

არდუინოს დაფა: ……….

MPU6050 IMU ……………

ნაბიჯი 1: MPU-6050 მოდული

MPU-6050 მოდული
MPU-6050 მოდული

MPU-6050 მოდულს აქვს 8 პინი,

INT: ციფრული გამომავალი პინის შეწყვეტა.

AD0: I2C Slave მისამართი LSB პინი. ეს არის მე -0 ბიტი მოწყობილობის 7-ბიტიანი მონა მისამართში. თუ დაკავშირებულია VCC– სთან, ის იკითხება როგორც ლოგიკური ერთი და მონა მისამართის ცვლილებები.

XCL: სერიული საათის დამხმარე პინი. ეს პინი გამოიყენება სხვა I2C ინტერფეისით ჩართული სენსორების SCL პინის MPU-6050- თან დასაკავშირებლად.

XDA: დამხმარე სერიული მონაცემების პინი. ეს პინი გამოიყენება სხვა I2C ინტერფეისით ჩართული სენსორების SDA პინ MPU-6050– თან დასაკავშირებლად.

SCL: სერიული საათის პინი. შეაერთეთ ეს პინი მიკროკონტროლერებთან SCL პინთან. SDA: სერიული მონაცემების პინი. შეაერთეთ ეს პინი მიკროკონტროლერების SDA პინთან.

GND: სახმელეთო პინი. შეაერთეთ ეს პინი მიწასთან.

VCC: კვების ბლოკი. შეაერთეთ ეს პინი +5V DC წყაროსთან. MPU-6050 მოდულს აქვს Slave მისამართი (როდესაც AD0 = 0, ანუ ის არ არის დაკავშირებული Vcc– თან), როგორც, მონა ჩაწერეთ მისამართი (SLA+W): 0xD0

მონა წაკითხვის მისამართი (SLA+R): 0xD1

ნაბიჯი 2: გამოთვლები

გამოთვლები
გამოთვლები

MPU6050 მოდულის გიროსკოპისა და აქსელერომეტრის სენსორის მონაცემები შედგება 16 ბიტიანი ნედლეულის მონაცემებისაგან 2-ის შემავსებლის სახით.

MPU6050 მოდულის ტემპერატურის სენსორის მონაცემები შედგება 16 ბიტიანი მონაცემებისგან (არა 2-ის შემავსებლის სახით).

ახლა დავუშვათ, რომ ჩვენ ავირჩიეთ,

  • - აქსელერომეტრის სრული მასშტაბის დიაპაზონი +/- 2 გ მგრძნობელობის მასშტაბის ფაქტორით 16, 384 LSB (რაოდენობა)/გ.
  • - გიროსკოპის სრული დიაპაზონი +/- 250 °/წმ მგრძნობელობის მასშტაბის კოეფიციენტით 131 LSB (რაოდენობა)/°/წმ. მაშინ,

სენსორული ნედლეულის მონაცემების მისაღებად, ჩვენ ჯერ უნდა შევასრულოთ 2 -ის დამატება აქსელერომეტრისა და გიროსკოპის სენსორულ მონაცემებზე. სენსორული ნედლეულის მონაცემების მიღების შემდეგ ჩვენ შეგვიძლია გამოვთვალოთ აჩქარება და კუთხოვანი სიჩქარე სენსორული ნედლეულის მონაცემების დაყოფით მათი მგრძნობელობის მასშტაბის ფაქტორით შემდეგნაირად-

აქსელერომეტრის მნიშვნელობები g (g ძალა)

  • დაჩქარება X ღერძის გასწვრივ = (აქსელერომეტრი X ღერძი ნედლი მონაცემები/16384) გ.
  • აჩქარება Y ღერძის გასწვრივ = (ამაჩქარებელი Y ღერძი ნედლი მონაცემები/16384) გ.
  • აჩქარება Z ღერძის გასწვრივ = (აქსელერომეტრი Z ღერძი ნედლი მონაცემები/16384) გ.

გიროსკოპის მნიშვნელობა °/s- ში (ხარისხი წამში)

  • კუთხის სიჩქარე X ღერძის გასწვრივ = (გიროსკოპი X ღერძი ნედლი მონაცემები/131) °/წ.
  • კუთხის სიჩქარე Y ღერძის გასწვრივ = (გიროსკოპი Y ღერძი ნედლი მონაცემები/131) °/წ.
  • კუთხის სიჩქარე Z ღერძის გასწვრივ = (გიროსკოპი Z ღერძი ნედლი მონაცემები/131) °/წ.

ტემპერატურის მნიშვნელობა °/c (ხარისხი ცელსიუსზე)

ტემპერატურა გრადუსებში C = ((ტემპერატურის სენსორის მონაცემები)/340 + 36.53) °/გ.

Მაგალითად, დავუშვათ, 2’შევსების შემდეგ ვიღებთ აქსელერომეტრ X ღერძების ნედლ მნიშვნელობას = +15454

შემდეგ ცული = +15454/16384 = 0.94 გ.

მეტი,

ჩვენ ვიცით, რომ ჩვენ ვმოძრაობთ +/- 2G და +/- 250deg/s მგრძნობელობით, მაგრამ რამდენად შეესაბამება ჩვენი მნიშვნელობები ამ აჩქარებებს/კუთხეებს.

ეს ორივე სწორი ხაზის დიაგრამაა და ჩვენ შეგვიძლია განვსაზღვროთ მათგან, რომ 1G- ისთვის ჩვენ ვკითხულობთ 16384 -ს და 1 გრადუსზე/წამში 131.07 -ს (თუმცა.07 ბინარულის გამო იგნორირებას მიიღებს) ეს მნიშვნელობები მხოლოდ დამუშავებულია ნახაზის დახატვით სწორი ხაზის დიაგრამა 2G 32767 და -2G at -32768 და 250/-250 იმავე მნიშვნელობებით.

ასე რომ, ახლა ჩვენ ვიცით ჩვენი მგრძნობელობის მნიშვნელობები (16384 და 131.07) ჩვენ უბრალოდ უნდა გამოვყოთ ჩვენი ღირებულებებისგან გადახრები და შემდეგ გავყოთ მგრძნობელობა.

ეს მშვენივრად იმუშავებს X და Y მნიშვნელობებზე, მაგრამ რადგან Z დაფიქსირდა 1G და არა 0, ჩვენ დაგვჭირდება მინუს 1G (16384) გამოკლებით, სანამ ჩვენს მგრძნობელობაზე გავყოფთ.

ნაბიჯი 3: MPU6050-Atmega328p კავშირები

MPU6050-Atmega328p კავშირები
MPU6050-Atmega328p კავშირები
MPU6050-Atmega328p კავშირები
MPU6050-Atmega328p კავშირები
MPU6050-Atmega328p კავშირები
MPU6050-Atmega328p კავშირები

უბრალოდ შეაერთეთ ყველაფერი, როგორც ეს მოცემულია დიაგრამაზე…

კავშირები მოცემულია შემდეგნაირად:-

MPU6050 არდუინო ნანო

VCC 5v გარეთ pin

GND სახმელეთო პინი

SDA A4 pin // სერიული მონაცემები

SCL A5 პინი // სერიული საათი

მწვერვალისა და რულონის გაანგარიშება: როლი არის ბრუნვა x ღერძის გარშემო, ხოლო ნაბიჯი არის ბრუნვა y ღერძის გასწვრივ.

შედეგი არის რადიანი. (გადააკეთეთ გრადუსზე 180 -ით გამრავლებით და pi- ზე გაყოფით)

ნაბიჯი 4: კოდები და ახსნა

კოდები და განმარტებები
კოდები და განმარტებები

/*

Arduino და MPU6050 აქსელერომეტრისა და გიროსკოპის სენსორის სახელმძღვანელო დეჟანის მიერ, https://howtomechatronics.com */ #Include const int MPU = 0x68; // MPU6050 I2C მისამართი float AccX, AccY, AccZ; float GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; float roll, pitch, yaw; 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); // გადატვირთვა - მოათავსეთ 0 6B რეგისტრში Wire.endTransmission (ჭეშმარიტი); // გადაცემის დასრულება/* // კონფიგურაცია ამაჩქარებლის მგრძნობელობა - სრული მასშტაბის დიაპაზონი (ნაგულისხმევი +/- 2 გ) Wire.beginTransmission (MPU); Wire.write (0x1C); // ესაუბრეთ ACCEL_CONFIG რეგისტრს (1C hex) Wire.write (0x10); // რეგისტრაციის ბიტების დაყენება 00010000 (+/- 8 გ სრული დიაპაზონი) Wire.endTransmission (ჭეშმარიტი); // Gyro Sensitivity - Full Scale Range (default +/- 250deg/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // ესაუბრეთ GYRO_CONFIG რეგისტრს (1B hex) Wire.write (0x10); // რეგისტრაციის ბიტების დაყენება 00010000 (1000 გრადუსი/წ სრული მასშტაბით) Wire.endTransmission (ჭეშმარიტი); დაგვიანება (20); */ // დარეკეთ ამ ფუნქციაზე, თუ გჭირდებათ თქვენი მოდულის IMU შეცდომის მნიშვნელობების გაანგარიშება_IMU_error (); დაგვიანება (20); } void loop () {// === წაიკითხეთ ამაჩქარებლის მონაცემები === // Wire.beginTransmission (MPU); Wire.write (0x3B); // დაწყება რეგისტრაციით 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); მავთული. მოთხოვნა (MPU, 6, ჭეშმარიტი); // წაიკითხეთ სულ 6 რეგისტრი, თითოეული ღერძის მნიშვნელობა ინახება 2 რეესტრში | Wire.read ()) / 16384.0; // X ღერძის მნიშვნელობა AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Y ღერძის მნიშვნელობა AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Z ღერძის მნიშვნელობა // ბრუნვისა და სიმაღლის გამოთვლა ამაჩქარებლის მონაცემებიდან accAngleX = (ატანი (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 (-1.58) // === გიროსკოპის მონაცემების წაკითხვა === // previousTime = currentTime; // წინა დრო ინახება რეალურ დრომდე სანამ წაიკითხავს currentTime = millis (); // მიმდინარე დრო ფაქტობრივი დრო წაკითხული elapsedTime = (currentTime - previousTime) / 1000; // გაყავით 1000 -ზე, რომ მიიღოთ წამები Wire.beginTransmission (MPU); Wire.write (0x43); // გირო მონაცემების პირველი რეგისტრაციის მისამართი 0x43 Wire.endTransmission (false); მავთულის მოთხოვნა (MPU, 6, ჭეშმარიტი); // წაიკითხეთ სულ 4 რეგისტრი, თითოეული ღერძის მნიშვნელობა ინახება 2 რეესტრში GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // 250 გრადუსი/ წმ დიაპაზონისთვის ჩვენ უნდა გავყოთ პირველი ნედლეული 131.0 -ით, ცხრილის მიხედვით GyroY = (Wire.read () << 8 | Wire.read ())/ 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) // ამჟამად ნედლეულის მნიშვნელობა არის გრადუსში წამში, deg/s, ამიტომ ჩვენ უნდა გავამრავლოთ sendonds (s), რათა მივიღოთ კუთხე გრადუსებში gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * გასული დრო; yaw = yaw + GyroZ * გასული დრო; // დამატებითი ფილტრი - დააკავშიროთ ამაჩქარებელი და გირო კუთხის მნიშვნელობები roll = 0.96 * gyroAngleX + 0.04 * accAngleX; მოედანი = 0.96 * gyroAngleY + 0.04 * accAngleY; // მნიშვნელობების დაბეჭდვა სერიულ მონიტორზე Serial.print (roll); Serial.print ("/"); Serial.print (მოედანზე); Serial.print ("/"); Serial.println (yaw); } void calc_IMU_error () {// ჩვენ შეგვიძლია გამოვიძახოთ ეს ფუნქცია დაყენების განყოფილებაში, რათა გამოვთვალოთ ამაჩქარებელი და გირო მონაცემების შეცდომა. აქედან ჩვენ მივიღებთ სერიულ მონიტორზე დაბეჭდილ ზემოთ მოცემულ განტოლებებში გამოყენებული შეცდომის მნიშვნელობებს. // გაითვალისწინეთ, რომ ჩვენ უნდა განვათავსოთ IMU ბინა, რათა მივიღოთ შესაბამისი მნიშვნელობები, ასე რომ ჩვენ შეგვიძლია სწორი მნიშვნელობები // წავიკითხოთ აქსელერომეტრის მნიშვნელობები 200 -ჯერ, ხოლო (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (false); მავთული. მოთხოვნა (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 + ((atan (-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 (false); მავთულის მოთხოვნა (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 ++; } // ჯამი გაყავით 200 -ზე, რომ მიიღოთ შეცდომის მნიშვნელობა GyroErrorX = GyroErrorX /200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // დაბეჭდეთ შეცდომის მნიშვნელობები სერიულ მონიტორზე 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 ბაიტში ან რეგისტრში და ჩვენ ვხედავთ ამ რეგისტრების მისამართებს სენსორის მონაცემთა ცხრილიდან.

ყველა მათგანის წასაკითხად, ჩვენ ვიწყებთ პირველი რეგისტრით და requiestFrom () ფუნქციის გამოყენებით ვითხოვთ წავიკითხოთ ყველა ექვსი რეგისტრი X, Y და Z ღერძებისთვის. შემდეგ ჩვენ ვკითხულობთ მონაცემებს თითოეული რეგისტრიდან და რადგანაც გამომავალი ორმაგი დამატებაა, ჩვენ მათ სათანადოდ ვაერთიანებთ სწორი მნიშვნელობების მისაღებად.

ნაბიჯი 5: დახრის კუთხის გაგება

აქსელერომეტრი

დედამიწის გრავიტაცია არის მუდმივი აჩქარება, სადაც ძალა ყოველთვის მიმართულია დედამიწის ცენტრისკენ.

როდესაც ამაჩქარებელი გრავიტაციის პარალელურია, გაზომილი აჩქარება იქნება 1G, როდესაც ამაჩქარებელი გრავიტაციული პერპენდიკულარულია, ის 0G იქნება.

დახრის კუთხე შეიძლება გამოითვალოს გაზომილი აჩქარებიდან ამ განტოლების გამოყენებით:

θ = sin-1 (გაზომილი აჩქარება / გრავიტაციის აჩქარება)

GyroGyro (a.k.a. სენსორი) გამოიყენება კუთხის სიჩქარის გასაზომად (ω).

რობოტის დახრის კუთხის მისაღებად, ჩვენ უნდა გავაერთიანოთ მონაცემები გიროსკოპიდან, როგორც ეს მოცემულია ქვემოთ მოცემულ განტოლებაში:

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

გირო და აქსელერომეტრის სენსორული შერწყმა გიროსა და ამაჩქარებლის მახასიათებლების შესწავლის შემდეგ, ჩვენ ვიცით, რომ მათ აქვთ საკუთარი ძლიერი და სუსტი მხარეები. აქსელერომეტრის მონაცემებიდან გამოთვლილ დახრის კუთხეს აქვს ნელი რეაგირების დრო, ხოლო ინტეგრირებული დახრის კუთხე გიროსკოპიდან ექვემდებარება დრიფტს გარკვეული პერიოდის განმავლობაში. სხვა სიტყვებით რომ ვთქვათ, შეგვიძლია ვთქვათ, რომ აქსელერომეტრის მონაცემები სასარგებლოა გრძელვადიან პერსპექტივაში, ხოლო გიროსკოპია - მოკლევადიანი.

ბმული უკეთესი გაგებისთვის: დააწკაპუნეთ აქ

გირჩევთ: