
Բովանդակություն:
2025 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2025-01-23 14:48


Amazարմացրեք ձեր ընկերներին և ընտանիքին այս նախագծով, որը հայտնաբերում է գործիքի նվագարկումը: Այս նախագիծը կցուցադրի մոտավոր հաճախականությունը, ինչպես նաև երաժշտական նոտան, որը հնչում է էլեկտրոնային ստեղնաշարի, դաշնամուրի հավելվածի կամ որևէ այլ գործիքի վրա:
Մանրամասներ
Այս նախագծի համար ձայնային մոդուլի դետեկտորից անալոգային ելքն ուղարկվում է Arduino Uno- ի A0 անալոգային մուտքին: Անալոգային ազդանշանը նմուշառվում և քվանտացվում է (թվայնացված): Ավտոկորելացիայի, կշռման և կարգաբերման ծածկագիրը օգտագործվում է հիմնական հաճախականությունը գտնելու համար `օգտագործելով առաջին 3 շրջանները: Մոտավոր հիմնարար հաճախականությունը այնուհետև համեմատվում է 3, 4 և 5 օկտավաների տիրույթների հաճախականությունների հետ `որոշելու երաժշտական նոտայի ամենամոտ հաճախականությունը: Ի վերջո, ամենամոտ հաճախականության ենթադրվող գրառումը տպվում է էկրանին:
Նշում. Այս հրահանգը կենտրոնանում է միայն ծրագրի կառուցման վրա: Մանրամասների և նախագծման հիմնավորումների մասին լրացուցիչ տեղեկությունների համար այցելեք այս հղումը ՝ Լրացուցիչ տեղեկություններ
Պարագաներ
- (1) Arduino Uno (կամ Genuino Uno)
- (1) DEVMO խոսափողի սենսոր Բարձր զգայունության ձայնի հայտնաբերման մոդուլ Համատեղելի
- (1) Եռակցման առանց տախտակ
- (1) USB-A- ից B մալուխ
- Jumper լարերը
- Երաժշտական աղբյուր (դաշնամուր, ստեղնաշար կամ ցավազրկող ծրագիր բարձրախոսներով)
- (1) համակարգիչ կամ նոութբուք
Քայլ 1. Կառուցեք սարքավորում երաժշտական նոտաների դետեկտորի համար

Arduino Uno- ի միջոցով միացման լարերը, առանց զոդման տախտակը և DEVMO խոսափողի սենսորը բարձր զգայունության ձայնի հայտնաբերման մոդուլը (կամ նմանատիպ) կառուցեք այս նկարում ցուցադրված միացումը
Քայլ 2. Programրագրեք երաժշտական նշումների դետեկտորը
Arduino IDE- ում ավելացրեք հետևյալ ծածկագիրը:
gistfile1.txt
/* |
Ֆայլի/Էսքիզի անվանումը ՝ MusicalNoteDetector |
Տարբերակ թիվ. V1.0 Ստեղծվել է 7 հունիսի, 2020 թ |
Բնօրինակի հեղինակ ՝ Clyde A. Lettsome, PhD, PE, MEM |
Նկարագրություն. Այս ծածկագիրը/ուրվագիծը ցուցադրում է մոտավոր հաճախականությունը, ինչպես նաև երաժշտական նոտան, որը հնչում է էլեկտրոնային ստեղնաշարի կամ դաշնամուրի հավելվածի վրա: Այս նախագծի համար անալոգային ելքը |
ձայնային մոդուլի դետեկտորն ուղարկվում է Arduino Uno- ի A0 անալոգային մուտքին: Անալոգային ազդանշանը նմուշառվում և քվանտացվում է (թվայնացված): Ավտոկորելացիան, կշռման և թյունինգի կոդը օգտագործվում է |
գտեք հիմնարար հաճախականությունը ՝ օգտագործելով առաջին 3 շրջանները: Մոտավոր հիմնարար հաճախականությունը համեմատվում է 3, 4 և 5 օկտավաների հաճախականությունների հետ `որոշելու ամենամոտ երաժշտական երաժշտությունը |
նշումների հաճախականությունը: Ի վերջո, ամենամոտ հաճախականության ենթադրվող գրառումը տպվում է էկրանին: |
Լիցենզիա. Այս ծրագիրը անվճար ծրագրակազմ է. կարող եք այն վերաբաշխել և/կամ փոփոխել այն GNU General Public License (GPL) 3 -րդ տարբերակի կամ ավելի ուշ |
ձեր նախընտրած տարբերակը, ինչպես հրապարակել է Ազատ ծրագրային ապահովման հիմնադրամը: |
Նշումներ. Հեղինակային իրավունք (գ) 2020 ՝ C. A. Lettsome Services, LLC |
Լրացուցիչ տեղեկությունների համար այցելեք |
*/ |
#սահմանել Նմուշներ 128 // Max 128 Arduino Uno- ի համար: |
#սահմանել SAMPLING_FREQUENCY 2048 // Fs = Nyquist- ի հիման վրա պետք է լինի 2 անգամ սպասված ամենաբարձր հաճախականությունից: |
#սահմանել OFFSETSAMPLES 40 // օգտագործվում է աղետաբեր նպատակների համար |
#սահմանեք TUNER -3 // Կարգավորեք մինչև C3- ը լինի 130,50 |
բոց նմուշառումPամանակաշրջան; |
անստորագիր երկար միկրովայրկյաններ; |
int X [Նմուշներ]; // ստեղծել չափսերի վեկտոր `իրական արժեքներ պահելու համար |
float autoCorr [Նմուշներ]; // ստեղծել նմուշների վեկտոր `երևակայական արժեքներ պահելու համար |
float storageNoteFreq [12] = {130.81, 138.59, 146.83, 155.56, 164.81, 174.61, 185, 196, 207.65, 220, 233.08, 246.94}; |
int sumOffSet = 0; |
int offSet [OFFSETSAMPLES]; // ստեղծել օֆսեթ վեկտոր |
int avgOffSet; // ստեղծել օֆսեթ վեկտոր |
int i, k, periodEnd, periodBegin, period, adjustuster, noteLocation, octaveRange; |
float maxValue, minValue; |
երկար գումար; |
int thresh = 0; |
int numOfCycles = 0; |
բոց ազդանշանՀաճախականություն, ազդանշանՀաճախականություն 2, ազդանշանՀաճախականություն3, ազդանշանՀաճախականությունԳուշակիր, ընդհանուր; |
բայթ state_machine = 0; |
int նմուշներPerPeriod = 0; |
դատարկ կարգավորում () |
{ |
Serial.begin (115200); // 115200 Baud տոկոսադրույքը սերիական մոնիտորի համար |
} |
դատարկ շրջան () |
{ |
//***************************************************************** |
// Calabration բաժին |
//***************************************************************** |
Serial.println ("Calabrating. Խնդրում ենք, որևէ գրառում մի կատարեք գնահատման ժամանակ:"); |
(i = 0; i <OFFSETSAMPLES; i ++) |
{ |
անջատված է = analogRead (0); // Կարդում է անալոգային 0 (A0) արժեքը, քվանտացնում և պահում որպես իրական տերմին: |
//Serial.println(offSet ); // օգտագործեք սա `ձայնի հայտնաբերման մոդուլը մոտավորապես կեսին կամ 512 -ին կարգավորելու համար, երբ ձայն չի հնչում: |
sumOffSet = sumOffSet + offSet ; |
} |
samplePerPeriod = 0; |
maxValue = 0; |
//***************************************************************** |
// Պատրաստվեք ընդունելություն A0- ից |
//***************************************************************** |
avgOffSet = կլոր (sumOffSet / OFFSETSAMPLES); |
Serial.println («Հետհաշվարկ»); |
ուշացում (1000); // դադար 1 վայրկյան |
Serial.println ("3"); |
ուշացում (1000); // դադար 1 վայրկյան |
Serial.println ("2"); |
ուշացում (1000); // դադար 1 -ի համար |
Serial.println ("1"); |
ուշացում (1000); // դադար 1 վայրկյան |
Serial.println («Նվագարկեք ձեր գրառումը»); |
ուշացում (250); // դադար 1/4 վայրկյան արձագանքի ժամանակի համար |
//***************************************************************** |
// Հավաքեք A0- ի նմուշներ նմուշառման ժամանակահատվածի նմուշառմամբ |
//***************************************************************** |
samplingPeriod = 1.0 / SAMPLING_FREQUENCY; // Pամանակահատվածը միկրո վայրկյաններում |
համար (i = 0; i <Նմուշներ; i ++) |
{ |
microSeconds = micros (); // Վերադարձնում է միկրովայրկյանների քանակը, քանի դեռ Arduino տախտակը սկսել է ընթացիկ սցենարի գործարկումը: |
X = analogRead (0); // Կարդում է անալոգային 0 (A0) արժեքը, քվանտացնում և պահում որպես իրական տերմին: |
/ *նմուշների միջև սպասման մնացած ժամանակը անհրաժեշտության դեպքում վայրկյանների ընթացքում */ |
իսկ (micros () <(microSeconds + (samplingPeriod * 1000000))) |
{ |
// ոչինչ մի արա, պարզապես սպասիր |
} |
} |
//***************************************************************** |
// Ավտոկորելյացիայի գործառույթ |
//***************************************************************** |
համար (i = 0; i <Նմուշներ; i ++) // i = ուշացում |
{ |
գումար = 0; |
համար (k = 0; k <Նմուշներ - i; k ++) // Համապատասխանեցրեք ազդանշանը հետաձգված ազդանշանի հետ |
{ |
գումար = գումար + ((((X [k]) - avgOffSet) * ((X [k + i]) - avgOffSet)); // X [k] ազդանշանն է, իսկ X [k+i] ՝ հետաձգված տարբերակը |
} |
autoCorr = գումար / Նմուշներ; |
// First Peak Detect State Machine |
եթե (state_machine == 0 && i == 0) |
{ |
thresh = autoCorr * 0.5; |
պետական_մեքենա = 1; |
} |
այլապես, եթե (state_machine == 1 && i> 0 && thresh 0) // state_machine = 1, գտեք 1 շրջան առաջին ցիկլի օգտագործման համար |
{ |
maxValue = autoCorr ; |
} |
այլապես, եթե (state_machine == 1 && i> 0 && thresh <autoCorr [i-1] && maxValue == autoCorr [i-1] && (autoCorr -autoCorr [i-1]) <= 0) |
{ |
periodBegin = i-1; |
պետական_ մեքենա = 2; |
numOfCycles = 1; |
samplePerPeriod = (periodBegin - 0); |
ժամանակաշրջան = samplePerPeriod; |
կարգավորիչ = TUNER+(50.04 * exp (-0.102 * samplePerPeriod)); |
signalFrequency = ((SAMPLING_FREQUENCY) / (samplePerPeriod))-կարգավորիչ; // f = fs/N |
} |
այլապես, եթե (state_machine == 2 && i> 0 && thresh 0) // state_machine = 2, գտեք 2 շրջան 1 -ին և 2 -րդ ցիկլի համար |
{ |
maxValue = autoCorr ; |
} |
այլապես, եթե (state_machine == 2 && i> 0 && thresh <autoCorr [i-1] && maxValue == autoCorr [i-1] && (autoCorr -autoCorr [i-1]) <= 0) |
{ |
periodEnd = i-1; |
պետական_ մեքենա = 3; |
numOfCycles = 2; |
samplePerPeriod = (periodEnd - 0); |
signalFrequency2 = ((numOfCycles*SAMPLING_FREQUENCY) / (samplePerPeriod))-կարգավորիչ; // f = (2*fs)/(2*N) |
maxValue = 0; |
} |
այլապես, եթե (state_machine == 3 && i> 0 && thresh 0) // state_machine = 3, գտեք 3 շրջան 1 -ին, 2 -րդ և 3 -րդ ցիկլի համար |
{ |
maxValue = autoCorr ; |
} |
այլապես, եթե (state_machine == 3 && i> 0 && thresh <autoCorr [i-1] && maxValue == autoCorr [i-1] && (autoCorr -autoCorr [i-1]) <= 0) |
{ |
periodEnd = i-1; |
պետական_ մեքենա = 4; |
numOfCycles = 3; |
samplePerPeriod = (periodEnd - 0); |
signalFrequency3 = ((numOfCycles*SAMPLING_FREQUENCY) / (samplePerPeriod))-կարգավորիչ; // f = (3*fs)/(3*N) |
} |
} |
//***************************************************************** |
// Արդյունքների վերլուծություն |
//***************************************************************** |
եթե (samplePerPeriod == 0) |
{ |
Serial.println («Հմմ …… ես վստահ չեմ: Փորձու՞մ ես ինձ խաբել»); |
} |
ուրիշ |
{ |
// պատրաստել քաշի գործառույթը |
ընդամենը = 0; |
եթե (ազդանշանՀաճախականություն! = 0) |
{ |
ընդամենը = 1; |
} |
եթե (signalFrequency2! = 0) |
{ |
ընդհանուր = ընդհանուր + 2; |
} |
եթե (signalFrequency3! = 0) |
{ |
ընդհանուր = ընդհանուր + 3; |
} |
// հաշվարկել հաճախականությունը `օգտագործելով կշռման գործառույթը |
signalFrequencyGuess = ((1/ընդհանուր) * signalFrequency) + ((2/ընդհանուր) * signalFrequency2) + ((3/ընդհանուր) * signalFrequency3); // գտնել կշռված հաճախականություն |
Serial.print («Ձեր նվագած նոտան մոտավորապես»); |
Serial.print (signalFrequencyGuess); // Տպեք հաճախականության գուշակությունը: |
Serial.println («Հզ.»); |
// գուշակության հիման վրա գտեք օկտավայի տիրույթ |
octaveRange = 3; |
մինչդեռ (! (signalFrequencyGuess> = պահվում է NotFreq [0] -7 && signalFrequencyGuess <= պահվում է NotFreq [11] +7)) |
{ |
համար (i = 0; i <12; i ++) |
{ |
storageNoteFreq = 2 * storageNoteFreq ; |
} |
octaveRange ++; |
} |
// Գտեք ամենամոտ գրառումը |
minValue = 10000000; |
noteLocation = 0; |
համար (i = 0; i <12; i ++) |
{ |
եթե (minValue> abs) |
{ |
minValue = abs (signalFrequencyGuess-storageNoteFreq ); |
noteLocation = i; |
} |
} |
// Տպել նշումը |
Serial.print («Կարծում եմ ՝ խաղացել ես»); |
եթե (noteLocation == 0) |
{ |
Serial.print («C»); |
} |
այլապես, եթե (noteLocation == 1) |
{ |
Serial.print («C#»); |
} |
այլապես, եթե (noteLocation == 2) |
{ |
Serial.print («D»); |
} |
այլապես, եթե (noteLocation == 3) |
{ |
Serial.print ("D#"); |
} |
այլապես, եթե (noteLocation == 4) |
{ |
Serial.print («E»); |
} |
հակառակ դեպքում (noteLocation == 5) |
{ |
Serial.print ("F"); |
} |
այլապես, եթե (noteLocation == 6) |
{ |
Serial.print ("F#"); |
} |
այլապես, եթե (noteLocation == 7) |
{ |
Serial.print ("G"); |
} |
այլապես, եթե (noteLocation == 8) |
{ |
Serial.print ("G#"); |
} |
այլապես, եթե (noteLocation == 9) |
{ |
Serial.print ("A"); |
} |
այլապես, եթե (noteLocation == 10) |
{ |
Serial.print ("A#"); |
} |
հակառակ դեպքում (noteLocation == 11) |
{ |
Serial.print («B»); |
} |
Serial.println (octaveRange); |
} |
//***************************************************************** |
//Կանգնիր այստեղ. Վերագործարկելու համար սեղմեք Arduino- ի վերակայման կոճակը |
//***************************************************************** |
մինչդեռ (1); |
} |
դիտել rawgistfile1.txt- ը hosted -ի հետ GitHub- ի կողմից
Քայլ 3: Կարգավորեք երաժշտական նշումների դետեկտորը
Arduino Uno- ն միացրեք համակարգչին Arduino IDE- ում գրված կամ բեռնված ծածկագրով: Կազմեք և վերբեռնեք կոդը Arduino- ում: Շղթան տեղադրեք երաժշտության աղբյուրին մոտ: Նշում. Ներածական տեսանյութում ես օգտագործում եմ պլանշետի վրա տեղադրված ծրագիրը ՝ համակարգչի բարձրախոսների հետ միասին, որպես իմ երաժշտության աղբյուր: Հպեք Arduino- ի տախտակի վերակայման կոճակին, այնուհետև նվագարկեք երաժշտության աղբյուրի գրառումը: Մի քանի վայրկյան անց Երաժշտական նշումների դետեկտորը կցուցադրի նվագարկված գրառումը և դրա հաճախականությունը:
Խորհուրդ ենք տալիս:
Raspberry Pi - TMD26721 ինֆրակարմիր թվային հարևանության դետեկտոր Java ձեռնարկ. 4 քայլ

Raspberry Pi-TMD26721 Ինֆրակարմիր թվային հարևանության դետեկտոր Java ձեռնարկ: ճշգրտություն. Պրո
Zigbee անկողնու ներկայության դետեկտոր ՝ 8 քայլ

Zigbee Bed Presence Detector: Որոշ ժամանակ ես փնտրում էի միջոց ՝ պարզելու, թե երբ ենք անկողնում: Սա `այս տեղեկատվությունը Homeassistant- ում օգտագործելու համար: Այս տեղեկատվության շնորհիվ ես կարող եմ ավտոմատներ սարքել գիշերը լույսերը անջատելու համար կամ, օրինակ, ազդանշանային համակարգ ակտիվացնել
Smխի դետեկտոր ՝ 13 քայլ

Okeխի դետեկտոր. Բարև ընկերներ, այսօր եկեք տեսնենք ծխի դետեկտորի մասին: Ձեզանից շատերը գնացինք առևտրի կենտրոններ, հիմնականում դուք կարող եք տեսնել այս սարքը, որը կոչվում է ծխի դետեկտոր: այն կբացահայտի ծուխը և կմիացնի ցնցուղը և կդադարեցնի կրակը: Բայց այս նախագծում դա փոքր փոփոխություն է: փոխարենը
Ներկա ցնցումների դետեկտոր `3 քայլ

Present Shake Detector: Այս նախագծում մենք պատրաստվում ենք սարք պատրաստել, որը ահազանգ կհնչի, եթե ինչ -որ մեկը թափի նվերը/տուփը: Այս գաղափարն ունեցա, երբ Սուրբ Christmasննդյան տոների համար փաթեթ ստացանք: Փորձելու և կռահելու համար, թե ինչ կար դրա մեջ, իհարկե, մենք այն ցնցեցինք այնպես, ինչպես բոլորը
Երաժշտական հավաքող. Ինտեգրված վիրտուալ երաժշտական գործիք ՝ բլոկի տեսքով հպման տվիչով ՝ 4 քայլ

Երաժշտական հավաքող. Ինտեգրված վիրտուալ երաժշտական գործիք ՝ բլոկի տեսքով հպման տվիչով. Կան շատ մարդիկ, ովքեր ցանկանում են սովորել երաժշտական գործիք նվագել: Lyավոք, նրանցից ոմանք դա չեն սկսում գործիքների բարձր գնի պատճառով: Դրա հիման վրա մենք որոշեցինք կատարել վիրտուալ երաժշտական գործիքների համակարգ ՝ նվազեցնելու սկսնակ բյուջեն