- Необходими материали:
- Електрическа схема:
- Схеми и обяснение:
- Разбиране на
- Възпроизвеждане на пиано тонове на Arduino:
- Програмиране на Arduino:
- Възпроизвеждане, запис, повторение и повторение! :
Arduino е благодат за хората, които не са от електрониката, за лесно създаване на неща. Това беше чудесен инструмент за прототипиране или да опитате нещо страхотно, в този проект ще изградим малко, но забавно пиано с помощта на Arduino. Това пиано е почти обикновен само с 8 бутони и зумер. Той използва функцията тон () на Arduino за създаване на различни видове пиано ноти на високоговорителя. За да го подправим малко, добавихме функцията за запис в проекта, това ни позволява да пуснем мелодия и да го пуснем многократно, когато е необходимо. Звучи интересно нали !! Така че нека да строим….
Необходими материали:
- Arduino Uno
- 16 * 2 LCD дисплей
- Звънец
- Тример 10k
- Превключвател SPDT
- Бутон (8 Nos)
- Резистори (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Макет
- Свързващи проводници
Електрическа схема:
Пълният проект за пиано Arduino може да бъде изграден върху плоча с някои свързващи проводници. Схемата на веригата, направена с помощта на фризиране, която показва изгледа на макета на проекта, е показана по-долу
Просто следвайте схемата на веригата и свържете съответно проводниците, бутоните и зумера, както се използват с модул за печатни платки, но в действителния хардуер сме използвали само превключвателя и зумера, това не бива да ви обърква много, защото те имат същия тип щифт. Можете също да се обърнете към изображението по-долу на хардуера, за да осъществите връзките си.
Стойността на резисторите отляво е в следния ред, 10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k и 10k. Ако нямате същия DPST превключвател, можете да използвате нормален превключвател като този, показан на схемата по-горе. Сега нека разгледаме схемите на проекта, за да разберем защо сме направили следните връзки.
Схеми и обяснение:
Показаните по-горе схеми за електрическата схема са дадени по-долу, тя също е направена с помощта на Fritzing.
Една основна връзка, която трябва да разберем, е как сме свързали 8-те бутони към Arduino чрез аналогов щифт A0. По принцип се нуждаем от 8 входни щифта, които могат да бъдат свързани към 8 входни бутона, но за проекти като този не можем да използваме 8 щифта на микроконтролера само за бутони, тъй като може да ни трябват за по-късна употреба. В нашия случай имаме LCD дисплей, който да бъде свързан.
Затова използваме аналоговия щифт на Arduino и формираме потенциален делител с различни стойности на резистора, за да завършим веригата. По този начин при натискане на всеки бутон към аналоговия щифт ще се подава различно аналогово напрежение. Примерна схема само с два резистора и два бутона е показана по-долу.
В този случай ADC щифтът ще получи + 5V, когато бутоните не са натиснати, ако първият бутон е натиснат, тогава потенциалният делител се завършва през резистора 560R и ако вторият бутон се натисне, потенциалният делител се конкурира с помощта на 1.5 k резистор. По този начин напрежението, получено от ADC щифта, ще варира в зависимост от формулите на потенциалния делител. Ако искате да научите повече за това как работи потенциалният делител и как да изчислите стойността на напрежението, получено от ADC щифта, тогава можете да използвате тази страница за калкулатор на потенциален делител.
Освен това всички връзки са направо напред, LCD е свързан към щифтове 8, 9, 10, 11 и 12. Зуммерът е свързан към щифт 7, а ключът SPDT е свързан към щифт 6 на Arduino. Пълният проект се захранва през USB порта на лаптопа. Можете също така да свържете Arduino към захранване 9V или 12V чрез DC жака и проектът ще продължи да работи по същия начин.
Разбиране на
Arduino има удобна функция тон (), която може да се използва за генериране на различни честотни сигнали, които могат да се използват за създаване на различни звуци с помощта на зумер. Така че нека разберем как функционира функцията и как може да се използва с Arduino.
Преди това трябва да знаем как работи пиезо зумер. Може би сме научили за пиезо кристалите в нашето училище, той не е нищо друго освен кристал, който преобразува механичните вибрации в електричество или обратно. Тук прилагаме променлив ток (честота), за който кристалът вибрира, като по този начин произвежда звук. Следователно, за да накараме пиезо зумера да издаде някакъв шум, ние трябва да накараме пиезо електрическия кристал да вибрира, височината и тонът на шума зависи от това колко бързо кристалът вибрира. Следователно тонът и височината могат да бъдат контролирани чрез промяна на честотата на тока.
Добре, как да получим променлива честота от Arduino? Тук идва функцията tone (). Тонът () може да генерира определена честота на определен щифт. Продължителността на времето също може да бъде спомената, ако е необходимо. Синтаксисът за tone () е
Синтаксисен тон (ПИН, честота) Тон (ПИН, честота, продължителност) Параметри ПИН: ПИН, на който да се генерира честотата на тона: честотата на тона в херци - неподписана int продължителност: продължителността на тона в милисекунди (по избор1) - неподписан дълго
Стойностите на pin могат да бъдат всеки от вашите цифрови pin. Тук съм използвал щифт номер 8. Честотата, която може да се генерира, зависи от размера на таймера във вашата дъска Arduino. За UNO и повечето други често срещани платки минималната честота, която може да бъде произведена, е 31Hz, а максималната честота, която може да бъде произведена, е 65535Hz. Обаче ние хората можем да чуем само честоти между 2000Hz и 5000 Hz.
Възпроизвеждане на пиано тонове на Arduino:
Добре, още преди да започна да се занимавам с тази тема, нека да дам да се разбере, че съм начинаещ с музикални ноти или пиано, така че, моля, простете ми, ако нещо споменато под това заглавие е глупост.
Сега знаем, че можем да използваме функцията за тонове в Arduino, за да произвеждаме някои звуци, но как можем да възпроизвеждаме тонове на определена нота, използвайки същите. За наш късмет има библиотека, наречена “pitches.h”, написана от Брет Хагман. Тази библиотека съдържа цялата информация за това коя честота е еквивалентна на коя нота на пиано. Бях изненадан от това колко добре тази библиотека всъщност може да работи и да свири почти всяка нота на пиано, използвах същата, за да свиря на пиано нотите на Карибски пирати, Луда жаба, Марио и дори титанично и звучаха страхотно. Ами сега! Тук се отклоняваме малко от темата, така че ако се интересувате от това, проверете възпроизвеждането на мелодии с помощта на проекта Arduino. Също така ще намерите повече обяснения за библиотеката pitches.h в този проект.
Нашият проект има само 8 бутони, така че всеки бутон може да възпроизвежда само една конкретна музикална нота и по този начин напълно можем да свирим само 8 ноти. Избрах най-използваните ноти на пиано, но можете ли да изберете произволни 8 или дори да разширите проекта с повече бутони и да добавите още бележки.
Бележките, избрани в този проект, са нотите C4, D4, E4, F4, G4, A4, B4 и C5, които могат да се възпроизвеждат с помощта на бутоните 1 до 8 съответно.
Програмиране на Arduino:
Достатъчно на теория нека стигнем до забавната част от програмирането на Arduino. Най- пълен Arduino програма се дава в края на тази страница можете да скочи надолу, ако нетърпелив или прочетете по-нататък, за да се разбере как кодът работи.
В нашата програма Arduino трябва да прочетем аналоговото напрежение от пин A0, след това да предскажем кой бутон е бил натиснат и да възпроизведем съответния тон за този бутон. Докато правим това, ние също трябва да запишем кой бутон е натиснал потребителят и колко дълго е натиснал, за да можем да пресъздадем тона, който е бил възпроизведен от потребителя по-късно.
Преди да преминем към логическата част, трябва да декларираме кои 8 ноти ще свирим. След това съответната честота за бележките се взема от библиотеката pitches.h и след това се формира масив, както е показано по-долу. Тук честотата за възпроизвеждане на бележка C4 е 262 и т.н.
int бележки = {262, 294, 330, 349, 392, 440, 494, 523}; // Задаване на честота за C4, D4, E4, F4, G4, A4, B4,
След това трябва да споменем към кои изводи е свързан LCD дисплеят. Ако следвате точно същите схеми, дадени по-горе, не е нужно да променяте нищо тук.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // щифтове, към които е свързан LCD LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
След това, в нашата функция за настройка, ние просто инициализираме LCD модула и серийния монитор за отстраняване на грешки. Показваме и въвеждащо съобщение, само за да сме сигурни, че нещата работят по план. На следващо място , във функцията на основния цикъл имаме два цикъл while.
Цикълът one while ще бъде изпълнен, докато ключът SPDT е поставен при запис на повече. В режим на запис потребителят може да плати необходимите тонове и в същото време тонът, който се възпроизвежда, също ще бъде запазен. Така цикълът while изглежда така по-долу
while (digitalRead (6) == 0) // Ако превключвателят е зададен в режим на запис {lcd.setCursor (0, 0); lcd.print ("Запис.."); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
Както може би сте забелязали , имаме две функции в цикъла while. Използва се първата функция Detect_button (), за да се намери кой бутон е натиснал потребителят, а втората функция Play_tone () се използва за възпроизвеждане на съответния тон. Освен тази функция функцията Detect_button () също записва кой бутон се натиска, а функцията Play_tone () записва колко дълго е бил натиснат бутонът.
Вътре в Detect_button () функцията четем аналоговия напрежение от ПИН A0 и я сравнете с някои предварително зададени стойности, за да разберете кой бутон е натиснат. Стойността може да бъде определена или чрез калкулатора на делителя на напрежението по-горе, или чрез сериен монитор, за да се провери каква аналогова стойност се чете за всеки бутон.
void Detect_button () { analogVal = analogRead (A0); // прочетете аналоговия волтаг на щифт A0 pev_button = бутон; // запомняме предишния бутон, натиснат от потребителя, ако (analogVal <550) бутон = 8; ако (analogVal <500) бутон = 7; ако (analogVal <450) бутон = 6; ако (analogVal <400) бутон = 5; ако (analogVal <300) бутон = 4; ако (analogVal <250) бутон = 3; ако (analogVal <150) бутон = 2; ако (analogVal <100) бутон = 1; ако (analogVal> 1000) бутон = 0; / **** Запишете натиснатите бутони в масив *** / ако (бутон! = pev_button && pev_button! = 0) { записан_бутон = pev_button; бутон_индекс ++; записан_бутон = 0; бутон_индекс ++; } / ** Край на програмата за запис ** / }
Както казахме, вътре в тази функция ние също записваме последователността, в която са натиснати бутоните. Записаните стойности се съхраняват в масив, наречен записан_бутон. Първо проверяваме дали е натиснат нов бутон, ако е натиснат, тогава също проверяваме дали не е бутонът 0. Когато бутон 0 не е нищо, но не е натиснат бутон. Вътре в цикъла if съхраняваме стойността в местоположението на индекса, дадено от променливата button_index и след това също увеличаваме тази стойност на индекса, така че да не презаписваме на същото място.
/ **** Запишете натиснатите бутони в масив *** / if (бутон! = Pev_button && pev_button! = 0) { записан_бутон = pev_button; бутон_индекс ++; записан_бутон = 0; бутон_индекс ++; } / ** Край на програмата за запис ** /
Вътре в Play_tone () функцията ще играем на съответния тон за натиснат бутона с помощта на множество ако условия. Също така ще използваме масив на име записано_време, в който ще запазим времетраенето, за което е бил натиснат бутонът. Операцията е подобна на записването на последователност от бутони, като използваме функцията millis (), за да определим колко дълго е бил натиснат всеки бутон, също и за намаляване на размера на променливата, разделяме стойността на 10. За бутон 0, което означава, че потребителят не е натискайки каквото и да е, не пускаме тон за същото време. Пълният код във функцията е показан по-долу.
void Play_tone () { / **** Запишете закъснението между всяко натискане на бутон в масив *** / if (бутон! = pev_button) { lcd.clear (); // След това го почистете note_time = (millis () - start_time) / 10; записано_време = време на бележка; time_index ++; start_time = милис (); } / ** Край на програмата за запис ** / if (бутон == 0) { noTone (7); lcd.print ("0 -> Пауза.."); } if (бутон == 1) { тон (7, бележки); lcd.print ("1 -> NOTE_C4"); } if (бутон == 2) { тон (7, бележки); lcd.print ("2 -> NOTE_D4"); } ако (бутон == 3) { тон (7, бележки); lcd.print ("3 -> NOTE_E4"); } if (бутон == 4) { тон (7, бележки); lcd.print ("4 -> NOTE_F4"); } if (бутон == 5) { тон (7, бележки); lcd.print ("5 -> NOTE_G4"); } if (бутон == 6) { тон (7, бележки); lcd.print ("6 -> NOTE_A4"); } if (бутон == 7) { тон (7, бележки); lcd.print ("7 -> NOTE_B4"); } if (бутон == 8) { тон (7, бележки); lcd.print ("8 -> NOTE_C5"); } }
Накрая след запис потребителят трябва да превключи DPST в другата посока, за да възпроизведе записания тон. Когато това е направено, програмата излиза от предишния цикъл while и влиза във втория цикъл while, където възпроизвеждаме нотите в последователността на бутоните, натиснати за продължителност, която е била записана преди това. Кодът, който прави същото, е показан по-долу.
while (digitalRead (6) == 1) // Ако превключвателят е зададен в режим на възпроизвеждане { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Now Playing.."); за (int i = 0; i <sizeof (записан_бутон) / 2; i ++) { закъснение ((записано_време) * 10); // Изчакайте преди да платите следващата мелодия, ако ( записан_бутон == 0) noTone (7); // потребителски dint докосване на който и да е бутон иначе тон (7, бележки - 1)]); // пускаме звука, съответстващ на бутона, докоснат от потребителя } } }
Възпроизвеждане, запис, повторение и повторение!:
Направете хардуера според показаната електрическа схема и качете кода на платката Arduino и показаното време. Поставете SPDT в режим на запис и започнете да възпроизвеждате избраните от вас тонове, като натискането на всеки бутон ще създаде различен тон. По време на този режим на LCD дисплея ще се изведе “ Запис…” и на втория ред ще видите името на бележката, която в момента се натиска, както е показано по-долу
След като изсвирите тона си, превключете превключвателя SPDT на другата страна и LCD дисплеят трябва да изведе “ Now Playing..” и след това да започне възпроизвеждането на тона, който току-що сте пуснали. Същият тон ще се възпроизвежда отново и отново, докато превключвателят се държи в положението, както е показано на снимката по-долу.
Цялостната работа на проекта може да бъде намерена във видеото, дадено по-долу. Надявам се, че сте разбрали проекта и ви е било приятно да го изградите. Ако имате някакви проблеми при създаването на тази публикация, ги публикувайте в раздела за коментари или използвайте форумите за техническа помощ за вашия проект. Също така не забравяйте да проверите демонстрационното видео, дадено по-долу.