Tartalomjegyzék:

Arduino hanggenerátor könyvtár vagy soros funkciók nélkül (megszakításokkal): 10 lépés
Arduino hanggenerátor könyvtár vagy soros funkciók nélkül (megszakításokkal): 10 lépés

Videó: Arduino hanggenerátor könyvtár vagy soros funkciók nélkül (megszakításokkal): 10 lépés

Videó: Arduino hanggenerátor könyvtár vagy soros funkciók nélkül (megszakításokkal): 10 lépés
Videó: Arduino Madizsó RC hajómodell hanggenerátor 2024, November
Anonim
Arduino hanggenerátor könyvtár vagy soros funkciók nélkül (megszakításokkal)
Arduino hanggenerátor könyvtár vagy soros funkciók nélkül (megszakításokkal)

Általában nem ez az, amiből oktathatóvá tenném, inkább a fémmegmunkálást részesítem előnyben, de mivel villamosmérnök hallgató vagyok, és mikrokontrollereken kell részt vennem (beágyazott rendszerek tervezése), gondoltam, megtanítok egy az egyik projektem. Amikor eredetileg elkészítettem a projektet és másokat ehhez az osztályhoz, azt tapasztaltam, hogy nagyon kevés olyan oktatóanyag létezik, amelyek nem használják az arduino könyvtár funkcióit vagy a soros funkciókat, ami egy másik ok, amiért azt gondoltam, hogy ez jó oktatható lenne.

Ezt a kódot az Atmega 2560 mikrokontrollerhez tervezték, így ha egy másik fórumon kívánja megvalósítani, meg kell változtatnia a címjegyzékeket a kódban a vezérlő felhasználói kézikönyve alapján. A kód alapgondolata az, hogy amikor a billentyűzeten billentyűt ír be a soros monitorba, az arduino mega egy bizonyos frekvenciát ad ki a gomb megnyomása alapján, és a "q" visszaállítja azt. Úgy csináltam, hogy az "a" az A lapos frekvenciát adja ki, az "A" pedig az A éles frekvenciát, a "b" a B lapos, a "c" a C lapos, a "C" a C éles stb. A teljes kódot a végén töltik fel, de minden lépés darabokra bontja a kódot, így könnyebb elmagyarázni.

1. lépés: Regisztrációs címek meghatározása

Regisztrációs címek meghatározása
Regisztrációs címek meghatározása

Ez a lépés egyszerű, ha az atmega 2560 -at használja, akkor csak azokat a címeket kell használnia, amelyeket használtam, bár ha más chipet használó táblát használ, akkor meg kell találnia a nyilvántartások mindegyikének címét a chipek felhasználói kézikönyve. A fenti definíciók csak konstansok, amelyeket a későbbiekben a funkcióinkhoz használunk. A címeket ingadozó előjel nélküliként adjuk meg, mert nem akarjuk, hogy a fordító összezavarja őket.

2. lépés: Tömbök és globális változók

Tömbök és globális változók
Tömbök és globális változók
Tömbök és globális változók
Tömbök és globális változók
Tömbök és globális változók
Tömbök és globális változók

Itt meg akarjuk határozni a frekvencia tömböt, amely tartalmazza az összes frekvenciát, amelyet az egyes kulcsoknak ki kell adniuk. Ezeket az értékeket a tényleges hangfrekvenciákból számítják ki, és őszintén szólva elfelejtettem, hogyan kaptam őket, de ezek a megfelelő értékek, mivel oszcilloszkóppal teszteltem őket. Meghatározzuk a jegyzetek tömbjét is, amely tartalmazza az egyes hangokhoz tartozó összes billentyűt, valamint a későbbi funkcióinkhoz szükséges változókat.

3. lépés: A "serial.begin" függvény

Az
Az

A "serial.begin" függvényt replikáló egyéni függvényünket U0init () -nak hívjuk. A kívánt átviteli sebességet veszi fel bemenetként, és elindítja a soros portot ezen az átviteli sebességnél.

4. lépés: A "serial.available" függvény

Az
Az

A "serial.available" utánzó függvényt U0kbhit () -nek hívjuk. Nem vesz igénybe bemenetet, hanem észleli, hogy történt -e módosítás a billentyűzeten az RDA állapotbit használatával, és igaz értéket ad vissza, ha változást észlel.

5. lépés: A "serial.read" függvény

Az
Az

A "serial.read" függvényt utánzó függvényt U0getchar () -nak hívjuk, amely nem vesz be és nem ad ki semmilyen változtatást a billentyűzeten, amelyet az UDR0 regiszter tárol.

6. lépés: A "serial.write" függvény

Az
Az

A "serial.write" -et utánzó függvényt U0putchar () -nak hívjuk, amely az UDR0 -regiszterből veszi az adatokat, miközben a változást észleli és tárolja, és a kimenetek visszatérnek a soros monitorra.

7. lépés: A beállítási funkció

A beállítási funkció
A beállítási funkció

Ez az alapvető beállítási funkció, amely a "serial.begin" utánzatunkat használja a soros port inicializálásához, és inicializálja az időzítő regiszterek bitbeállításait, és beállítja a PB6 -ot a hangjaink kiadására.

8. lépés: A hurok és az ISR funkciók

A hurok és az ISR funkciók
A hurok és az ISR funkciók

A ciklus így működik: ha a "serial.available" funkcióval változást észlelünk, akkor a "serial.read" függvény tárolja a változást, és a "serial.write" funkciónk ezt a változást a soros monitorba helyezi. Amíg az i változó kisebb, mint a frekvencia tömb mérete, addig a kimenetet az i pozíciónak fogja beállítani az adott tömbben, és a frekvenciát az adott pozícióban adja ki. Az ISR visszaállításként működik, ahol ha a frekvencia tömb pozíciója nem egyenlő 0 -val (más szóval, ha a "q" nincs megnyomva), akkor a frekvenciát adja ki, de a "q" megnyomásakor alaphelyzetbe áll. Kérjük, vegye figyelembe: ez a kód megszakításokat használ, de megszakításokkal is megtehető. Megszakítás nélkül közzéteszem a kódot, ha bármilyen kérést kapok rá, csak azt hiszem, hogy a megszakítás verzió szórakoztatóbb.

9. lépés: huzalozás

Vezeték
Vezeték

Ennek a kódnak a bekötése rendkívül egyszerű, egyszerűen helyezzen egy kimeneti vezetéket a PB6 -ról egy kenyérsütő táblára, csatlakoztasson ezzel egy hangjelzőt vagy hangszórót, és csatlakoztassa vissza a földhöz. Megjegyzés: ha hangszórót használ, tegyen egy kis ellenállást a hangszóró elé. Ha csak látni szeretné a kimenetet, de nem hallani, csatlakoztassa a PB6 -ot az oszcilloszkóp piros vezetékéhez és a fekete vezetéket a földhöz.

10. lépés: Összerakni

Hozzáadtam a teljes kódot ehhez a lépéshez, mivel az összes lépést elmagyaráztam az előző lépésekben. Csak billentyűzet -bemenetre van szükség a különböző frekvenciákhoz, és kimeneteket ad ki a PB6 -ra. Remélem, élvezte, hogy az IDE -vel más módon kódolhat!

Ezenkívül kérjük, szavazzon erre a mikrokontroller versenyen: D

Ajánlott: