Helló srácok, az elmúlt hetekben azon dolgoztam, hogy újra kapcsolatba lépjek a gitár iránti szeretetemmel. A boxgitározás az volt, hogy néhány évvel ezelőtt ellazulok, mielőtt a szaxofon átvenné a hatalmat. Visszatérve a gitárra, miután 3 évig ritkán zengtem az akkordot, felfedeztem többek között azt, hogy már nem tudom, hogyan kell mindegyik húrnak megszólalnia, hogy barátom szavaival így fogalmazzak: „A hallásom már nem volt hangolva”, és ennek eredményeként nem tudtam hangolni a gitárt billentyűzet vagy mobilalkalmazás nélkül, amelyet később letöltöttem. A hetek néhány nappal ezelőttig teltek, amikor a készítő bennem motiválttá vált, és úgy döntöttem, hogy építek egy Arduino alapú gitárhangolót. A mai oktatóanyagban megosztom, hogyan lehet saját DIY Arduino gitárhangolót készíteni.
Hogyan működik a gitárhangoló
Mielőtt áttérünk az elektronikára, fontos megérteni az összeállítás mögött rejlő alapelvet. Jelenleg 7 fő kották vannak jelölve ábécékkel; A, B, C, D, E, F, G és általában egy másik A-val végződnek, amely mindig egy oktávval magasabb, mint az első A. A zenében ezeknek a hangoknak több változata létezik, mint az első A és az utolsó A. különböznek egymástól variációiktól és egymástól a hangmagasság néven ismert egyik jellemzőjével. A hangmagasságot a hang erősségének vagy gyengeségének definiálják, amelyet a hang gyakorisága jelez. Mivel ezeknek a hangoknak a frekvenciája ismert, ahhoz, hogy megállapítsuk, a gitár hangolva van-e vagy sem, csak össze kell hasonlítanunk egy adott húr hangjának frekvenciáját a húr által képviselt tényleges frekvenciával.
A 7 hangjegy frekvenciája:
A = 27,50 Hz
B = 30,87Hz
C = 16,35Hz
D = 18,35Hz
E = 20,60 Hz
F = 21,83Hz
G = 24,50 Hz
Ezeknek a jegyzeteknek minden változata mindig az FxM egyenlő hangmagasságban van, ahol F a frekvencia és M nem nulla egész szám. Így az utolsó A esetében, amely a korábban leírtak szerint egy oktávval magasabb, mint az első A, a frekvencia az;
27,50 x 2 = 55Hz.
A gitár (ólom / dobozos gitár) általában 6 húrt tartalmaz, amelyeket nyitott húron az E, A, D, G, B, E hangok jelölnek. Szokás szerint az utolsó E egy oktávval magasabb lesz, mint az első E. Megtervezzük a gitárhangolónkat, hogy segítsen hangolni a gitárt ezen hangok frekvenciáinak felhasználásával.
A szokásos gitárhangolás szerint az egyes húrok hangja és megfelelő frekvenciája az alábbi táblázatban látható.
Húrok |
Frekvencia |
Jelölés |
1. (E) |
329,63 Hz |
E4 |
2. (B) |
246,94 Hz |
B3 |
3 (G) |
196,00 Hz |
G3 |
4 (D) |
146,83 Hz |
D3 |
5. (A) |
110,00 Hz |
A2 |
6 (E) |
82,41 Hz |
E2 |
A projekt folyamata meglehetősen egyszerű; a gitár által generált hangjelet frekvenciává alakítjuk, majd összehasonlítjuk a hangolandó húr pontos frekvenciaértékével. A gitáros LED-del értesítést kap, ha az érték korrelál.
A frekvencia érzékelés / átalakítás 3 fő szakaszból áll;
- Erősítő
- Beszámítás
- Analóg-digitális átalakítás (mintavétel)
Az előállított hangjel túl gyenge lesz ahhoz, hogy az Arduino ADC felismerje, ezért fel kell erősítenünk a jelet. Erősítés után, hogy a jelet az Arduino ADC által felismerhető tartományban tartsuk, hogy megakadályozzuk a jel kivágását, ellensúlyozzuk a jel feszültségét. Az eltolás után a jelet továbbítják az Arduino ADC-hez, ahol mintát vesznek róla, és megkapják a hang frekvenciáját.
Szükséges alkatrészek
A projekt felépítéséhez a következő összetevőkre van szükség:
- Arduino Uno x1
- LM386 x1
- Kondenzátor mikrofon x1
- Mikrofon / audio csatlakozó x1
- 10k potenciométer x1
- O.1uf kondenzátor x2
- 100 ohmos ellenállás x4
- 10 ohm x1 ellenállás
- 10uf kondenzátor x3
- 5mm sárga LED x2
- 5mm zöld LED x1
- Normálisan nyitott nyomógombok x6
- Jumper huzalok
- Kenyérlemez
Sémák
Csatlakoztassa az alkatrészeket az alábbi gitárhangoló áramköri ábra szerint.
A nyomógombok fel / le ellenállások nélkül vannak csatlakoztatva, mert az Arduino beépített húzóellenállásait fogják használni. Ennek célja, hogy az áramkör a lehető legegyszerűbb legyen.
Arduino kód a gitárhangolóhoz
A gitárhangoló projekt kódjának mögött álló algoritmus egyszerű. Egy adott húr hangolásához a gitáros a megfelelő nyomógomb megnyomásával választja ki a húrot, és egy nyitott húrra csattan. A hangot az erősítési szakasz összegyűjti és továbbadja az Arduino ADC-nek. A frekvenciát dekódoljuk és összehasonlítjuk. Ha a karakterláncból érkező bemeneti frekvencia kisebb, mint a megadott frekvencia, akkor az adott karakterlánc számára az egyik sárga LED világít, jelezve, hogy a húrt szigorítani kell. Ha a mért frekvencia nagyobb, mint az adott húrra előírt frekvencia, akkor egy másik LED kigyullad. Amikor a frekvencia az adott húr számára előírt tartományon belül van, a zöld LED kigyullad, hogy irányítsa a gitárosot.
A teljes Arduino kód a végén található, itt röviden elmagyaráztuk a kód fontos részeit.
Először létrehozunk egy tömböt a kapcsolók megtartására.
int buttonarray = {13, 12, 11, 10, 9, 8}; //
Ezután létrehozunk egy tömböt, amely megtartja az egyes húrok megfelelő frekvenciáját.
float freqarray = {82.41, 110.00, 146.83, 196.00, 246.94, 329.63}; // mindez Hz-ben
Ezzel megadjuk azokat a csapokat, amelyekhez a LED-ek csatlakoznak, és más változókat, amelyekkel a frekvenciát az ADC-től kapják.
int alacsonyabb = 7; int magasabbLed = 6; int justRight = 5; #define LENGTH 512 bájtos rawData; int count;
A következő a void setup () függvény.
Itt kezdjük azzal, hogy engedélyezzük az Arduino belső felhúzását minden olyan csapnál, amelyhez a kapcsolók csatlakoznak. Ezt követően kimenetekként beállítjuk azokat a csapokat, amelyekhez a LED-ek csatlakoznak, és elindítjuk a soros monitort az adatok megjelenítéséhez.
void setup () { for (int i = 0; i <= 5; i ++) { pinMode (buttonarray, INPUT_PULLUP); } pinMode (lowerLed, OUTPUT); pinMode (magasabbLed, OUTPUT); pinMode (justRight, OUTPUT); Serial.begin (115200); }
Ezután a void loop funkciót valósítjuk meg a frekvencia detektálással és összehasonlítással.
void loop () { if (szám <HOSSZ) { count ++; rawData = analogRead (A0) >> 2; } else { összeg = 0; pd_state = 0; int periódus = 0; for (i = 0; i <len; i ++) { // Autokorreláció sum_old = összeg; összeg = 0; mert (k = 0; k <len-i; k ++) összeg + = (rawData-128) * (rawData-128) / 256; // Soros.println (összeg); // Csúcsdetektáló állapotgép, ha (pd_state == 2 && (sum-sum_old) <= 0) { időszak = i; pd_state = 3; } if (pd_state == 1 && (sum> thresh) && (sum-sum_old)> 0) pd_state = 2; ha (! i) { cséplés = összeg * 0,5; pd_state = 1; } } // A frekvencia Hz-ben azonosítva, ha ( thresh > 100) { freq_per = sample_freq / period; Soros.println (frekvencia_per); mert (int s = 0; s <= 5; s ++) { if (digitalRead (buttonarray) == HIGH) { if (freq_per - freqarray <0) { digitalWrite (lowerLed, HIGH); } else if (freq_per - freqarray> 10) { digitalWrite (magasabbLed, HIGH); } else { digitalWrite (justRight, HIGH); } } } } count = 0; } }
Az alábbiakban bemutatjuk a teljes kódot egy bemutató videóval. Töltse fel a kódot az Arduino táblára, és távolodjon el.