Все мы знаем, что микроконтроллеры умеют работать только с цифровыми значениями, однако в реальном мире нам приходится иметь дело с налоговыми сигналами. Поэтому для того, чтобы микроконтроллеры могли обрабатывать эти сигналы, их необходимо преобразовать в цифровую форму с помощью аналогово-цифрового преобразователя (АЦП). В английском языке они называются ADC — Analog to Digital Converter. Но если цифровые значения, хранящиеся в микроконтроллерах, необходимо конвертировать в аналоговую форму, используются цифро-аналоговые преобразователи (ЦАП). В английском языке они называются DAC — Digital to Analog Converter.
Простейшим примером необходимости использования ЦАП является воспроизведение какой-либо песни, хранящейся в цифровой форме. В свое время певец записал песню в студии используя микрофон. Затем эта песня была преобразована в цифровой формат и хранилась в виде файла с цифровыми данными. Чтобы затем воспроизвести эту песню в аналоговом виде с цифрового носителя данных и нужен ЦАП.
Цифро-аналоговые преобразователи (ЦАП) могут использоваться в различных приложениях, например, для управления двигателями и яркостью свечения светодиодов, в аудио усилителях, в видео-кодерах и т.п.
Во многих микроконтроллерах есть встроенные ЦАП, однако в платах Arduino, построенных на основе микроконтроллеров ATmega328/ATmega168, нет встроенного ЦАП (хотя есть АЦП). Поэтому в данной статье мы рассмотрим подключение цифро-аналогового преобразователя (ЦАП) MCP4725 к плате Arduino. Данную статью можно считать пособием для начинающих по использованию цифро-аналогового преобразования в Arduino.
Необходимые компоненты
- Плата Arduino Uno или Arduino Nano (купить на AliExpress).
- MCP4725 DAC IC (микросхема цифро-аналогового преобразователя) (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Потенциометр 10 кОм — 2 шт. (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
MCP4725 DAC Module (модуль цифро-аналогового преобразователя)
Микросхема (IC) MCP4725 представляет собой 12-битный ЦАП и используется для формирования аналогового сигнала в диапазоне от 0 до 5V. Взаимодействие с MCP4725 осуществляется по протоколу I2C. Также микросхема MCP4725 имеет в своем составе энергонезависимую память EEPROM.
ЦАП MCP4725 имеет разрешение 12 бит, то есть он может оперировать со значениями от 0 до 4096. С помощью этих значений на его выходе можно формировать аналоговое напряжение по отношению к опорному напряжению. Максимальное опорное напряжение для него составляет 5V.
Формула для расчета напряжения на его выходе выглядит следующим образом:
O/P Voltage = (Reference Voltage / Resolution) x Digital Value
Reference Voltage – опорное напряжение;
Resolution – разрешение (разрешающая способность) ЦАП;
Digital Value – цифровое значение.
К примеру, пусть мы используем опорное напряжение 5V, рассчитаем напряжение на выходе ЦАП для цифрового значения равного 2048:
O/P Voltage = (5/ 4096) x 2048 = 2.5V
Назначение контактов (распиновка) MCP4725
На следующих рисунке и таблице представлено назначение контактов ЦАП MCP4725.
| Контакты ЦАП MCP4725 | Их назначение |
| OUT | выходное аналоговое напряжение |
| GND | земля для выходного аналогового напряжения |
| SCL | линия синхронизация протокола I2C |
| SDA | линия передачи данных протокола I2C |
| VCC | входное опорное напряжение 5V или 3.3V |
| GND | земля для опорного напряжения |
Интерфейс I2C в ЦАП MCP4725
Микросхемой ЦАП MCP4725 можно управлять с любого микроконтроллера используя интерфейс (протокол) I2C. Для функционирования протокола I2C необходимо только два провода (линии) — SCL и SDA. По умолчанию I2C адрес для MCP4725 равен 0x60, 0x61 или 0x62. В нашем варианте — 0x61. Используя шину I2C можно объединить несколько микросхем MCP4725, но в этом случае необходимо будет изменить их адреса. Более подробно работа с протоколом I2C в плате Arduino описана в следующей статье, здесь не будем на ней подробно останавливаться.
В этом проекте мы будем соединять микросхему ЦАП MCP4725 с платой Arduino. Аналоговое входное напряжение, регулируемое с помощью потенциометра, будет подаваться на аналоговый контакт A0 платы Arduino. Затем с помощью встроенного в плату АЦП это аналоговое напряжение будет преобразовываться в цифровую форму. Затем это цифровое значение будет передаваться к микросхеме MCP4725 через шину I2C и в ЦАП MCP4725 оно будет преобразовываться в аналоговую форму. Контакт A1 платы Arduino будет использоваться для проверки сигнала с аналогового выхода MCP4725. Затем значения с АЦП и ЦАП будут отображаться на экране ЖК дисплея.
Схема проекта
Схема подключения цифро-аналогового преобразователя (ЦАП) MCP4725 к плате Arduino представлена на следующем рисунке.

| MCP4725 | Arduino Nano | Мультиметр |
| SDA | A4 | NC |
| SCL | A5 | NC |
| A0 или OUT | A1 | +ve terminal |
| GND | GND | -ve terminal |
| VCC | 5V | NC |
Соединения между ЖК дисплеем 16×2 и платой Arduino Nano представлены в следующей таблице.
| ЖК дисплей 16×2 | Плата Arduino Nano |
| VSS | GND |
| VDD | +5V |
| V0 | к центральному контакту потенциометра для регулировка контрастности ЖК дисплея |
| RS | D2 |
| RW | GND |
| E | D3 |
| D4 | D4 |
| D5 | D5 |
| D6 | D6 |
| D7 | D7 |
| A | +5V |
| K | GND |
Центральный контакт потенциометра подключен к аналоговому контакту A0 платы Arduino Nano, остальные два его контакта подключены к питанию и земле соответственно.
Вначале в программе нам необходимо подключить библиотеки для работы с протоколом I2C (wire.h) и ЖК дисплеем (liquidcrystal.h).
|
#include<Wire.h> #include <LiquidCrystal.h> |
Затем необходимо сообщить плате Arduino контакты, к которым подключен ЖК дисплей.
|
LiquidCrystal lcd(2,3,4,5,6,7); //Define LCD display pins RS,E,D4,D5,D6,D7 |
Затем необходимо инициализировать адрес I2C для микросхемы ЦАП MCP4725.
Далее в функции void setup() необходимо инициализировать связь по протоколу I2C на контактах A4 (SDA) и A5 (SCL) платы Arduino Nano.
|
Wire.begin(); //Begins the I2C communication |
Затем мы зададим режим 16×2 для ЖК дисплея и покажем на его экране приветственное сообщение.
|
lcd.begin(16,2); //Sets LCD in 16X2 Mode lcd.print(«CIRCUIT DIGEST»); delay(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print(«Arduino»); lcd.setCursor(0,1); lcd.print(«DAC with MCP4725»); delay(2000); lcd.clear(); |
В функции void loop()
1. Запишем в buffer[0] значение контрольного байта (0b01000000). 010 – переводит MCP4725 в режим записи.
2. Следующая команда считывает аналоговое значение с контакта A0 и преобразует его в цифровое значение в диапазоне (0-1023). Разрешение АЦП платы Arduino составляет 10 бит, поэтому мы умножаем полученное значение на 4, в результате получим диапазон изменения цифрового значения 0-4096 – это будет соответствовать 12-битному разрешению нашего ЦАП.
|
adc = analogRead(A0) * 4; |
3. Следующей командой мы вычисляем значение аналогового напряжения при опорном напряжении 5V и диапазоне изменений цифрового значения от 0 до 4096.
|
float ipvolt = (5.0/4096.0)* adc; |
4. Первая из представленных ниже команд записывает самые значимые биты в buffer[1] при помощи сдвига вправо на 4 разряда (бита) значения переменной adc. А вторая команда записывает наименее значащие биты в buffer[2] при помощи сдвига влево на 4 разряда (бита) значения переменной adc.
|
buffer[1] = adc >> 4; buffer[2] = adc << 4; |
5. Следующая команда считывает аналоговое значение с контакта A1, на который подается значение с выхода ЦАП (MCP4725 DAC IC’s OUTPUT pin). Этот контакт можно также подключить к мультиметру чтобы контролировать значение напряжения на нем.
|
unsigned int analogread = analogRead(A1)*4 ; |
6. Затем значение напряжения из переменной analogread рассчитывается с помощью следующей формулы:
|
float opvolt = (5.0/4096.0)* analogread; |
7. Следующая команда предназначена для начала передачи (установления связи) в ЦАП MCP4725.
|
Wire.beginTransmission(MCP4725); |
Передаем контрольный байт.
Передаем MSB (наиболее значащие биты).
Передаем LSB (наименее значащие биты).
Заканчиваем передачу.
Отображаем полученные результаты на экране ЖК дисплея.
|
lcd.setCursor(0,0); lcd.print(«A IP:»); lcd.print(adc); lcd.setCursor(10,0); lcd.print(«V:»); lcd.print(ipvolt); lcd.setCursor(0,1); lcd.print(«D OP:»); lcd.print(analogread); lcd.setCursor(10,1); lcd.print(«V:»); lcd.print(opvolt); delay(500); lcd.clear(); |
Тестирование работы проекта
После сборки аппаратной части проекта и загрузки программы в плату Arduino вы можете вращать ручку потенциометра и наблюдать как при этом изменяются показания на ЖК дисплее. На первой строчке дисплея будут показываться значение с выхода АЦП и значение напряжения, а на второй строчке будут показываться значение с выхода ЦАП и значение напряжения.
Также вы можете проверить значение напряжения с помощью мультиметра, подсоединив его к контактам OUT и GND микросхемы MCP4725.
Исходный код программы (скетча)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
#include<Wire.h> // библиотека для работы с протоколом I2C #include <LiquidCrystal.h> //библиотека для работы с ЖК дисплеем #define MCP4725 0x61 //устанавливаем для MCP4725 адрес 0x61, для своего АЦП вы можете использовать свой адрес LiquidCrystal lcd(2,3,4,5,6,7); //контакты, к которым подключен ЖК дисплей — RS,E,D4,D5,D6,D7 unsigned int adc; byte buffer[3]; void setup() { Wire.begin(); //старт связи по протоколу I2C lcd.begin(16,2); //устанавливаем ЖК дисплей в режим 16х2 lcd.print(«CIRCUIT DIGEST»); delay(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print(«Arduino»); lcd.setCursor(0,1); lcd.print(«DAC with MCP4725»); delay(2000); lcd.clear(); } void loop() { buffer[0] = 0b01000000; //записываем в buffer0 контрольный байт (010-Sets in Write mode) adc = analogRead(A0) * 4; //считываем аналоговое значение с контакта A0, преобразуем его в цифровое значение в диапазоне (0-1023) и умножаем его на 4 чтобы преобразовать его к диапазону (0-4096) float ipvolt = (5.0/4096.0)* adc; //формула для расчета значения напряжения (A0) buffer[1] = adc >> 4; //записываем наиболее значимые биты buffer[2] = adc << 4; //записываем наименее значимые биты unsigned int analogread = analogRead(A1)*4 ; //считываем аналоговое напряжение с контакта A1 float opvolt = (5.0/4096.0)* analogread; // формула для расчета значения напряжения (A1) Wire.beginTransmission(MCP4725); //присоединяемся к шине I2C с MCP4725 с адресом 0x61 Wire.write(buffer[0]); //передаем контрольный байт с помощью протокола I2C Wire.write(buffer[1]); //передаем наиболее значимые биты с помощью протокола I2C Wire.write(buffer[2]); // передаем наименее значимые биты с помощью протокола I2C Wire.endTransmission(); //окончание передачи lcd.setCursor(0,0); lcd.print(«A IP:»); lcd.print(adc); // выводим на экран значение с выхода АЦП контакта A0 lcd.setCursor(10,0); lcd.print(«V:»); // выводим на экран значение напряжения на контакте A0 lcd.print(ipvolt); lcd.setCursor(0,1); lcd.print(«D OP:»); lcd.print(analogread); // выводим на экран значение с контакта A1 (с ЦАП) lcd.setCursor(10,1); lcd.print(«V:»); lcd.print(opvolt); // выводим на экран значение напряжения на контакте A1 (From DAC) delay(500); lcd.clear(); } |
Видео, демонстрирующее работу схемы
Также можете посмотреть еще весьма наглядное видео про принцип работы ЦАП и работу с ним с помощью платы Arduino (на английском языке, но очень доступно).
Загрузка…
10 868 просмотров

MCP4725 потребляет не более 0.4 мА от источника питания с нулевой нагрузкой на выходе и подавать к нагрузке менее 25 мА. Также обратите внимание, что напряжение на выводе VCC используется как опорный вход ЦАП, поэтому источник питания на выводе VCC должен быть настолько чистым, насколько это возможно для хорошей эффективности ЦАП. Поскольку это 12-разрядный ЦАП, он будет принимать до 4096 возможных входных значений для обеспечения аналогового выхода. Здесь выходное значение 0 равно нулю, а выходное значение 4095 является полномасштабным выходом, которое определяется опорным напряжением, подаваемым на вывод VCC. EEPROM позволяет MCP4725 самостоятельно сохранять значения данных и восстанавливать их при включении питания.
Так как в базовые модели Arduino (Arduino Uno, Arduino Mini и т.п.) не входит встроенный ЦАП, MCP4725 может быть использован в проектах Arduino, чтобы получить аналоговый сигнал, если формирование сигнала из ШИМ не дает нужной точности.
Содержание
- 1 Технические характеристики MCP4725
- 2 Распиновка MCP4725
- 3 Система установки I2C адреса
- 4 Модуль MCP4725 и его принципиальная схема
- 5 Материалы
- 6 Купить MCP4725 на AliExpress
- 7 Похожие записи
Технические характеристики MCP4725
- Разрешение: 12-разрядное;
- Встроенная энергонезависимая память: EEPROM;
- LSB DNL: ±0.2 (typ);
- Режим выключения питания: нормальный или выключеный;
- Время настройки: 6µs (typ);
- Вход опорного напряжения: VDD;
- Потребляемая мощность: мин. 0.06, тип. 210 мкА, макс. 400 мкА;
- Напряжение питания: 2.7 В — 5.5 В;
- Интерфейс: I2C;
- I2C адреса: внешний контакт установки адреса A0, два доступных адреса;
- Скорость преобразования: номинальная (100 Кбит/с), высокая (400 Кбит/с), максимальная (3.4 Мбит/с);
- Корпус: SOT-23 с 6 выводами (SOT-23-6);
- Расширенный диапазон температур: -40 °C — +125 °C;
- Класс: AEC-Q100 1 квалификации;
- Размеры: 15х15 мм.
Распиновка MCP4725
| Вывод | Описание | |
|---|---|---|
| 1 | Vout/OUT | Аналоговый выход напряжения |
| 2 | Vss/GND | Земля |
| 3 | Vdd/VCC | Питание |
| 4 | SDA | Линия данных (Serial Data) |
| 5 | SCL | Линия тактирования (Serial CLock) |
| 6 | A0/ADDR | Выбор адреса |
Система установки I2C адреса
Согласно документации, адрес устройства содержит четыре фиксированных бита (код устройства = 1100) и три бита адреса (A2, A1, A0). Биты A2 и A1 устанавливаются во время изготовления, а бит A0 определяется логическим состоянием настраиваемого пользователем вывода A0. Вывод A0 можно подключить к VCC (VCC = 1100 00 1 (0x61)) или GND (GND = 1100 00 0 (0x60)) или активно управлять цифровыми логическими уровнями. Обнаружено, что адрес I2C по умолчанию для модуля, представленного здесь, равен 0x60 (A0 = 0, A1 = 0, A2 = 0).

Модуль MCP4725 и его принципиальная схема
Материалы
Arduino и ЦАП MCP-4725
Скачать Datasheet 22039d.pdf для MCP4725
MCP-4725 Digital to Analog Converter Hookup Guide — learn.sparkfun.com
MCP-4725 — System D/A Converters — Microcontrollers and Processors
Купить MCP4725 на AliExpress
Похожие записи
Все мы знаем, что микроконтроллеры работают только с цифровыми значениями, но в реальном мире нам приходится иметь дело с аналоговыми сигналами. Вот почему АЦП (аналого-цифровые преобразователи) предназначены для преобразования реальных аналоговых значений в цифровую форму, чтобы микроконтроллеры могли обрабатывать сигналы. Но что, если нам нужны аналоговые сигналы из цифровых значений, так что здесь идет ЦАП (цифро-аналоговый преобразователь).
Простым примером цифро-аналогового преобразователя является запись песни в студии, где певец-исполнитель использует микрофон и поет песню. Эти аналоговые звуковые волны преобразуются в цифровую форму, а затем сохраняются в файле цифрового формата, и когда песня воспроизводится с использованием сохраненного цифрового файла, эти цифровые значения преобразуются в аналоговые сигналы для вывода на динамик. Итак, в этой системе используется ЦАП.
ЦАП можно использовать во многих приложениях, таких как управление двигателем, регулировка яркости светодиодных индикаторов, аудиоусилитель, видеокодеры, системы сбора данных и т. Д.
Во многих микроконтроллерах есть внутренний ЦАП, который можно использовать для аналогового вывода. Но процессоры Arduino, такие как ATmega328 / ATmega168, не имеют встроенного ЦАП. Arduino имеет функцию АЦП (аналого-цифровой преобразователь), но не имеет ЦАП (цифро-аналоговый преобразователь). Он имеет 10-битный ЦАП во внутреннем АЦП, но этот ЦАП не может использоваться как автономный. Итак, здесь, в этом руководстве Arduino DAC, мы используем дополнительную плату под названием MCP4725 DAC Module с Arduino.
Модуль ЦАП MCP4725 (цифро-аналоговый преобразователь)
MCP4725 IC — это 12-разрядный модуль цифро-аналогового преобразователя, который используется для генерации выходных аналоговых напряжений от (0 до 5 В) и управляется с помощью связи I2C. Он также имеет встроенную энергонезависимую память EEPROM.
Эта ИС имеет 12-битное разрешение. Это означает, что мы используем (от 0 до 4096) в качестве входных данных для обеспечения выходного напряжения относительно опорного напряжения. Максимальное опорное напряжение 5В.
Формула для расчета выходного напряжения
O / P напряжение = (Опорное напряжение / разрешение) х цифровое значение
Для примера, если мы используем 5V в качестве опорного напряжения и давайте предположим, что цифровое значение 2048. Таким образом, для вычисления выходного сигнала ЦАП.
Напряжение O / P = (5/4096) x 2048 = 2,5 В
Распиновка MCP4725
Ниже представлено изображение MCP4725 с четко обозначенными именами контактов.
|
Штифты MCP4725 |
Использовать |
|
ИЗ |
Выходы Аналоговое напряжение |
|
GND |
GND для выхода |
|
SCL |
Линия последовательных часов I2C |
|
ПДД |
Линия последовательных данных I2C |
|
VCC |
Ввод опорного напряжения 5В или 3.3В |
|
GND |
GND для входа |
Связь I2C в ЦАП MCP4725
Эта ИС ЦАП может быть сопряжена с любым микроконтроллером с использованием связи I2C. Для связи I2C требуются только двухпроводные SCL и SDA. По умолчанию адрес I2C для MCP4725 — 0x60, 0x61 или 0x62. Для меня это 0x61. Используя шину I2C, мы можем подключить несколько микросхем ЦАП MCP4725. Единственное, нам нужно изменить адрес I2C IC. Связь I2C в Arduino уже подробно объяснялась в предыдущем руководстве.
В этом руководстве мы подключим микросхему ЦАП MCP4725 к Arduino Uno и предоставим аналоговое входное значение на вывод A0 Arduino с помощью потенциометра. Затем АЦП будет использоваться для преобразования аналогового значения в цифровую форму. После этого эти цифровые значения отправляются на MCP4725 по шине I2C для преобразования в аналоговые сигналы с помощью DAC MCP4725 IC. Вывод A1 Arduino используется для проверки аналогового выхода MCP4725 с вывода OUT и, наконец, отображения значений и напряжений АЦП и ЦАП на ЖК-дисплее 16×2.
Необходимые компоненты
- Ардуино Нано / Ардуино Уно
- Модуль ЖК-дисплея 16×2
- Микросхема ЦАП MCP4725
- Потенциометр 10k
- Макетная плата
- Перемычки
Принципиальная электрическая схема
В таблице ниже показано соединение между ИС ЦАП MCP4725, Arduino Nano и мультиметром.
|
MCP4725 |
Ардуино Нано |
Мультиметр |
|
ПДД |
A4 |
NC |
|
SCL |
A5 |
NC |
|
A0 или OUT |
A1 |
+ ve терминал |
|
GND |
GND |
-ve терминал |
|
VCC |
5В |
NC |
Соединение между ЖК-дисплеем 16×2 и Arduino Nano
|
ЖК-дисплей 16×2 |
Ардуино Нано |
|
VSS |
GND |
|
VDD |
+ 5В |
|
V0 |
От центрального штифта потенциометра для регулировки контрастности ЖК-дисплея |
|
RS |
D2 |
|
RW |
GND |
|
E |
D3 |
|
D4 |
D4 |
|
D5 |
D5 |
|
D6 |
D6 |
|
D7 |
D7 |
|
А |
+ 5В |
|
K |
GND |
Потенциометр используются с центральным контактом, подключенным к A0 аналоговому входу Arduino Nano, левый стержень, подключенных к GND и правому большинство штифта, соединенному с 5V из Arduino.
Программирование DAC Arduino
Полный код Arduino для DAC приведен в конце с демонстрационным видео. Здесь мы объяснили код построчно.
Во-первых, включите библиотеку для I2C и LCD с помощью библиотеки wire.h и liquidcrystal.h.
#включают
#включают
Затем определите и инициализируйте выводы ЖК-дисплея в соответствии с выводами, которые мы подключили к Arduino Nano.
ЖК-дисплей LiquidCrystal (2,3,4,5,6,7); // Определение контактов ЖК-дисплея RS, E, D4, D5, D6, D7
Затем определите I2C-адрес микросхемы ЦАП MCP4725.
#define MCP4725 0x61
В настройке void ()
Сначала начните связь I2C на выводах A4 (SDA) и A5 (SCL) Arduino Nano.
Wire.begin (); // Начинает связь по I2C
Затем установите ЖК-дисплей в режим 16×2 и отобразите приветственное сообщение.
lcd.begin (16,2); // Устанавливает ЖК-дисплей в режим 16X2 lcd.print («CIRCUIT DIGEST»); задержка (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print («Ардуино»); lcd.setCursor (0,1); lcd.print («ЦАП с MCP4725»); задержка (2000); lcd.clear ();
В пустом цикле ()
1. Сначала в буфер поместите значение контрольного байта (0b01000000)
(010-устанавливает MCP4725 в режим записи)
буфер = 0b01000000;
2. Следующий оператор считывает аналоговое значение с вывода A0 и преобразует его в цифровые значения (0-1023). АЦП Arduino имеет 10-битное разрешение, поэтому умножение его на 4 дает: 0-4096, так как DAC имеет 12-битное разрешение.
adc = analogRead (A0) * 4;
3. Это утверждение, чтобы найти напряжение от входного значения АЦП (от 0 до 4096) и опорное напряжение, как 5V
float ipvolt = (5.0 / 4096.0) * adc;
4. Ниже первая строка помещает наиболее значимые битовые значения в буфер, сдвигая 4 бита вправо в переменной ADC, а вторая строка помещает наименее значимые битовые значения в буфер, сдвигая 4 бита влево в переменной ADC.
буфер = adc >> 4; буфер = adc << 4;
5. Следующая инструкция считывает аналоговое напряжение с A1, который является выходом ЦАП (вывод OUTPUT ИС ЦАП MCP4725). Этот вывод также можно подключить к мультиметру для проверки выходного напряжения. Узнайте, как использовать мультиметр здесь.
беззнаковое int analogread = analogRead (A1) * 4;
6. Далее значение напряжения из аналогового показания переменной рассчитывается по формуле ниже.
float opvolt = (5.0 / 4096.0) * analogread;
7. Следующая инструкция используется для начала передачи с MCP4725.
Wire.beginTransmission (MCP4725);
Отправляет управляющий байт в I2C
Wire.write (буфер);
Отправляет MSB в I2C
Wire.write (буфер);
Посылает LSB в I2C
Wire.write (буфер);
Завершает передачу
Wire.endTransmission ();
Теперь, наконец, отобразите эти результаты на ЖК-дисплее 16×2 с помощью lcd.print ()
lcd.setCursor (0,0); lcd.print («IP:»); lcd.print (АЦП); lcd.setCursor (10,0); lcd.print («V:»); lcd.print (ipvolt); lcd.setCursor (0,1); lcd.print («D OP:»); lcd.print (аналоговое чтение); lcd.setCursor (10,1); lcd.print («V:»); lcd.print (опвольт); задержка (500); lcd.clear ();
Цифро-аналоговое преобразование с использованием MCP4725 и Arduino
После завершения всех подключений схемы и загрузки кода в Arduino, измените потенциометр и посмотрите результат на ЖК-дисплее . Первая строка ЖК-дисплея покажет значение входного АЦП и напряжение, а вторая строка покажет значение и напряжение выходного ЦАП.
Вы также можете проверить выходное напряжение, подключив мультиметр к контактам OUT и GND MCP4725.
Вот как мы можем преобразовать цифровые значения в аналоговые, связав модуль ЦАП MCP4725 с Arduino.
Делаем музыкальный инструмент из кассетного плеера
Время прочтения
6 мин
Просмотры 6.5K
Кассетный синтезатор
Мне нравятся необычные музыкальные проекты. Например, я выпустил альбом, основанный на записях, сделанных NASA во время миссии «Аполлон-12». А недавно я, для управления темпом музыки, использовал собственное сердцебиение. Результаты моих музыкальных экспериментов вы можете найти здесь.
Недавно я сделал из старого кассетного плеера, напоминающего Walkman от Sony, синтезатор, управляемый MIDI-командами. Для этого мне понадобилась плата Arduino и немного кода. То, что получилось, можно назвать «кассетным синтезатором».
Кассетный синтезатор работает, проигрывая монотонный звук (одну ноту), заранее записанный на кассету. Высотой звука можно управлять, она зависит от скорости проигрывания плёнки. К идее создания кассетного синтезатора меня привёл проект Onde Magnétique, а создатели этого проекта вдохновлялись идеей меллотрона.
Вот видео, в котором показано как я играю на кассетном синтезаторе, используя MIDI-клавиатуру.
Этот синтезатор хорош тем, что у него получается очень «аналоговое» звучание при смене нот. А именно, часто высота звука плавно меняется при переходе от ноты к ноте, звук, в результате, получается весьма интересным (то есть, в музыке, исполняемом на этом синтезаторе, часто встречается эффект портаменто). Кроме того, на плёнку можно записать абсолютно любой звук, поэтому синтезатор у меня получился достаточно универсальным.
Создание кассетного синтезатора
На самом деле, создать такой синтезатор очень просто. Мне попалось хорошее видео, посвящённое тому, как модифицировать кассетный плеер, сделав так, чтобы скоростью воспроизведения кассеты можно было бы управлять, используя регулятор напряжения. Я доработал имеющийся у меня плеер подобным образом. Я, кроме того, создал, на основе браузера, простой MIDI-контроллер, рассчитанный на то, чтобы получать нужные ноты путём модификации напряжения.
Нижеприведённые инструкции посвящены аппаратной части синтезатора, представленной плеером и Arduino, и программной, роль которой играет MIDI-контроллер.
Материалы
- Кассетный плеер GE 3-5362A ($15, их очень много на eBay)
- Arduino ($23).
- Цифроаналоговый преобразователь MCP4725 ($11).
- Аудиокабель с 3,5 мм разъёмом на одной стороне и с обычными проводами на другой ($8).
- Соединительные провода (если у вас их нет, то стоят они $5).
- Паяльник и то, что нужно для пайки ($25, пользоваться им можно будет всю жизнь).
Модификация плеера GE 3-5362A
Обратите внимание на то, что вам необязательно использовать плеер GE 3-5362A. Подойдёт любой плеер, который поддерживает переменную скорость воспроизведения. Если вы будете делать кассетный синтезатор на основе другого плеера — вам лишь понадобится разобраться с его внутренним устройством, и с тем, куда припаивать соответствующие провода.
Начнём с того, что откроем корпус плеера. Для этого нужно открутить четыре винта, расположенных на задней части устройства. Больших усилий тут прилагать не нужно — достаточно открутить винты и аккуратно открыть корпус. Обратите внимание на то, что задняя и передняя части устройства связаны проводами, подводящими к электронике плеера питание. Не оборвите эти провода.
Разобранный плеер, который уже модифицирован
Для того чтобы превратить плеер в кассетный синтезатор, нам понадобится припаять к нему два новых компонента. Первый — это провод, подключённый к Vin, с помощью которого мы сможем управлять скоростью проигрывания плёнки, используя регулятор напряжения. Второй — это аудиоразветвитель, подключённый к Line in, который позволит нам записывать звуки на кассету (это пригодится тем, у кого нет магнитофона).
Если вы не умеете паять — не переживайте. Это просто. Посмотрите это видео. Из него вы узнаете о том, как припаивать провода к контактным площадкам.
Подключение к Vin и организация управления скоростью протяжки ленты
Найдите на корпусе устройства колёсико с подписью Variable Speed Playback. Именно тут мы и будем припаивать пару проводов. Я предпочитаю использовать красный провод для «плюса», а коричневый или зелёный — для «минуса». Поэтому красный провод мы припаиваем к контактной площадке VS+, а провод другого цвета — к площадке, расположенной сразу под B+.
Провода, припаянные к контактной площадке VS+ и к площадке, расположенной около B+
Обратите внимание на то, что я в подобных ситуациях, использую кабели с Female-разъёмами на одном конце. К ним очень удобно что-нибудь подключать.
Подключение к Line in для организации записи звука на кассету
Теперь нужно найти контактные площадки MIC- и MIC+, к которым припаяны красный и чёрный провода от микрофона. Эти провода можно просто отпаять и припаять к данным площадкам провода аудиокабеля. Красный — к MIC+, чёрный — к MIC-.
Провода, припаянные к MIC- и MIC+
Запись монотонного звука на кассету
Теперь можно вставить кассету в плеер и записать на неё звук, подключившись к Line in! Записать можно звучание любой ноты. Как правило, начать эксперименты можно с ноты «до». Запись должна быть достаточно длинной — 30 минут или что-то около того (тут, кстати, пригодилась бы кассета с плёночной петлёй). Обратите внимание на то, что на кассету надо записать лишь один тон, так как именно высоту этого тона мы будем изменять, управляя скоростью воспроизведения записи.
Запись звука на кассету с помощью OP-1
Подготовка Arduino для использования в роли MIDI-интерфейса
Arduino служит посредником между MIDI-интерфейсом и цифроаналоговым преобразователем, отвечающим за изменение напряжения. MIDI-клавиатура подключена к компьютеру. Сигналы от клавиатуры принимает программа, работающая в Chrome. Она обращается к серверу, который отправляет данные об изменении напряжения на Arduino, а Arduino передаёт соответствующие сигналы цифроаналоговому преобразователю, который и управляет скоростью воспроизведения кассеты на плеере.
Подключение цифроаналогового преобразователя MCP4725 к Arduino
Для начала нужно подключить MCP4725 к Arduino, воспользовавшись вышеприведённой схемой. MCP4725 — это цифроаналоговый преобразователь, которым можно управлять с Arduino. Контактную площадку OUT преобразователя надо соединить с красным проводом, который мы ранее припаяли к плееру. Другой провод надо подключить к контакту GND на Arduino.
Код, обеспечивающий взаимодействие компьютера и Arduino, обменивается с устройством данными, отправляя ему сведения о том, как нужно изменить напряжение. Например, если Arduino получит команду dac.setVoltage(newVolts, 1), то MCP4725 выдаст напряжение newVolts. Вот код:
#include <Wire.h>
#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dac;
String sdata = ""; // инициализация пустой строкой.
bool started = false;
void setup(void) {
Serial.begin(9600);
// Для Adafruit MCP4725A1 адрес - это 0x62 (по умолчанию) или 0x63 (пин ADDR связан с VCC)
// Для MCP4725A0 адрес - это 0x60 или 0x61
// Для MCP4725A2 адрес - это 0x64 или 0x65
dac.begin(0x62);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
Serial.println("Begin");
}
void loop(void) {
if (started == false) {
started = true;
dac.setVoltage(0, 1);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
}
byte ch;
if (Serial.available()) {
ch = Serial.read();
sdata += (char)ch;
if (ch == 'n') {
sdata.trim();
if (sdata.indexOf("voltage") > -1) {
sdata.remove(0, 7);
float newVal = sdata.toFloat();
// установка напряжения
float newVoltage = round(910.0 * newVal);
if (newVoltage > 4095) {
newVoltage = 4095;
}
uint16_t newVolts = uint16_t(newVoltage);
dac.setVoltage(newVolts, 1);
Serial.print("volts: ");
Serial.println(newVolts);
} else {
Serial.println("?");
}
sdata = "";
}
}
}
Сервер, используемый для отправки команд на Arduino
Для управления Arduino можно воспользоваться простым сервером, который отправляет плате команды, приводящие к изменению напряжения. Соответствующий код можно найти здесь. Для работы сервера понадобится Golang. Вот как подготовить сервер к работе:
$ git clone https://github.com/schollz/tape-synth
$ cd tape-synth
$ go build
$ ./tape-synth -com ARDUINOCOM
Если вы пользуетесь Linux, то для организации работы с USB-портом вам понадобится воспользоваться командой sudo. ARDUINOCOM — это COM-порт для платы Arduino, подключённой к компьютеру по USB. В Windows это обычно COM4.
Для управления сервером служит страница index.html. Для того чтобы открыть её в Chrome, надо перейти по адресу localhost:8080. Далее, можно будет подключить MIDI-клавиатуру и отправлять команды Arduino (Chrome — это самый популярный браузер, поддерживающий MIDI).
Сборка системы и игра на синтезаторе
Для того чтобы поиграть на кассетном синтезаторе нужно запустить сервер, подключить MIDI-клавиатуру и перейти в Chrome по адресу localhost:8080. Теперь можно включить плеер и начать играть! Нота, которую играют на клавиатуре, должна воспроизводиться плеером.
Настройка синтезатора
Мы имеем дело с механической системой, меняющей высоту звука путём изменения скорости протяжки ленты. Поэтому наш синтезатор нуждается в настройке. Для этого надо открыть index.html и отредактировать свойства объекта voltageMap. Каждой ноте должно быть назначено напряжение (между 0 и 3), соответствующее её высоте.
var voltageMap = {
"C": 0,
"C#": 0.7,
"D": 0.9,
"D#": 1.2,
"E": 1.4,
"F": 1.62,
"F#": 1.85,
"G": 2.25,
"G#": 2.6,
"A": 3.0,
"A#": 0,
"B": 0,
}
Итоги
Если я что-то объяснил непонятно (подозреваю, что так оно и есть) — задавайте мне вопросы в Twitter или в Instagram.
А вы планируете собрать собственный кассетный синтезатор?
26-02-2020, 18:44
0 комментариев
В данном материале мы познакомимся с популярным цифрово-аналоговым преобразователем MCP4725, его техническими характеристиками и схемой подключения к Ардуино. Подобные внешние модули являются отличным решением для создания тех проектов, где необходимо преобразовать цифровой сигнал в аналоговый.
Особую популярность приобрели подобные устройства в современных системах автоматического управления и конструирования девайсов по калибровке датчиков. Они достаточно бюджетны и функциональны, не требуют внешнего опорного напряжения, имеют интегрированную энергонезависимую память (EEPROM), легки в сборке. Прежде чем рассмотреть последний пункт, обозначим базовые параметры модуля:
- напряжение питания: 2.7 — 5.5V;
- мощность: 0.06 (минимальная), тип. 210 мкА, 400 мкА (максимальная);
- рабочий ток: <0,2 мА;
- разрешение: 12-разрядное;
- тип интерфейса: I2C;
- диапазон рабочих температур: -40 °C — +125 °C;
- 2 режима выключения питания (нормальный ∕ выключенный);
- габаритные размеры: 15х15 мм;
- вес: 13-14 г.
Распиновка ЦАП выглядит следующим образом:
Теперь рассмотрим подключение MCP4725 к Arduino. Можно использовать такой вариант:
В нем мы задействовали такие аппаратные компоненты как: плата расширения Ардуино Uno, модуль ЦАП, соединительные провода, USB-кабель для подключения к ноутбуку ∕ компьютеру.
Для проверки работоспособности и первоначального тестирования устройства, пропишем несложный программный код, т.е. скетч:
#include <Wire.h>
#include <Adafruit_MCP4725.h>
#include <LiquidCrystal.h>
#define MCP4725In A1
Adafruit_MCP4725 MCP4725;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
delay(1000);
lcd.begin(16,2);
MCP4725.begin(0x60);
// Считывание - требуемое значение
lcd.setCursor(0,0);
lcd.print("REQD: ");
// Считывание - наблюдаемое значение
lcd.setCursor(0,1);
lcd.print("OBSD: ");
}
void loop()
{
uint32_t MCP4725_value;
int adcInput = 0;
float voltageIn = 0;
float MCP4725_reading;
for (MCP4725_value = 0; MCP4725_value < 4096; MCP4725_value = MCP4725_value + 128)
{
delay(1000);
MCP4725_reading = (5.0/4096.0) * MCP4725_value;
MCP4725.setVoltage(MCP4725_value, false);
adcInput = analogRead(MCP4725In);
voltageIn = (adcInput * 5.0 )/ 1024.0;
lcd.setCursor(7,0);
lcd.print(MCP4725_reading,3);
lcd.setCursor(7,1);
lcd.print(voltageIn,3);
}
}
Наверняка вы заметили, что в описанной выше прошивке использовались сразу несколько специализированных библиотек: Wire (для управления интерфейсом), Adafruit_MCP4725 (для считывания значений), LiquidCrystal (для вывода информации на дисплей). Их нужно скачать и инсталлировать в среду IDE (папка libraries).
https://github.com/adafruit/Adafruit_MCP4725
На этом пока всё. Изучайте Arduino, собирайте интересные проекты и развивайтесь в свое удовольствие!




















