BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM GÉPÉSZMÉRNÖKI KAR MECHATRONIKA SZEKCIÓ
Drónirányítási lehetőségek kibővítése microcontrollerrel Expanding the oppurtunities of controlling quadcopters
TUDOMÁNYOS DIÁKKÖRI KONFERENCIA DOLGOZAT 2016.
Szerző:
Konzulens:
Kocsis Péter Koppány
Dr. Ekler Péter
Tartalomjegyzék Összefoglalás ...................................................................................................................... 3
I.
II. Bevezetés ............................................................................................................................ 5 1.
A projekt célja ................................................................................................................. 6
III. Irodalomkutatás ................................................................................................................... 8 IV. A projekt elemei ................................................................................................................ 10 1.
A drón ............................................................................................................................ 10
2.
A mikrovezérlő .............................................................................................................. 11
3.
A szenzor ....................................................................................................................... 12
V. MPU6050-Arduino kommunikáció .................................................................................. 14 1.
Az I2C kommunikáció ................................................................................................... 14
2.
MPU6050-Arduino kapcsolat ....................................................................................... 15
3.
Durva értékek kinyerése ................................................................................................ 16
4.
A Kálmán-szűrő ............................................................................................................ 17
5.
DMP által korrigált értékek kinyerése .......................................................................... 19
6.
A DMP és a Kálmán-szűrő összehasonlítása ................................................................ 21
7.
Kommunikáció két IMU-val ......................................................................................... 22
VI. A távirányító módosítása .................................................................................................. 23
1
1.
A távirányító funkciói ................................................................................................... 23
2.
A távirányító működése ................................................................................................ 25
3.
A csatlakozás kialakítása ............................................................................................... 26
VII. Az Arduino csatlakoztatása a távirányítóhoz .................................................................... 29 1.
A PWM jelek használata ............................................................................................... 29
2.
Low Pass Filter .............................................................................................................. 30
3.
A program ..................................................................................................................... 33
4.
Biztonsági megoldások ................................................................................................. 33
VIII.
Összegzés................................................................................................................... 34
1.
Alkalmazhatósági területek ........................................................................................... 35
2.
További fejlesztési tervek.............................................................................................. 35
IX. Hivatkozások..................................................................................................................... 36 X. Ábrajegyzék ...................................................................................................................... 37 1.
Ábrák ............................................................................................................................. 37
2.
Táblázatok ..................................................................................................................... 37
2
I.
Összefoglalás
A dolgozatomban szeretném bemutatni a kutatási és tervezési munkám eredményét, amelyben egy drón irányítását valósítottam meg giroszkóp segítségével. Manapság a drónok, vagy más néven quadcopterek egyre jobban elterjedtek, a szórakoztató funkcióik mellett egyre nagyobb szerepet kapnak az iparban is. Egyszerű felépítése és stabil működése során képes egy helyben is lebegni. Így az irányítása sokkal pontosabb és egyszerűbb lehet, mint a hozzá hasonló repülni képes modelleké. Olyan helyekre is eljuthat, ahova eddig más modell nem. Alapvető igazság, hogy a pontosabb irányíthatóság óriási előnyt jelent a tudomány bármely területén. Emiatt tűztem ki a kutatási projektem céljának, hogy létrehozzak egy precízebb, test közelibb irányítási módot, mely még nagyobb élményt és még több funkcionalitást nyújt. A fő szempontok a konfigurálhatóság, az egyszerűség és az alacsony költségek voltak. Ezek alapján jutottam arra, hogy egy létező terméket kötök össze egy microcontrollerrel, mely így bármilyen hozzákapcsolt érzékelő jelei alapján képessé válik a drón irányítására. Mivel célom volt a testközeli irányítás, ezért döntöttem két általános IMU szenzor mellett, melyeket a kézfejre erősítve, a különböző irányú megdöntéseikkel válhat valóra a vezérlés. Így a futó programtól függően nyújt repülésszerű élményt. A megvalósításhoz külföldről rendeltem egy kisméretű, egyszerű és olcsó drónt1, valamint egy microcontrollert2 választottam a vezérléshez. Az Arduino rendszer fő előnyei az egyszerű használat, a kedvező ár és jó konfigurálhatóság, mivel széles választékot nyújt a kompatibilis szenzorok terén. Az Arduino Nano az egyik legkisebb alaplap, azonban a teljesítménye hasonló más típusokéhoz és megfelelő számú ki- és bemenettel rendelkezik a projektemhez. A drón irányításának megváltoztatásához a hozzá tartozó távirányítót megvizsgáltam és műszeres méréseim alapján módosítottam úgy, hogy rá lehessen csatlakoztatni a microcontrollert. A projekt során nagyon fontosnak tartottam, hogy azzal, hogy a microcontrollerrel irányíthassak, ne vegyem el azt a lehetőséget, hogy a távirányító normál módon is működhessen. Ezért RJ45-ös csatlakozókat szereltem a távirányítóra, melyeket megfelelő módon kötve újra használhatóvá válik a távirányító. A precizitás alapfeltétele a minél pontosabb mérés. Ennek
1
FQ777-124, http://pocketdronefq777.com/, 2016. 10. 27.
2
Arduino Nano, https://www.arduino.cc/en/Main/ArduinoBoardNano, 2016. 10. 24.
3
érdekében a pontos dőlésszögeket a két MPU6050 típusú, hattengelyű (giroszkóp és gyorsulásmérő) szenzor által mért durva értékeket elemezve, a mérési hibák beleszámításával, Kálmán-szűréssel becsültem. A végeredményként kapott vezérlést kiértékelve, olyan irányítási precizitást kaptam, mely legnagyobb mértékben a programkódtól függ.
I.1. ábra Az irányítási rendszert demonstráló prototípus
Személy szerint kifejezetten rajongok a repülésért, a repülés élményéért. Innen eredt az az ötletem, hogy olyan érzetet keltsek biztonságos és egyszerű keretek között, mint a repülés valós közegben. Ennek az első lépése a mozgásgesztusok felismerése, amivel egy repülő egység (pl. egy drón) irányíthatóvá válik. További céljaim között szerepel a vezeték nélküli kapcsolat létrehozása az érzékelők és a vezérlő között, illetve egy megfelelő kamerarendszernek a drónba építése révén, kiterjesztett valóság alapú szemüveg használatával átadni a felhasználónak a világot a drón szemszögéből.
4
II.
Bevezetés
A drónok alatt elsősorban az összes pilóta nélküli légi járművet értjük (angolul UAV – Unnamed Aerial Vehicles). Mint a legtöbb technikai fejlesztést, ezeket is először a hadiparban alkalmazták. Azonban napjainkra eljutott a háztartásokba is, valamint egyre több alkalmazási területét használják ki az iparban is, a mezőgazdasági öntöző drónoktól kezdve, a villamos technikai ellenőrzéseken át, akár levél- és csomagtovábbításra. A legfontosabb jellemzőjük, hogy pilóta nélkül, távvezérléssel működnek, így méretük jelentősen lecsökkenhet, valamint nem szükséges a plusz teher hordozásához nagyobb teljesítmény. A drónok közé tartoznak a quadcopterek, multicopterek, ezekhez kapcsolódik a kutatásom. A működésük nagymértékben különbözik más drónokétól. A quadcopterek alapja a négy függőleges tengelyű rotor és a precíz vezérlés. A rotorok közül kettő szemközti pozitív, a másik kettő pedig negatív forgási irányban pörög. Ezáltal képes a vertikális felszállásra is, ellentétben a többi, horizontális felszállásra képes drónokkal. A quadcopterek vezérlését, stabilan tartását egy pontos mechatronikai rendszer irányítja. Enélkül enyhe dőlés esetén nem tudna visszaállni a stabil helyzetébe, folyamatos oldal irányú mozgásba kezdene, esetleg megfordulna és lezuhanna. Ennek elkerülésére minden drón tartalmaz legalább egy hattengelyű giroszkóp-gyorsulásmérőt, mivel e két szenzor adataiból pontosabban meghatározható a pillanatnyi helyzet, mint ha csak gyorsulásmérőt tartalmaznának. A dinamikai összefüggések alapján megírt program szerint a vezérlést végző microcontroller a kapott jelek alapján meghatározza szükséges ellenkormányzást, így visszanyerheti újra a stabilitását. Azonban ezalatt a folyamat alatt már a quadcopter horizontálisan elmozdult. Emiatt alkalmaznak a precízebb drónok GPS szenzorral kiegészített vezérlést, ami néhány méteres (fejlettebb drónok esetén néhány centiméteres) pontossággal képes meghatározni a helyzetet, amit a gyorsulásmérő értékeivel egybevetve sokkal pontosabb értéket kaphatunk. Az említetteken kívül még mágnesességmérőt is lehet alkalmazni az iránymeghatározás pontosításához. Ezekkel a megoldásokkal képes egy quadcopter az egy helyben lebegésre, a pontos és lassú mozgásokra is. A működéséhez szükséges eszközökön kívül a leggyakoribb kiegészítője a kamera, amivel egyszerűen lehet stabil madártávlati felvételeket készíteni, látni, amit a drón lát, így
egyszerűbbé
téve
az
irányítását.
Végezetül
érdemes
pár
szót
szólnom
a
költséghatékonyságukról, mivel mondhatni ez a legfontosabb szempont a működőképesség
5
után. A quadcopterek ezen a téren kiemelkedően jó megoldásnak számítanak, egyszerű felépítésük miatt standard, manapság egyszerűen előállítható elemekből épülnek fel. Így egy stabil, pontos drónt alacsony költségekkel el lehet készíteni.
1. A projekt célja A quadcoptereket ipari felhasználásukon kívül már szórakoztató eszközként is használják. Ennek a szórakoztató eszköznek a fejlesztésére irányult az alapötletem, egy olyan élethű irányítási rendszer kialakítására, amin keresztül a felhasználó olyan élményben részesülhet, mintha ő maga lenne a drón helyében. Ezt a kezek a mozgását érzékelő szenzorokkal akartam megvalósítani, a nézőpont átadását pedig az egyre jobban elterjedő VR (virtuális valóság) szemüveg használatával. Így a fejlesztési munkám első fázisának a drón irányításának újratervezését tűztem ki. Azonban a megvalósítás során fedeztem fel a fejlesztés általános alkalmazhatóságát, a precízebb, pontosabb irányíthatóság révén. A kutatásom és fejlesztésem során három fő szempontot tartottam mindig szem előtt, az egyszerűséget, a konfigurálhatóságot és a költségminimalizálást. Ez a három szempont a munkám során mindig első helyen szerepelt, minden esetben ilyen megoldásokra törekedtem. Az egyszerűség érdekében egy meglévő quadcopteren végeztem a fejlesztésem. Ezáltal olyan eljárást tudtam létrehozni, amellyel más modellek, akár más rendszerek irányítása is módosítható. Ezt a szempontot kibővítve a konfigurálhatósággal döntöttem az Arduino alapú microcontrollerek mellett, ezen belül egy olcsóbb típusú Arduino Nano mellett. Ezáltal bővíthető, további fejlesztésekre alkalmas felületet kaptam. Ehhez kapcsolódóan MPU6050 típusú hattengelyű giroszkóp-gyorsulásmérőket választottam. A költségek minimalizálásáért az egyik legegyszerűbb drónt, egy FQ777-124-es típusú mini quadcoptert választottam, amit külföldről rendeltem az Arduino Nano típusú microcontrollerrel és az érzékelőkkel együtt. A főbb költségek a következők szerint alakultak: FQ777-124 drón
3300Ft
Arduino Nano V3.0 Atmega 328
609Ft
2 darab MPU6050 modul
2x455Ft
40 darab anya-anya áthidaló vezeték
238Ft
Összesen:
5 057 Ft II.1. táblázat A költségek
6
A projektem három fő fázisra osztható. Az első fázis célja az Arduino és a szenzorok kommunikációjának megvalósítása volt a szükséges adatok kinyeréséhez. A második fázisban a távirányítót módosítottam úgy, hogy az Arduino irányíthassa. Végül a harmadik fázisként az Arduino és a távirányító közötti kapcsolat létrehozását végeztem el.
II.1. ábra A projekt fázisai
7
III.
Irodalomkutatás
A kutatásom és fejlesztésem során elsőként meg kellett ismernem a drónok alapvető működését, a mikrovezérlők és szenzorok használatát, kapcsolatát. Ennek során elsősorban internetes forrásokat használtam, nagyon sok hasznos leírás és adat elérhető manapság ezekkel kapcsolatban. A drónok megismeréséhez a „Modelling and control of quadcopter” [1] cikk nyújtott segítséget. Ebben a szerző egy független alkalmazott matematikai kutatás során a drónok elvi alapjait mutatja be. Ehhez először a dinamikájuk matematikai modelljét ismerteti, majd a számomra nagyon fontos irányítás stabilitási problémáiról szól, valamint ennek megoldására mutat be egy eljárást. A mikrovezérlők és használatuk megértéséhez a hivatalos Arduino honlapot, ezen belül a Arduino Board Nano leírását [2] használtam Ez az általam használt mikrovezérlőt3 mutatja be, alapvető jellemzői mellet hasznos linkek találhatóak a használatához szükséges információk eléréséhez. Ezen túl innen elérhető az Arduino IDE bemutatása is, ez nagyon sok segítséget nyújtott a program megírása során. A mikrovezérlő és a drónok megértése után a szenzor működésének megismerése után kutattam. Elsőként a hivatalos Arduino honlap MPU6050 szenzor leírását [3] tanulmányoztam, melyen a szenzor főbb vonásai kerülnek bemutatásra. A mélyebb megértéséhez további ismeretekre volt szükségem, amihez a [4] weboldalon található MPU6050 regiszter térkép adott igazán sok segítséget. Itt a regiszterek nagy része részletes bemutatásra kerül átlátható formában. A projektem fő alkotó elemeinek megismerése után a közöttük lévő kapcsolatra fordítottam a figyelmemet. Először a mikrovezérlő és a szenzor kapcsolatának módja után kutattam. Az ehhez szükséges információkat a kapcsolat hivatalos leírásából, a „The I2C-bus specification” [5] cikkben találtam meg. A szerzők az I2C buszrendszert mutatják be, aminek a használata elengedhetetlen volt számomra a fejlesztésem során. A szenzor adatainak kinyerése után azok pontosításához az „A quaternion-based unscented Kalman filter for orientation tracking” [6] cikk kínál megoldást. Ebben a szerző a kiterjesztett Kálmán-szűrőnél pontosabb szűrési eljárást mutat be egy valósidejű helyzet-meghatározáshoz. Ehhez gyorsulás, szögsebesség és mágneses
3
Arduino Nano, https://www.arduino.cc/en/Main/ArduinoBoardNano, 2016. 10. 24.
8
térerősség értékeket használ fel, ami megegyezik a számomra szükséges eljárással, azonban én a kutatásom során a hangsúlyt az egész rendszer összhangjára fektettem, a fő célom egy általános és egyszerűbb irányítási rendszer kiépítése volt, ehhez a Kálmán-szűrés egy eszköz volt számomra. A cikk során további segítséget nyújtott a megértéshez a „Quaternions, interpolation and animation” című könyv [7]. A mikrovezérlő és a távirányító közötti megfelelő kommunikáció kiépítéséhez elsőként az analóg áramkörök irányításához szükséges digitális PWM jelek használatával foglalkoztam. Ebben a „Pulse width modulation„ [8] cikk nyújtott segítséget, megmutatva annak logikáját ás működését. Azonban a PWM jelek nem voltak megfelelőek önmagukban analóg jelek adására a távirányító számára, ezért ennek megoldására low pass filterezés után kutattam. Ennek az alapjait az „Elektrotechnik für Maschinenbauer” [9] könyv alapján ismertem meg. Mindezek után a projektem megvalósításához szükséges eljárásokhoz kerestem mintát. A méréseim során használt, Jeff Rowberg által írt program a szenzor DMP által korrigált értékeinek kiolvasásához a [10] weboldalon, a Kálmán-szűrővel kapott értékek kinyeréséhez használt, Kristian Lausus által program pedig a [11] weboldalon megtalálható. A dolgozatomban bemutatott program alapja a [11] weboldalról származik, azonban megvalósítottam benne azt, hogy egyszerre két szenzorral is tudjak kommunikálni, továbbá a drón irányításához szükséges kimenő jelek létrehozását integráltam a programba.
9
IV.
A projekt elemei
1. A drón
IV.1. ábra FQ777-124-es drón
Az FQ777-124-es quadcopter az egyik legkisebb kapható drón, kis mérete ellenére nagyon strapabíró. Minden kiegészítő (rotor védő, leszállólábak, tartalék propellerek, USB vezeték) a csomag része. A stabilitásáért egy hattengelyes giroszkóp-gyorsulásmérő felel, ez a modell nem tartalmaz GPS szenzort. A 2.4 GHz-es távirányítójával kb. 50 méteres távolságból irányítható. Üzemidejét tekintve átlagos a hasonló drónokéhoz képest, a 100mAh-s LiPo akkumulátorral, leírás szerint 5-7 percig képes repülni, azonban a tapasztalataim alapján az átlagos működési idő 10 perc. Töltési ideje 15-20 perc, tölthető USB-n keresztül, illetve a távirányítóhoz csatlakoztatva. Egyszerű felépítése ellenére különböző módok és funkciók vannak beleprogramozva. Ilyenek a két sebességmód, az elfordulás független irányítás (Headless Mode), az automata hazatérés (mivel nem használ GPS-t, ez csak a gyorsulásmérő értékei alapján valósul meg, így pontatlanabb), valamint a jobb és a balkezes irányítási mód. A különböző funkcióknak egy-egy gomb felel meg a távirányítón, így ezek irányítása is létrehozható a microcontrollerrel. Ami számomra nagyon fontos volt, hogy egyszerű a távirányítójának felépítése, így könnyen meg tudtam vizsgálni, majd átirányítani rá a microcontroller jeleit. 10
2. A mikrovezérlő
IV.2. ábra Az Arduino Nano pinkiosztása
Az Arduino Nano mikrovezérlő alapja egy Atmel ATmega328-as microcontroller, ez adja a legfőbb tulajdonságait. 32KB flash memóriával, 2KB SRAM-mal, 1KB EEPROM-mal és 16MHz-es órajellel rendelkezik. Továbbá számomra nagyon fontos volt a ki- és bemenetek száma, a projektem megvalósításához legalább négy kimenet kellett a drón négy irányának megadásához (a tér három iránya plusz a vertikális tengely körüli forgatás). Ennek az Arduino Nano teljes mértékben megfelelt. A 14 darab digitális ki- és bemente (RX0, TX1, D2-D13), melyek közül 6 darab PWM jelek kiadására is képes (D3, D5, D6, D9, D10, D11), valamint 8 darab analóg bemenete (A0-A7) elegendő ahhoz is, hogy a későbbiek folyamán a drón további funkcióinak irányítását is átvehesse a microcontroller. A működéséhez szükséges energiát az USB kábelen keresztül kapja, azonban külső áramforrás is csatlakoztatható rá, így függetlenné válhat a számítógéptől. A programozásához az ingyenes Arduino IDE használható, melynek nyelve C alapú, C++ könyvtárakkal bővíthető. Minden Arduino program két fő részből áll. Az első egy setup() eljárás, a második pedig loop() eljárás. A nyelv felépítése és összetevői megtalálhatóak a [2] weboldalon.
11
3. A szenzor
IV.3. ábra MPU6050, GY-521-es alaplapon
Az MPU6050-es hattengelyű giroszkóp-gyorsulásmérő szenzor egy általános és olcsó megoldás a mozgásérzékelésre. Működésének alapja egy háromtengelyű MEMS (mikroelektromechanikai szenzor) gyorsulásmérő és egy háromtengelyű MEMS giroszkóp. A gyorsulásmérő a rögzített pontokhoz rugalmasan kapcsolódó szeizmikus tömeg gyorsulás hatására történő kitérése alapján képes meghatározni a gyorsulás mértékét. A giroszkóp egy rugalmasan lengő tömegre ható Coriolis erőt határozza meg, melyből a pillanatnyi szögsebesség kiszámítható. Ezeken kívül még tartalmaz egy beépített hőmérséklet szenzort, de ennek felhasználására nem volt szükségem a projektem során. A szenzor mérési határait programon keresztül lehet változtatni ±2g, ±4g, ±8g, és ±16g között, azonban ezáltal megváltozik a precizitása is. Az eredő gyorsulásvektor x, y, és z irányú koordinátáit 16 biten képezi le, így kis mérési tartomány mellett meglehetősen pontosnak mondható, azonban a mérési tartomány növelésével ez a pontosság csökken. Ez elmondható a giroszkóp értékeire is, ami ±250°/sec, ±500°/sec, ±1000°/sec, és ±2000°/sec között állítható. Az MPU6050-es szenzor a gyorsulásmérőn és giroszkópon kívül még tartalmaz egy Digital Motion Processor™-t, mely előre beprogramozott számítások elvégzésre képes, mint például a durva értékek pontosítása, de akár át is programozható saját számítások elvégzésére. Szenzorok használata során felmerülő első kérdés az az, hogy a kapott értékek valójában mit is jelentenek. Ennek a megválaszolására szükségünk van a méréshatárra, valamint arra, hogy az
12
adatainkat 16 bit-en leképezve kapjuk meg. Ez a leképezés azt jelenti, hogy ±(215-1) között kapjuk meg az adatokat. A kapott adatértékünk úgy aránylik a valódi gyorsulásértékhez, mint a 215 a méréshatárhoz. A fejlesztésem során a legpontosabb mérést választottam, mert kiugróan nagy gyorsulások úgysem léphetnek fel. Amennyiben mégis, azok elhanyagolhatóak a kiértékelés során, mivel tartósan nem léphet fel állva (nem gyorsulva) irányítás során nagyon kiugró gyorsulásérték. Ha fellép, az ideiglenes, ami az irányítás szempontjából pillanatnyi pontatlanságot jelent, azonban ez nem befolyásolja a teljes irányítás pontosságát, átmeneti zavarnak tekinthető. Későbbi fejlesztések során természetesen igény esetén ez a határ változtatható, a 16 bites pontosság elegendő a stabil irányításhoz tágabb mérési tartomány esetén is. Tehát esetemben a ±2g mérési határ mellett a gravitáció 214=16384-nek felel meg. Ez LSB-ben (least significant bit) megadott érték, vagyis a legkisebb értéket jelentő bitre átszámítva, ami esetünkben 1. Ezért szokták megadni szenzorok esetén az LSB/mért egység arányt. A szenzor az adatokat I2C (inter-integrated circuit) buszon keresztül szolgáltatja, erre a következő fejezetben fogok kitérni. Ilyen kapcsolaton keresztül csatlakoztatható hozzá külsőleg magnetométer is. Azonban az MPU-9150-es IMU (inertial measurement unit) már gyárilag magában foglalja a magnetométert, de ennek a típusnak az ára többszöröse az MPU-6050esének.
13
V.
MPU6050-Arduino kommunikáció
1. Az I2C kommunikáció
V.1. ábra Az I2C buszrendszer adattovábbítása
Az I2C buszrendszert a Philips fejlesztette ki 1995-ben az egyszerűbb kommunikáció érdekében. Ezzel sokkal egyszerűbb kommunikáció valósítható meg, valamint szabványt biztosít a kapcsolat létrehozásához. Napjainkra jelentősen elterjedt, gyakran használt megoldás microcontrollerek, általános célú áramkörök és alkalmazás-orientált áramkörök között. A legnagyobb előnye, hogy e szabvány révén a fejlesztés folyamatossá és átláthatóvá válhat, az egyes funkciókhoz szükséges eszközök egyszerűen hozzáadhatóak a rendszerhez, nem szükséges a teljes struktúra átépítése. Ezáltal a rendszer programból definiálható. A rendszer kiépítéséhez mindössze két vezeték szükséges, egy adatvonal (SDA) és egy órajel (SCL). A kommunikáció alapja egy master-slave (kezdeményező-megcímzett) kapcsolat. Azonban létrehozható multi-master-es rendszer is, ütközés detektálással és ún. arbitrációval (egyidejű küldés elkerülése). A projektem során egy master-es rendszer kiépítése volt a cél, ezért a továbbiakban az ilyen hálózatok működését fogom bemutatni. A hálózatba épített eszközök chipbe épített szűrővel rendelkeznek, mellyel az adatvonal zavarait kiszűrhetik. Egy buszra több eszköz is csatlakoztatható, azonban ennek van felső határa, amit a buszra szerelt kondenzátor határoz meg. A kommunikáció sebessége általában 100kbit/s körüli, azonban elérheti a 400kbit/s-ot is.
14
Az adatok átvitele byte-okban történik. Az adatvonalakon két jelszintet különböztetünk meg, magasat és alacsonyat. A SCL adatvonal biztosítja az órajelet, ez adja az átvitel sebességét. Az adatok az SDA vonalon továbbítódnak. Minden adatátvitel START jelzéssel kezdődik, és STOP jellel végződik. Ezeket az SCL folyamatos magas jel melletti SDA szintjének változása jelenti. Ha ez a változás negatív irányú (magasról alacsonyra), akkor ez egy START jelzés, ellenkező esetben STOP. A START után a master megcímzi 7 biten a slave-et. A bitek továbbítása a következőképpen történik: a master adott órajel alapján változtatja a magas és alacsony jeleket. A slave ehhez igazodva küldi (vagy fogadja) az SDA jelen érkező adatokat, melyek értéke az SCL magas szintje esetén fennálló SDA jelszint. Minden byte a legnagyobb helyiértékű bittel (MSB) indul, majd a nyolc bit után egy nyugtázó bittel zárul. Miután a master megcímezte a slave-et, nyolcadik bitként megadja a kommunikáció irányát (adatot fog küldeni, vagy adatot vár). Minden byte után egy ellenőrző bit következik. Ennek az ideje alatt az SDA vonalnak alacsonynak kell lennie. Az első byte-tal létrejött a kapcsolat, ezt követi az adattovábbítás, egyszerre több byte is küldhető.
2. MPU6050-Arduino kapcsolat Ahhoz, hogy a kapcsolat létrejöhessen, először csatlakoztatnunk kell a szenzort a microcontrollerhez. Először ezt fogom bemutatni. Az Arduino Nano kompatibilis az I2C buszrendszeren keresztüli kommunikációval, ehhez az A4, mint adatvonal (SDA) és az A5, mint órajel-vonal (SCL) használható. Ezen kívül még biztosítanunk kell a szenzor energiaellátást. Ezt a VCC és GND pineken keresztül tehetjük meg. Erre a célra az Arduino 5V kimenete a megfelelő. Ezek alapján a következőképpen kell csatlakoztatni az MPU6050-es szenzort: MPU6050
Arduino
SDA
A4
SCL
A5
VCC
5V
GND
GND
V.1. táblázat Az MPU6050-es szenzor csatlakoztatása
15
A csatlakoztatás után az Arduino beprogramozása szükséges. Azonban ez nem annyira egyszerű feladat. Ugyanis ha a szenzor alapbeállításait használva szeretnénk kiolvasni a durva, korrigálatlan értékeket, azoknak a szórás igen nagy, korrigálás szükséges. A korrigálásra több lehetőség is létezik. Az MPU6050-es szenzor DMP-vel (Digital Motion Processing) rendelkezik, így használható az előre beépített értékkorrigáló. Ezen kívül számos korrigálási elv létezik, kutatásaim szerint az egyik legpontosabbnak mondható a Kálmán-szűrés, így ezt választottam. A következőkben ezt a két eljárást fogom bemutatni és összehasonlítani. Minden esetben I2C kommunikációt kell megvalósítani, ennek kezelésére szolgál a hivatalos <Wire.h>4 könyvtár. A szenzor a pillanatnyi értékeket a regisztereiben tárolja. Ennek kiolvasása szükséges az adatok kinyeréséhez. A kommunikáció megkezdéséhez először a szenzor megcímzésére van szükség. Ez a cím MPU6050 esetén 0x68. A pontosság érdekében a méréshatárokat minden esetben a legkisebb értékre állítottam.
3. Durva értékek kinyerése A kapcsolat létrehozását az Arduino setup() eljárásában kell megtenni. Ez a következő kódokkal történik: Wire.begin(); //Csatlakozás az I2C buszrendszerhez Wire.beginTransmission(0x68);
//A
0x68-as
cím
alatti
eszköz
megcímzése Wire.write(0x6B); //Az írni kívánt regiszter küldése Wire.write(0); //Regiszterbe írás Wire.endTransmission(true); //Átvitel befejezése
A 0x6B regiszter átírásával szabályozható a szenzor energiaellátása és órajele. E regiszter hatodik bitje tartalmazza a Sleep Mode aktivitását. A regiszter további bitjeinek a szerepe megtalálható [4] weboldalon. Azáltal, hogy a regiszter értékének nullára állításával az összes bit nullára állítását értük el. Így a szenzorunk alvó módját deaktiváltuk, a mintavételezést folyamatosra állítottuk (Cycle), engedélyeztük a hőmérséklet szenzor működését, az órajelének pedig a 8MHz-es belső oszcillátor lett kiválasztva.
4
A Wire.h könyvtár függvényei elérhetőek a [2] forrásból
16
A kapcsolat létrehozása után az adatok kinyerése szükséges. Ezt a program loop() eljárásában kell megtenni. Ismét kezdeményezni kell a kapcsolatot (Wire.beginTransmission()), majd elkezdődhet az értékek kiolvasása. A szenzor az értékeket a 0x3B regiszterétől kezdve tárolja, minden értéket 2 byte-on tárolva. Így 14 byte kiolvasására van szükség (x-, y-, zgyorsulásértékek, hőmérséklet, x-, y-, z-szögsebességértékek). Ehhez a kezdeményezés után (Wire.requestFrom(0x68,14,true)) a Wire.read() függvény segítségével byte-onként lehet kiolvasni a regisztereket. Az egy értékhez tartozó első regiszter tartalmazza az érték felső byteját (9.-16. bit) a második regiszter az alsó byte-ját (1.-8. bit). Ezek alapján a kinyert értékekből a pillanatnyi helyzethez tartozó dőlésszögek (jaw (z tengely körüli), pitch (y tengely körüli), roll (x tengely körüli)) kiszámíthatóak, jobban mondva becsülhetőek (mivel a gyorsulásmérő és a giroszkóp is hibával mér). Erre a becslésre több eljárás is létezik, a következő részben a Kálmán-szűrést szeretném bemutatni.
4. A Kálmán-szűrő
V.2. ábra A Kálmán-szűrő működése 5
A Kálmán-szűrés egy nagyon elterjedt eljárás, különösen navigációs és irányításvezérléseknél, így a repüléstechnikában, űriparban. Az eljárást Kálmán Rudolf Emil magyar származású
A kép forrása: Dr. Sárközy Ferenc, Térinformatika, http://gisfigyelo.geocentrum.hu/sarkozy_terinfo/t61.htm, 2016. 10. 26. 5
17
amerikai villamosmérnök fejlesztette ki a ’60-as évek elején. Az eljárással ciklikusan egyre pontosabban becsülhető egy hibával mért változó, vagy abból számított érték (értékek), de ennek ellenére nem igényel nagy számítási kapacitást. A következőkben a lineáris rendszerekre történő alkalmazását fogom bemutatni, azonban létezik általánosítása nemlineáris rendszerekhez is. A szűrés elvégzéséhez szükséges a változók kezdeti értékeinek és a mért értékek hibájának, valamint azok korrelációjának ismerete. A Kálmán szűrés két alapvető lépésből áll. Az első lépés a becslés (predikció). Ehhez a mérés kezdetén szükséges egy kezdeti érték megadása. Már az első mérés előtt, ez alapján a kezdeti érték alapján és az ismert összefüggések alapján (pl. fizikai törvények, tételek), a mérés pillanatában várható értékről egy becslést kaphatunk. Ezt követi a második fázis, a mérés (korrekció), amelyben a mért értéket összehasonlítva a várt értékkel fontos összefüggéseket lehet levonni. A becsült értékhez meghatározható, hogy a szenzoroknak az elvárás alapján milyen értéket kell mutatnia. Ezt kiegészítve azzal, hogy ismerjük a szenzorunk bizonytalanságát, egy valószínűségi mezőt kapunk. Ezt a mezőt egybevetve a mérés alapján kapott értékkel és az ahhoz kapcsolódó valószínűségi mezővel, sokkal pontosabban becsülhetjük az új értéket. A centrális eloszlás tétele alapján a valószínűségi mezők normál eloszlással közelíthetőek. Belátható, hogy két különböző vártértékkel rendelkező normális eloszlás metszete egy mindkettő szórásánál kisebb szórással rendelkező normális eloszlás lesz. Ezáltal az elvárt értékünket, valamint annak kovarianciáját az ún. Kálmán-nyereség mátrixa (K) szerint pontosítjuk. E mátrix meghatározása során lehet megadni azt, hogy milyen arányban támaszkodunk a szenzorokra (R és P mátrix). Ez egy nagyon fontos előnye az eljárásnak, így egyszerűen végezhető el a kívánt zajszűrés. Azáltal, hogy a kovarianciát is módosítottuk, pontosítottuk, a következő ciklusban egy pontosabb becslést tudunk végezni, és így folytatva a külső hiba szinte kiküszöbölhető. Az eljárás során használt jelölések: xk
A meghatározni kívánt értékekből alkotott oszlopvektor a k-adik ciklus után
A
A meghatározni kívánt értékek közötti összefüggésekből felépíthető mátrix
uk
Az ismert külső, adott befolyásoló tényezőkből alkotott oszlopvektor a k-adik ciklus után
B
A befolyásoló tényező hatásából felépíthető mátrix
18
P
A meghatározni kívánt értékek (állapot) kovariancia-mátrixa, kezdetben ismert kezdeti érték esetén az összes eleme 0
Q
A mérés során fellépő zaj kovarianciája, a rendszer folyamatának kovarianciája
zk
A k-adik mérés értékeiből alkotott oszlopvektor
H
A szenzor modellje, négyzetes mátrix
R
A szenzorok kovariancia-mátrixa
K
Kálmán-nyereség mátrix, négyzetes mátrix, súlyozást jelent a mért érték és az elvárt érték között.
A projektemhez szükséges Kálmán-szűrőt a Kristian Lauszus által írt Kálmán-szűrőre alapoztam. Az adatok korrigálását ebben az esetben az Arduino végzi, ellentétben a DMP-vel történő korrigálás esetén, amikor maga a szenzor végzi a korrigálást.
5. DMP által korrigált értékek kinyerése A szenzor DMP funkciónak használatához a Jeff Rowberg által írt programot vettem alapul. A megírt
könyvtárak
tartalmazzák
a
kommunikációhoz
és
a
DMP-hez
szükséges
programkódokat. Ennek részleteit fogom a következőkben bemutatni. A durva értékekhez hasonlóan itt is a kapcsolat létrehozásával kell kezdeni, majd a szenzor beállítása következik. Ez a szenzor méréshatárainak és órajelének beállítását, majd az alvó mód deaktiválását jelenti. A méréshatárokat a 0x1B és a0x1C regiszterek 3-4. bitjének átállításával lehet elérni a következők szerint:
3-4. bit
Gyorsulásmérő
Giroszkóp
0
± 2g
± 250 °/s
1
± 4g
± 500 °/s
2
± 8g
± 1000 °/s
3
± 16g
± 2000 °/s
V.2. táblázat A szenzor méréshatárai
19
A szenzor belső órajelét a 0x6B regiszter 0-2. bitjének módosításával lehet beállítani a következők szerint:
0-2. bit
A belső órajel forrása
0
Belső 8MHz oszcillátor
1
PLL szintézer, referenciajel: X tengelyű szögsebesség
2
PLL szintézer, referenciajel: Y tengelyű szögsebesség
3
PLL szintézer, referenciajel: Z tengelyű szögsebesség
4
PLL szintézer, referenciajel: 32.768kHz-es külső forrás
5
PLL szintézer, referenciajel: 19.2MHz külső forrás
6
Lefoglalt
7
Megállítja az órát, folyamatos újraindítás V.3. táblázat A szenzor belső órajelének forrása
A kapcsolat létrehozása után következhet a DMP beállítása és elindítása. Ennek a legfontosabb lépése a DMP aktiválása. Ezt a 0x6A regiszter 7. bitjének 1-re változtatásával tehető meg. Ezen kívül számos beállítás megváltoztatható, mint például a mozgás érzékelési küszöb, vagy a DLPF (Digital Low Pass Filter) beállítása. A DLPF feladata a szenzor zajainak kiszűrése, a kiszűrni kívánt zajok frekvenciájának beállításával kiszűri az összes, a beállított frekvenciát meghaladó zajt. Ezt követően, mint a legtöbb szenzor esetén, be kell kalibrálnunk. Ez azért fontos, mert indirekt módon mérjük a helyzetünkhöz tartozó szögeket. Így ha bármilyen eltolódás lép fel a mért értékekben (pl. eltérő nagyságú g), a számított értékek is eltolódnak, rosszabb esetben folyamatosan lineárisan változnak. Ennek kiküszöbölésére meg kell adnunk a szenzorunk offsetjét, ami kiszámítható úgy, hogy stabil, vízszintes pozícióba helyezve a szenzort, több száz mért értéket kiátlagolunk. Erre a célra is Jeff Rowberg által írt programot használtam. A megkapott offsetet a DMP aktiválása után beállítva a szenzor készen áll a mérésre. A DMP által korrigált értékek a FIFO-ba kerülnek, majd onnan kiolvashatóak. Ennek a mérete alapértelmezetten 42 byte. Ezek az adatok a 0x74-es FIFO_R_W regiszteren keresztül érhetőek
20
el. A kapott értékek egy kvaternió w, x, y és z tagját jelentik bit értékként, melyekből a yaw, pitch, roll szögek a [7] forrás alapján számíthatóak.
6. A DMP és a Kálmán-szűrő összehasonlítása
Szög [°]
DMP által korrigált értékek stabil, mozdulatlan pozíció esetén
Kálmán-szűrő által korrigált értékek stabil, mozdulatlan pozíció esetén
60
60
50
50
40
40
30
30
20
20
10
10
0
0
-10
0
10
20
30
40
0
5
Idő [s]
Yaw
Pitch
10
15
20
Idő [s]
Roll
Roll
Pitch
V.3. ábra A DMP és a Kálmán-szűrő összehasonlítása
A két eljárás összehasonlításához mozdulatlan helyzetben tartottam a szenzort, és eközben olvastam ki az értékeket. Az így kapott eredményeket a V.3. ábra mutatja. A DMP szűrő képes mindhárom irányban meghatározni a szögeket, ezzel ellentétben a Kálmán-szűrőre írt program csak a horizontális x és y tengelyek elfordulását határozza meg. Ez azonban számomra nem probléma, mivel a projektem során csak ezekre az adatokra támaszkodok. A grafikonok megrajzolásához 2000-2000 értéket olvastam be. Látható, hogy a Kálmán-szűrő által számított értékek nagyobb változásokat mutatnak a stabil helyzethez képest, mint a DMP által korrigált értékek. Ezt bizonyítja az adatok szórása is: DMP
Kálmán
Pitch
0,203
0,17
Roll
0,07
0,163
V.4. táblázat A mérések szórásai
21
Ezek alapján azt a következtetést vontam le, hogy a DMP nagyobb szögek esetén pontosabb eredményt produkál, viszont a Kálmán-szűrő kis szögek esetén szolgáltat valamivel pontosabb adatokat. Mivel számomra főként kis szögek esetén fontos a precizitás (a drón elindítása, felszállása), valamint a fejlesztésem e fázisában még ennek a forráskódja egyszerűbbnek és átláthatóbbnak tűnt, így a Kálmán-szűrő mellett döntöttem. Emellett a Kálmán-szűrő programja kevesebb helyet foglal az Arduinon (29% a DMP-t használó program által felhasznált 46%-kal szembe), ami elég fontos szempont, hiszen a projektem során két szenzor adatait kell majd egyszerre olvasni. Továbbá látható, hogy a Kálmán-szűrés majdnem kétszeres sebességgel megy végbe, ugyanannyi adatot körülbelül feleannyi idő alatt volt képes a microcontroller korrigálni és szolgáltatni.
7. Kommunikáció két IMU-val Az eddigi fejezetekben azt mutattam, hogyan csatlakoztathatunk egy szenzort az Arduinohoz, hogyan tudunk vele kommunikálni és a számunkra releváns adatokat kinyerni. Azonban a projektem megvalósításához két szenzorra lesz szükségem (a két kéz mozgásának követéséhez). Ebben a fejezetben azt fogom bemutatni, hogyan lehet egyszerre két szenzort csatlakoztatni egy Arduinohoz I2C buszrendszeren keresztül. Ahhoz, hogy egyszerre két szenzorral is tudjon az Arduino kommunikálni, a két szenzornak különböző címekkel kell rendelkezniük, hogy külön címezhetőek legyenek. Ezt a címet a szenzorok 0x75-ös regisztere tartalmazza, de ez csak olvasható. Azonban ez a cím függ az AD0 pin értékétől. Alacsony érték esetén ez 0x68, magas érték esetén 0x69. Ha nincs erre a pinre csatlakoztatva semmi, az alacsony értéket jelent, így az egyik szenzort e pin nélkül használom. A másik szenzor AD0 pinjének magasra állításához csatlakoztatom azt az Arduino 3V3 pinjéhez. A második szenzort az I2C buszrendszerre (SDA és SCL vonalak) párhuzamosan kell kapcsolni. A csatlakoztatás után a programkódot úgy kell módosítani, hogy az mindkét szenzort kezelje. Váltakozó kommunikációt valósítottam meg, a kommunikáció elindítása után felváltva olvasok ki minden szükséges adatot a szenzorokból. Az értékek korrigálását egymástól teljesen függetlenül végzem, emiatt a program mérete 37%-ra nő (a teljes kihasználtsághoz képest). Ezek után a szenzorok korrigált adatai elérhetővé váltak, így következhet a projektem következő fázisa, a távirányító módosítása.
22
VI.
A távirányító módosítása
A projektem megvalósításához vezető út második lépése az FQ777-124-es típusú drón távirányítójának a megismerése volt. Mivel a célom e távirányító irányításának felülírása, részletesen megvizsgáltam.
1. A távirányító funkciói
VI.1. ábra Az FQ777-124-es drón távirányítója
A működésének két teljesen eltérő módja van, balkezes és jobbkezes mód. Az alapvető működését és funkcióit a jobbkezes módnak a VI.1. ábra mutatja. A balkezes mód és e között a funkcionalitást tekintve annyi a különbség, hogy megfordítás esetén baloldalra kerül a horizontális irányítókar, azonban a funkciógombok kiosztása hasonló marad a megfordítás ellenére, de a felső funkciók (Hazatérés, Headless Mode) helyet cserélnek (Előre trimmer, Hátra trimmer). A távirányítóhoz a drón csatlakoztatása a következőképpen történik. A drón bekapcsolását követően be kell kapcsolni a távirányítót. Sípoló hang jelzi a sikeres csatlakozást. Ezután a gázkart szélső helyzetbe kell tolni (újabb sípoló hang), majd vissza a nullpozícióba (újabb sípoló hang). Ezek után irányítható a drón.
23
A gombok áttekintése:
Horizontális irányítás: A horizontális síkban történő mozgás irányának megadására alkalmas (előre, hátra, jobbra, balra). Irányítókar mellet ez egyben gomb is, ami a 3D Flip-et indíthatja el. Ez egy előre beprogramozott funkció, a drón képes bármilyen irányban szaltózni. Ezt úgy lehet elérni, hogy repülés közben az irányítókar le kell nyomni, majd nyomva tartva abba az irányba mozgatni, amerre szeretnénk a szaltózást. Felengedés után továbbítja ezt a drónnak, ami elvégzi a kért műveletet. Azonban a szaltó biztonságos elvégzéséhez legalább 3 méteres magasság szükséges a leírás szerint. A kar középre igazított, eltérítés után felengedés esetén visszaáll a középső pozícióba.
Vertikális irányítás, forgatás: Ezzel a karral szabályozható a rotorok sebessége, ezáltal a drón repülési magassága. Jobbra-balra történő mozgatásával a drón vertikális tengelye körül forgatható. Ez az ellentétes forgásirányú propellerpároknak köszönhető. Ez a kar is egyben gomb is, két fokozat között lehet vele váltani nyomás esetén, lassú és gyors repülés között. Ezek a rotorok forgási sebességének a maximumát változtatják.
Trimmer gombok: Mivel a drón nem tartalmaz GPS szenzort, így az abszolút helyzetét nem képes meghatározni. Így már kis pontatlanság miatt is (pl. a rotorvédő egy irányba deformálódik, így arra az oldalra több súly kerül) előfordulhat a stabilitás elvesztése, ami folyamatos enyhe egy irányba repüléssel jár. Ennek a kalibrálására használhatóak a Trimmer gombok, így a nullpozíció beállítható.
Headless Mode: A repülés során a már említett apró hibák, külső tényezők (pl. szél), vagy forgatásunk hatására a drón főtengelye elfordulhat. Ez gyakran megnehezíti az irányítást, főleg akkor, amikor már távolra került a drón. Ennek a problémának a megoldására használható a Headless Mode. Ekkor a drón megjegyzi a kezdeti irányt és elfordulás esetén is a megjegyzett irány szerint repül, nem a saját elforgott vonatkoztatási rendszere alapján.
Hazatérés: Ez a funkció csak Headless Mode-ban használható, megnyomása esetén a drón elindul a kiindulási pozíció felé. Ez azonban elég pontatlan, mivel GPS szenzor nélkül csak a gyorsulási adatokra támaszkodhat, amelyekből a relatív helyzet csak nagy hibával határozható meg (erre egy későbbi fejezetben vissza fogok még térni).
24
2. A távirányító működése
VI.2. ábra A távirányító alaplapja
A funkciók megismerése után megvizsgáltam a működését. Szétszerelés után a VI.2. ábra szerint néz ki a távirányító. Mivel első lépésként az irányítást akartam átvenni, az irányítókarokat vizsgáltam meg először. Ezeken digitális multiméter segítségével méréseket végeztem. Az alaplap túloldalán egy irányítókarhoz 3-3 illesztési pont tartozik. A méréseim során a feszültségkülönbséget mértem két illesztési pont között, miközben változtattam a kar helyzetét. Ezek után az egyiket viszonyítási alapul véve elvégeztem a mérést a harmadik illesztéssel is. Ezek alapján a harmadik feszültségkülönbség meghatározhatóvá vált. A méréseket kiértékelve azt tapasztaltam, hogy a két szélső illesztési pont között a potenciálkülönbség állandó, 3,25V. A középső pont fezsültsége egyenes arányosságot mutatott a kitérési szöggel. Ezek alapján azt a következtetést vontam le, hogy a karok egy feszültségosztón (potenciométeren) keresztül kommunikálnak a távirányítóval. Ezt követően szakadásvizsgálattal megállapítottam, hogy ezek a potenciométerek a távirányítón kívülről nézve jobb oldalt található a test, bal oldalt pedig a forrás. Tehát mindkét irányítókarhoz két potenciométer tartozik, egy az előre-hátra és egy a jobbra-balra mozgatás érzékeléséhez. A potenciométerek által leosztott feszültség határozza meg azt, hogy milyen jelet küld a távirányító a drónnak. A méréseim alapján ezeket a feszültségeket jobbkezes mód esetén a VI.1. táblázat tartalmazza.
25
A test és a jel közötti feszültség
Vertikális kar
Horizontális kar
Előre-hátra
Balra-jobbra
Előre-hátra
Balra-jobbra
0V
Maximális sebesség
negatív irányú forgatás
hátra
balra
1,625V
Közepes sebesség
stabil állás
stabil állás
stabil állás
3,25V
Rotor leáll
pozitív irányú forgatás
előre
jobbra
VI.1. táblázat A távirányító működése jobbkezes módban
A távirányító irányításának átvételét úgy valósítottam meg, hogy az Arduinoval a megfelelő jeleket küldve a távirányítónak az úgy érzékelje, mintha az irányítókarok elforogtak volna. Ehhez adott érték küldése esetén annak megfelelő feszültséget kell létrehoznom a távirányítón. Ezt azonban párhuzamos kapcsolással nem tudtam megcsinálni, így szükségessé vált sorosan bekötni az Arduinot. Mivel a Thevenin elvet alkalmazva az Arduino helyettesíthető egy feszültségforrással és egy azzal soros ellenállással, a sorba kapcsolás esetén meghatározható a potenciométer jel kiállásának az adott értékre állításához szükséges feszültség, így az Arduino által adott jel.
3. A csatlakozás kialakítása Az Arduino soros bekötése az irányítókarok potenciométeréhez nem egyszerű feladat. Ugyanis ehhez a potenciométer kapcsolatát a távirányítóval szükségszerűen meg kell szakítani, majd ezután bekötni a microcontrollert. Emellett nagyon megfontolandó, hogy melyik kiálláshoz csatlakoztatjuk. A három kiállás közül a jel vonalon történik az adattovábbítás, így mindenképpen arra kell kötnünk az Arduinot. Azonban ha a jelvonalat megszakítjuk, és a szakadáspontok közé iktatjuk a microcontrollert, a potenciométer működőképes marad, tehát befolyásolja a jelet. Ez nagyon nem lenne jó, mivel így akár többlet-feszültséget is kaphatna a távirányító a jelvonalon keresztül, ami akár tönkre is teheti azt. Ez alapján az Arduinot a jel és a test közé kell kötni. Ezáltal a potenciométer teljesen ki lesz iktatva, egyedül az Arduino befolyásolja a jelet.
26
A csatlakoztatás megvalósításához az összesen négy potenciométer jeleit kell az Arduinoval irányíthatóvá tennem, a következőkben az egy potenciométerhez tartozó módosításokat mutatom be, a másik három módosítása ezek alapján történt. Az első lépés a jel vonal megszakítása. Ehhez a távirányító alaplapján kell megszakítani a kapcsolatot. Ezt a IV.3. ábrán megjelölt helyen végeztem el. Az alaplap műanyag bevonatának lekaparása után elérhetővé vált a jelvonal vezetéke. Ezt további kapargatással megszakítottam. A második lépés az Arduino csatlakoztatása. Ehhez vezetékeket forrasztottam az alaplap megtisztított vezetőjéhez, aminek a vége a microcontrollerhez köthető.
VI.3. ábra A távirányító módosítása
Ez a legkényesebb művelet, ugyanis nagyon kevés hely áll rendelkezésre a forrasztás elvégzéséhez, a tapadáshoz, és ha rosszul sikerül, sérül valamelyik szomszédos áramkör, az tönkreteheti a távirányítót. A jobb tapadás érdekében néhány vékony réz szálat tekertem össze gombolyagszerűen és helyeztem a vezeték végére, így az ón a szálak közé folyva jobban tart. Ezek után a vezetékek végét az Arduinohoz kötve, irányítható a jel vonal feszültsége. Ehhez a test-hez forrasztott vezetékeket az Arduino testéhez (GND) kell kötni, a jelet pedig az Arduino valamelyik kimenetéhez, lehetőség szerint PWM jelek adására alkalmas kimenethez (erre a következő fejezetben fogok kitérni). Ez azonban elég komplikált lehet a sok vezeték, valamint a kényes forrasztások miatt. Ennek a problémának a megoldásához egy egyszerű csatlakozón kezdtem gondolkodni. Egy olyan csatlakozón, ami sok vezetéket képes egyszerre összekötni és lehetőség szerint elterjedt, olcsó. Ennek tökéletesen megfelel az RJ45-ös csatlakozó. Egyszerre 8 vezeték kapcsolatát képes biztosítani, nagyon elterjedt, UTP kábel használatával sokkal
27
átláthatóbbá válhat a kapcsolat. Így a távirányító potenciométereinek megszakított jeleit egy RJ45-ös anya csatlakozóhoz kötöttem, az Arduinoból induló vezetékeket pedig UTP kábelen keresztül egy RJ45-ös apához. A fejlesztésem során nagyon fontosnak tartottam, hogy a távirányító működőképessége ne romoljon. Ehhez biztosítanom kellett, hogy a megszakított jelvonalat újra össze lehessen kapcsolni. Ehhez a megszakítási pontok másik oldalát is kívülről elérhetővé kellett tennem, így ezekhez is az előzőek alapján vezetéket forrasztottam. Az összekapcsolás megoldásához az RJ45-ös csatlakoztatást használtam ki. A távirányítóra még egy RJ45-ös anya csatlakozót szereltem, amibe ezeket a vezetékeket vezettem. Így ha a két RJ45-ös anyát megfelelően összekapcsoljuk (a szakítási végpontokat egymással), újra visszaáll az eredeti működés. Ehhez létrehoztam egy összekapcsoló UTP vezetéket a két végén egy-egy RJ45-ös apával, amik a megfelelő vezetékeket összekapcsolja.
VI.4. ábra A távirányító csatlakozói
Összegezve a távirányító irányítókarjaihoz tartozó összesen négy potenciométer jelvonalait megszakítottam, majd a szakítási pontokhoz forrasztott vezetékeket két RJ-45-ös csatlakozóhoz kötöttem. Mivel a távirányító teste ugyanazt a feszültségszintet jelenti minden potenciométernél, és egy áramkörön van minden potenciométer teste (szakadásvizsgálat alapján), így elegendő volt egy test bekötése az RJ45-ös csatlakozóba, nem volt szükséges minden potenciométernél megtenni. Így összesen 9 darab csatlakozási pont található a két RJ45-ös csatlakozókban. Az ilyen csatlakozót egyszerű használata miatt az Arduino és a szenzor között is alkalmaztam, így a szenzorok egy-egy csatlakoztatással a mikrovezérlőhöz kapcsolhatóak. 28
VII.
Az Arduino csatlakoztatása a távirányítóhoz
Az előző rész alapján kapott csatlakozóval rendelkező távirányítóhoz egyszerűen hozzá lehet kötni az Arduinot. Egy egyik végén RJ45-ös csatlakozóval ellátott UTP kábelt használtam ehhez. A másik végén a megfelelő vezetékek hozzáköthetőek az Arduinohoz, így létre tud jönni a kapcsolat. Minden potenciométer jelének irányításához PWM kimeneteket használtam. A kapcsolat létrejöttét a VII.1. ábra mutatja
VII.1. ábra Az Arduino és a távirányító kapcsolata
. A következőkben azt fogom bemutatni, hogy a vezetékeket milyen kiállásokhoz kötöttem, és ezáltal hogyan történik a kommunikáció.
1. A PWM jelek használata A távirányító potenciométerei folytonos feszültségváltozással kommunikálnak, azonban a microcontroller csak digitális kimenetekkel rendelkezik. Ennek a problémának a megoldására használhatóak a PWM (Puls Width Modulation) jelek. Az Arduino néhány pinje az ilyen jelek adására képes. A PWM az impulzusszélesség modulációját jelenti. A digitális kimenetek két értéket tudnak szolgáltatni, 0 és 4,6V-ot, ha ezt nagyfrekvencián váltogatjuk, akkor az érzékelt átlagfeszültség a be- és kikapcsolt időtartamok átlaga szerint alakul. Az Arduino D3, D5, D6, D9, D10 és D10 kimenetei előre fel vannak erre készítve, így a hozzá készült AnalogWrite() függvényt használtam. Az AnalogWrite() függvénynek két egész típusú paramétere van, az egyik hogy melyik pin-t állítsa, a másik pedig az érték. Az érték és a jel finomságának aránya mutatja meg a bekapcsolt
29
időtartam arányát a teljes periódushoz képest, tehát a kimeneti feszültséget a maximálishoz képest. A jel finomsága alatt azt értem, hogy milyen érték jelöli a maximális feszültséget. A jel felbontása
alapértelmezetten
8
bit,
tehát
255
a
maximális
érték.
Ezt
az
AnalogWriteResolution(bit) függvénnyel lehet állítani legfeljebb 32 bit-ig. Azonban mivel az Arduino Nano 8 bites PWM jelek kiadására képes, így átállítva sem lesz finomabb az állíthatóság. A távirányítót ennek megfelelően PWM kimenetekre kötöttem. Azonban a tesztelés során azt tapasztaltam, hogy a drón szaggatva repül. Ebből arra következtettem, hogy a távirányítóban nincs elég csillapítás ahhoz, hogy a PWM jelet kiegyenlítse, analóggá tegye. Ennek a megoldására egy egyszerű low pass filtert szereltem minden kimenet után.
2. Low Pass Filter A low pass filter működésének az alapja egy soros ellenállás és egy párhuzamos kondenzátor. A kondenzátor által a rendszer tehetetlenséget kap, így nagyfrekvenciájú rezgés esetén az átlaghoz konvergál. A megfelelő ellenállás és kondenzátor kiválasztásához szükséges ismernünk a feszültség alakulását az időben. Ezt az Ohm törvény és a kapacitás definíciója alapján lehet levezetni.
VII.2. ábra Low pass filter
A kapacitás definíciója alapján: 𝐶=
𝑄 𝑈
30
1 ∙ 𝐼 ∙ 𝑑𝑡 𝐶 1 𝑢 = ∙ ∫ 𝑖𝑑𝑡 𝐶
𝑑𝑈 =
𝑑𝑢 1 = ∙𝑖 𝑑𝑡 𝐶 A huroktörvény alapján: UC = 𝑈 − UR Ez az Ohm-törvény szerint: UC = 𝑈 − 𝐼 ∙ 𝑅 Tehát
U̇ C = 𝑈̇ − 𝐼 ̇ ∙ 𝑅 =
1 ∙𝐼 𝐶
Ez egy Cauchy probléma, vagyis egy elsőrendű lineáris differenciálegyenlet, aminek a peremfeltétele az, hogy 0-ban 0, az ugrásoknál pedig meg kell egyezni a bal és jobboldali függvényértékeknek, mivel a feszültségekben nem lehet ugrás. Az U az Arduino által leadott PWM jel, az UC pedig a csillapított jel. A PWM jel egy négyszögjel, nullának tekinthető idő alatt 4,6V-ra ugrik, majd valamennyi idő után vissza 0-ra, tehát két szakaszra bontható (nagy meredekséggel számolva is hasonló eredményre lehet jutni). 1.szakasz: 0 − 𝐼̇ ∙ 𝑅 =
1 ∙𝐼 𝐶
Ez egy szétválasztható differenciálegyenlet. 1 1 ∙ 𝐼̇ = − 𝐼 𝑅∙𝐶 𝑙𝑛|𝐼| = −
1 +𝑐 𝑅∙𝐶
−𝑡
𝐼 = 𝑒 𝑅∙𝐶 ∙ 𝑘 A c és a k valós paraméterek. k értékét a kezdeti érték alapján lehet meghatározni, viszont ahhoz előbb ki kell fejezni UC-t.
31
−𝑡
UC = 𝑈−𝑒 𝑅∙𝐶 ∙ 𝑘 ∙ 𝑅 𝑈
Ez t=0 esetén nulla kell, hogy legyen, így 𝑘 = 𝑅
Ezt levezetve a második szakaszra is azt kapjuk, hogy −𝑡
1. szakasz UC = 𝑈 ∙ (1 − 𝑒 𝑅∙𝐶 ) −𝑡
2. szakasz UC = 𝑈 ∙ 𝑒 𝑅∙𝐶 A másik feltétel alapján meghatározható a teljes UC függvény. Ennek a grafikonját az VII.3. ábra mutatja 50%-os 10Hz és az Arduino által is használt 490Hz-es PWM jelek esetén, az általam használt 1MΩ ellenállással és 100nF kapacitással számolva.
1,75
1,69
1,63
1,56
1,50
1,44
1,38
1,31
1,25
1,19
1,13
1,06
1,00
0,94
0,88
0,81
0,75
0,69
0,63
0,56
0,50
0,44
0,38
0,31
0,25
0,19
0,13
0,06
3,5 3 2,5 2 1,5 1 0,5 0
0,00
Uc [V]
Low pass filter 10Hz
Idő [s]
Low pass filter 490Hz 3
Uc [V]
2,5 2 1,5 1 0,5
0,00 0,02 0,04 0,06 0,08 0,10 0,12 0,14 0,16 0,18 0,20 0,22 0,24 0,27 0,29 0,31 0,33 0,35 0,37 0,39 0,41 0,43 0,45 0,47 0,49 0,51 0,53 0,55 0,57 0,59
0
Idő [s]
VII.3. ábra A low pass filterezés eredménye
Látható, hogy nagy frekvencia esetén stabilabban beáll a kívánt feszültségre. Ez a stabilitás más ellenállással és kondenzátorral tovább finomítható, a projektem során ez így is megfelelő egy
32
prototípus elkészítéséhez. A beállási idő csak a frekvencia növelése mellett javítható a stabilitás romlása nélkül.
3. A program A drón irányításához olyan programra volt szükségem, ami a mért értékeket kiértékelve a megfelelő jelet küldi a távirányítónak. Ezt egy osztállyal valósítottam meg. A megadott döntési szélsőértékek alapján a microcontroller meghatározza a pillanatnyi döntési arányt, majd ezt felhasználva, kiszámítja az ilyen arányú döntéshez (irányítókar döntésének) tartozó feszültséget, tudva hogy maximális döntöttség esetén ez az érték 3,25V. Jelenleg a programot egyszerű tesztelésre fejlesztettem, ez azt jelenti, hogy a távirányítóhoz hasonlóan történik az irányítás, vagyis a bal kéz előre-hátra döntése szabályozza a vertikális mozgást, a balra-jobbra döntés a forgást, a jobb kéz pedig a horizontális mozgásokat.
4. Biztonsági megoldások A kutatásaim után elkészítettem egy prototípust is, amin teszteltem az irányítást. Azonban ezt csak „házilag”, kézi forrasztással tudtam megcsinálni, illetve a mikrovezérlő néha nem működik tökéletesen, ritkán véletlenszerűen leáll. Ez a probléma elkerülhető lehet megbízhatóbb forrásból származó mikrovezérlő használatával. A leállás nagy problémát jelenthet, mivel ha a mikrokontroller leáll, az azt jelenti, hogy nem ad ki jelet. Ez 0V feszültséget jelent a távirányítón, ami maximális rotor-sebességet jelent, maximális hátra és balra menetben forgással. A probléma legfőbb veszélyforrása a maximális rotor-sebesség. Ennek az elkerülésére a következő biztonsági megoldásokat alkalmaztam. Az egyik biztonsági megoldásom a balkezes mód használata. A IV. fejezetben mutattam be a távirányítót és annak funkcióit, működését. Az ott leírt működési elvek jobbkezes módra vonatkoztak. Azonban a távirányító rendelkezik egy balkezes móddal is. A balkezes mód használata során a távirányító fordított helyzetben működik. Így a jobbkezes irányítási működési elvek megfordulnak. Az így kapott működési elveket a VII.1. táblázat mutatja.
33
Vertikális kar
Horizontális kar
A test és a jel közötti feszültség
Előre-hátra
Balra-jobbra
Előre-hátra
Balra-jobbra
0V
Rotor leáll
pozitív irányú forgatás
előre
jobbra
1,625V
Közepes sebesség
stabil állás
stabil állás
stabil állás
3,25V
Maximális sebesség
negatív irányú forgatás
hátra
balra
VII.1. táblázat A távirányító működése balkezes módban
Látható, hogy ebben az esetben a mikrovezérlő leállása esetén a drón egyszerűen kikapcsol, ami kisebb veszélyt jelent a maximális sebességnél. A további biztonsági megoldásaim a mikrovezérlő és a szenzor közötti kapcsolat megszakadására, pillanatnyi kiesésére vonatkoznak. Ilyen esetben az Arduino a megszakadás előtti jelet küldené folyamatosan. Ez veszélyt jelenthet már alacsony rotor-sebesség mellett maximális horizontális mozgás esetén is. Ennek az elkerülésére egy leszálló metódust írtam, ami kapcsolatkiesés esetén meghívódik. Ekkor a mikrovezérlő 1,625V-ot küld a forgatási, és horizontális irányokra, így stabil helyzetben áll, miközben a rotor sebességét a kezdeti értékről folyamatosan lassítja, amíg le nem áll.
VIII. Összegzés A kutatásaim és fejlesztéseim során megismerkedtem a mikrovezérlők, drónok és szenzorok működésével, gyakorlati alkalmazásával és elkészítettem egy prototípust a fejlesztési ötletem demonstrálására. A fő célom egy testközelibb irányítás létrehozása volt, ami sikerült, sokkal nagyobb élménnyé vált a szenzorok által a drón irányítása. Emellett azt tapasztaltam, hogy az irányítás nem csak nagyobb élménnyé, hanem érezhetően sokkal pontosabbá is vált. A távirányítóval összehasonlítva egy olyan irányítási rendszert kaptam, aminek a precizitását széles határok között változtathatom, egyszerűen a programkódban megadott határok átállításával. Valamint a kapott rendszer nem csak egyszerűen állítható, hanem módosítható, fejleszthető, bővíthető, véleményem szerint nagyon sok lehetőséget rejt.
34
1. Alkalmazhatósági területek A mozgásgesztusok általi irányítás számos helyen jól alkalmazható lehet. Az általam bemutatott drón irányítása elsősorban szórakoztató jellegű, azonban profi videó felvételeket készítő, vagy felderítő drónokhoz is megvalósítható és használható. Az egyszerű és pontos irányítás a technika minden területén kiemelkedően fontos, legyen szó gyártásról, kutatásról. Az utasítások adása a legtöbb esetben valamilyen mozdulattal történik, így egy mozgásgesztust felismerő szenzorral ez a mozdulat leegyszerűsödhet, így az irányítás gyorsabbá válhat, azonban a mozgások sokfélesége és a szenzorok érzékenysége miatt ez nem megy a pontosság rovására, sőt több lehetőséget kínál, ezáltal a precizitás fokozható.
2. További fejlesztési tervek A bemutatott rendszer fejlesztésére nagyon sok ötletem van. Elsőként a hibák kiküszöbölésére megfelelőbb mikrovezérlő kiválasztása. Ezen túl a jobb kapcsolat, valamint az egyszerűbb használat érdekében vezeték nélküli kapcsolat tervezek kiépíteni a mikrovezérlő és a szenzor között. Ezen kívül a drón további funkcióinak irányításához a gombok Arduinohoz kötését is megtenném, azokat valamilyen mozgásgesztussal aktiválnám. Az egyik legnagyobb hardveres fejlesztési tervem a drón kamerákkal történő felszerelése, amiknek a képét egy VR szemüvegen keresztül tenném láthatóvá. Így olyan látvány tárulna elénk, mintha mi is repülnénk. Ezt azonban úgy látom, hogy egy saját drón megépítésén keresztül tudnám elérni, mivel az élethű háromdimenziós felvételekhez két kamera beépítése szükséges az azokhoz tartozó megfelelő forgató eszközökkel. Ebben az esetben a pontosabb és stabilabb működés érdekében GPS-szel is rendelkező szenzorokat is használnék. Így egy szorosabb kapcsolat jönne létre a mikrovezérlő és a drón között, és ezt nagyon sok mindenre fel tudnám használni, sokkal több funkciót tudnék adni neki egyszerűen, programból. A szoftveres fejlesztések egyike a minél stabilabb és pontosabb működés biztosítása, lehetőleg minden hibalehetőség kizárásával. Ezen túl az irányítási mód nagyon sokféleképpen leírható, mint említettem jelenleg egy egyszerű tesztelő programot írtam, azonban a jobb élmény érdekében ez nagyon sokféleképpen módosítható, például az irányítás történhet az ismert Vasember, vagy Superman repüléséhez hasonlóan, ennek csak a mozgásgesztusok sokféleség szab határt.
35
IX. [1]
Hivatkozások LUUKKONEN, Teppo. Modelling and control of quadcopter. Independent research
project in applied mathematics, Espoo, 2011. [2]
Arduino Board Nano leírás, https://www.arduino.cc/en/Main/ArduinoBoardNano,
2016. 10. 24. [3]
MPU6050 leírás, http://playground.arduino.cc/Main/MPU-6050, 2016. 10. 24.
[4]
MPU6050 regiszter térkép, http://www.i2cdevlib.com/devices/mpu6050#registers,
2016. 10. 24. [5]
SEMICONDUCTORS, Philips. The I2C-bus specification. Philips Semiconductors,
2000, 9397.750: 00954. [6] KRAFT, Edgar. A quaternion-based unscented Kalman filter for orientation tracking. In: Proceedings of the Sixth International Conference of Information Fusion. 2003. p. 47-54. [7] DAM, Erik B.; KOCH, Martin; LILLHOLM, Martin. Quaternions, interpolation and animation. Datalogisk Institut, Københavns Universitet, 1998. [8] BARR, Michael. Pulse width modulation. Embedded Systems Programming, 2001, 14.10: 103-104. [9]
LINSE, Hermann. Elektrotechnik für Maschinenbauer. Stuttgart : B. G. Teubner,
1992. ISBN 3-519-16325-X. [10] Jeff Rowberg, MPU6050 DMP forráskód, https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050, 2016. 10. 24. [11] Kristian Lausus, Guide to gyro and accelerometer with Arduino including Kalman filtering, https://github.com/TKJElectronics/Example-Sketch-for-IMU-including-Kalmanfilter, 2016. 10. 24.
36
X.
Ábrajegyzék
1. Ábrák I.1. ábra Az irányítási rendszert demonstráló prototípus ........................................................... 4 II.1. ábra A projekt fázisai .......................................................................................................... 7 IV.1. ábra FQ777-124-es drón ................................................................................................. 10 IV.2. ábra Az Arduino Nano pinkiosztása ............................................................................... 11 IV.3. ábra MPU6050, GY-521-es alaplapon ............................................................................ 12 V.1. ábra Az I2C buszrendszer adattovábbítása ....................................................................... 14 V.2. ábra A Kálmán-szűrő működése ..................................................................................... 17 V.3. ábra A DMP és a Kálmán-szűrő összehasonlítása ........................................................... 21 VI.1. ábra Az FQ777-124-es drón távirányítója....................................................................... 23 VI.2. ábra A távirányító alaplapja ............................................................................................ 25 VI.3. ábra A távirányító módosítása......................................................................................... 27 VI.4. ábra A távirányító csatlakozói ......................................................................................... 28 VII.1. ábra Az Arduino és a távirányító kapcsolata ................................................................. 29 VII.2. ábra Low pass filter ....................................................................................................... 30 VII.3. ábra A low pass filterezés eredménye............................................................................ 32
2. Táblázatok II.1. táblázat A költségek ............................................................................................................ 6 V.1. táblázat Az MPU6050-es szenzor csatlakoztatása ........................................................... 15 V.2. táblázat A szenzor méréshatárai ....................................................................................... 19 V.3. táblázat A szenzor belső órajelének forrása ..................................................................... 20 V.4. táblázat A mérések szórásai ............................................................................................. 21 VI.1. táblázat A távirányító működése jobbkezes módban ...................................................... 26 VII.1. táblázat A távirányító működése balkezes módban ....................................................... 34
37