КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Raspberry Pi Pico: Издаём звуки и играем мелодии в Arduino IDE (Модуль Зуммер)





Общие сведения

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

Ссылки




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями