Miskolci Egyetem Gépészmérnöki és Informatikai Kar Robert Bosch Mechatronikai Intézeti Tanszék
SZAKDOLGOZAT Furulyával kísért akusztikus MIDI lejátszó tervezése
Készítette:
Novák Dominika G-4BMR 2017
Tartalom 1. Bevezetés ....................................................................................................................................................... 1 2. A furulya felépítése és a furulyajáték vizsgálata ........................................................................................... 2 3. A tervezés folyamata ..................................................................................................................................... 5 4. A tervek kidolgozása ..................................................................................................................................... 9 4.1
A váz ................................................................................................................................................ 9
4.2
Furatok lefogásának mechanizmusa .............................................................................................. 11
4.3
Levegőellátás ................................................................................................................................. 12
4.4
Az elektromos vezérlés .................................................................................................................. 13
4.5
Az alkalmazni kívánt Arduino fejlesztői platform ......................................................................... 14
4.6
Az SD kártyaolvasó modul ............................................................................................................ 17
4.7
Tápegység ...................................................................................................................................... 17
4.8
Motorvezérlő áramkörök................................................................................................................ 18
5. Dallamjátszás............................................................................................................................................... 21 5.1.
Anvil Studio ................................................................................................................................... 21
5.2
A dallamjátszó program ................................................................................................................. 22
5.2.1
A szöveges fájl olvasása ................................................................................................................ 23
5.2.2
A dallamjátszás elemei .................................................................................................................. 24
5.2.3
A dallamjátszás megvalósítása ....................................................................................................... 24
6. Az elkészült konstrukció, tapasztalatai és továbbfejlesztése ....................................................................... 25 6.1
Megoldásjavaslatok továbbfejlesztésre .......................................................................................... 25
Összefoglalás ................................................................................................................................................... 30 Summary ......................................................................................................................................................... 31 Irodalomjegyzék .............................................................................................................................................. 32 Ábrajegyzék .................................................................................................................................................... 34 Melléklet............................................................................................................................................................ 1 M1. A furulya fogástáblázata [14] ................................................................................................................. 1 M2. Mini Tec elemek [2] ............................................................................................................................... 4 M3. A vezérlő program kódja ........................................................................................................................ 5
I
1. Bevezetés A dolgozat bemutatja egy automatizált furulya tervezésének és elkészítésének lépéseit. A furulya mind az amatőrök, mind a zeneiskolai tanulók és hivatásos zenészek körében elterjedt hangszer. A hangszeren való játék magas szintű elsajátítása sok évet igényel, a zeneművészek
napi
több
órát
gyakorolnak,
emiatt
vált
igény
a
hangszerek
automatizálására. Már az antik Görögországban, Egyiptomban és a Közel-Keleten is készítettek mechanikusan működtetett zenei berendezéseket. Európában az arabokon keresztül vált ismertté a IX. században. Első formáik a zenélő toronyórák, harangjátékok, kakukkos és asztali órák. Ezek a zenei élmény mellett mozgó figurákkal kiegészítve szórakoztatták a nézőközönséget. Komolyabb szerkezetek a víziorgonák, melyeket vízturbina hajt meg. A világ első automata orgonája a Quirinale székesegyházba készült [1], amelynek szöges hengerét víz segítségével forgatták és víznyomás állította elő a sípok megfújásához szükséges sűrített levegőt. A felvilágosodás korában (XVII. sz.) ugrásszerű fejlődésen mentek keresztül és terjedtek el igazán a zenegépek. Ekkor vált ketté a kézzel hajtott zenélő szerkezetek, mint például verklik, orgonák csoportja a rugó hajtású gépektől, melyek emberi beavatkozást csak a rugó felhúzásáig igényelnek. Jelen korban is ugyanúgy aktualitása van a hangszerek automatizálásának, hiszen a mai ember, ha csak teheti, igyekszik gépekkel végeztetni a fizikai munkát. Egy zenélő humanoid robot elkészítése komoly finommechanikai, vezérléstechnikai feladat. A japánok élenjárók e téren. Készített például trombitáló és hegedülő robotokat a Toyota cég [4]. A szintén japán Z-Machines zenei társulat gitáros, dobos és billentyűs robotokkal ad rock koncerteket [5]. A hangszerekre vonatkozóan rövid történelmi áttekintést adott az [1] irodalom. A második fejezet ismerteti a furulya felépítését a [2] irodalom alapján, és vizsgálja a furulyajátékot, melyhez segítséget nyújtottak zeneművészek és a [12] irodalom. A harmadik fejezet a pontos tervezési célok meghatározásával kezdődik és vázolja a tervezési folyamat menetét. A negyedik fejezetben találhatók a szerkezet kidolgozott tervei. A tervezést legfőképp a [3] irodalom segítette. Az ötödik fejezet bemutatja a kottaolvasó és dallamjátszó programot. A hatodik fejezet az elkészült konstrukciót. Az összefoglalás tartalmazza az elért eredményeket, valamint a jövőbeni terveket.
1
2. A furulya felépítése és a furulyajáték vizsgálata A fejezet a furulya pontos meghatározásával, felépítésével és a hangok megszólaltatásának módjával foglalkozik. A [2] irodalom a következő meghatározást alkalmazza a furulyára: „A műzenében használatos furulya a szélcsatornás hangszerek között a legfejlettebb hangszer: mindkét végén nyitott, lineáris síp, 7 játszólyukkal a felső oldalán és egy „oktávváltó” lyukkal a hüvelykujj számára az alsón. Ajaksíp, azaz egy éles peremnek („labium”, vagy „ajak”) ütköző légáram gerjeszti a hangot, nincs mozgó szilárd elem sem a hangszerben (mint például az oboa nádja), sem a játékos testében (mint a trombitás ajka), csak a levegő vibrál a megfelelően kialakított térben. Szélcsatornás, azaz a hangszertestbe épített kis csatorna vezeti a légáramot a labiumnak, nem úgy, mint a fuvoláknál és peremfurulyáknál, ahol a szélcsatornát a játékos ajkai képzik. Lineáris, azaz vonalszerű: a hangszer tengelyére merőleges sík hullámfrontokban terjed benne a hang, szemben a térfogati sípként működő körtemuzsikával és gemshornnal. Mindkét végén nyitott, ellentétben a „fedett” orgonaajaksípokkal vagy a pánsíppal. Vannak rajta játszólyukak – nem úgy, mint a lyukak nélküli tilinkón – és a felső oldalon 7 darab van belőlük, szemben a 6 vagy ritkábban 5 lyukú népi furulyákkal.” Az 1. ábra bemutatja a furulyafej kialakítását.
1. ábra: A fej A furulya három részre szedhető szét, a fejre, a középrészre és a lábra, ezt a 2. ábra mutatja. A fej és a láb között hangolás miatt szükséges a szerelhetőség. Ha a fej és középrész csatlakozásánál szét van húzva egy kicsit a hangszer, akkor mélyebben, ha össze van tolva, akkor magasabban szól, mert a cső hosszának változtatása által változik a hangszerben rezgő levegőoszlop hossza, ami a hangmagasságot befolyásolja [2]. A lábrész állíthatóságának oka, hogy a lábon található lyukat nem érné el a zenész ujja, ha az egy egyenesbe esne a többi lyukkal. Ezért forgatással mindenki beállíthatja a saját újhosszának megfelelően, hogy kényelmesen érje el az utolsó lyukakat.
2
2. ábra: A furulya részei: a) fej, b) középrész, c) láb A furulya furatainak megkülönböztetésére használatos az 3. ábra jelölésrendszere. A furatok értelemszerűen számozva vannak. A 0F/0 jelölés arra utal, hogy a furatot bizonyos hangokhoz félig (0F), más hangokhoz teljesen (0) be kell fogni. Ugyanez vonatkozik 6F/6 és 7F/7 jelölésekre is.
3. ábra: Furatok megkülönböztetésére alkalmazott jelölésrendszer A hangszer megszólaltatásához a zenész mély levegőt szív magába, a furulya csőrét az ajkai közé veszi, majd a tüdejéből kiáramló szabályozott sebességű légárammal és ezzel egy időben adott fogással tud megszólaltatni egy hangot. A standard fogások táblázata [14] megtalálható a mellékletben, a tervek ezen fogások megvalósításával foglalkoznak. A magasabb skálafokhoz sebesebb gerjesztő légáram szükséges. A befúvás sebessége oktávonként nagyjából megkétszereződik [2]. Fontos észrevennünk, hogy a zenészek komoly artikulációs munkát végeznek játék közben. Ennek elsőként elsajátított eleme, hogy bizonyos hangok megszólaltatásakor „tű”-t mondanak a furulyába. Mi történik eközben? Tudjuk, hogy a „t” zárhang, tehát elzárjuk a levegő útját egy pillanatra, miközben kiejtjük. A zárás időtartamának megállapítására végezte el John Martin a 3
következő mérést Moeck típusú szoprán furulyával C5 hangra. A hang indítása kemény, zárhanggal történt (tah-tah). A mérést egy keskeny csővel végezte, amelyet a furulya csőrébe ragasztott. A csőhöz nyomásmérőt kapcsolt és a műszer egyenáramú kimenetét 10 kHz frekvenciával mintavételezte, a mért adatokat rögzítette. Közel a hangszer ablakához elhelyezett egy mikrofont és hangfelvételt is készített. Visszajátszva a légnyomás adatokat és demodulálva rákötötte egy oszcilloszkóp egyik bemeneti csatornájára, miközben a hangfelvételt is visszajátszotta és egy szűrőn keresztül az oszcilloszkópnak egy másik csatornájára vezette [12]. A mérés eredményét mutatja a 4. ábra. Leolvasható, hogy körülbelül 0,1 s időtartam alatt csillapodik le a kezdeti tranziens. Ez azt jelenti, hogy ennyi ideig tart, míg a zenész nyelve szabad utat enged a levegőnek.
4. ábra:A zárás időtartamának megállapítása [12]
4
3. A tervezés folyamata Ez a fejezet bemutatja a furulyázó szerkezet megalkotásának menetét és előkészíti a részletes tervezést, termékdokumentációt. A tervezési folyamat algoritmusát az 5. ábra szemlélteti. Célkitűzés
Lehetséges hibák és azok okainak felsorolása
Termék blokkdiagramja
Részletes tervezési követelmények
Prototípus
Tervezési célok
Termékdokumentáció
NEM Tesztek
IGEN
Tömeggyártásra alkalmas
5. ábra: Tervezés algoritmusa Cél egy szoprán furulyán játszó szerkezet tervezése és egy darab prototípus előállítása. Hangja legalább olyan minőségű legyen, mint egy alapfokú művészeti intézményben négy évet végzett tanuló játéka. Behelyezhető legyen egy 13-15 évesekből álló kamarazenekarba az egyik szólam játszására. Minimum tíz perces darabot képes legyen lejátszani. Olcsón, 5
saját, a Miskolci Egyetem Robert Bosch Mechatronikai Intézeti Tanszéke, valamint szponzorok finanszírozásával elkészíthető legyen. A lehetséges feltételezett hibák, hibás működések és azok okainak strukturált felsorolását a 6. ábra mutatja be. Cél, az előbbiek figyelembevételével egy olyan konstrukció tervezése, mely a felsorolt hiba okokat kizárja. Így a vevő igényeinek megfelelő robosztus termék jön létre. A halszálka diagram fő bordáin a hibás jelenségek, míg a bordák szálkáin a hiba okok vannak felsorolva, olyan mélységig, hogy lehetőleg felfedje a gyökérokokat. Kellemetlen zenei hangzást okoznak a hamisan megszólaló hangok, de hiába szólalnak meg tisztán az egyes hangok, ha rossz a ritmus vagy a berendezés működéséből adódó zajok elnyomják a dallamot szintén élvezhetetlenné válik az eredmény. A 7. ábra szemlélteti a berendezés blokkdiagramját, vázlatosan összefoglalja a termék fő egységeit és azok egymással való kapcsolatait.
Így
azokat
a
tervezett
konstrukció
lehetőleg
eleve
kizárja.
A
termékdokumentáció olyan mélységű leírása a szerkezetnek, amely alapján a gyártási dokumentáció, technológia készíthető úgy, hogy a vevői követelményeknek megfelelő termék jön létre. A prototípus egyetlen, legtöbbször néhány darabos kis széria egyedi legyártása, amelyeken méréssel, tesztekkel ellenőrizhető, hogy a termék valóban megfelel a tervezői követelményrendszernek, a vevői igényeknek. A tesztek méréssorozatok elvégzése fontos, hiszen ezek biztosítják majd a termék megfelelőségét.
6
6. ábra: Halszálka diagram
7
7. ábra: A blokkdiagram A rendszer működtetéséhez villamos és pneumatikus energiaellátásra van szükség, amely a blokkdiagram felső részén látható. Egy elektromos matracpumpa [10] biztosítja a szükséges légáramot. A szelep modellezi a zenész nyelvét, amely nyitásával, zárásával különülnek el egymástól a hangok. A szelepből a furulya sípjába áramlik a levegő. A villamos tápegység feszültséget biztosít, ezt osztja el és transzformálja megfelelő szintre a feszültségszabályozó áramkör, amely megtáplálja a billentyűket vezérlő IC-ket és a mikrovezérlőt. A mikrovezérlő olvassa a dallamjátszáshoz szükséges információkat az SD (Secure Digital) kártyáról és ennek megfelelően vezérli az IC-ket, azok pedig a billentyűket, amelyek adott jelre nyitják, zárják a furulya furatait.
8
4. A tervek kidolgozása Jelen fejezet foglalkozik a berendezés megalkotásához szükséges tervek ismertetésével.
4.1
A váz
A furulyázó berendezés alapját egy vázszerkezet képezi, amelyre rákerül a hangszer, az aktuátorok és a vezérlés. A váz feladata, hogy stabilan megfogja a hangszert és a billentyűket. Tervezési követelmény, hogy állítható legyen az állvány minden darabja. Mind az állíthatósági, mind a merevségi követelménynek jól megfelelnek a Mini Tec Profil [6] elemek. A váz felépítéséhez használt elemeket a melléklet tartalmazza. A váz a 8. ábrán látható a háromdimenziós modell szerint épül fel.
8. ábra: A váz modellje A kész konstrukciót a 9. ábra mutatja be.
9. ábra: A legyártott váz fényképe A sarokelemek biztosítják, hogy a lábak és a kötőelemek ne lötyögjenek, a műanyag záróelemek, hogy a lábak ne karcolják az asztalt, illetve ne legyenek balesetveszélyesek az
9
állvány éles sarkai. Mivel a furulya teste kúpos, ezért nem célszerű a hangszer vízszintes felfogatása. Egyszerűbb a hangszert olyan szögben felfogni, hogy a kúpos test külső palástja helyezkedjen el vízszintesen, mint a billentyűket állítani, a kúpossághoz. A 10. ábra az érthetőség kedvéért az arányokat felnagyítva ábrázolja a problémát.
10. ábra: A furulya és a billentyűk elhelyezkedése Megoldásképp menetes száron függőlegesen finoman állítható magasságú furulyatartó prizmák kerültek kialakításra 11. ábra. Anyaga 4 mm-es rétegelt falemez, lézervágással készült két alkatrészből a 12. ábra tervei alapján és az alkatrészek Dr. Schenk 403 faragasztóval vannak összeragasztva.
11. ábra: Furulytartó prizma kialakítása
12. ábra: Furulyatartó prizma tervei 10
4.2
Furatok lefogásának mechanizmusa
A furulyás, miközben játszik hangszerén, az ujjaival nyitja és zárja a furulya játszólyukait, amelyeknek kétféle funkciója van. Megrövidítik a hangszer testében rezgő levegőoszlopot, vagy megszüntetik a légrezgés egyik csomópontját. Ezáltal változik a furulya hangmagassága. A [2] irodalom részletesen foglalkozik a fogások és általuk létrehozott hangok összefüggéseivel. Jelen probléma a zenész ujjainak modellezése, miközben furulyázik. Az első tervek szerint elektromágnesek fogták le a furulya furatait, azonban költséghatékonyság miatt merevlemezekből kialakított karok oldják meg a fogásokat. Előnye még ennek a konstrukciónak, hogy nem igényli sok új alkatrész legyártását. 3,5”-os merevlemezben található egy csapágyazott fejmozgató aktuátor, amely az olvasófejet mozgatja. Igazi finommechanikai eszköz, saját elektronikával rendelkezik, 12 V-tal vezérelhető. A mozgató mechanika alacsony áron beszerezhető és ezáltal a leselejtezett elemek újrahasznosításra kerülnek. A 13. ábrán látható a merevlemezből kiszerelt egység és a kar meghosszabbítása zárt cellás szilikon habszalag szigetelőanyaggal a végén. A fejmozgató egység a megfelelő lábaira forrasztott vezetéken keresztül kapcsolódik a vezérlő áramkörhöz. A kar működés közben egyik végállásától a másikig mozog. Amikor zárja a furatot, akkor a hangszeren ütközik fel a szilikon habszalag, ez nem jár jelentős zajjal. Ha kinyit a kar, akkor azonban a merevlemez belsejében egy ütközőn áll meg csattanás kíséretében. Ennek tompítása céljából a merevlemez belsejében az ütközőre is került habszalag. habszalag az ütközőn
toldókar
szilikon habszalag villamos csatlakozók
13. ábra: A merevlemez fejmozgató egysége A 14. ábra szemlélteti az állványon a furulyatartó prizma, a hangszer és a furatzáró karok egymáshoz való elhelyezkedését.
11
14. ábra: A lefogó mechanizmus
4.3
Levegőellátás
A zenész a furulyát 5 − 14
𝑙 𝑝𝑒𝑟𝑐
áramlási sebességgel fújja (lásd: 15. ábra). A magasabb
hangok megszólaltatásához nagyobb légáramra van szükség. Egy elektromos matracpumpa megfelelő lehet a feladatra, hiszen hasonló mennyiségű levegőt kell, hogy fújjon, mint amennyit az ember képes. A matracpumpát egy maximum 12 V egyenárammal működtethető motor hajtja. A DC motorok fordulatszáma feszültséggel szabályozható az (1) összefüggés szerint: 𝑛=
𝑈𝑖 , 𝑘 ∙ ϕ𝑚𝑎𝑥
(1)
ahol 𝑛 a fordulatszám és 𝑈𝑖 az indukált feszültség, 𝑘 a motorra jellemző állandó, ϕ𝑚𝑎𝑥 a maximális pólusfluxus szintén állandó, tehát a feszültség az egyetlen változó az egyenlet jobb oldalán [13].
12
15. ábra: A hangokhoz tartozó térfogatáramok [3] A zenészek a furulyát nem egy folyamatos légárammal fújják, hanem gyakran megszakítják azt két hang között egy pillanatra és „tű”-t mondva a furulyába újraindítják. Így különítik el egymástól a hangokat vagy nyomatékosabban indítják a következő hangot. Ezért került beépítésre a 2/2-es útváltó szelep, ami modellezi a zenész nyelvét (lásd: 16. ábra). Az újraindítás időtartama átlagosan 0,1 másodperc. Az erre vonatkozó mérés olvasható a dolgozat 2. fejezetében.
16. ábra: A furulya levegőellátása
4.4
Az elektromos vezérlés
A vezérlés elemei egy számítógép, egy mikrokontroller, egy SD kártya modul, egy tápegység, IC-k, vezérelhető billentyűk, pumpa és egy elektromos vezérlésű szelep. Az elemek kapcsolatát a 17. ábra szemlélteti.
13
17. ábra: A furulya vezérlése Számítógépen kell létrehozni a dallamjátszáshoz szükséges forrásfájlt, azaz a kottát, amelyet az SD kártyaolvasó modulban található memóriakártyára helyezünk át. Szintén számítógépen kell megírni a dallamjátszó programot, amely USB kábelen keresztül áttölthető az AVR típusú mikrovezérlőre, majd ez a kapcsolat meg is szüntethető. Az AVR ezután egy 400 W-os AT-X szabványos tápegységről (PSU – Power Supply Unit) kapja az energiaellátást, közvetetten a H-hidas vezérlő IC-n keresztül. A motorvezérlő kártya ugyanis tartalmaz egy L7805-ös IC-t, amely előállítja a megfelelő feszültségszintet a mikrovezérlőnek. Az AVR futtatja a programot és annak megfelelően bináris jeleket ad a kimenetein. A jelek szintje, alacsony ahhoz, hogy működtesse, a billentyűket, a szelepet és a pumpát, ezért a mikrovezérlő és a végrehajtók közé L298N típusú H-hidas motorvezérlő IC-ket kell alkalmazni, adatlapjukat a [7] irodalom tartalmazza. Energiaellátásuk a tápegységről történik. Egy IC két merevlemez fejmozgató aktuátor vezérlésére alkalmas, tehát a nyolc furat lefogásához, a pumpa és a szelep vezérléséhez összesen öt darab szükséges. Ha az IC engedélyező jelet kap a mikrovezérlőtől, akkor a tápegység biztosította feszültség megjelenik az IC kimenetén és vezérli az adott végrehajtó szervet.
4.5
Az alkalmazni kívánt Arduino fejlesztői platform
A kotta olvasását, a szervomotor és a billentyűk vezérlését az Atmel AVR gyártmányú mikrovezérlőre épülő Arduino végzi, melyet elsősorban kezdő programozóknak, diákoknak fejlesztett, előre összeszerelt elektronikus panel (Arduino Board). Előnye, hogy könnyen beszerezhető, olcsó, egyszerű a kezelése, programozható és csatlakoztatható más
14
elektronikai eszközökhöz. Az Arduino Board-oknak több típusa létezik. A kiválasztás szempontjai
a
következők:
11
db
billentyűvel
minden
standard
furulyafogás
megvalósítható. (Jelen kivitelezésben 8 billentyű szerepel, a továbbfejleszthetőség céljából ebben a számításban álljon 11.) Billentyűnként 2 db digitális kimenetre van szükség és emellett kell egy-egy digitális és PWM (Pulse Width Modulation, azaz impulzusszélesség moduláció) kimenet a pumpa és a szelep vezérléséhez. Tehát összesen minimum 24 digitális és 2 PWM kimenet szükséges. Legyen Flash memóriája. Legmegfelelőbb a 18. ábrán látható Mega 2560 típusszámú Arduino fejlesztőplatform, melynek sematikus ábráját a [8] irodalom és műszaki adatait az 1. táblázat tartalmazza. adat küldést jelző LED
PWM kimenetek
adat fogadást jelző LED
digitális kimenetek
USB PORT
AT MEGA 2560 RESET
energiaellátás
feszültség ki-/ bemenet 18. ábra: Az Arduino Mega fejlesztőplatform Név:
Jellemzők:
Mikrovezérlő
ATmega2560 (AVR)
Üzemi feszültség
5V
Bemeneti feszültség (ajánlott)
7-12 V
Bemeneti feszültség (határ)
6-20 V
Digitális ki-/bemenetek
54 amelyből 15 kimenet ad PWM jelet
Analóg bemenetek
16 db
Egyenáram egy ki-/bemeneten
20 mA
Egyenáram a 3,3V-os kimeneten
50 mA
Flash memória
256 KB amelyből 8 KB-ot használ a 15
rendszerbetöltő program SRAM
8 KB
EEPROM
4 KB
Órajel
16 MHz
Hosszúság
101,52 mm
Szélesség
53,3 mm
Tömeg
37 g 1. táblázat: Az Arduino modul specifikációi
A számítógéphez USB kábellel csatlakoztatható, ezen keresztül kap tápellátást a mikrovezérlő és kommunikál a PC-vel. Programozására létezik egy a [9] internetes oldalon szabad hozzáférésű integrált fejlesztői környezet (IDE), melyet elindítva a 19. ábra kezelőfelülete jelenik meg. A programozás megkezdése előtt a Tools/Boards menüpontban be kell állítani a használni kívánt panel típusát, majd a Tools/Processor menüpontban, hogy melyik COM portra van csatlakoztatva a panel. Ezen beállítások után kezdhető el a programozás.
mentés
ellenőrzés
új
megnyitás
általános beállítások feltöltés főprogram
értesítések a program ellenőrzése után
Arduino egység típusa és a kommunikácós port
19. ábra: IDE kezelőfelülete
16
4.6
Az SD kártyaolvasó modul
Az SD kártyaolvasó modul lehetővé teszi egy cserélhető, hordozható adattároló beépítését a rendszerbe. A memóriakártya feladata a kotta tárolása, amelyet a mikrovezérlő beolvas és értelmez. Az SD modul és az Arduino Mega board soros porton kommunikálnak egymással. Az eszközök csatlakoztatásának módját a 20. ábra mutatja be.
20. ábra: Az Arduino MEGA board és az SD modul összekötése [15]
4.7
Tápegység
A tápegység biztosítja a villamos energiát a pumpa, a szelep, az Arduino, a motorvezérlő áramkörök és a billentyűk számára. A pumpában egy egyenáramú motor található, amely hálózatra kapcsolva P villamos teljesítményt vesz fel (lásd: 21. ábra).
17
21. ábra: A motor teljesítményfelvétele Minden teljesítményt meghatározva: P𝑓𝑒𝑙𝑣𝑒𝑡𝑡 = 24 𝑊 + 5,76 𝑊 + 2,6 𝑊 + 37,8 𝑊 + 102,3 𝑊 = 172,46 𝑊
(2)
a rendszer fogyasztása. A teljesítményadatokat összefoglalja a 2. táblázat. Fogyasztó
Felvett teljesítmény [W]
Pumpa
24
Szelep
5,76
Arduino board
2,6
Motorvezérlő kártyák (7 db)
37,8
Merevlemez fejmozgató aktuátorok (11db)
102,3
Összesen
172,46
2. táblázat: A számított teljesítmények Az alkalmazáshoz illeszkedik az ATX N- 400 W típusú tápegység (lásd 22. ábra), amely maximálisan 400 W teljesítményt ad le. A tápegység bekapcsolásához rövidre kell zárni a zöld és a fekete kimeneteket. Ezután a kapcsolóval indítható.
22. ábra: A feladathoz használt tápegység
4.8
Motorvezérlő áramkörök
Az Arduino kimeneti jelszintje 5 V, a pumpa, szelep és a karok működtetéséhez azonban 9-12 V szükséges. Ezért a 23. ábrán és a 3. táblázatban bemutatott illesztő elektronika kerül a vezérlőkártya és a végrehajtó szervek közé.
18
L298N IC
L7805 IC
20
12 13 14 15 16 17 18 19
1 2
3
4
5
6
7
8
9
10 11
23. ábra: Az L298N IC köré épült motorvezérlő kártya Sorszám
Megnevezés Feladat
1
OUT1
1. DC motor egyik lába
2
OUT2
1. DC motor másik lába
3
VCC
A motor bemeneti feszültsége, maximum 35 V DC.
4
GND
A motor föld pontja.
5
5V
5V kimenet, ha JP1-en van áthidaló.
6
ENA
Az 1. DC motorhoz tartozó engedélyező láb
7, 8
In1, In2
bemenet az 1. motor vezérléséhez 5V
9, 10
In3, In4
bemenet a 2. motor vezérléséhez 5 V
11
ENB
A 2. motorhoz tartozó engedélyező láb.
12, 13, 16, 17
5V
5 V kimenet, alkalmas például az Arduino megtáplálására vagy engedélyező jel biztosítására ENA, ENB számára.
14, 15
GND
földpont
18
OUT3
2. DC motor egyik lába
19
OUT4
2. DC motor másik lába
20
JP1
A két tüske egy áthidalóval összeköthető, ha a motor tápfeszültsége legfeljebb 12 V DC. Ez esetben működik az 5V regulátor. 3. táblázat: A vezérlőkártya csatlakozásai
A karok, a pumpa és a szelep vezérlésének kapcsolási rajzát az 16. ábra tartalmazza. A karokat két végállás között kell mozgatni. Ez úgy valósul meg, hogy amikor a kar bezár, akkor az OUT 1 kimeneten földpont van, az OUT 2 kimeneten 12 V, amikor pedig nyit a kar, akkor polaritás csere történik a két kimenet között. A pumpa és a szelep vezérlésének 19
elve megegyezik. Mindkettő lehet bekapcsolt vagy kikapcsolt állapotban és szabályozható a tápfeszültségük nagysága. A be-, illetve kikapcsolás az Arduino egy-egy digitális kimenetéről vezérelhető a motorvezérlő engedélyező lábaira adva jelet. A feszültségszint szabályozásához PWM kimenetről vett jelet kell kötni a motorvezérlő bemenetére.
20
5. Dallamjátszás A fejezet bemutatja az Anvil Studio [16] kottaszerkesztő program segítségével leírt dallamok beolvasásának módját, hogy azt a furulyázó berendezés képes legyen lejátszani.
5.1.
Anvil Studio
Az Anvil Studio egy szabad hozzáférésű dallamszerkesztő program. Öt vonalas rendszerben lehet benne kottát írni. Kezelőfelületét a 24. ábra mutatja a Jingle Bells kottájával. A létrehozott fájlok formátuma MIDI, amely a zenei események leírására szolgáló protokoll.
24. ábra: Az Anvil Studio kottaíró felülete Miután elkészült a kotta, válthatunk a program „View” menüjében az „Event List”, azaz esemény lista megjelenítésére. Ekkor a 25. ábrán bemutatott formában jelenik meg a kotta, amely leírja, hogy hányadik ms-ban mi történik a zenében. Az eseménylista első soraiban a kottára vonatkozó általános információk szerepelnek. A 8. sorában kezdődik a dallam leírása. A „Min:Sec:Msec=0:00:000.NoteOn chan:1 note:71” jelenti, hogy a 0. ms-ban megszólal
a
71-es
számmal
jelölt
H
zenei
hang.
A
következő
sorban
„Min:Sec:Msec=0:00:500.NoteOff chan:1 note:71” szerint az 500. ms-ban kikapcsol a 71es hang. Ennek megfelelően folytatódik a dallam leírása. A zenei hangok számjelölései egyezményesek, a MIDI szabvány írja le őket [17]. A kezelőfelületen látható „Save Symbolic…” ikonra kattintva txt formátumban menthető a dallam eseménylistája. Az így kapott szövegfájlt áthelyezve a memóriakártyára képes feldolgozni az Arduinoban futó dallamjátszó program.
21
25. ábra: Anvil Studio, Event List
5.2
A dallamjátszó program
Az Arduino-ban futó dallamjátszó program a 4.5 alfejezetben bemutatott fejlesztői környezetben került megírásra. A programkód megtalálható a mellékletben. 4 hang definiálását tartalmazza, a többi zenei hang leírásának analógiája megegyezik a 22
bemutatottakkal. A mikrovezérlő először megpróbál kapcsolatot létesíteni az SD kártyaolvasó modullal, utána a program ciklusban beolvassa a dallamot leíró szövegfájlt a memóriakártyáról és utasításokat ad az aktuátoroknak a dallam lejátszásához. Három nagyobb egységre tagolható a vezérlő program. A dallamot leíró szöveges fájl olvasását végző egységre, a dallamjátszás elemeit leíró egységre és a dallamjátszó „loop” végtelen hurokfüggvényt tartalmazó egységre.
5.2.1 A szöveges fájl olvasása Mivel az SD kártyaolvasó modul soros porton keresztül kommunikál a vezérlővel, ezért szükség van az „SD.h” és „SPI.h” header fájlokra. Az Arduino MEGA board és az SD kártyaolvasó modul mester-szolga kapcsolatban állnak egymással, ezért az Arduino MEGA board az 53-as pin segítségével tudja engedélyezni vagy letiltani a hozzá csatlakoztatott szolga eszközt.
Ezt állítja be a „const int chipSelect = 53;”
programsor. Egy „setupSD” függvény létesít soros kommunikációt az SD kártyával. Ha felismerte a memóriakártyát, akkor engedélyezi a kommunikációt a „chipSelect” nevű pinen keresztül, ha nem, akkor hibaüzenetet küld. Egy függvény keresi az SD kártyán található szöveges fájlban a számokat, neve „OlvassBeEgySzamot”. Ha nem talált számot, akkor visszatér a függvény elejére és folytatja a keresést. Ha már talált a program egy számot, akkor megjegyzi azt, és le tud futni az „OlvasdBeAKovetkezoSzamot” függvény és sorban beolvassa a következő számokat. A forrásfájl felépítése sorokra tagolódik, ezért szükséges
a
sorvégek
felismerésére
az
„OlvassEnterig”
függvény.
Egy
„NoteOnKarakterSzamFrissites” függvény szolgál a NoteOn szövegrészlet felismerésére. Erre azért van szükség, mert mindig a „NoteOn” után áll a zenei hangot jelölő beolvasandó szám. A „VaneNoteOnSzovegASorban” függvény az elnevezése szerinti vizsgálatot teszi. Az 25. ábrán látható, hogy az Anvil Studio fájl formátuma kétféle eseményt tartalmaz. A hang bekapcsolását vagy kikapcsolását („NoteOn”/„NoteOff”) és ezek mindig egymást követő sorokban szerepelnek. Ezért az „OlvassBeEgyNoteOnNoteOffParost” algoritmus jogosan azt feltételezi, hogy „NoteOn” szöveget tartalmazó sorok után mindig „NoteOff” szöveget tartalmazó sor következik. Minden sorban az elsőként szereplő számok egy időpontot definiálnak. Ezt beolvassa az algoritmus, majd megnézi, hogy a sorban NoteOn szöveg követi-e. Ha igen, akkor beolvassa a sorban hátralevő, hangmagasságot jelölő számot is, majd a következő sorból egyedül a hang befejezésének időpontját. Ha nem talált „NoteOn” szöveget a függvény, akkor tovább folytatja a keresést. A felismert hang magasságát, kezdő és végpontját globális változók tárolják el. A hang felismerése után
23
kiszámításra kerül, hogy milyen hosszú szünet volt a hang előtt és milyen hosszú az az időtartam, amíg szól a hang.
5.2.2 A dallamjátszás elemei Ez az egység tartalmazza az Arduino számozott lábainak elnevezéseit. Itt található a „SetupMechanika” függvény, amely kimenet módba állítja az Arduino megfelelő lábait és a „szelep” függvény, amely azt a műveletet írja le, amikor a zenész „tű”-t mond a nyelvével két hang között. Vezérlőjel hatására a szelep elzárja a levegő útját, ennek időtartama körülbelül 20 ms, majd 60 ms-ig zárva tart és ezután kinyit a szelep, amely időtartama szintén körülbelül 20 ms. Így összesen 0,1 másodperc időre szakad meg a légáram. Ennyi időt mért a furulyajátékban John Martin a 2. fejezetben leírt módon. A szelep zárási és nyitási gyorsasága állítható a „szelepPWM” lábról. Ha gyorsan nyit a szelep, akkor keményebben, ha lassan nyit a szelep, akkor lágyabb hangzással indul a zárást követő hang. Definiálva vannak ebben az egységben egy-egy függvényként a hangok. Például a „G6” függvény leírja, hogy a MIDI szabvány szerinti hatodik oktáv G hangját mekkora térfogatáramú levegő szólaltassa meg és melyik játszólyukakat szükséges lefogni. A térfogatáram szabályozás is PWM jelt adó lábról történik. Az Arduino PWM frekvenciája körülbelül 500 Hz, ez azt jelenti, hogy 2 ms időtartam kitöltési tényezője változtatható. A kitöltési tényező megadja, hogy 2 ms időtartam hányad része alatt ad jelt a láb, ez az érték 0-255 között változtatható. Ha a kitöltési tényező 0, akkor áll a motor, ha 255, akkor maximális tápfeszültséget kap, ha 175, akkor a tápfeszültség 50%-a hajtja a motort [11]. Található még az egységben egy „Jatssz” függvény, amely utasítást ad az „OlvassBeEgyNoteOnNoteOffParost” függvény által felismert hang lejátszására.
5.2.3 A dallamjátszás megvalósítása A dallamjátszás megvalósításához szükséges a „setup” függvényre, amely meghívja a „setupSD” és „setupMechanika” függvényeket, és a végtelen „loop” ciklusra, amely üzembe helyezi a pumpát és a szelepet, majd megnyitja a memóriakártyáról a lejátszani kívánt dalhoz tartozó szövegfájlt. Ha megtalálta ezt a fájlt, akkor annak alapján lejátssza a dalt az „OlvassBeEgyNoteOnNoteOffParost” és „Jatssz” függvények segítségével. Ha nem találta a program a keresett szövegfájlt, akkor hibaüzenetet küld. A ciklus végén leáll a pumpa, a szelep bezár, majd a megadott várakozási idő után újraindul a ciklus, tehát kezdi előröl a darab lejátszását.
24
6. Az elkészült konstrukció, tapasztalatai és továbbfejlesztése A 26. ábra bemutatja az elkészült prototípust felülnézetből.
pumpa
furulya
billentyűk
tápegység
szelep
SD kártya modul Arduino board motorvezérlő kártyák
furulyatartó prizmák
26. ábra: Az elkészült furulyázó rendszer A szerkezet váza stabil, könnyen átalakítható, szükség esetén újabb elemek felszerelése megoldható. A billentyűk pontos ritmussal játszanak. A tesztelésnél a szilikon habszalag nem tömített teljesen szivárgásmentesen, ezért a 6.1 alfejezetben megoldásjavaslatok lesznek ismertetve. A levegőellátás megfelelő tartományban szabályozható, azonban a pumpa tehetetlensége miatt lassú a szabályozás.. Például a „Gólya-gólya gilice” lejátszásához megfelelő, de egy pörgős tarantella lejátszására már nem lenne alkalmas. Az elektromos vezérlés kiszolgálta a követelményeket, a vezérlő program továbbfejlesztése folyamatban van.
6.1
Megoldásjavaslatok továbbfejlesztésre
A winchestert megtoldó karok kicserélhetők olyanra, hogy a furatot lefogó részük a furulya hengeres felületén feküdjenek fel. Kialakításának módja, hogy tekerjünk csiszolópapírt a furulya köré, majd balsafa léceket csiszoljunk formára. A balsafa könnyű és puha. Erre kerül egy vékony szivacsréteg, amely tudja követni a hengerfelületet, így nagyobb felületen érintkezik a hangszerrel a lefogó kar, ahogyan a 27. ábra mutatja. 25
27. ábra: Balsafa lefogókar 𝑙
Levegőellátás szabályozására a piacon nincs forgalomban olyan szelep, amely 5 − 14 𝑝𝑒𝑟𝑐 térfogatáram tartományban fokozatmentesen finoman szabályozható lenne. Ezért vált szükségessé kifejleszteni erre a célra az egyedi szelepet. Kiindulási adatnak megfelelő, hogy a kilépő keresztmetszet maximuma egyezzen meg a furulya szélcsatornájának keresztmetszetével, ami 19,6 𝑚𝑚2 és forgómozgással, fokozatmentesen szabályozható legyen nullától a maximális értékig. A levegő útja kanyarog, vannak benne veszteségek, ezért méretezzük 1,5-ös biztonsági tényezővel: 19,6 ∙ 1,5 = 29,4 𝑚𝑚2, így legyen a kimenő
keresztmetszet
30 𝑚𝑚2 .
A
térfogatáram
egy
csigavonalban
szűkülő
keresztmetszet forgatásával szabályozható, amint ez a 28. ábrán látható. A tengely két részből áll a csigavonal gyárthatósága miatt, és ezt a két részt egy csavar fogja össze és illesztőszeg pozícionálja. A csavar körül van egy acélpersely, mivel tengely anyaga polietilén, amelynél a nyomóerő hatására felléphet a kúszás jelensége, és ezért kilazulhat a kötés. Az acélpersely ezt megakadályozza. A szelepházból kivezetett tengelycsonkra kapcsolható a szelepet mozgató léptetőmotor vagy szervomotor.
28. ábra: A megtervezett szelep tengelye A tengely anyaga polietilén és acél házban van, ez a kettő jól csúszik egymáson, ugyanis ilyen anyagpárosítással készülnek a konvejor pályák is. A szelep felépítését a 29. ábra, a háromdimenziós modellt, amelyen jelölve van a levegő áramlásának útja a 30. ábra mutatja be.
26
29. ábra A szelep konstrukciója
30. ábra: A szelep háromdimenziós modellje Tömítőelemként O-gyűrűk vannak a szelepben, ezek a Trelleborg ingyenesen hozzáférhető O-Ring Calculation Software segítségével kerültek kiválasztásra. A programnak a 31. ábrán bemutatott kezelőfelületén, be kell állítani a tömítés típusát, hogy radiális vagy 27
axiális, és ha radiális, akkor külső vagy belső. Az igénybevétel lehet statikus vagy dinamikus. Ezek után meg kell adni a beépíteni kívánt gyűrű méreteit, a működési hőmérsékletet, a gyűrű anyagát és anyagjellemzőit. A program leellenőrzi, hogy megfelel-e a választott termék a különböző szempontoknak. Például megfelelő méretű házba építjük e be. Ha nem, akkor jelzi, hogy mi a hiba. terhelés
tömítés típusa
bemenő adatok megadása
ellenőrző adatok, hibaüzenetek 31. ábra: Trelleborg tömítés kivalsztás A szeleppel és a motorral kiegészülve a rendszer blokkdiagramja a 32. ábra szerint módosul a 7. ábrához képest.
28
32. ábra: A módosított blokkdiagram
29
Összefoglalás A bevezető gondolatok után a második fejezetben a [2] irodalom szerint definiáltam a furulyát és bemutattam a felépítését és a furulyajátékot. A harmadik fejezetben bemutattam a folyamatot, amely szerint a tervezést végeztem. A negyedik fejezetben dokumentáltam a tervezést. Elkészítettem a furulyatartó állvány és a hangszer furatainak lefogására alkalmas mechanizmus terveit a merevlemez motoros karjának felhasználásával, amely megoldás jónak bizonyult működés, gyárthatóság és költséghatékonyság szempontjából is. Egyszerűbb darabok lejátszásához szükséges fogásokhoz alkalmas a mechanizmus. Kialakítottam a rendszer levegőellátását. Elkészítettem az elektromos vezérlő kör tervét és kiválasztottam a tápegység, a mikrovezérlő és az IC-k felhasználandó típusait. Ismertettem a vezérlő program megírására alkalmas Arduino fejlesztői környezetet és kezelését. Az ötödik fejezetben írtam egy olyan általános jellegű vezérlőprogramot, amely bármely egyszólamú furulyadarab lejátszására képes MIDI (Musical Instrument Digital Interface) formátumból számítógépen kinyerhető adathalmaz alapján. A PC és a furulyázó berendezés közötti minél egyszerűbb adattovábbításra egy memóriakártyát használok. Elkészítettem és teszteltem az elkészült prototípust és megoldást kerestem a felmerült problémákra. A tervezést folytatni fogom a vezérlés fejlesztésével. Szeretném fejleszteni a lefogó mechanizmust, hogy legyen lefogókar a furulya 0. furatához is és egyes furatok félig is lefoghatók legyenek, így nagyobb hangterjedelmű darabok lejátszására is alkalmas lesz a szerkezet. Az elkészült berendezésen szándékomban áll méréseket végezni félsüket szobában és az eredményeket összehasonlítani egy furulyaművész játékával. Így ellenőrizhető és kalibrálható a hangszer hangminősége, pontosan beállíthatók a térfogatáramok és a szelepnyitási sebességek. A szerkezet alkalmas szórakoztató és bemutató célból dallamok lejátszására.
30
Summary In my thesis I have planned an automated recorder with a MIDI (Musical Instrument Digital Interface) reader program. After the beginner thoughts [1], [3], [4], [5] in the second chapter I have defined the recorder and I have introduced the recorder and its structure and the playing on the instrument [2]. In the third chaptetr I have shown the planning processes and I have researched the aspects of the design. My purpose is to create an automated recorder player mechanism, which can play like an average 10 years old child. The equipment sould be able to take part in a chamber orchestra and it must be low costs. In the fourth chapter I have made documentation about my plans. I have planned the frame of the apparatus of Mini Tec profiles [6]. The arms, which cover the instruments holes. These arms made of disassembled and modified winchesters. This solution is good, because it works fast and accurately, easy to produce myself and it has low costs. This mechanism can play easier songs. I have planned the pneumatic circuits which contains a pump, a valve and connecton pipes between these parts [10]. I have planned the electronic driver circuits of the apparature. I have selected the types of the power supply unit, the microcontroller, the motor driver and the SD card modul which makes easy the data transactions [7], [8], [15]. I have introduced the Arduino program builder platform and its usage. In the fifth chapter I have planned a general program for playing any music on recorder. This program reades MIDI formatted files from an SD card and controll the actuators [9], [11], [12], [16], [17]. I have build the hole apparatus and I have made tests on it. My experiences that the driver program, the frame and the rythm are right but there are problems with the holes cover sponge and the flow rate control. Therefore in the sixth chapter I have looked for solutions to solve these problems and I would like to improve the mechanism. It sould be able to cover only half holes too. This device can be used to demonstrational purposes.
31
Irodalomjegyzék [1]
Mednyánszky M.: A zenélő, muzsikáló szerkezetek története
[2]
Bali J.: A furulya, EMB Zeneműkiadó Kft., Budapest, 2007
[3]
T. Kato, Y. Kawamura, T. Funaki, K. Kawashima, T. Kagawa: Control of Blown Air for a Soprano-Recorder-Playing Robot Using Unsteady Folw Rate Measurements and Control Techniques, JFPS, ISBN 4-931070-08-6, 2011
[4]
Toyota cég Humanoid zenélő robotai http://www.toyota-global.com/innovation/partner_robot/family_2.html#h202
[5]
Z-Machines robotzenekar, 2014 http://edition.cnn.com/2014/03/14/tech/meet-the-robot-guitarist/
[6]
MiniTec profilok http://www.minitecframing.com/Products/30%20SERIES%20PROFILES/30_SERI ES_MAIN_PAGE.html
[7]
L298N IC adatlapja https://www.sparkfun.com/datasheets/Robotics/L298_H_Bridge.pdf
[8]
Arduino MEGA 2560 sémája https://www.arduino.cc/en/uploads/Main/arduino-mega2560_R3-sch.pdf
[9]
Az Arduino Software (IDE) elérhetősége https://www.arduino.cc/en/Main/Software
[10] Matracpumpa http://www.open-air.com/products/details/64&tid=8 [11]
Arduino impulzusszélesség modulációja https://www.arduino.cc/en/Tutorial/PWM
[12]
John
Martin:
The
Acoustics
of
the
Recorder,
Moeck
Verlag
+
Musikinstrumentenwerk, ISBN 3-87549-061-4, Celle, 1994 [13]
Uray Vilmos – Dr. Szabó Szilárd: Elektrotechnika, Tankönyvkiadó, ISBN 963-176638-1, Budapest., 1983 32
[14]
Furulya fogástáblázat http://recorder-fingerings.com/hu/Div.php?f=P8&t=aBar.1S.2g&Aus=Std
[15]
Az Arduino MEGA board és az SD modul összekötése www.comm2excel.com
[16]
Anvil Studio http://www.anvilstudio.com
[17]
MIDI szabvány hangjelülései http://www.midimountain.com/midi/midi_note_numbers.html
Linkek utoljára ellenőrizve: 2017. május 8.
33
Ábrajegyzék 1. ábra: A fej .......................................................................................................................... 2 2. ábra: A furulya részei: a) fej, b) középrész, c) láb ............................................................ 3 3. ábra: Furatok megkülönböztetésére alkalmazott jelölésrendszer ..................................... 3 4. ábra:A zárás időtartamának megállapítása [12] .............................................................. 4 5. ábra: Tervezés algoritmusa ............................................................................................... 5 6. ábra: Halszálka diagram ................................................................................................... 7 7. ábra: A blokkdiagram ........................................................................................................ 8 8. ábra: A váz modellje .......................................................................................................... 9 9. ábra: A legyártott váz fényképe ......................................................................................... 9 10. ábra: A furulya és a billentyűk elhelyezkedése .............................................................. 10 11. ábra: Furulytartó prizma kialakítása ............................................................................ 10 12. ábra: Furulyatartó prizma tervei .................................................................................... 10 13. ábra: A merevlemez fejmozgató egysége ....................................................................... 11 14. ábra: A lefogó mechanizmus ......................................................................................... 12 15. ábra: A hangokhoz tartozó térfogatáramok [3] ............................................................ 13 16. ábra: A furulya levegőellátása ...................................................................................... 13 17. ábra: A furulya vezérlése............................................................................................... 14 18. ábra: Az Arduino Mega fejlesztőplatform ..................................................................... 15 19. ábra: IDE kezelőfelülete ................................................................................................ 16 20. ábra: Az Arduino MEGA board és az SD modul összekötése [15] .............................. 17 21. ábra: A motor teljesítményfelvétele ............................................................................... 18 22. ábra: A feladathoz használt tápegység .......................................................................... 18 23. ábra: Az L298N IC köré épült motorvezérlő kártya ...................................................... 19 24. ábra: Az Anvil Studio kottaíró felülete.......................................................................... 21 25. ábra: Anvil Studio, Event List ....................................................................................... 22 26. ábra: Az elkészült furulyázó rendszer ............................................................................ 25 27. ábra: Balsafa lefogókar ................................................................................................. 26 28. ábra: A megtervezett szelep tengelye ............................................................................ 26 29. ábra A szelep konstrukciója ........................................................................................... 27 30. ábra: A szelep háromdimenziós modellje ...................................................................... 27 31. ábra: Trelleborg tömítés kivalsztás ............................................................................... 28 32. ábra: A módosított blokkdiagram .................................................................................. 29 34
Melléklet M1. A furulya fogástáblázata [14]
1
2
3
M2. Mini Tec elemek [2]
4
M3. A vezérlő program kódja //=============================== // // Fajl iras-olvasas // //===============================
#include <SPI.h> #include <SD.h>
const int chipSelect = 53;
void setupSD () { Serial.begin(9600); while (!Serial) { Serial.print("Initializing SD card..."); } if (!SD.begin(chipSelect)) { Serial.println("Card failed, or not present"); return; } Serial.println("card initialized."); }
bool OlvassBeEgySzamot (File& dataFile, int& szam) { szam = 0; bool beolvastunkBarmiSzamKaraktert = false; while (dataFile.available()) { char c = dataFile.read(); Serial.write(c); if (c >= '0' && c <='9') { szam = szam * 10 + (c - '0'); beolvastunkBarmiSzamKaraktert = true; 5
} else { return beolvastunkBarmiSzamKaraktert; } } return beolvastunkBarmiSzamKaraktert; }
int OlvasdBeAKovetkezoSzamot (File& dataFile) { int szam = 0; while (!OlvassBeEgySzamot (dataFile, szam)) { } return szam; }
void OlvassEnterig (File& dataFile) { while (dataFile.available()) { char c = dataFile.read(); Serial.write(c); if (c == '\n') { return; } } }
void NoteOnKarakterSzamFrissites (int& noteOnKarakterek, char c) { if (c == 'N') { noteOnKarakterek = 1; } else if ((c == 'o' && noteOnKarakterek == 1) || (c == 't' && noteOnKarakterek == 2) || (c == 'e' && noteOnKarakterek == 3) || 6
(c == 'O' && noteOnKarakterek == 4) || (c == 'n' && noteOnKarakterek == 5)) { ++noteOnKarakterek; } else { noteOnKarakterek = 0; } }
bool VaneNoteOnSzovegASorban (File& dataFile) { int noteOnKarakterek = 0; while (dataFile.available()) { char c = dataFile.read(); Serial.write(c); if (c == '\n') { return false; } NoteOnKarakterSzamFrissites (noteOnKarakterek, c); if (noteOnKarakterek == 6) { //Megtalaltuk a NoteOn szoveget!! return true; } } return false; }
char ch = 'a';
int utolsoHangVege = 0;
int szunetHossz = 0; int hangHossz = 0; int hangKod = 0;
7
bool OlvassBeEgyNoteOnNoteOffParost (File& dataFile) { int nemKellSzam = OlvasdBeAKovetkezoSzamot (dataFile);
int perc = OlvasdBeAKovetkezoSzamot (dataFile); int masodperc = OlvasdBeAKovetkezoSzamot (dataFile); int ezredMasodperc = OlvasdBeAKovetkezoSzamot (dataFile);
int kezdopont = perc * 60 * 1000 + masodperc * 1000 + ezredMasodperc;
bool noteOn = VaneNoteOnSzovegASorban (dataFile);
if (!noteOn) { return false; } nemKellSzam = OlvasdBeAKovetkezoSzamot (dataFile); int hang = OlvasdBeAKovetkezoSzamot (dataFile);
OlvassEnterig (dataFile);
nemKellSzam = OlvasdBeAKovetkezoSzamot (dataFile);
perc = OlvasdBeAKovetkezoSzamot (dataFile); masodperc = OlvasdBeAKovetkezoSzamot (dataFile); ezredMasodperc = OlvasdBeAKovetkezoSzamot (dataFile);
int vegpont = perc * 60 * 1000 + masodperc * 1000 + ezredMasodperc;
OlvassEnterig (dataFile);
szunetHossz = kezdopont - utolsoHangVege; hangHossz = vegpont - kezdopont; hangKod = hang;
8
utolsoHangVege = vegpont;
Serial.write("UjHang: "); Serial.write(ch); Serial.write("\n"); ++ch; return true; }
//=========================================================== // // A dallamjátszás elemei // //===========================================================
int ny1=24; int z1=25; int ny2=26; int z2=27; int ny3=28; int z3=29; int szelepPin=40; int szelepPWM=2; int pumpa=41; int pumpaPWM=3;
void setupMechanika () { pinMode(ny1, OUTPUT); pinMode(z1, OUTPUT); pinMode(ny2, OUTPUT); pinMode(z2, OUTPUT); pinMode(ny3, OUTPUT); pinMode(z3, OUTPUT); 9
pinMode(szelepPin, OUTPUT); pinMode(pumpa, OUTPUT); }
void szelep () { delay(60); digitalWrite(szelepPin, LOW); }
void G6(int hossz) { analogWrite(pumpaPWM, 107); szelep(); digitalWrite(ny1, LOW); digitalWrite(z1, HIGH); digitalWrite(ny2, LOW); digitalWrite(z2, HIGH); digitalWrite(ny3, LOW); digitalWrite(z3, HIGH); delay(hossz - 100); }
void xA6(int hossz) { analogWrite(pumpaPWM, 120); szelep(); digitalWrite(ny1, LOW); digitalWrite(z1, HIGH); digitalWrite(ny2, LOW); digitalWrite(z2, HIGH); digitalWrite(ny3, HIGH); digitalWrite(z3, LOW); delay(hossz - 100); }
void H6(int hossz) { 10
analogWrite(pumpaPWM, 120); szelep(); digitalWrite(ny1, LOW); digitalWrite(z1, HIGH); digitalWrite(ny2, HIGH); digitalWrite(z2, LOW); digitalWrite(ny3, HIGH); digitalWrite(z3, LOW); delay(hossz - 100); }
void C7(int hossz) { analogWrite(pumpaPWM, 120); szelep(); digitalWrite(ny1, HIGH); digitalWrite(z1, LOW); digitalWrite(ny2, LOW); digitalWrite(z2, HIGH); digitalWrite(ny3, HIGH); digitalWrite(z3, LOW); delay(hossz - 100); }
void Jatssz () { digitalWrite(szelepPin, HIGH); //szunet elott mindenkepp zarjuk a szelepet delay (szunetHossz); if (hangKod == 67) { G6 (hangHossz); } else if (hangKod == 69) { xA6 (hangHossz); } else if (hangKod = 71) { H6 (hangHossz); } else if (hangKod == 72) { 11
C7 (hangHossz); }
}
//=========================================================== // // A dallamjátszás megvalósítása // //===========================================================
void setup() { setupSD (); setupMechanika (); }
void loop() { digitalWrite(pumpa, HIGH); digitalWrite(szelepPin, HIGH); analogWrite(szelepPWM, 250); delay(100); analogWrite(pumpaPWM, 120); delay(2000); File dataFile = SD.open("golya.txt"); if (dataFile) { while (dataFile.available()) { if (OlvassBeEgyNoteOnNoteOffParost (dataFile)) { Jatssz (); } } dataFile.close(); } else { Serial.println("error opening datalog.txt"); 12
}
digitalWrite(szelepPin, HIGH); delay(1000); digitalWrite(pumpa, LOW); delay(10000); }
13