Общие сведения
Иногда бывает полезно чтобы наше устройство подавало какие-то сигналы не только светом, но и звуком. В этом уроке мы научимся подавать сигналы при помощи Trema-модуля Зуммер.
Для этого урока нам понадобится:
Для работы данных примеров в Pi Pico необходимо загрузить прошивку MicroPython и установить Thonny IDE, о том как это сделать можно прочитать в этой статье https://lesson.iarduino.ru/page/pi-pico-python-ide
Подключение
Подключим Trema-модуль Зуммер согласно таблице
Вывод модуля | Вывод Pi Pico |
---|---|
Vcc | 3V3(OUT) |
GND | GND |
S | GP15 |
Подключим Trema-модуль Потенциометр согласно таблице
Вывод модуля | Вывод Pi Pico |
---|---|
Vcc | ADC_VREF |
GND | AGND |
S | GP26 |
Управляем частотой звука
Зуммер состоит из платы, излучателя и транзистора, который преобразует низкое сопротивление переменному току (импеданс) излучателя в высокое сопротивление на затворе или базе транзистора. Благодаря этому мы можем управлять работой излучателя используя маленькие токи вывода Pi Pico. Выводы Pi Pico не имеют цифро-аналогового преобразователя, поэтому форма волны, излучаемая зуммером может быть только квадратной (единица и ноль). Но можно менять частоту этого сигнала, что мы сейчас и попробуем.
Погудим
// Определяем вывод зуммера #define ZUM_PIN 15 void setup() { // устанавливаем режим работы вывода pinMode(ZUM_PIN, OUTPUT); // устанавливаем частоту ШИМ analogWriteFreq(440); // устанавливаем ШИМ на выводе с широтой 50% analogWrite(ZUM_PIN, 127); delay(200); // устанавливаем частоту ШИМ analogWriteFreq(880); // устанавливаем ШИМ на выводе с широтой 50% analogWrite(ZUM_PIN, 127); delay(500); // устанавливаем ШИМ на выводе с широтой 0% (выключаем ШИМ) analogWrite(ZUM_PIN, 0); } void loop() { }
Уроки музыки: Арпеджио
В качестве проекта для этого урока сделаем простой пример, если поворачивать ручку потенциометра - то зуммер будет бегать вниз и вверх по заданным нотам (так называемое "арпеджио", а наш прибор будет называться "Арпеджиатор"):
// Определяем выводы #define ZUM_PIN 15 #define POT_PIN 26 // Аккорд C maj 7 (ДО-МИ-СОЛЬ-СИ) раскинутый на две октавы int scale[] = {523, 659, 784, 988, 1046, 1318, 1568, 1875}; // для хранения предыдущего индекса массива int previous_index = 0; void setup() { pinMode(POT_PIN, INPUT); pinMode(ZUM_PIN, OUTPUT); analogWrite(ZUM_PIN, 127); } void loop() { // Получаем индекс для массива с частотами нот относительно положения потенциометра int current_index = int(analogRead(POT_PIN)/int(1024/((sizeof(scale)/sizeof(scale[0])-1)))); // Если новая нота if (previous_index != current_index) { // запоминае её previous_index = current_index; // воспроизводим analogWriteFreq(scale[current_index]); analogWrite(ZUM_PIN, 127); // ждём длительность delay(200); // выключаем зуммер analogWrite(ZUM_PIN, 0); } delay(5); }
В качестве эксперимента можно поиграться с числом передаваемым в
analogWrite()
- это будет слега менять окрас звучания
зуммера. Так же можно добавить или убрать ноты из массива
scale
Обсуждение