В этом проекте мы рассмотрим небольшое развлекательное устройство на основе платы Arduino. У всех нас есть привычка постукивать по столу или ручке для создания любой случайной музыки. Конечно, это не может считаться хорошей манерой поведения, но нам всем нравится делать это, хотя бы изредка. Поэтому и возникла идея создания подобного проекта. После создания этого проекта вы сможете генерировать тона, постукивая пальцами по чему-нибудь проводящему и создавать свои собственные ритмы, словно играть на пианино на своей ладони. Звучит неплохо, неправда ли?
Для лучшего понимания данного проекта рекомендуется прочитать статью про использование функции tone() в Arduino.
Необходимые компоненты
- Плата Arduino Pro Mini (купить на AliExpress).
- Пьезоэлектрический динамик/зуммер (Peizo Speaker) (купить на AliExpress).
- Гибкий датчик (купить на AliExpress).
- Перчатки на пальцы.
- Резисторы на 10 кОм (купить на AliExpress).
- Транзисторы BC547 (купить на AliExpress).
- Батарейка на 9 В.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Набор компонентов не является обязательным, поняв работу проекта вы сами можете модернизировать его по своему желанию.
Работа схемы
Схема проектируемого нами “пианино на ладони” на основе платы Arduino представлена на следующем рисунке.
Пара Дарлингтона
Пара Дарлингтона представляет собой два биполярных транзистора, соединенных таким образом, что ток, усиленный первым транзистором, дополнительно усиливается вторым транзистором. Пара Дарлингтона показана на следующем рисунке:
В нашем проекте для построения пары Дарлингтона мы использовали два транзистора BC547, коллекторы которых соединены между собой, а эмиттер первого транзистора соединен с базой второго транзистора. Эта схема действует как усилитель с коэффициентом усиления, то есть любого малого сигнала, подаваемого на базу первого транзистора, достаточно для смещения базы второго транзистора. Наше тело действует здесь как земля, поэтому всякий раз, когда мы касаемся базы (основания) транзистора, второй транзистор смещается. На основании этого эффекта мы и построили простой датчик прикосновения для нашего проекта.
Контакты 2 и 3 будут служить контактами прерывания для платы Arduino. На них с помощью внутренних подтягивающих резисторов будет подаваться напряжение высокого уровня, а когда переключатель Дарлингтона будет закрываться на эти контакты будет подаваться земля. Таким образом, когда мы будем касаться базы (провода) первого транзистора пары Дарлингтона в плате Arduino будет генерироваться прерывание.
Использование двух пальцев по этому принципу может производить только два типа тонов, поэтому мы в проект добавили гибкий датчик (его еще называют датчиком изгиба), который будет изменять тон в зависимости от того, насколько он согнут. Мы запрограммировали три разных тона на каждый палец, основываясь на том, насколько согнут палец (а вместе с ним и гибкий датчик). Вы можете увеличить это число если хотите производить больше тонов на кончиках пальцев.
Мы разместили все это устройство на перфорированной плате и оно легко умещается на нашей ладони, но вы также можете использовать макетную плату. Просто убедитесь в том, что ваше тело касается земли схемы в какой-нибудь точке. Когда вы все это спаяете это должно выглядеть примерно следующим образом:
Мы использовали двое перчаток на пальцы чтобы закрепить провода от пары Дарлингтона и гибкие датчики в положениях, показанных на рисунке. Но вы можете использовать и свою собственную конструкцию для размещения этих элементов.
Программирование Arduino
Программа для нашего генератора тонов на основе движений пальцев достаточно прямолинейна. Мы просто должны следить за прерываниями от пар Дарлингтона и при их обнаружении проигрывать мелодию, зависящую от того насколько согнут гибкий датчик на пальце, от которого поступило прерывание. Полный код программы приведен в конце статьи, здесь же объяснены наиболее важные его части.
Примечание: эта программа работает с использованием библиотеки “pitches.h”. Поэтому удостоверьтесь в том, что вы добавили ее заголовочный файл перед тем как компилировать программу. По этой ссылке вы можете скачать заголовочный файл pitches.h.
В функции setup мы инициализируем контакты 2 и 3 на работу в режим ввода данных с использованием внутренних подтягивающих резисторов. Мы также объявим их контактами прерывания и будем вызывать функцию tone1() при прерывании на контакте 2 и функцию tone2() при прерывании на контакте 3. Эти прерывания будут возникать каждый раз когда на эти контакты будет подаваться напряжение низкого уровня, то есть будет срабатывать один из наших датчиков касания.
1 2 3 4 5 6 7 |
void setup() { pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(2), tone1, LOW); attachInterrupt(digitalPinToInterrupt(3), tone2, LOW); Serial.begin(9600); } |
Внутри функции loop мы будем постоянно проверять насколько согнуты гибкие датчики. Использованный нами в проекте гибкий датчик 1, к примеру, выдает значения около 200 когда он полностью распрямлен и около 130 когда он полностью согнут, поэтому мы сопоставляем значения от 200 до 130 значениям от 1 до 3 поскольку мы должны проигрывать три различных типа мелодий (тонов) в зависимости от того насколько согнут гибкий датчик. Вы должны настроить (изменить) эти две строчки кода в зависимости от используемого вами гибкого датчика и количества мелодий (тонов), которые вы хотите генерировать при изгибе пальца.
1 2 3 4 5 |
void loop() { flexSensor1 = map(analogRead(A0),200,130,1,3); //измените эти значения в зависимости от значений, выдаваемых вашим гибким датчиком flexSensor2 = map(analogRead(A1),170,185,1,3); //Map up with your own values based on your flex sensor } |
Как мы уже говорили, функция tone1() будет вызываться при появлении прерывания на контакте 2. Внутри этой функции мы будем проигрывать мелодию, зависящую от значений на выходе гибкого датчика (степени его изгиба). Мелодии тона проигрываются с использованием Arduino’s Tone function. Ее использование мы подробно изучали в предыдущей статье на “музыкальную тематику”.
1 2 3 4 5 6 7 8 9 10 11 |
void tone1() { if (flexSensor1==1) tone(8, NOTE_D4,50); else if (flexSensor1==2) tone(8, NOTE_A3,50); else if (flexSensor1==3) tone(8, NOTE_G4,50); else tone(8, NOTE_D4,50); } |
Следующая строка используется для проигрывания мелодии. С ее помощью вы можете проигрывать любую мелодию, которая находится в заголовочном файле “pitches.h”. К примеру, следующая строка проигрывает мелодию под названием NOTE_A3 на контакте 8 в течение 50 миллисекунд.
1 |
tone(8, NOTE_A3,50); //tone(PinNum,Note name, Duration); |
Исходный код программы
Когда аппаратная часть проекта готова загрузите код программы в плату Arduino и смонтируйте собранное устройство на своих пальцах. Убедитесь в том, что ваше тело касается земли схемы в какой-нибудь точке. Теперь просто коснитесь любого проводящего материала или вашего тела, и вы должны услышать соответствующий тон (мелодию).
Вы можете воспроизводить свою собственную мелодию или музыку, производя прикосновения на разные интервалы времени и при разных положениях ваших пальцев.
Видео в конце статьи (на английском языке) демонстрирует работу проекта. Надеемся, вы получите массу положительных эмоций когда соберете это устройство. Также можете посмотреть проект простого аудио плеера на основе платы Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
/* * Arduino based Tap and Tone player * Published by: CircuitDigest.com (статья переведена с данного сайта) * Code By: B.Aswinth Raj * Dated:8-7-2017 * * ###CONNECTIONS### * Darlington Wire 1 -> Pin 2 * Darlington Wire 2 -> Pin 3 * FlexSensor 1 -> A0 * FlexSensor 2 -> A1 * Speaker -> Pin 8 */ #include "pitches.h" //добавьте эту библиотеку в папку с вашим проектом int flexSensor1,flexSensor2; void setup() { pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(2), tone1, LOW); //будем вызывать функцию tone1 при появлении прерывания низкого уровня на контакте 2 attachInterrupt(digitalPinToInterrupt(3), tone2, LOW); //будем вызывать функцию tone2 при появлении прерывания низкого уровня на контакте 3 Serial.begin(9600); } void loop() { flexSensor1 = map(analogRead(A0),200,130,1,3); //Map up with your own values based on your flex sensor flexSensor2 = map(analogRead(A1),170,185,1,3); //Map up with your own values based on your flex sensor } //**Function to execute on Interrupt 1**// void tone1() { if (flexSensor1==1) tone(8, NOTE_D4,50); else if (flexSensor1==2) tone(8, NOTE_A3,50); else if (flexSensor1==3) tone(8, NOTE_G4,50); else tone(8, NOTE_D4,50); } //**Function to execute on Interrupt 2**// void tone2() { if (flexSensor1==1) tone(8, NOTE_A4,50); else if (flexSensor1==2) tone(8, NOTE_F4,50); else if (flexSensor1==3) tone(8, NOTE_E4,50); else tone(8, NOTE_A4,50); } |