
Интернет-магазин «Неглупый Дом»
Функция `tone()`, использованная во многих других звуковых проектах на сайте, формирует грубый прямоугольный сигнал — щелчок между 0 и 5V на пине. Здесь MCP4725 выводит плавно нарастающее и убывающее напряжение по заранее рассчитанной таблице синуса, получая на выходе заметно более мягкий, "музыкальный" тон, а не резкое жужжание.
MCP4725 умеет выставлять любое из 4096 значений напряжения почти мгновенно по команде `setVoltage()` — этого достаточно, чтобы быстро проходить по точкам, лежащим на кривой синуса, а не просто переключаться между двумя крайними значениями, как делает прямоугольный сигнал `tone()`. Заранее рассчитанная таблица (например, 32 точки на один период синуса) хранится в массиве в памяти Arduino, а в цикле код просто проходит по этим точкам одну за другой, отправляя каждое значение в ЦАП с небольшой задержкой между ними.
Частота получившегося тона зависит от того, как быстро код проходит одну таблицу целиком: чем короче задержка между точками (или чем короче сама таблица), тем выше частота. Этот метод в упрощённом виде называется прямым цифровым синтезом (DDS) — именно так устроены многие профессиональные генераторы сигналов, только здесь всё закодировано вручную без специализированной аппаратной акселерации.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
#include <Wire.h>
#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dac;
const int TABLE_SIZE = 32;
int sineTable[TABLE_SIZE];
void buildSineTable() {
for (int i = 0; i < TABLE_SIZE; i++) {
float angle = (2.0 * PI * i) / TABLE_SIZE;
sineTable[i] = (int)(2048 + 2047 * sin(angle)); // от 1 до 4095, центр 2048
}
}
void setup() {
Serial.begin(9600);
dac.begin(0x60);
buildSineTable();
}
void loop() {
for (int i = 0; i < TABLE_SIZE; i++) {
dac.setVoltage(sineTable[i], false);
delayMicroseconds(300); // уменьшите для более высокой частоты тона
}
}
Библиотека Adafruit_MCP4725 ставится через Менеджер библиотек Arduino IDE. Приблизительная частота тона = 1 / (TABLE_SIZE × задержка в секундах) — например, при 32 точках и задержке 300 мкс получается примерно 104 Гц.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 216 ₽ 194 ₽ (экономия 22 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.