Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/Проигрывание мелодии с помощью функции tone()

Материал из Онлайн справочника
Перейти к: навигация, поиск

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


Проигрывание мелодии с помощью функции tone()

Данный пример демонтирует подключение динамика и воспроизведение простейшей мелодии. В данном примере используется два массива одинаковой длины для нот и длительности звучания нот. Обратите внимание, функция tone() использует один из аппаратных таймеров контроллера ATmega, поэтому после ее вызова она продолжает работать в фоновом режиме и поэтому после вызова функции tone() введена задержка delay(), чтобы следующая нота звучала только тогда, когда закончится воспроизведение текущей ноты.

Необходимые компоненты

Монтажная схема

Соберите схему согласно монтажной схеме.

При подключении динамика к выводам Arduino необходимо использовать токоограничивающие резисторы. Каждый вывод Arduino может выдать ток не более 40 мА (0,04 А). Воспользовавшись законом Ома, вычислим минимальное сопротивление токоограничивающего резистора:

  • U = I * R;
  • R = U / I = 5 / 0,04 = 125 Ом;

Но т.к. динамик имеет также сопротивление(обмотка провода катушки электромагнита), для примера возьмем 8 Ом, то получим минимальное сопротивление токоограничивающего резистора равным:

  • R = 125 - 8 = 117 Ом;

Ближайший номинал резистора равен 150 Ом, его и будем использовать в нашей схеме.

Чтобы регулировать громкость звучания мелодии, воспользуемся переменным резистором на 10 кОм, включив его последовательно с подобранным токоограничивающим резистором. Обратите внимание, что мы используем только крайний и средний вывод потенциометра. Крайний вывод соединен с токоограничивающим резистором, а средний с одним из выводов динамика.

При повороте ручки потенциометра громкость воспроизведения будет изменяться вследствие изменения сопротивления цепи.

Arduino uno example speaker 1.png

Код

В данном скетче используется дополнительный файл – pitches.h. Он содержит все значения, соответствующие стандартным нотам. Например, NOTE_C4 – это среднее «до», а NOTE_FS4 – это «фа-диез» и так далее. Этот нотный «алфавит» был написан Бреттом Хэгменом (Brett Hagman), и функция tone() основана именно на его работе.

  1. #include "pitches.h"                        // заголовочный файл с названиями нот и значениями частот
  2.  
  3. #define SPEAKER 9                           // вывод для подключения динамика
  4.  
  5. // массив нот
  6. int notes[] = {
  7.  NOTE_A4, NOTE_E3, NOTE_A4, 0,
  8.  NOTE_A4, NOTE_E3, NOTE_A4, 0,
  9.  NOTE_E4, NOTE_D4, NOTE_C4, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_C4, NOTE_D4,
  10.  NOTE_E4, NOTE_E3, NOTE_A4, 0
  11. };
  12.  
  13. // массив длительностей звучания нот (в мс)
  14. int times[] = {
  15.  250, 250, 250, 250,
  16.  250, 250, 250, 250,
  17.  125, 125, 125, 125, 125, 125, 125, 125,
  18.  250, 250, 250, 250
  19. };
  20.  
  21.  
  22. void setup()
  23. {
  24.  // Воспроизведение каждой ноты в течение заданной длительности
  25.  for (int i = 0; i < 20; i++)
  26.  {
  27.   tone(SPEAKER, notes[i], times[i]);
  28.   delay(times[i]);
  29.  }
  30. }
  31.  
  32. void loop()
  33. {
  34.  // Нажмите кнопку сброса(Reset) для повторного воспроизведения.
  35. }

Создайте новую вкладку с названием файла pitches.h и вставьте туда этот код.

Arduino ide new tab 1.PNG


  1. /*************************************************
  2.  * Константы для публичного использования
  3.  *************************************************/
  4.  
  5. #define NOTE_B0  31
  6. #define NOTE_C1  33
  7. #define NOTE_CS1 35
  8. #define NOTE_D1  37
  9. #define NOTE_DS1 39
  10. #define NOTE_E1  41
  11. #define NOTE_F1  44
  12. #define NOTE_FS1 46
  13. #define NOTE_G1  49
  14. #define NOTE_GS1 52
  15. #define NOTE_A1  55
  16. #define NOTE_AS1 58
  17. #define NOTE_B1  62
  18. #define NOTE_C2  65
  19. #define NOTE_CS2 69
  20. #define NOTE_D2  73
  21. #define NOTE_DS2 78
  22. #define NOTE_E2  82
  23. #define NOTE_F2  87
  24. #define NOTE_FS2 93
  25. #define NOTE_G2  98
  26. #define NOTE_GS2 104
  27. #define NOTE_A2  110
  28. #define NOTE_AS2 117
  29. #define NOTE_B2  123
  30. #define NOTE_C3  131
  31. #define NOTE_CS3 139
  32. #define NOTE_D3  147
  33. #define NOTE_DS3 156
  34. #define NOTE_E3  165
  35. #define NOTE_F3  175
  36. #define NOTE_FS3 185
  37. #define NOTE_G3  196
  38. #define NOTE_GS3 208
  39. #define NOTE_A3  220
  40. #define NOTE_AS3 233
  41. #define NOTE_B3  247
  42. #define NOTE_C4  262
  43. #define NOTE_CS4 277
  44. #define NOTE_D4  294
  45. #define NOTE_DS4 311
  46. #define NOTE_E4  330
  47. #define NOTE_F4  349
  48. #define NOTE_FS4 370
  49. #define NOTE_G4  392
  50. #define NOTE_GS4 415
  51. #define NOTE_A4  440
  52. #define NOTE_AS4 466
  53. #define NOTE_B4  494
  54. #define NOTE_C5  523
  55. #define NOTE_CS5 554
  56. #define NOTE_D5  587
  57. #define NOTE_DS5 622
  58. #define NOTE_E5  659
  59. #define NOTE_F5  698
  60. #define NOTE_FS5 740
  61. #define NOTE_G5  784
  62. #define NOTE_GS5 831
  63. #define NOTE_A5  880
  64. #define NOTE_AS5 932
  65. #define NOTE_B5  988
  66. #define NOTE_C6  1047
  67. #define NOTE_CS6 1109
  68. #define NOTE_D6  1175
  69. #define NOTE_DS6 1245
  70. #define NOTE_E6  1319
  71. #define NOTE_F6  1397
  72. #define NOTE_FS6 1480
  73. #define NOTE_G6  1568
  74. #define NOTE_GS6 1661
  75. #define NOTE_A6  1760
  76. #define NOTE_AS6 1865
  77. #define NOTE_B6  1976
  78. #define NOTE_C7  2093
  79. #define NOTE_CS7 2217
  80. #define NOTE_D7  2349
  81. #define NOTE_DS7 2489
  82. #define NOTE_E7  2637
  83. #define NOTE_F7  2794
  84. #define NOTE_FS7 2960
  85. #define NOTE_G7  3136
  86. #define NOTE_GS7 3322
  87. #define NOTE_A7  3520
  88. #define NOTE_AS7 3729
  89. #define NOTE_B7  3951
  90. #define NOTE_C8  4186
  91. #define NOTE_CS8 4435
  92. #define NOTE_D8  4699
  93. #define NOTE_DS8 4978

У вас должны получится две вкладки, одна с кодом и вторая с нотами.

Arduino ide tabs 1.PNG

См.также

Внешние ссылки