Miskolci Egyetem Gépészmérnöki és Informatikai Kar Automatizálási és Infokommunikációs Intézeti Tanszék H-3151 Miskolc-Egyetemváros
Motorkerékpáros gyorsulási versenyt támogató management rendszer fejlesztése Szakdolgozat
Készítette:
Pónya Balázs
Bsc szintű, villamosmérnök szakos Elektronikai tervezés és gyártás szakirányos hallgató Konzulens, és tervezésvezető:
Dr. Vásárhelyi József egyetemi docens
Miskolc 2015
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Tartalom 1.
Bevezetés ............................................................................................................................. 4 1.1 A feladat bemutatása ......................................................................................................... 4 1.2 Eddigi megoldások............................................................................................................ 5
2.
A rendszer felépítése ........................................................................................................... 6 2.1 Alapkoncepció .................................................................................................................. 6 2.2 A tervezés menete ............................................................................................................. 7 2.2.1 Kommunikáció a pálya eleje és vége között .............................................................. 7 2.2.2 A versenyzők érzékelése ............................................................................................ 7 2.2.3 Felhasználói felület .................................................................................................... 8 2.3 A rendszer elemei ............................................................................................................. 9 2.31 Indító állomás .............................................................................................................. 9 2.3.2 Cél állomás ................................................................................................................. 9 2.3.3 Adatfeldolgozó számítógép ........................................................................................ 9
3.
A hardver ........................................................................................................................... 10 3.1 A tervezés folyamata, eszközei ....................................................................................... 10 3.1.1 Hiányzó alkatrészek megrajzolása ........................................................................... 10 3.2 A cél állomás................................................................................................................... 13 3.2.1 Tápegység................................................................................................................. 14 3.2.2 Mikrokontroller ........................................................................................................ 18 3.2.3 Infra detektorok ........................................................................................................ 20 3.2.4 Wi-Fi modul ............................................................................................................. 22 3.3 Az indító állomás ............................................................................................................ 24 3.3.1 Lámpa meghajtó ....................................................................................................... 24 3.4 Infra adók ........................................................................................................................ 26 3.4.1 555-ös astabil kapcsolása ......................................................................................... 27 3.5 Tervezési szabályok ellenőrzése ..................................................................................... 29 2
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
3.6 A nyomtatott áramkör tervezése ..................................................................................... 29 4.
Mikrokontroller szoftver ................................................................................................... 32 4.1 Cél állomás...................................................................................................................... 32 4.1.1 Feladatai ................................................................................................................... 32 4.1.2 A program megvalósítása ......................................................................................... 32 4.2 Indító állomás.................................................................................................................. 48 4.2.1 Feladatai ................................................................................................................... 48 4.2.2 A program megvalósítása ......................................................................................... 48
5.
PC szoftver ........................................................................................................................ 57 5.1 Feladatai .......................................................................................................................... 57 5.2 Megvalósítás ................................................................................................................... 57 5.2.1 A program működése ............................................................................................... 60
6.
Összefoglalás ..................................................................................................................... 65
7.
Summary ........................................................................................................................... 66
Idézett forrásmunkák ................................................................................................................ 68 Ábrajegyzék .............................................................................................................................. 69 Képletjegyzék ........................................................................................................................... 71 Mellékletek jegyzéke ................................................................................................................ 72
3
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
1. Bevezetés 1.1 A feladat bemutatása 1.1.1 A verseny A feladatom egy motorkerékpárok gyorsulási versenyét támogató verseny management rendszer fejlesztése. Ennek a célkitűzése, hogy a lehető legkevesebb felhasználói beavatkozással lehessen lebonyolítani a futamokat (rajtoltatás, időmérés), a rendszer képes legyen automatikusan megállapítani a továbbjutókat, és naplózza az eredményeket. A versenyen egyszerre két induló vesz részt. A pályát egy kb. 110 m-es útszakasz alkotja, amely két részre van osztva, a két motoros számára. A versenyzők a célvonaltól indulnak egy lámpa jelzésére, ettől kezdve szükséges az idejüket mérni, egészen addig, amíg a célvonalon át nem haladnak. A továbbjuttatás egy előfutam után, egyenes kieséses elven történik. Az előfutamon is párokban indulnak a motorok. Ekkor az összes jelentkező pályaideje mérésre kerül. Innen a legjobb tíz versenyző juthat tovább a döntőbe, ahol már egyenes kieséses elven zajlik a továbbjutás. Értelemszerűen, ha nincs egy kategóriában tíznél több jelentkező, akkor alapból az egyenes kieséssel kezdődnek a futamok. Az egyenes kiesés során a jelentkezők párokba lesznek osztva, és ezek a párosok indulhatnak a futamon. A párosból pedig mindig az jut tovább, aki a jobb időt futja. Az utolsó három versenyzőnél ez annyiban módosul, hogy ott már mindenki megy egy futamot mindenkivel, és így alakul ki az első három helyezett.
1.1.2 Technikai követelmények A verseny lebonyolítása során az útszakasz biztosítása időhöz van kötve, ezért fontos, hogy a rendszert minél gyorsabban fel lehessen állítani, és el lehessen bontani. A pályán keresztbe nem lehet elhelyezni vezetékeket, mivel azokon az áthaladás balesetveszélyes. A helyszínen a hálózati áram biztosítása nem megoldott, tehát akkumulátoros üzemre kell tervezni.
4
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
1.2 Eddigi megoldások
A nagy versenyek lebonyolítása során legelterjedtebb megoldás, hogy már magába a pályába építik be a verseny lebonyolításához szükséges hardvereket. Ez gyakorlatilag annyit tesz, hogy egy érzékelő hurok van asz aszfalt burkolatba beépítve, ami antennaként is funkcionál. Minden versenyzőnél található egy jeladó, amit ez hurok érzékelni tud. Amíg kapcsolat van a két eszköz között, lehetőség van kétirányú adatcserére. A jeladók adatai alapján pedig meg lehet különböztetni a különböző versenyzőket, így nagyszámú résztvevő esetén is megoldható a mérés. A rendszer további részét képezi egy dekóder, ami az antennával áll kapcsolatban, és egy szerver, ami az adatokat kezeli. Mivel szükség van a pályába beépített antennákra, ez a rendszer nem mozgatható, hanem az adott helyszínhez van kötve. [1] Létezik ennek egy mobil változata is, amely szintén hasonló elven működik. A különbség az antennákban rejlik, itt nincsenek fixen az útburkolatba építve, hanem egy hordozható szőnyegben kaptak helyet. [2] A verseny, amihez ezt a rendszert fejlesztem, egy lezárt, de nem feltétlen minden alkalommal azonos útszakaszon zajlik. Ennek okából kifolyólag a pályába fixen beépített jeladók nem valósíthatóak meg, a szőnyeg típusúakkal pedig az a probléma, hogy nincsenek fixen rögzítve, így ha ráfut egy motor, könnyen megcsúszhat, ami balesetveszélyes, ezért nem alkalmazható. Olyan rendszerre van tehát szükség, ami nem igényel a pályán a versenyzők útjában elhelyezett vezetékeket/érzékelőket.
5
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
2. A rendszer felépítése 2.1 Alapkoncepció
A rendszer fő elemeit a következő ábra mutatja:
1. ábra A rendszer felépítése
A pálya elején és végén infra kapuk vannak, amik érzékelik az áthaladó versenyzőket. A pálya végére oldalanként két kapura van szükség, hogy az azok által mért időkülönbségből a sebesség számítható legyen. Az elején csak egy is elég, mivel ott csak a reakcióidő mérése történik. Az indító modul vezérli a lámpát, amire a versenyzők indulhatnak. A modulok egymás között vezeték nélkül kommunikálnak.
6
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
2.2 A tervezés menete
Első lépésként meg kell határozni a funkciókat, és az ahhoz szükséges hardvereket. Ezek a funkciók a következők:
Kommunikáció a pálya eleje és vége között
A versenyzők érzékelése
Kommunikáció a PC-n keresztül a felhasználóval
2.2.1 Kommunikáció a pálya eleje és vége között A versenyre kijelölt pályaszakasz megközelítőleg 110m-es hosszúságú sík terep. A két vég közötti kapcsolatra alapvetően két elgondolás vizsgálható, a vezetékes, és vezeték nélküli adatátvitel. A vezetékes átvitel esetén több probléma is felmerül. Elsőként olyan kommunikációs protokollt kell választani, amely képes ekkora távolság áthidalására. Ezekhez pedig általában nem elegendőek a logikai jelszintek, így egy illesztő áramkörre volna szükség. Gondolni kell arra is, hogy a versenyben résztvevő motorok elektromágneses zajkibocsátása magas, ezért célszerű volna differenciális jelátvitelt alkalmazni árnyékolt vezetékekkel. A hátránya ennek a megoldásnak, hogy az ehhez szükséges vezeték, és a hozzájuk tartozó illesztő áramkörök is költségesek. Ennél költséghatékonyabb megoldás a vezeték nélküli jelátvitel. Ezen belül is a legkézenfekvőbb a Wi-Fi alkalmazása. Ez széles körben elterjedt, képes a pálya hosszának az áthidalására, és egyszerű összeköttetést biztosít bármilyen mobil eszközzel (notebook, okos telefon). Ezért én ezt a megoldást választottam.
2.2.2 A versenyzők érzékelése Az
érzékelés
megoldására
két
főbb
irányvonal
áll
rendelkezésre.
Az
elektronikus/elektromágneses úton való érzékelés, és az optikai úton való érzékelés. Az első változathoz szükség van egy jeladóra, ami a versenyzőkre kerül felszerelésre. Ez lehet például egy RFID tag. A célvonalnál ennek az adónak az áthaladását kell érzékelni. 7
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Probléma vele, hogy nehéz megoldani, hogy pontosan ugyan abban a helyzetben érzékeljünk minden versenyzőt, és mivel a végeredményben század másodpercek is számítanak, alacsony költségvetéssel ez a megoldás nem valósítható meg. Az optikai irányvonalon lehetséges volna képfeldolgozás segítségével, egy kamerával figyelni a beérkezőket. Ezzel pontos eredményt lehetne kapni, viszont a megvalósításához nagy számítási igényre van szükség továbbá az egymás mellet haladó versenyzők megkülönböztetése is gondot okozhat. Egyszerűbb megoldás, ha a pályára optikai kapukat helyezünk, egy fénysugár kerül keresztben az útra, amit az elhaladó motoros megszakít. Ezt a megszakítást egy mikrokontrolleres kártya érzékeli. A fény kapu állhat egy lézerdiódafotodióda párosból, vagy ami kevésbé költséges, és biztonságosabb is (a lézer látássérülést okozhat) lehet infra LED-eket használni. Ezeknek hátránya, hogy igen nagy szögben sugároznak, viszont ha egy kis átmérőjű, megfelelő hosszúságú csőben helyezzük el az adó LED-eket, és a vevő egységeket, akkor kellő eredményt lehet vele elérni, viszonylag kis távolság esetén. A pálya szélessége egy versenyző területén maximum 2,5m, így itt ez a megoldás még stabilan működik. Szükséges még meghatározni, az optikai érzékelők talajtól való távolságát. Az érzékelni kívánt motorok felépítése eltérő lehet, ezért a legegyszerűbb a kerekeket érzékelni, ugyanis ezek többé-kevésbé egyformák. A jeladó-vevő párosok tehát az útburkolathoz lehető legközelebb kerülnek, de csak annyira, hogy annak a domborúsága még ne akadályozza a mérést.
2.2.3 Felhasználói felület A cél az, hogy a rendszer kezelőjének minél kevesebb dolga legyen, így létre kell hozni egy olyan grafikus felhasználói felületet, amin keresztül az összes szükséges művelet lebonyolítható. A versenyzők listáját egy Excel fájlba lehet összegyűjteni, melléjük írva az indulás kategóriáját, és ezt a fájlt megadva a kezelőnek csupán a versenyzők célhoz állását kell nyugtáznia. A mért eredmények automatikusan felvezetésre kerülnek az Excel táblába.
8
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
2.3 A rendszer elemei
2.31 Indító állomás Az első elem az indító állomás. Ez áll közvetlen kapcsolatban a célvonalnál található modullal, és a számítógéppel. A PC-ről történő utasítások feldolgozása ezen történik, továbbá ez továbbítja a célvonaltól érkező adatokat a PC-hez. Tartalmazza az indító lámpát, és a reakcióidő mérésére alkalmas berendezéseket is. Ez szolgál a Wi-Fi hostjaként is.
2.3.2 Cél állomás Közvetlen kapcsolatban csak az indító állomással áll. Feladata, hogy mérje az indító állomás trigger jelétől, a versenyzők beérkezéséig eltelt időt, továbbá a versenyzők célvonalon történő áthaladásának sebességét is. Tartalmaz egy visszajelző lámpát is, ennek feladata, hogy „berajtolás” (Szakszó, az az esemény, amikor az egyik versenyző hamarabb indul el a céltól, mint a másik.) esetén figyelmeztesse a versenyzőket, hogy a menet újraindítása szükséges. A rendszer a berajtolás következtében létrejövő idő különbséget ugyan tudná korrigálni, de a látványosság szempontjából ez hátrányos volna.
2.3.3 Adatfeldolgozó számítógép Wi-Fi-n keresztül csatlakozik az indító állomáshoz, fogadja annak adatait, utasításokat küld neki. A bejövő adatok feldolgozása is itt történik. Felelős a versenyző párok összeállításáért, a továbbjutók számon tartásáért, valamint az eredmények megjelenítéséért, és dokumentálásáért. A versenyzők neve, és a kategória amiben indulnak, egy Excel táblába kerül felvezetésre, a program ebből olvassa ki az adatokat, és a naplózás is az ide történő visszaírással valósul meg.
9
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
3. A hardver
3.1 A tervezés folyamata, eszközei Az áramkörök megtervezésének folyamatát az alábbi ábra mutatja meg:
2. ábra Blokk diagram: Tervezés fázisai
Első lépésként létre kell hozni egy projektet, amely tartalmazni fogja majd a kapcsolási rajzokat, és nyomtatott áramköri rajzokat. A következő lépés meghatározni a szükséges főbb alkatrészeket, és ellenőrizni, hogy megtalálható-e a kapcsolási rajz szerkesztő alkatrész könyvtáraiban a felhasználni kívánt elem. Amennyiben valamelyik nem található meg, akkor azt az eszközt magunknak kell létrehozni. Ezután már összeállítható a kapcsolási rajz. A nyomtatott áramkör megrajzolása előtt még le kell futtatni egy tervezési szabály ellenőrzőt, a kapcsolási rajz esetleges hibáinak feltárására. Ha nincsenek hibák, akkor következhet a nyomtatott áramkör huzalozásának megrajzolása, majd ezután újra a tervezési szabályok ellenőrzése.
3.1.1 Hiányzó alkatrészek megrajzolása Az általam használt kapcsolási rajz szerkesztőben az alkatrészek három részből állnak:
Device (Eszköz)
Symbol (Szimbólum)
Package (láblenyomat) A Device kapcsolja össze a Symbol, és Package részeket. Egy adott alkatrész többféle
tokozásban is létezhet, lehetőség van egy Symbol-hoz több Package-t rendelni. A felhasználni kívánt alkatrészeknek egy új könyvtárat fogok létrehozni. Ebben a könyvtárban elsőként az adott alkatrész szimbólumát rajzolom meg. A körvonalakat alap rajzolóelemek segítségével kell megrajzolni, majd ezek után hozzá kell adni az 10
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
alkatrészlábakat. A létrehozott lábaknak be kell állítani a tulajdonságait. Ezek között szerepel, hogy a láb ki/bemenet, vagy egyéb funkciókkal rendelkezik, beállíthatóak a grafikus tulajdonságai, (látható-e, milyen méretű) és a pozíciója, neve is módosítható.
3. ábra Szimbólum lábak beállítási lehetőségei
Utolsó lépésként, ha ki szeretnénk jelezni az alkatrész nevét és értékét, akkor az ahhoz szükséges feliratokat is el kell helyezni.(A név itt az alkatrész azonosítót jelöli, pl.: U1, az érték pedig az alkatrész neve pl.: WS2803.) Ezeknél lényeges, hogy egy ’>’ karakterrel kezdődjenek, a tulajdonságaiknál pedig a megfelelő rétegre kell helyezni őket (a nevét a Names rétegre, az értékét pedig a Values rétegre).
11
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
4. ábra A kész szimbólum
A láblenyomat megszerkesztése hasonló elven történik. Itt lehetőség van SMD (Surface Mounted Device) és THD (Through Hole Device) lábak lerakására is, attól függően, milyen alkatrészt rajzolunk meg.
5. ábra A megrajzolt láblenyomat
Az utolsó lépés az eszköz létrehozása, melyben összekötésre kerül a láblenyomat, és a szimbólum. Itt a szimbólumot úgy lehet elhelyezni, mint a kapcsolási rajz szerkesztőben, 12
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
majd pedig be kell tallózni a használni kívánt láblenyomatot. A „Connect” menüpont alatt lehet a szimbólum lábait összekötni a láblenyomat PAD-jeivel.
6. ábra Láb-ak hozzárendelése a PAD-ekhez
Az eszköz szerkesztőben lehet még beállítani az automatikus prefixumokat, amit a „Name” címkéhez rendel hozzá a program. Hozzáadhatunk még leírást is az alkatrészhez. A hiányzó láblenyomatok létrehozása után következhet
a kapcsolási rajz
megszerkesztése.
3.2 A cél állomás
A cél állomás egy mikrokontrolleres kártya, amely tartalmazza az infra kapuk érzékelőjét, és a jelfeldolgozó áramköreit. A kapcsolás négy alap részre bontható: 1. Tápegység 2. Mikrokontroller 3. Infra detektorok 4. Wi-Fi modul
13
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
3.2.1 Tápegység Az áramköröket akkumulátorokról kell üzemeltetni, mert a verseny helyszínén nincs kiépítve elektromos hálózat. Mivel a rendelkezésre álló akkumulátorok eltérő paraméterekkel rendelkezhetnek, egy széles bemeneti feszültségtartományú tápegység szükséges. A panelon két feszültségszintet kell előállítani. 5V-ot a mikrokontroller, és az infra kapuk számára, és 3,3V-ot a Wi-Fi modul számára. A tápegység megtervezéséhez szükséges megállapítani az áramkör várható áramfelvételét. Ezt az egyes elemek áramfelvételéből tudjuk meghatározni, amelyeket pedig az adatlapokban találhatunk meg. Alkatrész TSOP34830 (Infra vevő) NE556D Atmega328p Visszajelző LED-ek ESP8622 Wi-Fi modul
Darabszám 4 2 1 4 1 Összesen:
Maximális áramfelvétel [mA] 3 6 2,7 20 300 406mA
7. ábra Táblázat: Az áramfelvételt meghatározó alkatrészek
A 3,3V-os feszültség a viszonylag nagy áramterhelés miatt az 5V-os feszültségből kerül előállításra egy LDO (Low DropOut) analóg szabályzó segítségével. Ez egy TC1263-as, amely 500mA kimenő áramra képes, maximálisan 6V bemenő feszültséggel.
8. ábra Blokkvázlat: Tápegység
Ebben az esetben a teljes áram át kell, hogy folyjon az 5V-os szabályozón is. Az 5Vos szabályozás egy lehetséges módja, lineáris szabályzóval megvalósítani, egy 7805-ös segítségével. A leggyakrabban használt akkumulátor névleges feszültsége 12V, ami a gyakorlatban 13V körüli érték is lehet, így a számoláshoz ezt az értéket fogom használni. A felhasználása várhatóan nyáron tűző napsütésben fog történni, így a környezet hőmérsékletét 40°C-nak veszem. Ekkor a disszipált teljesítmény a következőként alakul: 14
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Ta=40°C
Tj=125°C
Rja=65°C/W
A hűtőborda nélkül disszipálni képes teljesítmény: Pd=
𝑇𝑗 −𝑇𝑎 𝑅𝑗𝑎
=
125°𝐶−40°𝐶 65°𝐶/𝑊
= 1,3𝑊 (1)
ahol Pd a disszipálni képes teljesítmény, Tj a félvezető réteg maximális hőmérséklete, T a a környezet hőmérséklete, Rja pedig a környezet, és a félvezető lapka közötti hő ellenállás. A disszipálni szükséges teljesítmény: 𝑃𝑑 = 𝑈𝑏𝑒 − 𝑈𝑘𝑖 ∗ 𝐼𝑘𝑖 = 13𝑉 − 5𝑉 ∗ 0,406𝐴 = 3,25𝑊 (2) ahol Ube a bemeneti feszültség, Uki a kimeneti feszültség, Iki pedig a kimeneti áram. A disszipálni szükséges teljesítmény meghaladja a disszipálni képes teljesítményt, így hűtőborda volna szükséges, ám ha megvizsgáljuk az áramkör teljesítményigényét kiderül, hogy az kevesebb, mint a disszipált teljesítmény. 𝑃ℎ𝑎𝑠𝑧𝑛𝑜𝑠 = 𝑈 ∗ 𝐼 = 5𝑉 ∗ 0,406𝐴 = 2,03𝑊 (3)
Így a hatásfok: 𝜂=
𝑃 ℎ 𝑎𝑠𝑧𝑛𝑜𝑠 𝑃ö𝑠𝑠𝑧𝑒𝑠
=
2,03𝑊 2,03𝑊+3,25𝑊
= 0,384 (4)
A kapott 38%-os hatásfok akkumulátoros üzemnél nem kifejezetten gazdaságos, így célszerűbb egy kapcsoló üzemű tápegységet beépíteni, azon belül is egy Step-Down converter-t.
15
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Step-down converter
9. ábra Kapcsolási rajz: Step-down konverter
A step-down converter elvi kapcsolása áll egy kapcsoló elemből, egy diódából, egy induktivitásból, és egy kondenzátorból. A működése az induktivitás karakterisztikáján alapszik. Amikor a kapcsoló elem zárva van, akkor áram fog folyni a bemenet felől a kimenet felé. Ez az áram tölti a kimeneti kondenzátort, és táplálja a fogyasztókat. Ekkor az induktivitáson feszültség esik, a diódán pedig záró irányú feszültség van, így nem vezet. Amikor a kondenzátor feszültsége elér egy határértéket, a kapcsoló elemet kikapcsoljuk. Az így csökkenő mágneses fluxus a Lorentz törvény miatt olyan áramot hoz létre, amely iránya megegyezik a zárt állapotban folyó áram irányával. Ekkor viszont az induktivitáson már nem feszültség esik, hanem mint áramgenerátor fog működni, ezért a feszültség iránya megfordul. A dióda most már nyitó irányú feszültséget kap, áram folyik rajta, amely táplálja a fogyasztókat. Mivel az induktivitás árama exponenciálisan csökken, a kondenzátornak is be kell segítenie a fogyasztók táplálásába, annak feszültsége ennek következtében csökkenni fog. Ha elér egy határértéket, akkor a kapcsoló elemet újra bekapcsoljuk, és a folyamat kezdődik elölről. A kapcsolóelemet egy céláramkör kapcsolgatja, impulzus szélesség moduláció segítségével, a kimenet terhelésének függvényében. Az ilyen szabályzók hatásfoka 80-99% is lehet. [3]
16
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Megvalósítás
10. ábra Kapcsolási rajz: Tápegység
Az általam felhasznált vezérlő az A8498 típusú szabályzó IC. Ez tartalmazza beépítve a kapcsoló elemet, és annak vezérlő áramkörét. maximális 50V bemenő feszültséget tolerál, és 3A kimenő áramra képes. Ez ugyan több a szükségesnél, ám a hatásfoka kb. 400-500mA-nél a legmagasabb (87%), és az alacsony ára sem elhanyagolható.
A kimeneti feszültség az R15-R17 ellenállások által képzett feszültség osztóval állítható be, az alábbi képlet alapján: 𝑅15
𝑉𝑜𝑢𝑡 = 𝑉𝐹𝐵 ∗ (1 + 𝑅17 ) (5) ahol VFB a belső 0,8V-os referencia feszültség, Vout pedig a beállítani kívánt kimeneti feszültség. 5V-os kimeneti feszültséghez szükséges ellenállás pár aránya: 𝑅15 = 5,25 ∗ 𝑅17 (6) R15-nek 2kΩ-ot választva, megkapjuk, hogy R15-nek 10,5kΩ-nak kell lennie.
17
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Az R18-as ellenállás a lágyindítást befolyásolja, értéke az adatlap által ajánlott érték. Az induktivitás, és a kondenzátor érétke az adatlapban található minta kapcsolás alapján választottam. L1=68µH
C14=220µF
A D1-es diódára vonatkozó követelmények, a teljes bemenő feszültség elviselése, és a kimenő áram 1,2-szeresének tolerálása, valamint a magas működési frekvencia miatt gyors diódának kell lennie. A jelenlegi 3A-et képes elviselni, és 40V záró irányú feszültséget, melyek teljesítik ezeket a feltételeket. Az áramkört a bemeneti oldalon olvadó biztosíték védi, 600mA-es névleges árammal, az alacsony feszültségű részeken pedig Polimer PTC biztosítékok, a 3,3V-os részt 330mA-es névleges áramú, az 5V-os részt 500mA névleges áramú.
3.2.2 Mikrokontroller A rendszer alapját egy 8 bites AVR mikrovezérlő adja, pontosan egy ATMEGA328as. Ez egy CMOS AVR RISC architektúrájú kontroller. Rendelkezik három időzítővel, analóg-digitális átalakítóval, analóg komparátorral. 32kB áll rendelkezésre a program számára, és 2kB statikus RAM a változók számára. Található benne egy beépített 8MHz-es órajel generátor is, de lehetőség van egy külső kvarc beépítésére is, amivel a maximális órajel 16Mhz-re növelhető. A külvilággal való kapcsolatra négy darab GPIO port áll rendelkezésre. [4] A kapcsolásba való illesztéséhez csak egy pár külső alkatrész beépítésére van szükség. Az egyik ilyen a kvarc oszcillátor, amelyhez egy 16MHz-es 20pF-os kapacitású kvarcot használtam. Mivel az Analog Reference láb nincsen használatban, egy 100nF-os kondenzátort kell rákötni a föld felé. A kontroller RESET lába alacsony logikai szinten aktív, így azt egy 100KΩ-os ellenállással a tápfeszültségre húztam. Ide kapcsolódik még a RESET gomb is. Ezen felül már csak az I/O lábakat szükséges bekötni, továbbá a programozó lábakat. A programozás szabványos ISP (In-System Programming) csatlakozón keresztül történik beültetés után.
18
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
11. ábra Kapcsolási rajz: Mikrokontroller
Az ERROR elnevezésű GPIO lábra beépítésre került még egy FET is. Ez a pálya végén található hibajelző lámpát vezérli. Ez a lámpa tájékoztatja a versenyzőket arról, hogy az adott kör nem érvényes. Mivel a felhasznált IRF3205-ös 5V-os feszültségszinten még nem nyit ki teljesen, szükség volt még egy kis teljesítményű FET alkalmazására. Az IRF 3205-ös gate lába alapesetben a szabályozatlan tápfeszültségre van húzva egy ellenállással. Ezt lehet a kisebb FET-tel a földre húzni, hogy lezárjon az IRF3205-ös. A kisebbik FET is alapesetben nyitva van, így vezérlés nélkül a lámpa nem fog világítani, a kimenet pedig 0-ban lesz aktív.
12. ábra Kapcsolás rajz: Hiba lámpa
19
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
3.2.3 Infra detektorok Az infra kapuk alapját a TSOP34830-as integrált IR vevő alkotja. Ez az IC tartalmazza a fotodióda erősítőjét, egy 30KHz-es sáváteresztő szűrőt, és a demodulátort, így a kimenetén egyből logikai szintű jelet kapunk. Mivel ezt az IC-t eredetileg adatátvitelre szánták, nem lehet direkt módon folytonosan a 30KHz-es jelet küldeni neki, hanem valamilyen adatfolyamot kell szolgáltatni. Ennek a legegyszerűbb módja, ha a hordozó jelet egy alacsony frekvenciával megszaggatjuk. (Jelen esetben 600Hz-el) Ekkor az IC kimenetén egy 600Hz-es négyszögjel jelenik meg, ha pedig megszakad a fénysugár, akkor a kimenetet egy belső felhúzó ellenállás a tápfeszültségre húzza. A négyszögjel kimaradásának a detektálása hardveresen történik, egy impulzus hiány detektor segítségével.
13. ábra Kapcsolási rajz: Infra vevők
Ennek a kapcsolásnak az alapját egy NE556-os adja, monostabil kapcsolásban (Ez két darab 555-öst tartalmaz). Ha nem érkezik trigger jel, akkor a kimenet folyamatosan alacsony logikai szinten marad. Az IR vevő kimenete, az 555-ös trigger bemenetére kapcsolódik. Ha itt alacsony logikai szint van, akkor az 555 magas szintre vált, és ott is marad egészen a beállított ideig, majd újra alacsony szintre vált, kivéve, ha a bemenetére egy újabb trigger impulzus érkezik. Ám az újratriggerelés esetén már nem a teljes ideig marad magas szinten, mivel a 20
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
kondenzátor nincs teljesen kisütve, hamarabb feltöltődik, és a trigger impulzustól számított magasban tartózkodási idő csökken. Ennek kiküszöbölésére triggereléskor ki kell sütni a kondenzátort is. Ezt egy PNP tranzisztor végzi el, aminek a bázisa szintén az IR vevő kimenetére kapcsolódik. Így tehát amíg a bejövő négyszögjel magas szinten tartózkodik, az 555-ös kimenete még magas logikai szinten van, és csak akkor lesz alacsony szintű, ha nem történik meg az újratriggerelés.
14. ábra Kapcsolási rajz: 555 monostabil alapkapcsolás
Az 555-ös kimenetének magas logikai szinten tartózkodási idejét úgy kell meghatározni, hogy az megegyezzen a detektálni kívánt négyszögjel periódusidejével. A szükséges magas logikai szinten tartózkodási idő: 𝑇𝐻 =
1/𝐹 2
=
1
600 𝐻𝑧 2
= 833µ𝑠 (7)
ahol Th a magas logikai szinten tartózkodás ideje, F pedig a bejövő jel frekvenciája. Az 555-ös kimenetének magas logikai szinten tartózkodási ideje: 𝑇𝐻 = 0,639 ∗ 𝑅𝑎 + 𝑅𝑏 ∗ 𝐶 (8) A szükséges elemek aránya tehát a következő: 1
766,8 ∗ 𝑅𝑎 = 𝐶 (9) 21
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Ebből az alkatrészek értékei: Ra=110kΩ C=11nF Mivel 11nF-os kondenzátor nem kapható (és a szórásuk is nagyobb) így a legközelebbi szabványos értékűt, a 10nF-osat használom. Összesen négy darab ilyen érzékelő szükséges, hogy a két pályán időt, és sebességet is tudjak mérni. Ezekhez négy ilyen áramkör is tartozik. Az egyszerűség kedvéért 555-ösök helyett 556-osokat használtam, ami gyakorlatilag 2db 555-ös egy tokozásban.
3.2.4 Wi-Fi modul A vezeték nélküli kapcsolat megvalósítására egy ESP8266-osra épülő Wi-Fi kártyát használtam. Ez egy soros vonalon (UART) keresztül kommunikál, és beépítve tartalmazza a TCP, UDP protokollok kezeléséhez szükséges szoftvert. Képes hozzáférési pontként is működni, és meglévő hálózatra is fel lehet vele csatlakozni. A csatlakoztatására egy 2*4-es tüskesor szolgál, a nyomtatott áramkörön ennek az aljzata került kialakításra. A működéséhez szükséges még a CH_PD lábát is tápfeszültségre kötni, ennek hiányában a kártya alvó módban marad. A működéséhez 3,3V-os tápfeszültséget igényel, és a bemeneti lábai sem 5V toleránsak, így egy feszültség illesztő közbeiktatása szükséges. Az RX vonal illesztése egy egyszerű ellenállásosztó segítségével történik. Az osztó egyik fele a földre, a másik a mikrovezérlő Tx lábára kapcsolódik, a középső pontja pedig a Wi-Fi modulra megy.
22
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
15. ábra Kapcsolási rajz: Wi-Fi modul illesztése
A szükséges ellenállások számítása: 𝑈𝑅𝑥 = 𝑈𝑇𝑥 ∗
𝑅9 𝑅9+𝑅10
(10)
ahol URx a Wi-Fi modul bemenetére eső feszültség, U Tx pedig a mikrokontroller kimeneti lábának a feszültsége. Átrendezve, behelyettesítve: 𝑅10 = 0,515 ∗ 𝑅9 (11) Innen R10-et 5,6kΩ-nak választva, R9-re a kiszámított érték 2,88kΩ. Az ehhez legközelebbi szabványos érték a 2,8kΩ, viszont erre kiszámítva az osztót 3,33V-ot kapunk az Rx bemenetre, így inkább 3kΩ-ot alkalmazok. Erre kiszámolva már csak 3,25V jut a bemeneti lábra. Az ESP8266 a tápfeszültség 0,75-szörösét érzékeli már stabilan logikai magas szintnek, ami 2,47V. A kapott feszültség nagyobb ennél, így a működés megfelelő lesz. A Tx láb illesztése már nem oldható meg csupán passzív elemek segítségével. Ez a kapcsolás egy MOSFET-ből és két ellenállásból áll. Amikor a Wi-Fi modul TX lába alacsony szinten van, mivel a FET Gate lába tápfeszültségre van kötve, pozitívabb lesz a Source-nál, tehát a csatorna nyitva lesz. Ez lehúzza a mikrokontroller bemeneti lábát a földre, így ott is logikai alacsony szint lesz.
23
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Ha a Wi-Fi modul magas szintre állítja a kimenetét, akkor a FET Gate lába már nem lesz pozitívabb, mint a source, le fog zárni. Ebben az esetben rajta áram nem folyik, és mivel a mikrokontroller lába nagy ellenállással rendelkezik az R21-es ellenálláson nem fog áram folyni, feszültség nem esik rajta, a mikrokontroller bemenetére tehát a tápfeszültség jut, így magas szinten lesz.
3.3 Az indító állomás
Az indító oldalon található panel sok tekintetben megegyezik a célvonalnál találhatóval. A tápegység, a Wi-Fi modul ugyan az, a mikrovezérlő kapcsolása is megegyezik. Különbség csupán az IR szenzorok mennyiségében, és az indítólámpa vezérlő áramkörében van. Az IR szenzorokból ezen a panelon csak 2db található. Ezek felelnek a versenyzők reakcióidejének a méréséért. A kontroller méri, hogy mennyi idő telik el a lámpa zöldre váltása, és a mérőkapuk előtt történő áthaladás között.
3.3.1 Lámpa meghajtó Az indító lámpa öt darab 6W-os RGB LED-et tartalmaz. Ezeket az indító panel mikrovezérlője fogja kapcsolni, meghatározott színben, és sorrendben. Az 5db LED egyenként 3db vezérlendő kimenetet jelent, így összesen 15db kimenetre volna szükség, ha minden LED-nek egy mikrokontroller lábat dedikálnánk. Ez le is foglalná a kontroller legtöbb lábát, és egyéb célokra nem maradna. Ennek megoldásaként egy LED meghajtó áramkört használok, melynek típusa WS2803. Ennek 18 független csatornája van, beépített áramgenerátorral rendelkezik, és ami a legfontosabb, két vezeték szükséges csupán a vele történő kommunikációhoz. Gyakorlatilag az IC, mint egy shift regiszter működik. Egy órajel, és egy adatvezeték segítségével lehet beleírni az egyes csatornák értékeit, majd miután ez megtörtént, 600µs után a beírt adatoknak megfelelő kitöltési tényezőjű négyszögjellel vezérli a kimeneteit. A kitöltési tényezőket 8 biten 256 lépésben lehet meghatározni, tehát összesen 144 bitet kell beírni.
24
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
16. ábra Kapcsolási rajz: Led vezérlő
Mivel az IC önmegában maximálisan 30mA-el tudja meghajtani a kimeneteit, ez nem lesz elegendő az alkalmazott LED-eknek. Szükség van további meghajtó tranzisztorokra. Az illesztéshez WS2803-as bemeneteit 1kΩ-os ellenállások segítségével
a
tápfeszültségre húztam. Ekkor a rajtuk átfolyó maximális áram 5mA lehet, az áramgenerátort ennek függvényében kell majd beállítani. Amikor egy adott kimenet nem aktív, az ellenálláson nem folyik áram, tehát a láb 5V-os feszültség szinten lesz, ha pedig aktív, akkor föld potenciálon. Ez így pont fordítva vezérelné a LED-eket, tehát akkor lennének bekapcsolva, amikor épp nem kapnak vezérlő jelet. Invertálni kell tehát a kimenet állapotait. Ez megvalósítható volna elemi tranzisztorok segítségével is, ám az viszonylag nagy helyet foglalna el, ezért inkább invertereket építettem be. Ezek CD4009-es típusúak, egyenként 6db csatornát tudnak invertálni, tehát 3db szükséges belőlük. A kimeneteik alapesetben a földre vannak lehúzva 100kΩ-os ellenállásokkal. Ide csatlakoznak a teljesítmény FET-ek gate-jei. Ezek logikai szintű FET-ek, TN2510N8 típusúak, a maximális drain áramuk 3A. A meghajtani kívánt LED-ek színenként maximum 500mA áramot vesznek fel, így az áramterhelhetősége a FET-nek megfelelő. A nyitott állapotú ellenállása 1,5Ω. Ebből kiszámolható a disszipált teljesítmény: 𝑃𝑑 = 𝐼 2 ∗ 𝑅𝐷𝑆(𝑂𝑁) = (0,5𝐴)2 ∗ 1,5𝛺 = 0,375𝑊 (12)
25
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
A tokozás által disszipálni képes teljesítmény, 40°C-os környezeti hőmérséklet esetén: Pd=
𝑇𝑗 −𝑇𝑎 𝑅𝑗𝑎
=
150°𝐶−40°𝐶 133°𝐶/𝑊
= 0,827𝑊 (13)
Tj, és Rja értéke a FET adatlapjából származik. Ebből Tj a félvezető lapka maximális megengedett hőmérséklete, Rja pedig a lapka, és a környezet közötti hő ellenállás értéke. Mivel a kiszámított disszipálni képes teljesítmény nagyobb, mint a disszipálni szükséges teljesítmény, tehát ez a FET megfelel erre a célra.
17. ábra Kapcsolási rajz: Inverter
3.4 Infra adók
Az infra adók feladata vezérelni az infra LED-eket, a vevők által érzékelhető módon. Ez azt takarja, hogy létre kell hozni egy 30kHz-es vivőjelet, amit meg kell szaggatni 600Hzes frekvencián. Az áramkör alapját itt is az 556-os időzítők képezik, annyi különbséggel, hogy itt astabil kapcsolásban szerepelnek.
26
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
3.4.1 555-ös astabil kapcsolása
18. ábra Kapcsolási rajz: 555 astabil alapkapcsolás
Az áramkör indításakor a kondenzátor energiamentes, ahogy feszültség alá helyezzük a rendszert, az Ra és Rb ellenállásokon keresztül elkezd feltöltődni. Mivel a kondenzátor feszültsége alacsonyabb, mint a tápfeszültség 1/3-ada, a trigger bemenet aktív lesz, így a kimenet magas logikai szintre vált. Amint a kondenzátor eléri a tápfeszültség 1/3-át a kimenet alacsony logikai szintre vált, és a Discharge lábon keresztül megkezdődik a kondenzátor kisütése. Amint a kondenzátor kisült, a trigger bemenet újra aktív lesz, és kezdődik a ciklus elölről. A periódusidő meghatározása a logikai magas, és alacsony szinten tartózkodási idők összegeként határozható meg. A kondenzátor töltése az Ra és Rb ellenállásokon keresztül történik, így a magas logikai szinten tartózkodási idő a következőképpen írható fel: [5] 𝑇ℎ = 0,695 ∗ 𝐶 ∗ (𝑅𝑎 + 𝑅𝑏 ) (14) Kisütésekor már csak az Rb ellenálláson keresztül folyik áram, így annak az ideje a következő: [5] 𝑇𝑙 = 0,695 ∗ 𝐶 ∗ 𝑅𝑏 (15) 27
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Jelen esetben egy 50%-os kitöltési tényezőt szeretnék elérni, így a Th és Tl idők megegyeznek. Ekkor a két egyenletet összevonva és rendezve: 1,44
𝐹 = 𝐶∗(𝑅
𝑎 +𝑅𝑏 )
(16)
Ezek alapján a 30kHz-hez szükséges alkatrész értékek: C=C3=1nF;
Ra=R3=4,7kΩ;
Rb=R4=22kΩ
Ennek a kimenete egy BD140-es tranzisztoron keresztül hajtja meg az infra LED-eket. Érzékelőkként 2db LED került beépítésre, a megfelelő érzékelhetőség érdekében. Egy vezérlőhöz pedig két pár LED tartozik, mert egy helyről kapják a vezérlést az idő és a sebesség méréséhez szükséges LED-ek is. Az egyik pár LED közvetlenül a panelon foglal helyet, a másik pár pedig vezetékkel csatlakoztatható, mivel azokat távolabbra kell helyezni. A 600Hz-es szaggatás a 30kHz-es 555-ös RESET lábának használatával történik. A 600Hz-es kimeneti frekvenciájú 555-ös kimenete ide van kapcsolva. Ennek az alkatrészei az előbbi képlet alapján meghatározva a következőek: C=C1=10nF;
Ra=R2=4,7kΩ;
19. ábra Kapcsolási rajz: Infra adó
28
Rb=R1=100kΩ
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
3.5 Tervezési szabályok ellenőrzése
A kapcsolási rajz megszerkesztésének utolsó lépése, a tervezési szabályok ellenőrzése. Itt ellenőrzi a program, hogy nincs-e rövidzár, ellenőrzi a ki és bemenetek kapcsolatait. Ha minden alkatrész lábainak paraméterei jól vannak megadva, és a kapcsolási rajz sem hibás, akkor a hibaellenőrző nem jelez hibát. Az ábrán a figyelmeztetések csupán azt jelzik, hogy néhány alkatrésznek van VALUE bejegyzése, de ez nem tartalmaz adatot. Mivel ezek csupán csatlakozók, így értékük nem lehet, ezért figyelmen kívül hagyhatóak, illetve az ERC ellenőrző ablakban jóváhagyhatóak.
20. ábra ERC ellenőrzés
3.6 A nyomtatott áramkör tervezése
Az áramkör megtervezéséhez fontos meghatározni az egyes vezetők áramterhelését. A vezetősávok nagy részénél csak néhány mA folyik, így ezeknél én 0,4mm-es vezető sávot alkalmaztam, mivel ez a szélesség a prototípusok esetében házi módszerekkel is még elkészíthető. A kritikus területet a tápvezetékek és a lámpa meghajtó FET-ek vezető sávjai jelentik. A tápvezetékek esetében az IC-k áramfelvétele összességében is 100mA körüli, így ide is elegendő a legvékonyabb vezetősáv. Nagy áramot vesz fel viszont a Wi-Fi modul. Ennek az áramfelvétele 300mA körüli. Az ehhez szükséges vezetősáv szélesség: 𝐼 = 𝑘 ∗ ∆𝑇𝛽1 ∗ 𝐴𝛽2 (17) 29
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
ahol „k”, „𝛽1”, „ 𝛽2” az IPC 2221 szabvány által meghatározott konstansok, „A” a szükséges
vezetősáv
keresztmetszete,
„∆𝑇”
pedig
a
megengedett
maximális
hőmérsékletemelkedés. k=0,067,𝛽1=0,4281, 𝛽2=0,6732, ∆𝑇=10°C esetén a szükséges keresztmetszet: A=5,18*10-3mm2 (18) Ebből kiszámítva a szükséges vezetősáv szélesség: W=
A x
=
5,18∗10−3 35∗10 −3
= 0,148mm (19)
ahol „W” a szükséges vezetősáv szélesség, „x” pedig a réz vastagsága. A legnagyobb áramfelvételt a LED vezérlő rész jelenti. Itt kétféle vezetősáv szélességet kell meghatározni.
Csatlakozó, és FET közötti.
Táp csatlakozó, és LED csatlakozó közötti. A lámpákban RGB LED-ek találhatóak, ezeknek egy színe 500mA-t vesz fel, tehát az
egyes színek csatlakozója és a FET-ek között erre kell méretezni. Összesen 5 lámpát szükséges vezérelni, ez 15 elemi LED-et jelent, így a LED-ek tápvonalának áramterhelése: 𝐼𝑡á𝑝 = 15 ∗ 0,5𝐴 = 7,5𝐴 (20) Az ehhez szükséges vezetősáv szélesség, az előzőek alapján: W=32,7mm Az így kiszámított vezető szélesség nem férne el a tervezett panelon, így e sávok külső megerősítése szükséges. A vezérlő FET-ek, és a csatlakozó közötti 500mA áramterhelésre számított vezetősáv szélesség, a fenti képletek alapján: W=0,3mm
30
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
21. ábra Cél állomás nyomtatott áramköre teli föld nélkül
22. ábra Indító állomás nyomtatott áramköre teli föld nélkül
31
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
4. Mikrokontroller szoftver A szoftver elkészítésének első lépése meghatározni azt, hogy milyen funkciókat kell ellátnia az adott készüléknek. Ezek után meg kell határozni a szükséges perifériákat, és fel kell konfigurálni őket. Majd jöhetnek az alap függvények megvalósításai, majd pedig a funkcionalitásért felelős kódrészletek megírása.
4.1 Cél állomás 4.1.1 Feladatai
Megvalósítani a kommunikációt a Wi-Fi modullal.
Felcsatlakozni a megadott hálózatra, és létrehozni egy TCP csatornát
Fogadni a TCP-n érkező parancsokat, és végrehajtani azokat.
Mérni az indítás parancstól számítva az infra kapuk zárásáig eltelt időt.
Visszaküldeni a mért adatokat
4.1.2 A program megvalósítása
23. ábra Folyamatábra: Cél modul programja
32
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
A program működési elvét a fenti folyamatábra mutatja be. Elinduláskor elsőként inicializálja a Wi-Fi modult, am csatlakozik a hozzáférési ponthoz. Ha ez megtörtént, akkor a program belép egy végtelen ciklusba, ami a bejövő üzenetek feldolgozásáért felel. Elsőként megvizsgálja, hogy a beérkezett parancs „START”-e, ha igen, akkor lenullázza az idő méréséhez használt változót, és beállítja a mérés futását jelző változót. Ha nem akkor vizsgálatot végez a „RESET” parancsra is. Ha ez igaz, akkor nullába állítja a mérés futását jelző változót, ha hamis, akkor pedig átlép a következő vizsgálatra. Ide csatlakozik be a „START” parancs vizsgálatának hamis ága is. A következő részben ellenőrzi a program, hogy fut-e a mérés, tehát a futást jelző változó 1-e. Ha 0, akkor visszatér a ciklus elejére, ha 1, akkor megvizsgálja, hogy az összes érzékelő ki lett-e olvasva. Ha igen, elküldi azokat a számítógépnek, ha pedig nem, visszatér a ciklus elejéhez. Ezzel párhuzamosan két megszakítás is jelen van. Az első az időzítő megszakítása, ami az idő pontos számlálásáért felel, a második pedig a szenzorok változására hajtódik végre. Ekkor megvizsgálja, hogy fut-e a mérés. Ha fut, akkor elmenti az adott szenzorhoz rendelt változóba a jelenlegi időt, ha pedig nem, akkor visszajelző LED-eken mutatja a szenzorok aktuális állapotát.
A perifériák beállítása A program első feladata, hogy a beállításokat elvégezze, ezért ezekhez írtam egy függvényt, így induláskor csak azt kell meghívni. Először is meg kell határozni a felhasználni szükséges perifériákat. Szükség van az egyes érzékelők számára bemenetekre, ami összesen négy darabot jelent. Szintén ugyan ennyi kimenet is kell a bemenetek visszajelzését szolgáló LED-ek vezérlésére. Ezekre azért van szükség, mert az adók csak kis szögben sugároznak, a vevők pedig kis szögben érzékelnek, így a pálya felállításakor pontos beállításuk szükséges. Ez csak úgy lehetséges, ha van valamilyen visszajelzésünk arról, hogy az adott pillanatban épp érzékeli-e a vevő a jelet, vagy nem. Erre szolgálnak ezek a LED-ek. További egy kimenet kell még a berajtolást visszajelző lámpa vezérlésére. A kapcsolási rajzon már kiosztásra került, hogy a mikrokontroller mely lábára mi csatlakozik, így ezek alapján kell az egyes portokat beállítani. Az Atmega328-as mikrokontrollernél minden porthoz három darab regiszter tartozik. Ezek, a DDRx, amely a port irányának a beállításáért felelős, a PORTx, ez az adat regiszter, 33
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
ennek beállításával lehet a kimenetre kiírni az adatokat, és a PINx regiszter, mely a bemenetek kiolvasásáért felelős. A portok használatához, csak az irányukat kell az inicializálás során megadni. Ez úgy történik, hogy a DDR regiszterbe a kimenetnek használni kívánt lábnak megfelelő bit-be 1-es értékeket írunk. A bemeneteket nem kell külön beállítani, mivel alapesetben a regiszter összes bitje 0, és ahol 0 van az ahhoz tartozó láb bemenetként fog működni. A kód megírásához be kell hívni az AVR Studio által tartalmazott AVR Libc könyvtár io.h header fájlját. Ez tartalmazza a portok, és lábak definiálásait. //kimenetek definiálása //D port beállítása DDRD|=(1<
A lábak elnevezése, egy 8 bites egész típusú számot takar. A fent látható kódrészletben, egy 1-es értéket balra shiftelek, a láb nevének megfeleltetett számmal. Így egy olyan értéket kapok, amely binárisan csak a beállítani kívánt láb helyén 1-es, a többi helyen 0. Ezt bitenkénti vagy kapcsolatba kerül a DDRx regiszter értékeivel, továbbá a többi bemeneti láb shiftelt értékével. A végeredmény mindenhol 1-es lesz ahol bemenetet szeretnék, a többi helyen pedig 0-t. Meg kell vizsgálni az egyes bemenetek olvasásának kérdését is. Lehetséges a fő végtelen ciklusba beépíteni egy olyan függvényt, ami minden lefutáskor lekérdezi, hogy mi az adott bemenet értéke, de ez a megoldás, rövid impulzusok érzékelésére alkalmatlan. Ha a változás abban az időben történik, amikor a mikrokontroller éppen egy másik utasítást hajt végre, és hamarabb megszűnik, mint hogy a program a vizsgálat szakaszába érne, akkor az említett változás figyelmen kívül marad. Ennek kiküszöbölésére használhatóak a Pin Change Interrupt-ok. Ez azt takarja, hogy engedélyezni lehet, hogy egy adott láb változása egy megszakítást kezdeményezzen. Ez az Atmega328-as esetén minden I/O lábhoz hozzárendelhető, de nem lehet minden láb változásához külön megszakítás kezelő rutint kapcsolni. Ha egy port valamelyik lábán történik a változás, akkor az adott porthoz kapcsolt megszakítás kezelő rutint hajtja végre a mikrokontroller. 34
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Az egyes lábakhoz a megszakítás engedélyezését a PCMSKx regiszterek beállításával lehet megtenni. Ez a Pin Change Interrupt Mask-ot takarja, és három darab van belőle. A bemenetek beállításához hasonlóan lehet bele adatokat írni. Hogy megállapítsuk mely bitek beállítása szükséges, az adatlap alapján meg kell vizsgálni, hogy mely lábhoz mely pin change interrupt tartozik. Ha ezek beállítása megtörtént, akkor a PCICR-Pin Change Interrupt Control Registerben még engedélyezni kell globálisan a pin change interrupt-okat. // enable pin change interrupts PCMSK2|=(1<
A program egyik fő feladata az idő mérése, tehát szükség van egy időzítőre, ami lefutásainak számlálásával mérhető az indító jel, és a szenzorok megszakítása között eltelt idő. Ehhez az Atmega328-as 2-es számú időzítőjét használom. Ez egy 8 bites időzítő, többféle üzemmóddal is rendelkezik, de számomra az „Output Compare” mód lényeges. Ez azt takarja, hogy a számláló egy előre beállított osztón keresztül addig számol, míg regiszterének az értéke meg nem egyezik egy másik előre beállított regiszter értékével. Ha igen, akkor generál egy megszakítást, majd nullába állítja a számláló értékét, és újból kezdi a számlálást. A méréshez 4kHz-re állítom be a számláló lefutásának frekvenciáját, ez azt jelenti, hogy 250µs-os léptékekben lehet mérni az időt. Ez a pontosság már elegendő a sebesség megállapításához, és az teljes idő méréséhez is. Az időzítő használatához négy darab regiszter értékét kell beállítani. Az első a TCCR2A-Timer/Counter Control Register A. Ebben a regiszterben lehet beállítani az időzítő üzemmódját. Ezek közül az első kettő legsúlyozottabb bitet szükséges beállítani (a többi megfelel az alapértéken). Ezeknél egy táblázat mutatja meg, hogy mely kombinációkhoz milyen funkció tartozik. Nekem a CTC mód szükséges, ez pedig úgy állítható be, hogy az első bitbe 0-t, a másodikba pedig 1-et írunk.
35
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
A második beállítandó regiszter a TCCR2B. Ebben lehet meghatározni az órajel osztóját. Egy 32-es osztót állítottam be, ami azt jelenti, hogy az a 16MHz-es rendszer órajelet 500kHz-re osztja le. Ezután be kell állítani az OCR2A regisztert. Ez azt az értéket tartalmazza, ami a számláló regiszterének összehasonlítási alapjául szolgál. Az értékének beállítása a következő képlet alapján lehetséges: 𝐹𝐼/𝑂
𝐹𝑇𝑖𝑚𝑒𝑟 = 2∗𝑁∗(1+𝑂𝐶𝑅2𝐴) (21) Ahol 𝐹𝐼/𝑂 az I/O portok órajele, N az órajel osztójának az értéke, FTimer pedig az időzítő kívánt frekvenciája. Innen meghatározható, hogy a szükséges érték: OCR2A=124. //2-es timer beállítása 4KHz-re (250us) TCCR2B|=(1<
Az utolsó szükséges periféria az USART0. Ennek az inicializálása egy külön függvényben kapott helyet, ami az adatlapban található mintakód alapján lett megírva. Ennek egy bemeneti változója van, mégpedig a baud-ráta generáló regiszter értéke. Ez még a fordító által kerül kiszámításra. Az ESP8266-os több baud-rátát is képes kezelni, ezért szabadon kiválasztható a kommunikáció sebessége. Én 19200-as rátát választottam. Az ehhez tartozó regiszter érték kiszámításához ismernünk kell a mikrokontroller órajelét. A kívánt érték kiszámításának képlete: 𝐹
𝑂𝑆𝐶 𝑈𝐵𝑅𝑅0 = 16∗𝐵𝐴𝑈𝐷 − 1 (22)
A kiszámítás a programban: #define FOSC16000000// órajel definiálása #define BAUD19200 //baud-ráta definiálása #define MYUBRRFOSC/16/BAUD-1 //baud-ráta generátor regiszter értékének kiszámítása 27. ábra Programkód: Baud-ráta kiszámítása
Ahol MYUBRR a kiszámított regiszter érték, FOSC a mikrokontroller órajele, és a BAUD a beállítani kívánt baud-ráta.
36
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Az inicializálás során a MYUBRR értékét beírjuk a megfelelő regiszterekbe. Mivel ez összesen 16 biten foglal helyet, két regiszter is tartozik hozzá, az alsó és a felső 8 bitet külön kell beírni. Szükség van az UCSR0B regiszterre is. Itt lehet engedélyezni az adást és vételt, továbbá engedélyezhető az adat beérkezésekor történő megszakítás generálása is. Az Atmega328-as többféle keretformátum kezelésére is alkalmas. Meg kell adni tehát neki, hogy mi az, amit használunk. Ehhez a Wi-Fi modul specifikációját kell megtekinteni. Ebből kiderül, hogy a kommunikációjában 8 adatbit szerepel, 1 stop bittel, és 0 paritás bittel. A beállítás kódja: voidUSART_Init(unsignedintubrr) { // megszakítások letiltása cli(); UBRR0H=(unsignedchar)(ubrr>>8); UBRR0L=(unsignedchar)ubrr; //Rx, és Tx engedélyezése UCSR0B=(1<
USART kezelő függvények Az USART használatának megkönnyítéséhez létrehoztam egy header fájlt, ami tartalmazza a szöveges üzenetek kiírásához szükséges kódokat, valamint a beépített printf() függvényt az USART vonalra irányítja. Ehhez kell egy olyan függvény, amely karakterenként ki tudja írni az UART vonalra az adatokat.
37
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
intUSART_putchar(chardata,FILE*stream) { // végtelen ciklus, amíg a kimeneti buffer ki nem ürül while(!(UCSR0A&(1<
Ez a függvény azt vizsgálja, hogy az UCSR0A (USART Control and Status Register) UDRE0 bitje 1-es értéket vesz-e fel. Ez a bit jelzi, hogy az adat regiszter üres-e? (Ha üres, akkor lesz 1-es az értéke, ha nem akkor 0) Amíg nem, nem lehet új adatot beleírni. Ebben az esetben a while ciklus feltétele teljesül, és a program nem csinál semmit egészen addig, míg a feltétel hamissá nem válik, tehát a regiszter kiürült. Ekkor beírhatjuk az elküldeni kívánt új adatot a regiszterbe. Ahhoz, hogy a printf() függvényt használni lehessen, meg kell hívnunk az azt inicializáló függvényt. Ezt a beépített AVR Lib C könyvtár tartalmazza. Paraméterként meg kell adni, hogy mely függvényt kívánjuk használni a karakterek kiírására. [6] FILE mystdout=FDEV_SETUP_STREAM(USART_putchar,NULL, _FDEV_SETUP_WRITE); 30. ábra Programkód: printf függvény átirányítása
Az így létrehozott változó címét pedig bele kell írni az stdout változóba az USART inicializálásakor. Az USART vonalon érkező adatok fogadása megszakítások segítségével történik. Amikor beérkezik egy bájt adat, az egy megszakítást generál. Ekkor el kell dönteni, hogy az adott bájttal mi a további teendő. Az ezt lekezelő rutin a következő:
38
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
ISR(USART_RX_vect) { char b; //beérkezett karakter static char rx_buffer[50]; //beérkezett szöveg static int rx_index=0; //a jelenlegi karakter pozíciója az rx_buffer vektorban cli(); //megszakítások letiltása a kiolvasás idejére b=UDR0; // Sorlezáró karakterek keresése if((b=='\r')||(b=='\n')||(b=='@')) { // Van-e karakter a buffer-ben? if(rx_index!=0) { // A beérkező adat a Wi-Fi modultól, vagy másik eszköztől jön? if(command==true) { //Mentés egy külső változóba memcpy((void*)intext,rx_buffer,rx_index); intext[rx_index]='\0'; rx_index=0; RX_flag=1; command=false; }else { //Mentés egy külső változóba memcpy((void*)buffer,rx_buffer,rx_index); buffer[rx_index]='\0'; rx_index=0; RX_flag=1; } } }else { //jelenlegi karakter beírása a buffer tárolóba if(rx_index==50) { rx_index=0; } rx_buffer[rx_index++]=b; //’+’karakter keresése if(b=='+'){command=true;} } sei(); //megszakítások engedélyezése } 31. ábra Programkód: USART megszakítás
A működése a következő: Amikor egy megszakítás érkezik be, akkor egy char típusú változóba elmentésre kerül az UDR regiszter tartalma. A beérkezett karaktert vizsgálatoknak vetem alá. Az első if azt vizsgálja, hogy a beolvasott karakter sorlezáró karakter-e? Az alapvető sorlezárók mellé (kocsi vissza, új sor) egy sajátot is definiáltam, mivel a Wi-Fi modul a beérkező üzenetek mellé néha sajátokat is kapcsol, és így egyszerűbb a hasznos üzenetek szelektálása. Ha a 39
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
beérkezett karakter sorlezáró, akkor meg kell vizsgálni, hogy a buffer tároló tartalmaz-e adatokat. Ehhez az rx_index változó szolgál segítségül, amely azt tartja számon, hogy a buffer vektor melyik pozíciójába kerül beírásra az adat. Ha ez 0 az azt jelenti, hogy még semmi sincs a tárolóban, így nem érdemes elmenteni. Ha nem 0, akkor pedig egy külső változóba kerül kimentésre. Két ilyen változó is van, a buffer, és az intext. Ezekbe kerül szelektálásra, hogy a beérkezett üzenet honnan jött. Ha a Wi-Fi valamelyik kliensétől, akkor az intext változóba kerül, ha pedig csupán a Wi-Fi modultól, akkor a buffer változóba. Ez a szelektálás azért fontos, mert egyszerre több sor üzenet is érkezhet a Wi-Fi modultól, ami így felülírná egyből a buffer tárolót, még mielőtt feldolgozásra kerülne annak a tartalma. A szelektálás az alapján történik, hogy az üzenet tartalmazza-e a ’+’ karaktert. Ha igen, akkor az üzenet kívülről érkezett, mert a Wi-Fi modul csak a kliensektől beérkező adatok esetén ír ki ’+’ karaktert. A kimentés után beállításra kerül egy az új adatokat a main() függvénynek jelző változó. A kód végén meg kell még vizsgálni, hogy nem léptük-e túl a maximális buffer méretet, ami 50 karakterben van meghatározva, mivel a használt üzenetek ebbe a méretbe mind beleférnek. A rutin végrehajtása folyamán ki kell kapcsolni a cli() függvény segítségével a többi megszakítást, mivel azok adat kiesést okozhatnak.
Be és kimeneteket kezelő függvények A különböző be és kimenetek kezeléséhez függvényeket írtam, amik egy külön header fájlban kaptak helyet, az átláthatóság kedvéért. Itt a kimenetek LED néven, a bemenetek pedig SENSOR néven definiálva is vannak a könnyebb azonosíthatóság miatt. A kimeneteken található LED-ek beállítását a SetLED elnevezésű függvény végzi.
40
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
voidSetLED(int led_id,int state) { //vizsgálat, hogy a kimenet a B porton van-e? if(led_id==LED4||led_id==E_LAMP) { //port megfelelő bitjének beállítása switch(state){ case0: PORTB&=~(1<
A függvény bemenete a beállítani kívánt LED azonosítója, és a beállítani kívánt állapot. A LED-ek nem egy porton helyezkednek el, ezért meg kell vizsgálni, hogy az adott LED esetén melyik port beállítása szükséges. Mivel csak kevés számú LED van, ezért egy ifel meg lehet oldani a vizsgálatot. Ha a 4-es LED, vagy az E_LAMP nevű hiba visszajelző lámpa a bemeneti paraméter, akkor a B port beállítása történik, ha más, akkor pedig a D porté. A beállítani kívánt állapotot egy switch struktúra vizsgálja meg. Ha magas logikai szintre kell állítani, akkor 1-et ír be a megfelelő regiszter megfelelő bitjébe, ha pedig logikai alacsonyat, akkor 0-t. Hasonlóképpen működik a szenzorokat kiolvasó függvény is.
41
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
intReadSensor(intsensor_id) { //vizsgálat, hogy a bemenet a B porton van-e? if(sensor_id==SENSOR4) { //port bitjének kiolvasása if(PINB&(1<<sensor_id)) { //visszatérés 1-el, ha a kiolvasott bit 1 return1; }else{return0;} }else{ if(PIND&(1<<sensor_id)){ //visszatérés 1-el, ha a kiolvasott bit 1 return1; }else{return0;} } } 33. ábra Programkód: Infra érzékelők logikai állapotának olvasása
Itt csak egy bemenet van másik porton elhelyezve, tehát csak arra kell elvégezni a vizsgálatot. Ez a függvény kiolvassa a PINx regiszter megfelelő bitjét, és ha az 1, akkor 1-es értékkel tér vissza, ha 0 akkor 0-val.
Megszakítások A programban összesen négy megszakítás található, melyek közül egyet, ami az USART adatok fogadásáért felel, már korábban tárgyaltam. A másik három közül a legelső, és egyben a legegyszerűbb az időzítő által generált megszakítás. Ennek az egyetlen feladata, hogy inkrementálja az aktuális időt tartalmazó „time” változót. Ez egy előjel nélküli két bájton tárolt változó. Ez határozza meg a maximálisan mérni képes időt is. Mivel 16 biten összesen 216-ig lehet elszámolni, ami 65536, ezért az összesen mérhető idő: 𝑇𝑚𝑎𝑥 = 65536 ∗ 250𝜇𝑠 = 16,38𝑠 (23) Az eddigi versenyek során a pályát leglassabban is 15 másodperc alatt teljesítették, ezért nem szükséges nagyobb változó alkalmazása. A másik két megszakítás a Pin Change Interrupt-okhoz tartozik. a feladatuk megegyezik, csak két különböző portot vizsgálnak.
42
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
ISR(PCINT2_vect) { if(started) // el van-e indítva a mérés? { //L1 szenzor várakozik-e, és most 0-e? if(L1_pending==true&&ReadSensor(SENSOR1)==false) { L1_time=time; //idő hozzárendelése L1-hez L1_pending=false; // várakozás törlése SetLED(LED1,0); //jelző led kikapcsolása } //vizsgálat a többi szenzorra: if(R1_pending==true&&ReadSensor(SENSOR2)==false) { R1_time=time; R1_pending=false; SetLED(LED2,0); } if(L2_pending==true&&ReadSensor(SENSOR3)==false) { L2_time=time; L2_pending=false; SetLED(LED3,0); } }else{ //Ha nincs elindítva a mérés, a visszajelző ledek a szenzorok aktuális értékét veszik fel: SetLED(LED1,ReadSensor(SENSOR1)); SetLED(LED2,ReadSensor(SENSOR2)); SetLED(LED3,ReadSensor(SENSOR3)); } 34. ábra Programkód: Pin change megszakítás kezelő rutin
A kód egy vizsgálattal kezdődik, amely azt hivatott megállapítani, hogy a mérés el van-e indítva. Ha nincs, akkor az else ágat hajtja végre, miszerint a bemenetek aktuális állapota megjelenítésre kerül a szenzorok mellett elhelyezett LED-eken, hogy a szenzorok működése ellenőrizhető legyen. Ha mérés folyamatban van, akkor a program megvizsgálja, hogy melyik bemenet épp milyen logikai szinten van, továbbá azt, hogy az a bemenet már korábban a mérés folyamán vett-e fel 0 értéket. Ha még nem vett fel, és jelenleg 0-ban van, akkor az azt jelenti, hogy elhaladt a szenzor előtt egy versenyző, így az adott szenzorhoz tartozó változóhoz hozzárendelésre kerül az aktuális idő. Emellett a szenzorra való várakozást jelző változó hamis értéket kap.
43
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Main függvény A Main függvény két fő részből áll. Egy végtelen ciklusból, és egy egyszer lefutó részből. Az egyszer lefutó rész felel az indításkor szükséges beállítások elvégzéséért. Itt kerül meghívásra a perifériákat inicializáló függvény, valamint a Wi-Fi modul használatához szükséges parancsok is itt kerülnek elküldésre. A célvonalon található állomás, mint kliens csatlakozik fel a Wi-Fi hálózatra. A program indulásakor fontos, hogy a Wi-Fi modul is kapjon legalább egy szoftveres reset parancsot, mivel a panelon található reset gomb csak a mikrokontrollert reseteli hardveresen.
intmain(void) { InitAll();//Perifériák inicializálása cli();// megszakítások letiltása a beállítás alatt //ledek bekapcsolása SetLED(LED1,1); SetLED(LED2,1); SetLED(LED3,1); SetLED(LED4,1); printf("AT+RST");//Wi-Fi reset-elése printf("\r\n"); _delay_ms(2000); StartWi-Fi_Client("SimsonBorsod","s51e2015");//AP csatlakozás sei();//megszakítások bekapocslása //ledek kikapcsolása SetLED(LED1,0); SetLED(LED2,0); SetLED(LED3,0); SetLED(LED4,0); 35. ábra Programkód: Inicializálás
Az InitAll() függvény állítja be a perifériákat. Utána visszajelzés céljából az infra kapukhoz tartozó négy LED bekapcsolásra kerül, és a hozzáférési ponthoz való csatlakozás befejezéséig bekapcsolva is maradnak. A bekapcsolásuk után az AT+RST parancs elküldésével újraindításra kerül az ESP8266-os. A két másodperces késleltetés szolgál arra, hogy amíg újraindul a modul, ne küldjön neki új üzenetet a program, mivel ilyenkor az nem tudja feldolgozni. A StartWi-Fi_Client függvény a hozzáférési ponthoz való csatlakozásért felel. Paramétereinek meg kell adni a csatlakozni kívánt hálózat SSID-jét, és a jelszavát.
44
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
A csatlakozás után belép a program a végtelen while ciklusba. Ennek szintén két fő része van, a beérkező parancsok feldolgozása, és a pályaidők számon tartása, elküldése. A parancsfeldolgozás string kezelő függvények segítségével történik. Egy if-ben a program megvizsgálja, hogy a beérkezett üzenet tartalmaz-e egy speciális karaktersorozatot, és ha igen, akkor végrehajtja az annak az utasításnak megfelelő feladatokat. Négy fontosabb parancs van, amelyek a működést meghatározzák. Az első ilyen az „ID?” parancs. Mivel az ESP866-os a bejövő kapcsolatokat csak sorszámokkal határozza meg, szükség van egy azonosítási eljárásra, hogy tudja, mely adatokat hova kell küldenie. Amikor valamelyik kliens felcsatlakozik a socket szerverre, az elküldi az új eszköznek ezt a parancsot. Erre az eszköz egy kétbetűs kóddal válaszol, ami alapján azonosítható. if(strstr(intext, "ID?")!=NULL) { _delay_ms(700); Wi-Fi_Send_Any("FL"); } 36. ábra Programkód: Azonosítás
A második parancs egy beállítást végez el. A pálya felállításakor előfordulhat, hogy a kapukat nem lehet mindig ugyan abban a távolságban elhelyezni, ezért a távolságuk a PC-ről beállítható lesz. Ezt végzi el a DST_ parancs, amely után paraméterként elküldésre kerül az aktuális távolság, mm-ben. if(strstr(intext, "DST")!=NULL) { i=0; // végiglép a szövegen, míg ’_’ karaktert nem talál while(intext[i]=='_') { i++; } //a ’_’ karakter utáni 4 karaktert átmásolja egy ideiglenes tárolóba strncpy(dst,intext+(i+1),4); dst[5]='\0'; //az ideiglenes tárolóból egésszé alakítva a megfelelő változóba helyezés distance=atoi(dst); } 37. ábra Programkód: "DST" parancs feldolgozás
45
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Itt a distance változó tartalmazza a távolságot. A beérkezett szöveges üzenetből úgy nyerhető ki az értéke, hogy először egy while ciklus segítségével megkeresem a ’_’ karaktert, ami elválasztja a parancsot, a paraméterétől. Innentől kezdve az strncpy függvénnyel a következő négy karaktert kimásoljuk egy változóba, majd ezt a változót, (ami még char típusú) az atoi() függvénnyel egész típusú változóvá alakítjuk. A következő két parancs már közvetlenül felel a mérések lebonyolításáért. Ezek a „START” és „RESET” parancsok.
if(strstr(intext, "START")!=NULL) { //szenzorok várakozásának beállítása L1_pending=true; R1_pending=true; L2_pending=true; R2_pending=true; started=1; //elindítás jelzése time=0; //idő 0-ba állítás //ledek bekapcsolása SetLED(LED1,1); SetLED(LED2,1); SetLED(LED3,1); SetLED(LED4,1); SetLED(E_LAMP,0); //hibajelző kikapcsolása } 38. ábra Programkód: "START" parancs feldolgozás
A két parancsra végrehajtandó utasítások nagyban megegyeznek, a különbség csak az, hogy ellenkező értékekre állítják be a változókat. A „START” parancs az a trigger jel, ami a mérést elindítja. Ekkor nullázásra kerül az időt tartalmazó változó, és az egyes szenzorok kiolvasatlanságát jelző változók is igaz értéket kapnak (XX_pending). A verseny futását jelző „started” változó is 1 értéket kap. A visszajelző LED-ek bekapcsolásra kerülnek (kivéve a hiba jelzőt). A párja a „RESET” parancs azért szükséges, mert ha az egyik futam valami oknál fogva megszakításra kerül, le lehessen állítani a mérést Ez a mérés futását jelző változót 0-ra állítja. A while ciklus másik fele a mérési eredmények megérkezését, és számítását végzi.
46
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
if(started) // el van-e indítva a mérés? { if(L1_pending==false) //L1 várakozik-e? { Ltime=L1_time/4; //idő átszámítása ms-ba if(L2_pending==false) // L2 várakozik-e? { Lspeed=(Ltime)-(L2_time/4); //sebesség számítása Lspeed=distance/Lspeed; } } if(R1_pending==false) //R1 várakozik-e? { Rtime=R1_time/4; //idő átszámítása ms-ba if(R2_pending==false) //L2 várakozik-e? { Rspeed=(Rtime)-(R2_time/4); //sebesség számítása Rspeed=distance/Rspeed; } } if(L1_pending==false&&R1_pending==false)//mérve
van-e
mindkét
pálya? { started=0; //mérés leállítása //adatok szöveggé formázása sprintf(send,"TPC_LT_%da_RT_%db_LS_%de_RS_%dd",Ltime,Rtime,Lspeed,Rspeed); Wi-Fi_Send_Any(send); //mért idők elküldése } } 39. ábra Programkód: Sebességek számítása, idők küldése
Ennek a lényege, hogy a megszakításokban, ha valamelyik bemenet megváltozik, a program false értékbe állítja az annak a szenzornak megfelelő XX_pending változót, a while ciklusban pedig, ha a mérés el van indítva, folyamatosan figyeli, hogy mindkét, a pálya távolabbik végén lévő szenzor átváltott-e. A közelebbi szenzorokat külön nem vizsgálja, mivel ha a távolabbi előtt áthaladt egy versenyző, akkor szükségszerűen a közelebb előtt is el kellett haladnia. Ha pedig valami hiba miatt az első szenzorok nem mérnének, nem akasztja meg a mérést, a lényegesebb teljes idő mérése akkor is megvalósul. A beérkezett idők milliszekundumba kerülnek átváltásra. Ehhez a számláló értékét néggyel szükséges osztani. (mivel a számláló egy lépése 250µs-ot jelent) A sebesség meghatározása úgy történik, hogy a két szenzorhoz tartozó időnek vesszük a különbségét, ezzel megkapjuk, hogy a versenyző mennyi idő alatt tette meg a két szenzor közötti távolságot. Mivel a szenzorok távolsága ismert, a v=s/t képlet segítségével meghatározható az áthaladás átlagsebessége. A pálya végén ezen a távolságon már elhanyagolható a versenyzők gyorsulása, így az így kapott sebesség megegyezik a maximálisan elért sebességgel. 47
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Ha az összes idő le lett mérve, akkor ezek a megfelelő formátumban továbbításra kerülnek. A megfelelő stringet az sprintf függvény segítségével állítom elő. A string elején a „TPC” parancs jelzi a start vonal moduljának, hogy ezt az üzenetet továbbítani kell a számítógép felé. Az „LT”,”RT”,”RS”,”LS” pedig a jobb, és bal sebességeket, és időket jelölik. (Left Time, Right Time, Right Speed, Left Speed)
4.2 Indító állomás 4.2.1 Feladatai
Megvalósítani a kommunikációt a Wi-Fi modullal.
Létrehozni egy socket szervert, melyhez a többi kliens csatlakozhat.
Számon tartani a csatlakozott klienseket.
Fogadni a PC-ről küldött parancsokat.
Parancsokat küldeni a cél állomáshoz.
Vezérelni az indító lámpát.
Mérni a versenyzők reakció idejét.
4.2.2 A program megvalósítása Az indítóállomás programja sok tekintetben megegyezik a cél állomás programjával. A reakcióidők mérése ugyan azon az elven történik, a perifériákat kezelő függvényekben is csak annyi különbség van, hogy itt egyel több perifériát kell kezelni (kommunikálni kell az indítólámpa LED-jeit meghajtó IC-vel). A különbségek a feldolgozandó parancsokban, és a Wi-Fi modul konfigurálásában vannak. Az indító állomáson található Wi-Fi modul sugározza azt a hozzáférési pontot, amire a többi eszköz felcsatlakozik, és ezen kapott helyet a socket szerver is.
48
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
40. ábra Folyamatábra: Indító program
A program fő szerkezete a 40-es ábrán látható. Elindulásakor elsőként létrehoz egy TCP protokoll szerint működő socket szervert, a Wi-Fi modul 7000-es portján. Ezután a fő ciklusba kerül. Ez megvizsgálja először, hogy van-e új beérkezett üzenet. Ha nincs akkor továbblép a mérés futását vizsgáló részhez. Ha van üzenet, akkor megvizsgálja, hogy az „CONNECT”-e. Ha igen, akkor elküld egy „ID?” Parancsot, majd várakozik, amíg arra válasz nem érkezik. A beérkezett válasz alapján pedig megállapítja, hogy a PC vagy a cél modul csatlakozott-e fel. Ha az üzenet nem „CONNECT” akkor vizsgálatot végez a „START” üzenetre. Ha ez igaz lesz, akkor az időt nullázza, és beállítja a mérés futását jelző változót. Ha hamis, akkor megvizsgálja a RESET-et is. Ha ez igaz, akkor nullázza a mérés futását jelző változót. Ha hamis, akkor megvizsgálja, hogy a beérkezett üzenetet a cél modultól jött-e. Ha igen, akkor továbbítja azt a PC felé, ha pedig nem, akkor belép a mérést ellenőrző szakaszba. 49
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Ha a mérés fut, akkor ellenőrzi, hogy minden szenzor ideje mérésre került-e. Ha nem akkor visszatér a program elejére, ha igen akkor pedig először elküldi a PC-nek a mért adatokat, és utána tér vissza a program elejére. Ezzel párhuzamosan két megszakítás is lezajlik. Az egyik az időzítőé, ez inkrementálja az időt tartalmazó változót. A másik a szenzoroké. Ez megvizsgálja, hogy fut-e a mérés. Ha igen akkor hozzárendeli a szenzorokhoz az aktuális időt, ha nem akkor kijelzi a szenzorok állapotát.
Wi-Fi kezelése Magának a Wi-Fi modulnak a kezelése ugyan úgy történik, mint a cél állomásnál. A main függvény elején kap egy újraindítás parancsot, ezután viszont nem kell csatlakozni hozzáférési ponthoz, mivel ő maga a hozzáférési pont. Be kell viszont állítani a socket szervert. A modul indulásakor alaphelyzetbe állítja a bejövő kapcsolatok számáért felelős paraméterét, amit át kell állítani, az AT+CIPMUX=1 paranccsal, majd a 7000-es porton létrehozunk egy TCP socket szervert. A beérkezett kapcsolatok kezelése a program parancsokat feldolgozó részében van. Ha az USART csatornán egy „CONNECT” karaktersorozatot is tartalmazó szöveg érkezik be, akkor végrehajtódik az azonosítást végző rutin.(A Wi-Fi modul x,CONNECT üzenettel jelzi, ha felcsatlakozott a szerverre egy kliens, ahol x a csatorna számát jelzi) //csatlakozás keresése if((strstr(buffer, "CONNECT")!=NULL)&&(strstr(buffer,"FAIL")==NULL)) { RX_flag=0; //üzenet jelző 0-zása //azonosító meghatározása ID[1]='\0'; ID[0]=buffer[0]; ref_num=atoi(ID); //azonosító egésszé alakítása Tag=Wi-FiSend_ID_Req(ref_num); //azonosítási kérvény küldése Clear_buffer(buffer); if(Tag==1) //válasz vizsgálata { PC_ID=ref_num; //azonosító PC-hez rendelése pc_con=true; // PC csatlakozásának jelzése } if(Tag==2) { F_ID=ref_num; //azonosító cél modulhoz rendelése fl_con=true; //cél modul csatlakozásának jelzése } } 41. ábra Programkód: "CONNECT" parancs kezelése
50
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
A Wi-Fi modul a kapcsolatban történt hibát az „x,CONNECT FAIL” üzenettel jelzi, ezért az if-ben történő vizsgálat során vizsgálni kell, hogy a FAIL karaktersort ne tartalmazza az üzenet.. Ha érvényes a bejövő kapcsolat, akkor az üzenet első karakterét egész számmá alakítom a könnyebb kezelhetőség végett, majd ezt paraméterként megadva meghívom a WiFiSend_ID_Req függvényt. Ez 1 értéket ad vissza, ha a PC csatlakozott fel, és 2 értéket, ha a célvonalon lévő modul. A visszakapott értéket megvizsgálva a csatorna számot hozzárendeli a megfelelő modul változójához.
42. ábra Jelalak: Wi-Fi kommunikáció
A Wi-FiSend_ID_Req függvény a paraméterként megadott csatornára elküld egy „ID?” parancsot, majd egy saját UART fogadó kóddal addig vár, míg a felcsatlakozott eszköz azonosítja magát. A visszakapott üzenetet megvizsgálva megállapítja, hogy a felcsatlakozott eszköz a PC-e, vagy a cél állomás, majd az azoknak megfelelő értékekkel tér vissza.
51
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
intWi-FiSend_ID_Req(intID_code) { inti=0; intb; bool recieved=false; chartext[50]; charfind[30]; _delay_ms(50); //üzenet küldése a csatlakozott eszköznek printf("AT+CIPSEND=%d,%d",ID_code,3); printf("\r\n"); SetLED(LRED,1); _delay_ms(20); printf("ID?"); printf("\r\n"); _delay_ms(300); cli(); while(!recieved) //várakozás egy teljes string-re { while(!(UCSR0A&(1<
2) { recieved=true; //string végének jelzése text[i+1]='\0'; //\0 karakter beírása a karakter vektor végére }else{i++;} } _delay_ms(200); SetLED(LRED,0); sei(); if(strstr(text, "IPD")!=NULL) //a szöveg jó helyről jött-e? { sprintf(find,"IPD,%d",ID_code); // jó csatorna küldte-e a választ? if((strstr(text,find))!=NULL) { printf("ID ok: %d",ID_code); //debug üzenet if(strstr(text, "PC")!=NULL) { printf("pc ok\r\n"); return1; //ha a pc csatlakozott, visszatérés 1-el } if(strstr(text, "FL")!=NULL) { printf("fl ok\r\n"); return2; //ha a cél modul csatlakozott visszatérés 2-vel } } } } 43. ábra Programkód: Azonosítás fogadása
Az üzenetre való várakozás itt nem megszakítás segítségével történik, hanem az UCSR0A regiszter RXC0 jelzőbitjének a figyelésével. Ha ez 1-es értéket vesz fel, az azt jelenti, hogy karakter érkezett be az USART vonalon. A megszakítás alapú fogadáshoz hasonlóan itt is addig fogadja a bájtokat, amíg valamilyen sorlezáró karakter nem érkezik. Ez 52
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
a várakozás egy while ciklussal történik, aminek a paraméterét alapból igaznak definiáltam, és csak a sorlezáró karakter észlelésekor kap hamis értéket. Az eszközök csatlakozásának állapotát a panelon két LED jelzi. Az egyik addig világít, míg a felcsatlakozott eszköz nem azonosítja magát,(piros) a másik pedig villogással jelzi, hogy a modul be van kapcsolva, viszont nem csatlakozott fel minden szükséges eszköz (sárga). Ha mind a PC és a cél állomás is felcsatlakozott, akkor a villogás folyamatos fényre vált.
Indító lámpa vezérlése A lámpákat egy WS2803-as LED vezérlő IC hajtja meg. Ez gyakorlatilag úgy működik, mint egy shift regiszter. Két vezetéken lehet beleírni az adatokat, egy adat, és egy órajel vezetéken. Összesen 144 bitet szükséges beleírni, mivel összesen 18 csatornával rendelkezik, és minden egyes csatorna fényereje 8 biten írható le. A beírás kezdetét jelzi, ha az órajelet 500µs-ig alacsony szintre húzzuk. ezután történhet meg az adatok beírása. Ezt az alábbi kód valósítja meg: voidSetLamp_matrix(uint8_tgrayscale[5][18],introw) { inti,j; SetPinC(SCL,0); _delay_us(500); //várakozás az adatlapban megadott ideig for(i=0;i<18;i++)//csatornák léptetése { for(j=0;j<8;j++)//bitek léptetése { SetPinC(SCL,0); //órajel 0-ba állítása if((grayscale[row][i]>>j)&1) //az aktuális bit 1-e? { SetPinC(SDA,1); //adat 1-be állítása }else{SetPinC(SDA,0);} //adat 0-ba állítása _delay_us(4); SetPinC(SCL,1); //órajel 1-be állítása _delay_us(4); } } //az összes csatorna kimenetre a beshiftelt értékek SetPinC(SCL,0); _delay_us(600); SetPinC(SCL,1); }
kiírása
után
600us
szünet,
44. ábraProgramkód: Indító lámpa vezérlése
53
ekkor
kerülnek
a
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
A függvény bemeneti változója egy mátrix, amiben a lámpa mintázata van eltárolva. A mátrix sorai az egyes állapotokat jelölik. A SetLamp_matrix függvény második bemeneti változójával lehet kiválasztani, hogy épp melyik sort szeretnénk kirakni a lámpára. A beírást két egymásba ágyazott for ciklus végzi el. A külső felel a mátrix értékeinek léptetéséért, a belső pedig az egyes értékek bitenkénti lebontásáért. Az egyes bitek bitenkénti és kapcsolat segítségével kerülnek megvizsgálásra. Az épp soron lévő bit számával shiftlejük jobbra az 1-es értéket, majd összehasonlítjuk a kiírni kívánt bájttal. Ha igaz értéket kapunk, akkor egy 1-es értéket ír ki a program, ha pedig hamisat, akkor 0-t.
45. ábra Jelalak: Az első lámpa piros LED-jének bekapcsolása. Fent az órajel, lent az adat látható.
Parancsok Az indító modul hat fontosabb parancsot vizsgál. Ezek közül a „CONNECT” parancsot már a Wi-Fi kezelése fejezetben bemutattam. Egy másik ilyen parancs az „STRT” parancs. Ez gyakorlatilag a cél állomás „START” parancsának felel meg (nem lehet ugyan az a kettő, mert a Wi-Fi modul az elküldött adatokat visszaechózza, és ha a visszaechózott adatot is parancsként értelmezi a modul, akkor egy végtelen parancs végrehajtásba kerülne). Ez a parancs hívja meg a visszaszámlálásért felelős függvényt. Ez a függvény végiglépteti a láma mátrixában megadott mintázatot, majd lenullázza a reakcióidő méréséért felelős változót, és egy „START” parancsot küld a cél modulnak.
54
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
voidCountDown(void) { //a lámpák egymás utáni bekapcsolása SetLamp_matrix(LampMatrix,0); _delay_ms(1000); SetLamp_matrix(LampMatrix,1); _delay_ms(1000); SetLamp_matrix(LampMatrix,2); _delay_ms(1000); SetLamp_matrix(LampMatrix,3); _delay_ms(1000); Wi-Fi_Send_Comm("START",F_ID); //start parancs küldése a cél modulnak started=1; //saját mérés indítása time=0; //idő nullázása L_pending=1; //L várakozik R_pending=1; //R várakozik L_sent=false; R_sent=false; SetLamp_matrix(LampMatrix,4); //zöld lámpa bekapcsolása } 46. ábra Programkód: Visszaszámlálás
Egy másik parancs a „RST” parancs, ami a „RESET” parancs megfelelője. Azon kívül, hogy alaphelyzetbe állítja a reakcióidő mérésért felelős változókat, tovább is küldi a „RESET” parancsot a cél állomásnak. if(strstr(buffer, "RST")!=NULL) { RX_flag=0; Clear_buffer(buffer); started=0; //mérés leállíátsa L_pending=0; //L nem várakozik R_pending=0; //R nem várakozik //Lámpa nullázás Wi-Fi_Send_Comm("RESET",F_ID); } 47. ábra Programkód: "RST" parancs végrehajtása
A „DST” és a „TPC csupán üzenetek tovább küldésére szolgál. A „DST” a beérkezett távolság adatot küldi el a cél állomásnak, a „TPC” pedig a céltól érkezőt a számítógépnek. A maradék egy parancs pedig a „x,CLOSED” parancs, ami a Wi-Fi modultól érkezik. Ez azt jelzi, valamelyik socket kapcsolat megszűnt. Ilyenkor a megszűnt kapcsolatot a program megvizsgálja, hogy melyik modulhoz tartozott, és az ahhoz tartozó változókat alaphelyzetbe állítja. ennek hatására a csatlakozást visszajelző LED újra villogni fog.
55
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
//lecsatlakozás vizsgálata if(strstr(buffer,"CLOSED")!=NULL) { ID[1]='\0'; ID[0]=buffer[0]; ref_num=atoi(ID); //csatorna azonosító mentése //lecsatlakozott eszköz meghatározása: if(F_ID==ref_num) { F_ID=0; fl_con=false; } if(PC_ID==ref_num) { PC_ID=0; pc_con=false; } } Clear_buffer(buffer); RX_flag=0; } 48. ábra Programkód: Megszűnt csatorna vizsgálata
56
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
5. PC szoftver 5.1 Feladatai
Kommunikálni az indító állomással.
Beolvasni a versenyzők listáját, és kategorizálni azokat.
Naplózni a verseny eredményeit.
Létrehozni a versenyző párosokat.
Automatikusan kiválasztani a továbbjutókat.
5.2 Megvalósítás
A számítógépes program Visual alapját egy grafikus felhasználói felület képezi. A legtöbb műveletet a program a kezelőszervek megváltozásakor hajtja végre. Ezzel párhuzamosan csak a Wi-Fi-n keresztül érkezett adatok feldolgozása folyik.
49. ábra Kép: Felhasználói felület
57
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Indításkor a fenti ábrán látható felhasználói felület kerül elénk. A használathoz ennek be kell tallózni az xls fájlt, ami a versenyzők listáját tartalmazza az első oszlopban, a másodikban pedig a kategóriájukat. A program képes mind Wi-Fi-n, mind soros porton keresztül is kommunikálni az indító modullal. Ha soros port van beállítva, akkor itt lehet megadni, hogy melyik COM portra van csatlakoztatva az eszköz. Ha pedig Wi-Fi, akkor ez nem kerül vizsgálatra. A kategória fülnél lehet kiválasztani, hogy mely kategóriát szeretnénk elindítani, az egyes versenyzőket pedig a képen nem aktív indítás gombbal lehet elindítani. Lehetőség van a párosokat kézzel is újraindítani, de ha a két versenyző túl nagy differenciával indult el, akkor ez automatikusan is megtörténik. A kezelő felület alsó részén található két szövegdoboz is. Ezen keresztül közvetlenül lehet üzeneteket küldeni a moduloknak, és láthatóak az onnan érkezett üzenetek is. A „Connect” gombbal pedig a Wi-Fi-re lehet felcsatlakozni. A menü fül alatt található egy beállításokat tartalmaz ablak is. Itt lehet megadni, hogy Wi-Fi-n, vagy UART-on keresztül csatlakozik a PC a rendszerhez, meg lehet határozni, hogy a két versenyző indulásának különbségének mi az engedélyezett maximális értéke, és itt adható meg a sebesség mérésére használt szenzorok távolsága is. A Wi-Fi alap paraméterei is állíthatóak. Az alábbi ábrán az alapértelmezett értékek láthatóak.
50. ábra Kép: Beállítások
58
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Ha elindítjuk valamelyik kategóriát, akkor a program kiírja az első két versenyzőt. A párost az indítás gombbal lehet elindítani. Ekkor a vezérlők letiltásra kerülnek (kivéve az újraindítást) egészen addig, míg a mért idők be nem érkeznek.
51. ábra Kép: Elindított kategória
Az idők beérkezése után hasonló képet láthatunk:
52. ábra Kép: Beérkezett adatok
59
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
A fenti kép készítésekor nem volt az összes szenzor csatlakoztatva, ezért 0 a sebességek értéke, és hiányzik a reakcióidő.
5.2.1 A program működése
Verseny előtti teendők Először a felhasználónak be kell tallózni a használni kívánt XLS fájlt. Ezt az Open File gombbal lehet megnyitni. Az XLS fájlok kezeléséhez az NPOI.dll könyvtárat használom. Ennek segítségével a gomb lenyomásakor try-catch struktúrával megnyitom a betallózott fájlt, és a tartalmát beolvasom egy osztályba. Ha a megnyitás során a program valami hibába ütközik, akkor azt egy üzenet ablakban jelzi. //excel fájl beolvasása try { using (file = newFileStream(@Path, FileMode.Open, FileAccess.Read)) { book = newHSSFWorkbook(file); //munkafüzet mentése osztályként file.Close();//fájl lezárása } //debug üzenet OutText.AppendText("XLS file opened: " + Path + Environment.NewLine); bOpen.Enabled = false; //fájl megnyitás gomb tiltása fileOK = true; //fájl megnyitásának nyugtázása
}catch //esetleges hibák jelzése { OutText.AppendText("Uups something is wrong!"+Environment.NewLine); MessageBox.Show("Hiba történt a fájl megnyitásakor! Lehet, hogy a fájl sérült, vagy használatban van!","File hiba!"); fileOK = false; path.Enabled = true; bbrowse.Enabled = true; } 53. ábra Programkód: Eccel fájl olvasása
Ha a beolvasás sikeresen megtörtént, akkor egy for ciklus segítségével végigolvasom az első két oszlopot. Az első oszlopban a nevek szerepelnek. Ezek egy vektorban kerülnek elmentésre. A program az egyes versenyzőket ebben a vektorban elfoglalt sorszámuk alapján tartja számon. A második oszlop beolvasása során a versenyzők a három kategóriába kerülnek 60
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
besorolásra egy switch-case struktúra által. (itt már sorszám alapján történik a rájuk hivatkozás.) //sorok végigolvasása for (int rowIndex = sheet.FirstRowNum; rowIndex <= sheet.LastRowNum; rowIndex++) { //sorok tartalmának vektorba mentése Names[rowIndex + 1] = sheet.GetRow(rowIndex).GetCell(0).ToString(); Cat = sheet.GetRow(rowIndex).GetCell(1).ToString(); //az egyes bejegyzések kategóriába sorolása switch (Cat) { case"50": Otven[j, 0] = rowIndex + 1; j++; break; case"60": Hatvan[k, 0] = rowIndex + 1; k++; break; case"70": Hetven[l, 0] = rowIndex + 1; l++; break; default: break; } } bStart_cat.Enabled = true; Names[(Maxind + 2)] = "---"; } 54. ábra Programkód: Versenyzők kategóriákba sorolása
A verseny elindítása előtt még csatlakozni kell a socket szerverhez. Ezt a „Connect” gomb megnyomásával lehet megtenni. Ha a csatlakozás hiba nélkül megtörtént, elindul a BackgroundWorker, ami a bejövő adatok fogadásával foglalkozik. privatevoid bConnect_Click(object sender, EventArgs e) { //távoli kapcsolódási pont változójának létrehozása remoteEP = newIPEndPoint(ipAddress, port); // TCP socket létrehozása. socketsender = newSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //csatlakozás a távoli kapcsolódási ponthoz try { socketsender.Connect(remoteEP); connected = true; //csatlakozás nyugtázása } //hibák jelzése catch (Exception ex) { connected = false; MessageBox.Show(( csatlakozáskor!"+Environment.NewLine+ex), "Hiba!");} Recieve_Wi-Fi.RunWorkerAsync();//adat fogadó folyamat indítása } 55. ábra Programkód: Csatlakozás a socket szerverhez
61
"Hiba
a
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
A versenyek lebonyolítása Amikor egy kategória elindításra kerül, akkor az adott kategória versenyzői egy mátrix első sorába kerülnek átmásolásra. Ez a mátrix fogja tartalmazni a további körökbe bejutott versenyzőket is. Itt kerül kiszámításra a szükséges körök száma. Vizsgálatra kerül az is, hogy az indulók száma páros-e vagy páratlan, mert ha páratlan, akkor egyel több kör szükséges, hogy az utolsó versenyző is megmérkőzhessen. A switch struktúra egy kategóriára vonatkozó része: switch(Category.Text) { case"50ccm": Curr_running = 50; //vezérlő elemek beállítsa bStart_cat.Enabled = false; bRestart.Enabled = true; bStart_pair.Enabled = true; tCat.Text = "50 ccm"; tCat.Visible = true; MaxRound = j / 2; if (j % 2 != 0) //páratlanok-e az indulók? { NotEven = true; MaxRound++;//ha igen + egy kör } for (int i = 0; i <= j;i++ ) {//kategória nevei másolása a verseny mátrixba Matrix[1, (i+1), 0] = Otven[i,0]; } NextRound = j; //következő körben indulók számának megadása break; 56. ábra Programkód: Kiválasztott kategória inicializálása
A következő programrész meghatározza az adott körben játszó párosok számát, és kiírja az első induló versenyzőket. PairMax = NextRound / 2; //párosok számának számítása if (NextRound % 2 != 0) { NotEven = true; PairMax++; }//páratlan versenyző esetén +1 pár Round = 1; //kör változó beállíátsa Pair = 1; //páros változó beállítása NextRound = 0; //következő kör számlálójának nullázása FirstRound = true; //első kör jelzése tRound.Text = Convert.ToString(Round); tPair.Text = Convert.ToString(Pair); //versenyző páros kijelzése left = Matrix[Round, (Pair*2),0]; right = Matrix[Round, ((Pair*2) - 1),0]; tLeft.Text = Names[left]; tRight.Text = Names[right]; tLeft.Visible = true; tRight.Visible = true; 57. ábra Programkód: A következő körben induló versenyző párosok számának meghatározása
62
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Az indítás gomb megnyomására a program elküld egy „STRT” parancsot a start modulnak, és engedélyezi az újraindítás gombot, az indítást pedig letiltja. Ezt követően a program addig vár, míg meg nem érkeznek a kiírható idők. Az idők fogadása másik szálon, egy BackgroundWorker segítségével történik. while (connected) //van-e élő kapcsolat? { string message=""; try { int bytesRec = socketsender.Receive(bytes); // bejövő bájt olvasása //bejövő bájt ASCII kódolással string-é alakításam,és kiírása message = Encoding.ASCII.GetString(bytes, 0, bytesRec); OutText.Invoke(newAction(() => OutText.AppendText("Recieved: " + message + Environment.NewLine))); } catch(Exception ex) { MessageBox.Show("Hiba"+Environment.NewLine+ex, "Hiba!"); } //válasz az azonosítási kérelemre if (message.IndexOf("ID?") > -1) { Thread.Sleep(1000); // 1 másodperc késleltetés(a wifi modul ennél hamarabb nem tudja fogadni a választ) SendWi-Fi("PC@"); } //’_’ karakter keresése, ha megtalálható akkor idő érkezett be if (message.IndexOf("_") > -1) { //eredeti program szál függvényének meghívása(idők feldolgozásához) if (InvokeRequired) { this.Invoke(newAction(() => ProcessCommands(sender, e, message))); } } } 58. ábra Programkód: Wi-Fi-n érkező adatok fogadása
Itt egy végtelen ciklus fut, amely folyamatosan fogadja az adatokat, és ha a beérkezett üzenet megfelel a megadott paramétereknek, akkor meghívja az üzeneteket feldolgozó függvényt. A csatlakozásnál történő azonosítás pedig egyből itt megtörténik. Az üzenetek feldolgozása gyakorlatilag abból áll, hogy a beérkezett stringet substringekre bontja a beépített jelzőkarakterek alapján, majd a megfelelő típusú számokká alakítva hozzárendeli az időket, és sebességeket tároló változókhoz.
63
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
startindex = message.IndexOf("RT") + 3; //RT bejegyzés keresése length = message.IndexOf("b") - startindex; //b jelző karakter keresése //idő kiolvasása a szövegből L_time = Convert.ToInt16(message.Substring(startindex, length)); tTimeL.Text = msToSec(L_time); //kiírható formátumú stringgé alakítás times[0] = L_time; 59. ábra Programkód: Idők kiolvasása a beérkezett üzenetből
Ezután egy újabb függvényhívás történik. Ez megvizsgálja, hogy épp melyik körben tart a mérkőzés, és hogy kieséses alapon kell-e versenyeztetni, vagy idő szerint. Ha idő szerint (tehát a körök száma 1-nél nagyobb, és a párosok száma nagyobb, mint 10) akkor az idők egy új mátrixba kerülnek beírásra, a hozzájuk tartozó versenyző azonosítójával együtt. Ha kieséses verseny zajlik, akkor pedig a párosok indításakor létrehozott mátrix következő sorába kerül be a kisebb időt futott versenyző. Ezzel párhuzamosan az Excel fájl következő oszlopaiba beírásra kerülnek az idők, és sebességek. Ha valami oknál fogva érvényteleníteni, és újraindítani kell az adott futamot, akkor ez itt még megtehető. Ekkor egyszerűen az előzőleg beírt hibás értékek felülírásra kerülnek. Végül a program kijelzi az aktuális időket, és sebességeket, és aktiválódik a „Következő” gomb. A „Következő” gomb megnyomásakor megvizsgálja a program, hogy az adott körben van-e még versenyző. Ha igen, akkor a párosok számát tartalmazó változót inkrementálja, majd kiírja a következő versenyzők nevét, az előzőek idejét tartalmazó címkéket pedig eltűnteti. Ha nincsen következő páros, akkor megnézi, hogy a következő körre jut-e még versenyző. Ha jut, akkor átlép a program a következő körre, tehát az indításkor meghatározott mátrix következő sorából olvassa ki a versenyzőket. Ha 10-nél több versenyző van, és a következő kör a második kör, akkor meghívja a legjobb tíz időt szelektáló függvényt. Ez gyakorlatilag egy egyszerű sorba rendezést végez, majd a sorba rendezett mátrix első 10 oszlopát átmásolja egy vektorba, ahonnan a többi kör folyamán fogja kiolvasni a program az indulókat. Ha nincsenek további körök, akkor azt egy üzenettel jelzi a program, és alaphelyzetbe állítja a kezelő szerveket, a változókat pedig nullázza.
64
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
6. Összefoglalás Dolgozatomban
a
gyorsulási
versenyt
menedzselő
rendszer
tervezését,
és
megvalósítását mutattam be. Ez a rendszer egy 2015 nyarán elkészített prototípus tapasztalatai alapján készült el, ami az éles bevetés során jól teljesített, ám funkcionalitása jelen változatban jelentősen ki lett bővítve. Úgy gondolom sikerült elérni a kitűzött célokat. Sikerült megvalósítani egy stabilan működő vezeték nélküli kommunikációt, amelynek köszönhetően a rendszer telepítési ideje nagyban csökkenhet. Az infra kapuk segítségével egyszerűen, és költséghatékonyan érzékelhetőek a versenyzők, működéséhez csupán a pálya szélére elhelyezett jeladókra van szükség. A számítógépes szoftver is viszonylag kevés felhasználói beavatkozást igényel, csupán néhány beállítás elvégzésével pár perc alatt munkára fogható. Az adatok kezelése is egyszerű, csupán egy Excel fájlba kell elmenteni őket, majd ugyan abba a fájlba kerülnek az elmentett eredmények is. Az áramkörökből házi módszerekkel egy-egy próbadarab el is készült, ezek láthatóak a 27-es ábrán, még dobozolás nélkül. Később egy dobozban fognak helyet kapni, ami az infra érzékelők felé egy csőben végződik a látószög csökkentése érdekében.
60. ábra Kép: Az elkészült áramkörök
65
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
7. Summary My thesis is about planning, and implementing a motorcycle drag racing management system. Its main goal is to measure the overall time, maximal speed, and the reaction time of the competitors. It supposed to log these data, and automatically keep count of the competitors position. The hardware needs to be easily installable. If the number of competitors is greater than ten, the race’s first round is a qualification. In this round, the system measures the time of all competitors, than selects the first ten times. The next rounds happens straight knockout basis. The system generates pairs of the contestants. From each pair, the winner goes to the next round. If the competitors number does not reach the limit, the race goes only in knockout mode. The system consists of three main modules. The first one is the PC, which logs the data, and accepts the user’s commands. The second module is the start module, which is located at the start point of the track. It measures the reaction times, and controls the starter lamp. The last part is located at the finish line. Its duty is to measure the overall time, and the maximal speed, and send it back to the module at the start line. The communication between these modules happens via Wi-Fi. The start module hosts the access point, the other modules acts as clients. If one of the module connects, an identification request is sent. The answer for this identifies which device connected. The motorcycles are detected by infra-red gates. On the side of the track IR transmitters are placed, and in the middle, the receivers. When something goes in front of the sensors, it brakes the signal. The microcontroller detects it and assigns a time to that sensor. At the end of the track two pairs of sensors are placed. They are needed to measure the maximal speed. The distance of these are known, so by measuring the times, it can calculate the speed. If all the sensors data are collected, the module calculates the speed, from the time difference of the two gates, than it sends them to the start module, and the start module sends it to the PC. The PC than processes the data, calculates the winner, and places it among the contestants of the next round. If the reaction time difference, of the two actual contestants is too big, the system automatically restarts them, and erases the collected times, and speeds. (if there are any) The staff controls the race through a graphical user interface, which runs on windows operating system. It is written in C#. The program gets the names of the competitors from an excel file. It also contains the category in which they start. The system accepts three 66
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
categories, and there is also an uncategorised option. After reading the excel file, the race can be started. The staff only need to call the competitors, and click the start, and next button, the other things happens automatically. The collected time and speed records are written back to the excel file.
67
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Idézett forrásmunkák [1] MYLAPS. [Online] [Hivatkozva: 2015. 11 12.] http://www.mylaps.com/en/systemcomponents/x2#x2decoder. [2] ChampionChip Timing System. MYLAPS . [Online] [Hivatkozva: 2015. 11 12.] http://www.mylaps.com/en/system-components/championchip-system. [3]
Poole,
Ian.
[Online]
[Hivatkozva:
2015.
11
10.]
http://www.radio-
electronics.com/info/power-management/switching-mode-power-supply/step-down-buckregulator-converter-basics.php. [4]
Atmel.
atmel.com.
[Online]
http://www.atmel.com/images/atmel-2486-8-bit-avr-
microcontroller-atmega8_l_datasheet.pdf. [5] [Online] [Hivatkozva: 2015. 11 10.] http://www.ti.com/lit/ds/symlink/ne555.pdf. [6]
hekilledmywire.wordpress.com.
[Online]
https://hekilledmywire.wordpress.com/2011/01/05/using-the-usartserial-tutorial-part-2/. [7] Microsoft Developer Network. [Online] Microsoft. [Hivatkozva: 2015. 10 28.] https://msdn.microsoft.com.
68
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Ábrajegyzék 1. ábra A rendszer felépítése....................................................................................................... 6 2. ábra Blokk diagram: Tervezés fázisai .................................................................................. 10 3. ábra Szimbólum lábak beállítási lehetőségei ........................................................................ 11 4. ábra A kész szimbólum......................................................................................................... 12 5. ábra A megrajzolt láblenyomat............................................................................................. 12 6. ábra Láb-ak hozzárendelése a PAD-ekhez ........................................................................... 13 7. ábra Táblázat: Az áramfelvételt meghatározó alkatrészek ................................................... 14 8. ábra Blokkvázlat: Tápegység................................................................................................ 14 9. ábra Kapcsolási rajz: Step-down konverter .......................................................................... 16 10. ábra Kapcsolási rajz: Tápegység ........................................................................................ 17 11. ábra Kapcsolási rajz: Mikrokontroller ................................................................................ 19 12. ábra Kapcsolás rajz: Hiba lámpa ........................................................................................ 19 13. ábra Kapcsolási rajz: Infra vevők ....................................................................................... 20 14. ábra Kapcsolási rajz: 555 monostabil alapkapcsolás .......................................................... 21 15. ábra Kapcsolási rajz: Wi-Fi modul illesztése ..................................................................... 23 16. ábra Kapcsolási rajz: Led vezérlő ....................................................................................... 25 17. ábra Kapcsolási rajz: Inverter ............................................................................................. 26 18. ábra Kapcsolási rajz: 555 astabil alapkapcsolás ................................................................. 27 19. ábra Kapcsolási rajz: Infra adó ........................................................................................... 28 20. ábra ERC ellenőrzés ........................................................................................................... 29 21. ábra Cél állomás nyomtatott áramköre teli föld nélkül ...................................................... 31 22. ábra Indító állomás nyomtatott áramköre teli föld nélkül .................................................. 31 23. ábra Folyamatábra: Cél modul programja .......................................................................... 32 24. ábra Programkód: Kimenetek definiálása .......................................................................... 34 25. ábra Programkód: Pin change megszakítások engedélyezése ............................................ 35 26. ábra Programkód: Időzítő beállíátsa................................................................................... 36 27. ábra Programkód: Baud-ráta kiszámítása ........................................................................... 36 28. ábra Programkód: USART inicializálása ........................................................................... 37 29. ábra Programkód: USART egy bájt küldése ...................................................................... 38 30. ábra Programkód: printf függvény átirányítása .................................................................. 38 31. ábra Programkód: USART megszakítás ............................................................................ 39 32. ábra Programkód: LED-ek vezérlése ................................................................................. 41 69
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
33. ábra Programkód: Infra érzékelők logikai állapotának olvasása ........................................ 42 34. ábra Programkód: Pin change megszakítás kezelő rutin .................................................... 43 35. ábra Programkód: Inicializálás ........................................................................................... 44 36. ábra Programkód: Azonosítás ............................................................................................. 45 37. ábra Programkód: "DST" parancs feldolgozás ................................................................... 45 38. ábra Programkód: "START" parancs feldolgozás .............................................................. 46 39. ábra Programkód: Sebességek számítása, idők küldése ..................................................... 47 40. ábra Folyamatábra: Indító program .................................................................................... 49 41. ábra Programkód: "CONNECT" parancs kezelése............................................................. 50 42. ábra Jelalak: Wi-Fi kommunikáció..................................................................................... 51 43. ábra Programkód: Azonosítás fogadása ............................................................................. 52 44. ábraProgramkód: Indító lámpa vezérlése ........................................................................... 53 45. ábra Jelalak: Az első lámpa piros LED-jének bekapcsolása. Fent az órajel, lent az adat látható. ...................................................................................................................................... 54 46. ábra Programkód: Visszaszámlálás .................................................................................... 55 47. ábra Programkód: "RST" parancs végrehajtása ................................................................. 55 48. ábra Programkód: Megszűnt csatorna vizsgálata ............................................................... 56 49. ábra Kép: Felhasználói felület ............................................................................................ 57 50. ábra Kép: Beállítások.......................................................................................................... 58 51. ábra Kép: Elindított kategória............................................................................................. 59 52. ábra Kép: Beérkezett adatok ............................................................................................... 59 53. ábra Programkód: Eccel fájl olvasása ................................................................................. 60 54. ábra Programkód: Versenyzők kategóriákba sorolása ....................................................... 61 55. ábra Programkód: Csatlakozás a socket szerverhez ........................................................... 61 56. ábra Programkód: Kiválasztott kategória inicializálása ..................................................... 62 57. ábra Programkód: A következő körben induló versenyző párosok számának meghatározása .......................................................................................................................... 62 58. ábra Programkód: Wi-Fi-n érkező adatok fogadása ........................................................... 63 59. ábra Programkód: Idők kiolvasása a beérkezett üzenetből ................................................ 64 60. ábra Kép: Az elkészült áramkörök ..................................................................................... 65
70
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Képletjegyzék 1. Disszipálni képes teljesítmény .................................................................................................... 15 2. Disszipált teljesítmény ................................................................................................................ 15 3. Hasznos teljesítmény.................................................................................................................. 15 4. Hatásfok ..................................................................................................................................... 15 5. Kimeneti feszültség .................................................................................................................... 17 6. Feszültségosztó ellenállásainak aránya ...................................................................................... 17 7. Szükséges magas logikai szint ideje ............................................................................................ 21 8. Magas logikai szint ideje............................................................................................................. 21 9. R-C aránya .................................................................................................................................. 21 10. Ellenállásosztó .......................................................................................................................... 23 11. Kapott aránypár ....................................................................................................................... 23 12 Disszipált teljesítmény ............................................................................................................... 25 13. Tokozás által disszipálni képes teljesítmény ............................................................................. 26 14. Magas logikai szint ideje........................................................................................................... 27 15. Alacsony logikai szint ideje ....................................................................................................... 27 16. Kimeneti frekvencia.................................................................................................................. 28 17. Vezetősáv szélessége ............................................................................................................... 29 18. Vezetősáv keresztmetszete ...................................................................................................... 30 19. Kiszámított vezetősáv szélesség ............................................................................................... 30 20. LED-ek árama ........................................................................................................................... 30 21.Időzítő frekvenciája ................................................................................................................... 36 22. Baud-ráta generátor regiszter értéke ....................................................................................... 36 23. Maximális mérhető idő ........................................................................................................... 42
71
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Mellékletek jegyzéke
A szakdolgozathoz tartozik: 1. 1db CD melléklet, amely tartalmazza:
A szakdolgozat szövegét .DOCX és .PDF formátumban.
A szakdolgozat kiírását ..DOCX és .PDF formátumban.
A kapcsolási rajzokat .SCH formátumban a Rajzok mappában.
A nyomtatott áramkörök terveit .BRD formátumban a Rajzok mappában.
A számítógépes szoftver Visual Studio projektfájljait a PC projekt mappában.
A
számítógépes
szoftver
futtatható
állományát,
és
a
hozzá
segédállományokat a PC szoftver mappában.
Az indító modul firmware-ének forráskódját az Indito firmware mappában.
A cél modul firmware-ének forráskódját a Cel firmware mappában.
2. Az indító modul kapcsolási rajza (melléklet 1). 3. Az indító modul nyomtatott áramköri rajza (melléklet 2). 4. A cél modul kapcsolási rajza (melléklet 3). 5. A cél modul nyomtatott áramköri rajza (melléklet 4). 6. Az IR jeladó kapcsolási rajza (melléklet 5). 7. Az IR jeladó nyomtatott áramköri rajza (melléklet 6).
72
tartozó
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Melléklet 1
73
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Melléklet 2
74
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Melléklet 3
75
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Melléklet 4
76
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Melléklet 5
77
Miskolci Egyetem Gépészmérnöki és Informatikai Kar
Melléklet 6
78