Делаем бумажное пианино на основе Ардуино

Создадим пианино с помощью Arduino, нарисованной клавиатуры с использованием свинцового карандаша, бумаги и динамика.

В итоге мы получим вот такое незамысловатое пианино на Ардуине:

Комплектующие

Проект довольно не сложный и требует минимум деталей для исполнения.

  • Провода "папа-папа" × 1
  • Макетная плата (на выбор) × 1
  • Arduino Mega 2560 и Genuino Mega 2560 × 1
  • Резистор 1 Mом × 1
  • Спиккр 0.25 Вт, 8 Ом × 1
  • Карандаш
  • Бумага формата А4
  • Скрепка

Проект

Как уже было сказано выше - это простой проект и любой начинающий радиоэлектронщик с помощью рисованной клавиатуры с использованием свинцового карандаша, бумаги и динамика сможет сделать такое пианино.

Емкостная чувствительность

Емкостное сенсорное восприятие - это способ сенсорного восприятия человека, для которого требуется мало силы или почти её отсутствие для активации. Его можно использовать для ощущения человеческого прикосновения более чем через 2 см пластика, дерева, керамики или другого изоляционного материала (но не через все виды металла), что позволяет полностью визуально скрывать датчик.

Почему емкостное прикосновение?

  • Для каждого сенсорного датчика требуется только один провод, подключенный к нему.
  • Может быть скрыт под любым неметаллическим материалом.
  • Можно легко использовать вместо кнопки.
  • Может обнаружить руку с нескольких сантиметров, если потребуется.
  • Очень недорогой вариант.

Как работает емкостный датчик?

Пластина датчика и ваше тело образуют конденсатор. Мы знаем, что конденсатор хранит заряд. Чем больше его емкость, тем больший заряд он может хранить.

Емкость этого емкостного сенсорного датчика зависит от того, как близко ваша рука к пластине.

Что делает Arduino?

В основном Arduino измеряет сколько времени конденсатору (т.е. сенсорный датчик) нужно на заряд, давая оценку емкости.

Емкость может быть очень малой, однако Ардуино измеряет ее с точностью.

Одним из способов использования емкостного прикосновения в проекте является использование библиотеки CapSense. Для библиотеки CapSense ардуино использует один разъем для отправки и любое количество принимаемых контактов. Получающий вход соединен со штырем отправки через резистор средней или большой величины.

Вот некоторые рекомендации для резисторов, но обязательно экспериментируйте:

  • Используйте резистор на 1 МОм (возможно и больше) для абсолютного касания для активации.
  • С резистором 10 МОм датчик начнет реагировать на 10-15 см.

Схема соединения

Теперь переходим к нашей принципиальной схеме нашего пианино на Ардуино. Выглядит это примерно так:

Код для Ардуино

Вы можете ниже скачать или скопировать код для пианино, который нужно загрузить в микроконтроллер.

Перед этим нужно скачать библиотеку CapSense library:

// Import the CapacitiveSensor Library.
#include 
 
#define speaker 11

// Set the Send Pin & Receive Pin.
CapacitiveSensor   cs_2_3 = CapacitiveSensor(2,3);        
CapacitiveSensor   cs_2_4 = CapacitiveSensor(2,4);         
CapacitiveSensor   cs_2_5 = CapacitiveSensor(2,5);     
CapacitiveSensor   cs_2_6 = CapacitiveSensor(2,6);     
CapacitiveSensor   cs_2_7 = CapacitiveSensor(2,7);      
CapacitiveSensor   cs_2_8 = CapacitiveSensor(2,8);         
CapacitiveSensor   cs_2_9 = CapacitiveSensor(2,9);  
CapacitiveSensor   cs_2_10 = CapacitiveSensor(2,10);     

void setup()                    
{
  cs_2_6.set_CS_AutocaL_Millis(0xFFFFFFFF);     // turn off autocalibrate on channel 1 - just as an example
  
  // Arduino start communicate with computer.
  Serial.begin(9600);
}

void loop()                    
{
  // Set a timer.
  long start = millis();
  
  // Set the sensitivity of the sensors.
  long total1 =  cs_2_3.capacitiveSensor(3000);
  long total2 =  cs_2_4.capacitiveSensor(3000);
  long total3 =  cs_2_5.capacitiveSensor(3000);
  long total4 =  cs_2_6.capacitiveSensor(3000);
  long total5 =  cs_2_7.capacitiveSensor(3000);
  long total6 =  cs_2_8.capacitiveSensor(3000);
  long total7 =  cs_2_9.capacitiveSensor(3000);
  long total8 =  cs_2_10.capacitiveSensor(3000);
  
  Serial.print(millis() - start);        // check on performance in milliseconds
  Serial.print("\t");                    // tab character for debug windown spacing

  Serial.print(total1);                  // print sensor output 1
  Serial.print("\t");                    // Leave some space before print the next output
  Serial.print(total2);                  // print sensor output 2
  Serial.print("\t");                    // Leave some space before print the next output
  Serial.print(total3);                  // print sensor output 3
  Serial.print("\t");                    // Leave some space before print the next output
  Serial.print(total4);                  // print sensor output 4
  Serial.print("\t");                    // Leave some space before print the next output
  Serial.print(total5);                  // print sensor output 5
  Serial.print("\t");                    // Leave some space before print the next output
  Serial.print(total6);                  // print sensor output 6
  Serial.print("\t");                    // Leave some space before print the next output
  Serial.print(total7);                   // print sensor output 7
                                          // Leave some space before print the next output
  Serial.print("\t");
  Serial.println(total8);                 // print sensor output 8
                                         // "println" - "ln" represent as "line", system will jump to next line after print the output. 
  
  // When hand is touched the sensor, the speaker will produce a tone.
  // I set a threshold for it, so that the sensor won't be too sensitive.
  if (total1 > 500) tone(speaker,131);   // frequency
  if (total2 > 500) tone(speaker,147);   // you can see https://www.arduino.cc/en/Tutorial/toneMelody if you want to change frequency
  if (total3 > 500) tone(speaker,165);
  if (total4 > 500) tone(speaker,175);
  if (total5 > 500) tone(speaker,196);
  if (total6 > 500) tone(speaker,220);
  if (total7 > 500) tone(speaker,247);
  if (total8 > 500) tone(speaker,262);
  
  // When hand didn't touch on it, no tone is produced.
  if (total1<=500  &  total2<=500  &  total3<=500 & total4<=500  &  total5<=500  &  total6<=500 &  total7<=500 &  total8<=500)
    noTone(speaker);

  delay(10);                             // arbitrary delay to limit data to serial port 
}

Итоговый результат

В итоге вы сможете сыграть вот такие знакомые многим мелодии:

На этом пока всё, дорогие друзья. Добавляйте наш сайт в закладки, впереди еще много интересного.

Ардуино+