![]() |
![]() |
![]() |
![]() |
Общие сведения
Иногда бывает полезно чтобы наше устройство подавало какие-то сигналы не только светом, но и звуком. В этом уроке мы научимся подавать сигналы при помощи 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





Обсуждение