2025 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2025-01-13 06:57
Sveiki atvykę į mano pirmą pamokomą pamoką! Tikiuosi, kad jums tai pasirodė informatyvi. Prašome nedvejodami palikti atsiliepimus, teigiamus ar neigiamus.
Šio projekto tikslas - sukurti arduino ir MPU6050 skaitmeninį gulsčiuką. Nors baigtas dizainas ir kodas yra mano, pirminė koncepcija ir daugelis kodo, iš kurių dirbau, nėra. Nesu plagiatas, todėl džiaugiuosi galėdamas padėkoti tiems, kurių idėjomis aš remiausi. 2 pagrindiniai žmonės, kuriems noriu šaukti, yra „YouTuber“atstovas Paul McWhorter ir „DroneBot Workshop“. Nuorodas į jas įtraukiu į savo „YouTube“naudingas PDF nuorodas. Taip pat dėkoju „EEEnthusiast“už informatyvų vaizdo įrašą apie naudojimąsi MPU6050, įskaitant sąranką ir skaitymą iš modulio be išorinės bibliotekos (jo nuoroda yra tame pačiame PDF faile).
Mano sukurtas projektas veikia „toks, koks yra“ir yra pasakiškas, tikrai iki 45% bet kuria kryptimi. Galite naudoti tiksliai taip, kaip aš suprojektavau, arba galite pritaikyti pagal savo skonį. Sąmoningesni pastebėsite, kad mano projektas atrodo beveik identiškas tam, kurį pagamino „DroneBot“dirbtuvės, tačiau būkite tikri, kad yra reikšmingų skirtumų, ypač kalbant apie kampų skaičiavimo kodą ir galimybę išsaugoti kalibravimo vertes Eeprom!
Kai kurios savybės, skatinančios apetitą:
Pasvirimo ir pasukimo kampai yra 0,1 laipsnio tikslumu.
Automatinis giroskopo įrenginio padėties nustatymas (horizontalus arba vertikalus)
Visiškas kalibravimas, kurio rezultatai automatiškai išsaugomi „eeprom“
LED indikatorius nuo -2 iki +2 laipsnių (galima keisti kodu)
Papildoma garsinė lygio indikacija (galima įjungti/išjungti skrendant)
Kompaktiška grandinė, kuriai reikia minimalių komponentų
Pradėkime.
Prekės
Šiame projekte (kaip yra) naudojami šie elementai:
1 x „Arduino nano“(mano yra klonas)
1 x MPU6050 giroskopo/akselerometro modulis
1 x LCD - 16 x 2 + I2C jungtis
1 x Paspauskite, kad perjungtumėte
1 x pjezo garsinis signalas
1 x žalias šviesos diodas
2 x geltoni šviesos diodai
2 x raudoni šviesos diodai
5 x 220 omų rezistoriai
Įvairūs jungiamieji kabeliai
Bandomoji Lenta
Maitinimo šaltinis (mano buvo naudojamas 5 V USB maitinimo blokas, kai jis nebuvo prijungtas prie mano kompiuterio, tačiau galite naudoti tinkamai prijungtą bateriją)
1 žingsnis: grandinė
Darant prielaidą, kad turite visus komponentus, turėsite sukurti savo duonos lentą.
Aš parodau savo sąranką kaip vadovą, tačiau jungtys yra tokios:
„Arduino“kaištis D2 jungiamas prie 1 stūmiklio jungiklio pusės. Kita stūmimo jungiklio pusė jungiasi prie žemės
„Arduino“kaištis D3 jungiamas prie vienos 220 omų rezistoriaus pusės. Kita rezistoriaus pusė jungiama prie raudonos šviesos diodo anodos. Raudonojo LED katodas eina į žemę.
„Arduino“kaištis D4 jungiamas prie vienos 220 omų rezistoriaus pusės. Kita rezistoriaus pusė jungiama prie geltonos šviesos diodo anodos. Geltonos šviesos diodo katodas eina į žemę.
„Arduino“kaištis D5 jungiamas prie vienos 220 omų rezistoriaus pusės. Kita rezistoriaus pusė jungiama prie žalios šviesos diodo anodos. Žalios šviesos diodo katodas eina į žemę.
„Arduino“kaištis D6 jungiamas prie vienos 220 omų rezistoriaus pusės. Kita rezistoriaus pusė jungiama prie geltonos šviesos diodo anodos. Geltonos šviesos diodo katodas eina į žemę.
„Arduino“kaištis D7 jungiasi prie 1 220 omų rezistoriaus pusės. Kita rezistoriaus pusė jungiama prie raudonos šviesos diodo anodos. Raudonojo LED katodas eina į žemę.
„Arduino“kaištis D8 jungiasi prie vienos „Piezo“garsinio signalo pusės. Kita garsinio signalo pusė jungiasi prie žemės.
„Arduino“kaištis A4 jungiamas prie SDA kaiščių MPU6050 IR skystųjų kristalų ekrane.
„Arduino“kaištis A5 jungiasi prie MPL6050 IR LCD SCL kaiščių
MPV6050 ir LCD 5V maitinimas ir Gnd gaunami atitinkamai iš „Arduino Nano 5v“ir „GND“kaiščių.
Kai baigsite, jis turėtų būti panašus į parodytą mano sąranką. Aš įdėjau „blu tak“po MPU6050, kad jis nejudėtų, taip pat LCD, kad jis būtų ant duonos lentos krašto.
2 žingsnis: kodas
Pridėtas kodas yra kodas, kurį naudoju šiam projektui. Vienintelė biblioteka, su kuria gali kilti problemų, yra
„LiquidCrystal_I2C.h“biblioteka, kurią importavau, kai pirmą kartą pradėjau dirbti su LCD. Deja, yra keletas bibliotekų, kuriose naudojamas tas pats #include teiginys, tačiau jos šiek tiek skiriasi. Jei turite problemų su savo, suraskite kitą jums tinkantį LCD kodą ir atitinkamai pakeiskite kodą. Tikėtina, kad skiriasi tik sąranka. Visos „spausdinimo“komandos turėtų veikti vienodai.
Visas kodas buvo pakomentuotas ir darant prielaidą, kad padariau teisingai, taip pat bus vaizdo įrašas, kuriame viskas paaiškinta, tačiau atkreipkite dėmesį į keletą punktų:
LiquidCrystal_I2C LCD (0x27, 16, 2);
Aukščiau pateiktas kodas yra mano LCD sąranka. Jei jūsų biblioteka yra kitokia, gali tekti pakeisti ne tik biblioteką, bet ir šią eilutę.
{lcd.setCursor (0, 1); lcd.print ("Horizontalus!"); orientacija = HORIZONTALI; // 1000 kartų skaitykite neapdorotus acc ir giroskopo duomenis iš MPU-6050 (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // Giroskopo x poslinkį pridėti prie kintamojo gyro_x_cal gyro_x_cal += gyro_x; // Pridėkite giroskopinį poslinkį prie gyro_y_cal kintamojo gyro_y_cal += gyro_y; // Pridėti gyro z poslinkį prie gyro_z_cal kintamojo gyro_z_cal += gyro_z; // Pridėti acc x poslinkį prie acc_x_cal kintamojo acc_x_cal += acc_x; // Pridėti acc y poslinkį prie acc_y_cal kintamojo acc_y_cal += acc_y; } // Padalinkite visus rezultatus iš 1000, kad gautumėte vidutinį poslinkį 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); // Atkreipkite dėmesį, kad dėl gravitacijos Acc_z poslinkio nesaugome! vėlavimas (500); }
Aukščiau pateiktas kodo blokas vykdomas pagal kalibravimo procedūrą. Šis kodas skirtas horizontaliam kalibravimui. Vertikaliam kalibravimui yra beveik identiškas kodas (atkreipkite dėmesį, kad kodas žino, ar jūsų MPU6050 sumontuotas horizontaliai, ar vertikaliai!). MPU6050, skaitoma 1000 kartų. atitinkamos vertės sumuojamos kartu, tada padalijamos iš 1000, kad būtų gauta vidutinė „kompensavimo“vertė. Šios vertės išsaugomos „Nano eeprom“. Visos horizontalios kalibravimo vertės saugomos nuo eeprom adreso 0. Visos vertikalios vertės saugomos nuo eeprom adreso 24. Kalibravimas PRIVALO būti atliekamas ant visiškai lygaus paviršiaus, kitaip jos nieko nereiškia.
/ * * Kitos kelios eilutės apdoroja neapdorotus duomenis, kad pakeistų juos į kampus, kuriuos galima išvesti į LCD ir šviesos diodus. * 4096 vertė, iš kurios padalyti pagreičio duomenys, paimta iš MPU6050 duomenų lapo ir yra pagrįsta imties dažniu. * 9,8 reikšmė yra gravitacija /2/3.141592656 * 360; // Neapdoroti duomenys phiM = -atan2 ((acc_y/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Neapdoroti duomenys dt = (millis ()-millisOld)/1000.; millisOld = milis (); / * * Šiame skyriuje naudojami giroskopo duomenys, kad sistema geriau reaguotų * 65,5 vertė, iš kurios giroskopo duomenys yra padalyti, paimta iš MPU6050 duomenų lapo ir yra pagrįsta imties dažniu */ teta = (theta+(gyro_y/ 65.5)*dt)*. 96 + tetaM*.04; // Žemo dažnio filtras phi = (phi + (gyro_x/65,5)*dt)*. 96 + phiM*.04; // Žemo dažnio filtras
Aukščiau pateiktas kodas yra tai, kas apskaičiuoja kampus. Tikimės, kad komentarai šiek tiek supras, kaip tai veikia, tačiau išsamesniam paaiškinimui peržiūrėkite Paulo McWhorterso vaizdo įrašą, susietą su pridėtu PDF. Tačiau pasakysiu, kad galite pakeisti giroskopo ir pagreičio matuoklio imties dažnį (tai daroma nustatymo MPU6050 paprogramėje, esančioje mano kodo apačioje). Jei pakeisite atrankos dažnį, taip pat turite pakeisti, kiek iš neapdorotų duomenų yra padalyta. Akselerometro duomenims dabartinė vertė yra 4096. Giroskopui dabartinė vertė yra 65,5.
Žiūrėkite pridėtus duomenų lapus ir „EEEntusiast“vaizdo įrašą (nuoroda pridedamame PDF), kad gautumėte išsamesnės informacijos apie tai, kaip randamos atrankos ir poslinkio vertės.
3 žingsnis: kiti veiksmai
Tikimės, kad iki to laiko šis projektas bus sukurtas, bet kas dabar?
Pirma, kodėl gi ne iš tikrųjų pastatyti jį į gulsčiuką, kurį galite naudoti. Galite nusipirkti pigų gulsčiuką (įsitikinkite, kad tai dėžutės tipas), kurį galite pritaikyti, arba, jei turite rinkinį, atsispausdinkite savo lygį/dėžutę.
Galbūt pažaiskite giroskopo ir akselerometro mėginių ėmimo dažnį, kad pamatytumėte, ar jie veikia geriau nei vienas.
Pabandykite dar patikslinti kodą. Pavyzdžiui, šiuo metu, esant daugiau nei 45 laipsniams, nurodytas kampas yra grubus. Ar yra būdas tai apeiti?
Jei turite kokių nors klausimų, kad ir kokie paprasti jie atrodytų, klauskite. Jei galėsiu padėti, padėsiu.
Jei jums patinka šis pamokymas, paspauskite „Patinka“, kad žinotumėte.
Jei tai padarysite, parodykite man (ypač jei tai veikia).
AČIŪ