🛒
0 товаров
0 руб.

Интернет-магазин «Неглупый Дом»


🎵 Проект: генератор чистого синусоидального тона через ЦАП MCP4725

Функция `tone()`, использованная во многих других звуковых проектах на сайте, формирует грубый прямоугольный сигнал — щелчок между 0 и 5V на пине. Здесь MCP4725 выводит плавно нарастающее и убывающее напряжение по заранее рассчитанной таблице синуса, получая на выходе заметно более мягкий, "музыкальный" тон, а не резкое жужжание.

Как это работает

MCP4725 умеет выставлять любое из 4096 значений напряжения почти мгновенно по команде `setVoltage()` — этого достаточно, чтобы быстро проходить по точкам, лежащим на кривой синуса, а не просто переключаться между двумя крайними значениями, как делает прямоугольный сигнал `tone()`. Заранее рассчитанная таблица (например, 32 точки на один период синуса) хранится в массиве в памяти Arduino, а в цикле код просто проходит по этим точкам одну за другой, отправляя каждое значение в ЦАП с небольшой задержкой между ними.

Частота получившегося тона зависит от того, как быстро код проходит одну таблицу целиком: чем короче задержка между точками (или чем короче сама таблица), тем выше частота. Этот метод в упрощённом виде называется прямым цифровым синтезом (DDS) — именно так устроены многие профессиональные генераторы сигналов, только здесь всё закодировано вручную без специализированной аппаратной акселерации.

Пошаговая сборка

Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.

  1. MCP4725: SDA → A4, SCL → A5, VCC → 5V, GND → GND.
  2. Выход MCP4725 (OUT/VOUT) не может напрямую раскачать динамик мощно — для простого теста подключите динамик через конденсатор (например, 10 мкФ, чтобы отделить постоянную составляющую) прямо к выходу; для громкого и чистого звука используйте отдельный усилитель, как в проекте с динамиком на сайте.

Скетч

// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.

#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 ₽)

Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.

Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.

Корзина


Поиск



Пример: понижающий или DC-DC или mini360 или aw-023 или арт. OZ/WB/YA