Arduino & MPU6050 Թվային ոգու վրա հիմնված մակարդակ ՝ 3 քայլ
Arduino & MPU6050 Թվային ոգու վրա հիմնված մակարդակ ՝ 3 քայլ
Anonim
Image
Image
The Circuit
The Circuit

Բարի գալուստ իմ առաջին երբևէ ուսանելի: Հուսով եմ, որ այն տեղեկատվական կգտնեք: Խնդրում ենք ազատ զգալ թողնել դրական կամ բացասական կարծիքներ:

Այս նախագիծը պետք է դարձնի arduino- ի և MPU6050- ի վրա հիմնված թվային ոգու մակարդակ: Մինչ պատրաստի դիզայնը և ծածկագիրը իմն են, սկզբնական հայեցակարգը և այն կոդի մեծ մասը, որից ես աշխատել եմ, այդպիսին չեն: Ես գրագողության մեջ չեմ, ուստի ավելի քան ուրախ եմ գնահատական տալ նրանց, ում գաղափարների վրա եմ կառուցել: Երկու հիմնական մարդիկ, ում ես ուզում եմ բացականչել, են YouTuber- ի Paul McWhorter- ը և DroneBot Workshop- ը: Ես դրանց հղումները ներառում եմ իմ youtube- ի օգտակար PDF հղումներում: Շնորհակալություն նաև EEEnthusiast- ին ՝ MPU6050- ի օգտագործման վերաբերյալ տեղեկատվական տեսանյութի համար, ներառյալ մոդուլից առանց արտաքին գրադարանի տեղադրման և ընթերցման (նրա հղումը նույն PDF- ում է):

Իմ պատրաստած նախագիծը աշխատում է «ինչպես կա» և հեքիաթային ճշգրիտ է, անշուշտ մինչև 45% երկու ուղղություններով: Դուք կարող եք օգտագործել այն այնպես, ինչպես ես եմ այն նախագծել, կամ կարող եք այն հարմարեցնել ձեր սեփական ճաշակին: Ձեզանից առավել խորաթափանց կնկատեք, որ իմ նախագիծը գրեթե նույնական է DroneBot- ի արտադրամասի նախագծին, բայց վստահ եղեք, որ կան էական տարբերություններ, հատկապես, երբ խոսքը վերաբերում է անկյունների հաշվարկման կոդին, գումարած հարմարեցումը `կալիբրացիոն արժեքներ պահելու համար: Եփրոմ

Ձեր ախորժակը բացելու որոշ առանձնահատկություններ.

Պտտման և գլորման անկյունները մատչելի են 0.1 աստիճանի սահմաններում:

Գիրո միավորի կողմնորոշման ավտոմատ հայտնաբերում (հորիզոնական կամ ուղղահայաց)

Ամբողջական ճշգրտում ՝ արդյունքներով ավտոմատ կերպով պահվող eeprom- ում

LED ցուցիչ -2 -ից +2 աստիճան (փոփոխելի է կոդով)

Մակարդակի լրացուցիչ լսելի ցուցում (կարելի է միացնել/անջատել ինքնաթիռում)

Կոմպակտ ճարմանդ, որը պահանջում է նվազագույն բաղադրիչներ

Եկեք սկսենք.

Պարագաներ

Այս նախագիծը (ինչպես կա) օգտագործում է հետևյալ տարրերը.

1 x Arduino nano (իմը կլոն է)

1 x MPU6050 գիրո/արագացուցիչի մոդուլ

1 x LCD - 16 x 2 + I2C միացում

1 x Անցում կատարելու համար սեղմեք

1 x Պիեզո ազդանշան

1 x Կանաչ LED

2 x դեղին LED

2 x կարմիր LED

5 x 220 ohm դիմադրիչներ

Տարբեր jumper մալուխներ

Breadboard

Էլեկտրաէներգիայի մատակարարում (իմն օգտագործել է 5 վ USB հզորության բանկ, երբ միացված չէ իմ համակարգչին, բայց կարող եք օգտագործել մարտկոցը համապատասխան միացված)

Քայլ 1: Շղթան

The Circuit
The Circuit
The Circuit
The Circuit

Ենթադրելով, որ դուք ունեք բոլոր բաղադրիչները, ձեզ հարկավոր է կառուցել ձեր հացահատիկը:

Ես ցույց եմ տալիս իմ կարգավորումը որպես ուղեցույց, բայց կապերը հետևյալն են.

Arduino քորոց D2- ը միանում է սեղմիչ անջատիչի 1 կողմին: Անջատիչի մյուս կողմը միանում է գետնին

Arduino կապում D3- ը միանում է 220 օհմ դիմադրության 1 կողմին: Ռեզիստորի մյուս կողմը միանում է Կարմիր LED լուսադիոդին: Կարմիր LED- ի կաթոդն անցնում է գետնին:

Arduino քորոց D4- ը միանում է 220 օհմ դիմադրության 1 կողմին: Ռեզիստորի մյուս կողմը միանում է դեղին LED լուսադիոդին: Դեղին LED լուսադիոդը անցնում է գետնին:

Arduino քորոց D5- ը միանում է 220 օհմ դիմադրության 1 կողմին: Ռեզիստորի մյուս կողմը միանում է Կանաչ LED լուսադիոդին: Կանաչ LED- ի կաթոդն անցնում է գետնին:

Arduino կապում D6- ը միանում է 220 օհմ դիմադրության 1 կողմին: Ռեզիստորի մյուս կողմը միանում է դեղին LED լուսադիոդին: Դեղին LED լուսադիոդը անցնում է գետնին:

Arduino քորոց D7- ը միանում է 220 օհմ դիմադրության 1 կողմին: Ռեզիստորի մյուս կողմը միանում է Կարմիր LED լուսադիոդին: Կարմիր LED- ի կաթոդն անցնում է գետնին:

Arduino կապիչ D8- ը միանում է Piezo ազդանշանի մի կողմին: Buանգիչի մյուս կողմը միանում է գետնին:

Arduino pin A4- ը միանում է MPU6050- ի և LCD- ի SDA կապումներին:

Arduino pin A5- ը միանում է MPU6050- ի և LCD- ի SCL կապերին

5v հոսանքը և Gnd MPU6050- ի և LCD- ի համար գալիս են համապատասխանաբար Arduino Nano 5v և GND կապումներից:

Ավարտելուց հետո այն պետք է նման լինի իմ ցուցադրած կարգավորմանը: Ես Blu takak- ը դնում եմ MPU6050- ի տակ, որպեսզի այն չշարժվի, ինչպես նաև LCD- ի վրա `այն պահելու եզրին:

Քայլ 2: Կոդ

Կցված կոդը այն ծածկագիրն է, որը ես օգտագործել եմ այս նախագծի համար: Միակ գրադարանը, որի հետ կարող եք խնդիր ունենալ, դա է

LiquidCrystal_I2C.h գրադարանը, քանի որ այն ներմուծեցի, երբ առաջին անգամ սկսեցի աշխատել LCD- ների հետ: Unfortunatelyավոք, կան մի քանի գրադարաններ, որոնք օգտագործում են նույն #Include հայտարարությունը, բայց մի փոքր տարբեր են: Եթե ձեր հետ խնդիրներ ունեք, գտեք մեկ այլ LCD կոդ, որն աշխատում է ձեզ համար և համապատասխանաբար փոխեք ծածկագիրը: Ամենայն հավանականությամբ, դա տարբերվող կարգավորումն է: Բոլոր «տպման» հրամանները պետք է աշխատեն նույնը:

Ամբողջ ծածկագիրը մեկնաբանված է և ենթադրելով, որ ես դա ճիշտ եմ արել, կլինի նաև ամեն ինչ բացատրող տեսանյութ, բայց ահա մի քանի կետ պետք է նշել.

LiquidCrystal_I2C LCD (0x27, 16, 2);

Վերոնշյալ կոդը իմ LCD- ի կարգավորումն է: Եթե ձեր գրադարանը տարբեր է, գուցե անհրաժեշտ լինի փոխել ոչ միայն ձեր գրադարանը, այլև այս տողը:

{lcd.setCursor (0, 1); lcd.print («Հորիզոնական»); կողմնորոշում = ՀՈՐԻZՈՆԱԿԱՆ; // Կարդացեք MPU-6050- ի չմշակված acc և gyro տվյալները 1000 անգամ (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // 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 += sizeof (int); EEPROM.put (eeprom_address, gyro_x_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, gyro_y_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, gyro_z_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, acc_x_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, acc_y_cal); eeprom_address += sizeof (float); // Ուշադրություն դարձրեք, մենք չենք պահում օֆսեթ acc_z- ի համար, ծանրության պատճառով: ուշացում (500); }

Կոդի վերը նշված բլոկը կատարում է ստուգաչափման ռեժիմը: Այս ծածկագիրը հորիզոնական ճշգրտման համար է: Գոյություն ունի գրեթե նույնական ծածկագիր ուղղահայաց տրամաչափման համար (նշեք, ծածկագիրը գիտի ՝ ձեր MPU6050- ը տեղադրված է հորիզոնական թե՞ ուղղահայաց): MPU6050, կարդացվել է 1000 անգամ: համապատասխան արժեքները կուտակային կերպով ավելացվում են, ապա բաժանվում 1000 -ի `միջին« փոխհատուցված »արժեք տալու համար: Այս արժեքները պահվում են Nano eeprom- ում: Բոլոր հորիզոնական տրամաչափման արժեքները պահվում են eeprom հասցեից սկսած: Բոլոր ուղղահայաց արժեքները սկզբից պահվում են 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 = millis (); / * * Այս բաժինը կիրառում է գիրոյի տվյալները ՝ համակարգը ավելի արձագանքելու համար * 65.5 արժեքը, որի վրա կինրո տվյալները բաժանված են, վերցված է MPU6050 տվյալների թերթից և հիմնված է ընտրանքի արագության վրա */ theta = (theta+(gyro_y/ 65.5)*դտ)*. 96 + thetaM*.04; // passածր անցումային ֆիլտր phi = (phi + (gyro_x/65.5)*dt)*. 96 + phiM*.04; // passածր փոխանցման զտիչ

Վերը նշված ծածկագիրը այն անկյուններն են, որոնք հաշվարկում են: Հուսանք, որ մեկնաբանությունները մի փոքր պատկերացում կտան, թե ինչպես է այն աշխատում, բայց խորը բացատրության համար տես Փոլ ՄաքՎորթերսի տեսանյութը, որը կցված է կցված PDF- ում: Այն, ինչ ես կասեմ, այն է, որ դուք կարող եք փոխել նմուշառման արագությունը գիրոյի և արագացուցիչի համար (ինչը կատարվում է MPU6050 ենթածրագրում ՝ իմ ծածկագրի ներքևում): Եթե դուք փոխում եք նմուշի տոկոսադրույքը, դուք նույնպես պետք է փոխեք, թե որքանով են բաժանվում հումքի տվյալները: Արագացուցիչի տվյալների համար ներկայիս արժեքը 4096 է: theիրոյի համար ընթացիկ արժեքը 65.5 է:

Անդրադառնացեք կից տվյալների թերթերին և EEEntusiast- ի տեսանյութին (հղումը կցված PDF- ում) `ավելի մանրամասն տեղեկությունների համար, թե ինչպես են հայտնաբերվում ընտրանքային և փոխհատուցված արժեքները:

Քայլ 3: Հաջորդ քայլերը

Այս պահին, հուսով եմ, որ այս նախագիծը կկատարվեր, բայց հիմա ի՞նչ:

Նախ, ինչու իրականում այն չդարձնել հոգևոր մակարդակի, որը կարող եք օգտագործել: Դուք կարող եք գնել էժան ոգու մակարդակ (համոզվեք, որ դա տուփի տեսակն է), որը կարող եք հարմարեցնել, կամ եթե ունեք հավաքածուն, տպեք ձեր սեփական մակարդակը/տուփը:

Թերևս խաղացեք գիրո և արագացուցիչի ընտրանքային դրույքաչափերի հետ `տեսնելու, թե արդյոք դրանք ավելի լավ են աշխատում, քան մյուսը:

Փորձեք ավելի ճշգրտել ծածկագիրը: Օրինակ, ներկայումս, 45 աստիճանից այն կողմ, նշված անկյունը մեղմ ասած կոպիտ է: Կա՞ արդյոք դրա շուրջ միջոց:

Եթե ունեք որևէ հարց, որքան էլ դրանք պարզ թվան, խնդրեք: Եթե կարողանամ օգնել, կանեմ:

Եթե ձեզ դուր է գալիս այս խրատը, խնդրում եմ դրեք լայք, որպեսզի ես իմանամ:

Եթե դուք պատրաստում եք սա, խնդրում եմ ցույց տվեք ինձ (հատկապես, եթե դա աշխատանքային պատյանում է):

ՇՆՈՐՀԱԿԱԼՈՒԹՅՈՒՆ

Խորհուրդ ենք տալիս: