Სარჩევი:

Arduino & MPU6050 დაფუძნებული ციფრული სული დონე: 3 ნაბიჯი
Arduino & MPU6050 დაფუძნებული ციფრული სული დონე: 3 ნაბიჯი

ვიდეო: Arduino & MPU6050 დაფუძნებული ციფრული სული დონე: 3 ნაბიჯი

ვიდეო: Arduino & MPU6050 დაფუძნებული ციფრული სული დონე: 3 ნაბიჯი
ვიდეო: Гироскоп-Акселерометр MPU-6050. Первое знакомство 2024, ნოემბერი
Anonim
Image
Image
წრე
წრე

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

ეს პროექტი არის არდუინოს და MPU6050 ციფრული სულის დონის შექმნა. მიუხედავად იმისა, რომ დასრულებული დიზაინი და კოდი ჩემია, ორიგინალური კონცეფცია და კოდის დიდი ნაწილი, რომელზეც ვიმუშავე, არ არის. მე არ ვარ პლაგიატში, ასე რომ მე უფრო ბედნიერი ვარ, რომ მივანიჭო დამსახურება მათ, ვისი იდეებიც მე შემექმნა. ორი მთავარი ადამიანი, ვისი ყვირილით უნდა გამოვიდე, არის YouTuber– ის პოლ მაკვორტერი და DroneBot Workshop. მათ ბმულებს ვდებ ჩემს youtube– ის სასარგებლო PDF ბმულებში. ასევე მადლობა EEEnthusiast– ს MPU6050– ის გამოყენების შესახებ ინფორმაციული ვიდეოსთვის, რომელიც მოიცავს მოდულის დაყენებას და კითხვას გარე ბიბლიოთეკის გარეშე (მისი ბმული არის იგივე PDF– ში).

პროექტი, რომელიც მე შევადგინე, მუშაობს "როგორც არის" და არის ზღაპრული ზუსტი, რა თქმა უნდა 45% -მდე ორივე მიმართულებით. თქვენ შეგიძლიათ გამოიყენოთ ზუსტად ისე, როგორც მე შევიმუშავე იგი, ან შეგიძლიათ მოარგოთ იგი თქვენს გემოვნებაზე. თქვენგან უფრო გამჭრიახი შეამჩნევთ, რომ ჩემი პროექტი თითქმის იდენტურია DroneBot– ის სახელოსნოს მიერ წარმოდგენილ პროექტთან, მაგრამ დარწმუნებული იყავით, რომ არსებობს მნიშვნელოვანი განსხვავებები, განსაკუთრებით მაშინ, როდესაც საქმე ეხება კუთხეების გამოთვლის კოდს, ასევე კალიბრაციის მნიშვნელობების შესანახ ობიექტს. ეპრომ!

ზოგიერთი თვისება თქვენი მადის გასამყარებლად:

Pitch and Roll კუთხეები ხელმისაწვდომია 0.1 გრადუსამდე.

გირო ერთეულის ორიენტაციის ავტომატური გამოვლენა (ჰორიზონტალური ან ვერტიკალური)

სრული კალიბრაცია შედეგებით ავტომატურად ინახება eeprom– ში

LED ჩვენება -2 დან +2 გრადუსამდე (ცვალებადია კოდით)

დონის დამატებითი ხმოვანი მითითება (შეიძლება ჩართოთ/გამორთოთ ფრენის დროს)

კომპაქტური კურკი, რომელიც მოითხოვს მინიმალურ კომპონენტებს

Დავიწყოთ.

მარაგები

ეს პროექტი (როგორც არის) იყენებს შემდეგ ელემენტებს:

1 x Arduino nano (ჩემი არის კლონი)

1 x MPU6050 გირო/ამაჩქარებლის მოდული

1 x LCD - 16 x 2 + I2C კავშირი

1 x დააჭირეთ ღილაკს გადართვისთვის

1 x Piezo buzzer

1 x მწვანე LED

2 x ყვითელი LED ნათურები

2 x წითელი LED

5 x 220 ohm რეზისტორები

სხვადასხვა ჯუმბერის კაბელები

პურის დაფა

კვების ბლოკი (ჩემმა გამოიყენა 5 ვ USB დენის ბანკი, როდესაც არ იყო დაკავშირებული ჩემს კომპიუტერთან, მაგრამ თქვენ შეგიძლიათ გამოიყენოთ ბატარეა სათანადოდ დაკავშირებული)

ნაბიჯი 1: წრე

წრე
წრე
წრე
წრე

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

მე ვაჩვენებ ჩემს კონფიგურაციას როგორც სახელმძღვანელოს, მაგრამ კავშირები შემდეგია:

Arduino pin D2 აკავშირებს გადამრთველის 1 მხარეს. ბიძგის გადამრთველის მეორე მხარე უკავშირდება მიწას

Arduino pin D3 აკავშირებს 220 ohm რეზისტორის 1 მხარეს. რეზისტორის მეორე მხარე უკავშირდება წითელი LED- ის ანოდს. წითელი LED კათოდი მიწაზე მიდის.

Arduino pin D4 აკავშირებს 220 ohm რეზისტორის 1 მხარეს. რეზისტორის მეორე მხარე უკავშირდება ყვითელი LED- ის ანოდს. ყვითელი LED კათოდური მიდის მიწაზე.

Arduino pin D5 აკავშირებს 220 ohm რეზისტორის 1 მხარეს. რეზისტორის მეორე მხარე უკავშირდება მწვანე LED- ის ანოდს. მწვანე LED კათოდი მიწაზე მიდის.

Arduino pin D6 აკავშირებს 220 ohm რეზისტორის 1 მხარეს. რეზისტორის მეორე მხარე უკავშირდება ყვითელი LED- ის ანოდს. ყვითელი LED კათოდური მიდის მიწაზე.

Arduino pin D7 აკავშირებს 220 ohm რეზისტორის 1 მხარეს. რეზისტორის მეორე მხარე უკავშირდება წითელი LED- ის ანოდს. წითელი LED კათოდი მიწაზე მიდის.

Arduino pin D8 აკავშირებს პიეზო ზუზერის ერთ მხარეს. ზუზერის მეორე მხარე მიწას უკავშირდება.

Arduino pin A4 აკავშირებს SDA ქინძისთავებს MPU6050 და LCD.

Arduino pin A5 აკავშირებს SCL ქინძისთავებს MPU6050 და LCD

5v ენერგია და Gnd MPU6050 და LCD– ისთვის მოდის Arduino Nano 5v და GND ქინძისთავებიდან შესაბამისად.

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

ნაბიჯი 2: კოდი

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

LiquidCrystal_I2C.h ბიბლიოთეკა, როგორც ეს შემოვიღე, როდესაც პირველად დავიწყე მუშაობა LCD– ებთან. სამწუხაროდ, არსებობს რამდენიმე ბიბლიოთეკა, რომელიც იყენებს ერთსა და იმავე #ჩათვლით განცხადებას, მაგრამ ოდნავ განსხვავებულია. თუ თქვენ გაქვთ პრობლემები, იპოვეთ სხვა LCD კოდი, რომელიც თქვენთვის მუშაობს და შეცვალეთ კოდი შესაბამისად. სავარაუდოა, რომ ეს არის განსხვავებული კონფიგურაცია. ყველა "დაბეჭდვის" ბრძანება ერთნაირად უნდა მუშაობდეს.

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

LiquidCrystal_I2C LCD (0x27, 16, 2);

ზემოთ მოყვანილი კოდი არის ჩემი LCD– ის დაყენება. თუ თქვენი ბიბლიოთეკა განსხვავებულია, შეიძლება დაგჭირდეთ არა მხოლოდ ბიბლიოთეკის, არამედ ამ ხაზის შეცვლა.

{lcd.setCursor (0, 1); lcd.print ("ჰორიზონტალური!"); ორიენტაცია = ჰორიზონტალური; // MPU-6050– ის ნედლი acc და gyro მონაცემების 1000-ჯერ წაკითხვა (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // დაამატეთ gyro x offset gyro_x_cal ცვლადს gyro_x_cal += gyro_x; // დაამატეთ gyro y offset gyro_y_cal ცვლადს gyro_y_cal += gyro_y; // დაამატეთ gyro z offset gyro_z_cal ცვლადს gyro_z_cal += gyro_z; // დაამატეთ acc x ოფსეტი acc_x_cal ცვლადს acc_x_cal += acc_x; // დაამატეთ acc y ოფსეტი acc_y_cal ცვლადს acc_y_cal += acc_y; } // გაყავით ყველა შედეგი 1000 -ზე, რომ მიიღოთ საშუალო ოფსეტური gyro_x_cal /= 1000.0; gyro_y_cal /= 1000.0; gyro_z_cal /= 1000.0; acc_x_cal /= 1000.0; acc_y_cal /= 1000.0; horizonalCalibration = 255; eeprom_address = 0; EEPROM.put (eeprom_address, horizonalCalibration); eeprom_address += ზომა (int); EEPROM.put (eeprom_address, gyro_x_cal); eeprom_address += ზომა (float); EEPROM.put (eeprom_address, gyro_y_cal); eeprom_address += ზომა (float); EEPROM.put (eeprom_address, gyro_z_cal); eeprom_address += ზომა (float); EEPROM.put (eeprom_address, acc_x_cal); eeprom_address += ზომა (float); EEPROM.put (eeprom_address, acc_y_cal); eeprom_address += ზომა (float); // გაითვალისწინეთ, რომ ჩვენ არ ვინახავთ ოფსეტს acc_z– სთვის, სიმძიმის გამო! დაგვიანება (500); }

კოდის ზემოთ მოყვანილი ბლოკი ასრულებს კალიბრაციის რუტინას. ეს კოდი განკუთვნილია ჰორიზონტალური დაკალიბრებისთვის. არსებობს თითქმის იდენტური კოდი ვერტიკალური დაკალიბრებისთვის (გაითვალისწინეთ, რომ კოდმა იცის თქვენი MPU6050 დამონტაჟებულია ჰორიზონტალურად თუ ვერტიკალურად!). MPU6050, იკითხება 1000 -ჯერ. შესაბამისი მნიშვნელობები კუმულაციურად ემატება, შემდეგ იყოფა 1000 -ზე, რათა მივიღოთ საშუალო "ოფსეტური" მნიშვნელობა. ეს მნიშვნელობები შემდეგ ინახება ნანო ეპრომში. ყველა ჰორიზონტალური დაკალიბრების მნიშვნელობა ინახება დაწყებული eeprom მისამართიდან 0. ყველა ვერტიკალური მნიშვნელობა ინახება დასაწყისში eeprom მისამართი 24. დაკალიბრება უნდა მოხდეს სრულიად თანაბარ ზედაპირზე, წინააღმდეგ შემთხვევაში ისინი არაფერს ნიშნავს.

/ * * მომდევნო რამდენიმე სტრიქონი ამუშავებს ნედლეულ მონაცემებს მის შესაცვლელად კუთხეებად, რომელიც შეიძლება გამოვიდეს LCD და LED– ებზე. * მნიშვნელობა 4096, რომელზედაც დაყოფილია აჩქარების მონაცემები, აღებულია MPU6050 მონაცემთა ცხრილიდან და ემყარება შერჩევის მაჩვენებელს. * 9.8 არის გრავიტაცია * atan2 ფუნქცია არის მათემატიკის მოდულიდან და გამოიყენება მოცემული მონაცემებიდან კუთხეების გამოსათვლელად */thetaM = -atan2 ((acc_x/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // ნედლეული მონაცემები phiM = -atan2 ((acc_y/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // ნედლეული მონაცემები dt = (millis ()-millisOld)/1000.; millisOld = მილი (); / * * ეს განყოფილება იყენებს გიროს მონაცემებს, რათა სისტემა უფრო მგრძნობიარე იყოს * ღირებულება 65.5, რომელიც გირო მონაცემებს იყოფა, აღებულია MPU6050 მონაცემებიდან და ემყარება შერჩევის მაჩვენებელს */ theta = (theta+(gyro_y/ 65.5)*დტ)*. 96 + thetaM*.04; // დაბალი გავლის ფილტრი phi = (phi + (gyro_x/65.5)*dt)*. 96 + phiM*.04; // დაბალი გავლის ფილტრი

ზემოთ მოყვანილი კოდი არის ის, რაც ითვლის კუთხეებს. ვიმედოვნებთ, რომ კომენტარები იძლევა მცირე ინფორმაციას იმის შესახებ, თუ როგორ მუშაობს იგი, მაგრამ სიღრმისეული ახსნისთვის იხილეთ პოლ მაკვორტერსის ვიდეო, რომელიც დაკავშირებულია თანდართულ PDF– ში. რასაც მე ვიტყვი არის ის, რომ თქვენ შეგიძლიათ შეცვალოთ ნიმუშის მაჩვენებელი გიროსკოპისა და ამაჩქარებლისთვის (რაც კეთდება MPU6050 ქვეპროგრამაში, ჩემი კოდის ბოლოში). თუ თქვენ შეცვლით ნიმუშის მაჩვენებელს, თქვენ ასევე უნდა შეცვალოთ რამდენად იყოფა ნედლეული მონაცემები. აქსელერომეტრის მონაცემებისთვის, ამჟამინდელი მნიშვნელობაა 4096. გიროსთვის, ამჟამინდელი მნიშვნელობა არის 65.5.

იხილეთ თანდართული მონაცემთა ფურცლები და EEEntusiast– ის ვიდეო (ბმული თანდართულ PDF– ში) უფრო სიღრმისეული ინფორმაციისათვის, თუ როგორ მოიპოვება შერჩევისა და კომპენსირებული მნიშვნელობები.

ნაბიჯი 3: შემდეგი ნაბიჯები

ამ მომენტამდე იმედია გაკეთდება ეს პროექტი, მაგრამ რა არის ახლა?

უპირველეს ყოვლისა, რატომ არ დაამყარეთ ის სულიერ დონეზე, რომლის გამოყენებაც შეგიძლიათ. თქვენ შეგიძლიათ შეიძინოთ იაფი სული (დარწმუნდით, რომ ეს არის ყუთის ტიპი), რომლის მორგებაც შეგიძლიათ, ან თუ გაქვთ ნაკრები, დაბეჭდეთ თქვენი საკუთარი დონე/ყუთი.

ალბათ ითამაშეთ გიროსა და ამაჩქარებლის შერჩევის მაჩვენებლებით, რომ ნახოთ ისინი ერთზე უკეთესად მუშაობენ, ვიდრე მეორეზე.

ეცადეთ კოდი კიდევ უფრო დახვეწოთ. მაგალითად, ამჟამად, 45 გრადუსს მიღმა, გამოთქმული კუთხე რბილად რომ ვთქვათ უხეშია. არის რაიმე გზა მის გარშემო?

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

თუ მოგწონთ ეს სასწავლო, გთხოვთ მოიწონოთ, რომ ვიცოდე.

თუ ამას აკეთებთ, გთხოვთ მაჩვენეთ (განსაკუთრებით თუ ის სამუშაო შემთხვევაშია).

ᲒᲛᲐᲓᲚᲝᲑᲗ

გირჩევთ: