Микроконтроллеры могут работать только с цифровыми значениями, но в современной электронике часто приходится иметь дело и с аналоговыми сигналами. Для преобразование сигналов из аналоговой формы в цифровую используются аналого-цифровые преобразователи (АЦП, в англ. – ADC, Analog to Digital Converter), а из цифровой в аналоговую – цифро-аналоговые преобразователи (ЦАП, в англ. – DAC, Digital to Analog Converter).
Цифро-аналоговые преобразователи (ЦАП) находят широкое применение в таких приложениях как управление двигателями, управление яркостью свечения светодиодов, аудио-усилителях, энкодерах видео и т.д.
В данной статье мы рассмотрим подключение цифро-аналогового преобразователя MCP4725 к плате Raspberry Pi. Ранее на нашем сайте мы уже рассматривали подключение ЦАП MCP4725 к плате Arduino.
Необходимые компоненты
- Плата Raspberry Pi (купить на AliExpress) с установленной операционной системой (Raspberry Pi OS).
- MCP4725 DAC IC (микросхема цифро-аналогового преобразователя) (купить на AliExpress).
- ЖК дисплей 16x2 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Принципы работы модуля ЦАП MCP4725
Микросхема MCP4725 представляет собой модуль 12-битного ЦАП, позволяющий формировать на своем выходе аналоговый сигнал в диапазоне от 0 до 5V. Управляется ЦАП MCP4725 по интерфейсу I2C. Также микросхема MCP4725 содержит в своем составе энергонезависимую память (EEPROM).
Модуль MCP4725 имеет разрешение 12 бит. Это значит что на его вход можно подавать цифровые значения в диапазоне 0-4096, которые он преобразует в соответствующее аналоговое значение по отношению к опорному напряжению. Максимальное опорное напряжение (reference voltage) составляет 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 | земля для опорного напряжения |
Микросхемой ЦАП MCP4725 можно управлять с любого микроконтроллера используя интерфейс (протокол) I2C. Для функционирования протокола I2C необходимо только два провода (линии) - SCL и SDA. По умолчанию I2C адрес для MCP4725 равен 0x60, 0x61 или 0x62
Настройка интерфейса I2C в Raspberry Pi
Для того, чтобы подключить ЦАП MCP4725 к плате Raspberry Pi, необходимо знать контакты интерфейса I2C в плате и включить использование данного интерфейса в настройках платы.
Как показано на приведенной распиновке платы Raspberry Pi контактами интерфейса I2C в ней являются контакты GPIO2 (SDA) и GPIO3 (SCL).
По умолчанию использование интерфейса I2C отключено в плате Raspberry Pi, поэтому нам необходимо его включить. Для этого выполните следующие действия:
- В окне терминала введите команду sudo raspi-config. После этого появится панель настроек платы.
- В ней выберите настройки подключения (Interfacing options) и затем в них включите использование интерфейса I2C.
- После этого перезагрузите плату.
Определение адреса I2C модуля MCP4725 с помощью Raspberry Pi
Чтобы взаимодействовать с модулем MCP4725 по интерфейсу I2C нам необходимо узнать адрес I2C модуля. Чтобы узнать этот адрес подключите контакты SDA и SCL модуля MCP4725 к контактам SDA и SCL платы Raspberry Pi. Также подключите контакт питания и землю.
После этого откройте окно терминала и введите следующую команду чтобы узнать адрес подключенного по интерфейсу I2C устройства:
1 |
sudo i2cdetect –y 1 or sudo i2cdetect –y 0 |
Установка библиотеки Adafruit для работы с ЦАП MCP4725
Мы для взаимодействия с модулем ЦАП MCP4725 будем использовать специальную библиотеку для работы с ним - Adafruit MCP4725 library. Для ее установки выполните следующую последовательность шагов.
1. Убедитесь в том, что плата Raspberry Pi подключена к сети Интернет.
2. Откройте окно терминала и введите в нем следующие команды (одну за другой):
1 2 3 4 |
sudo apt-get install git build-essential python-dev git clone https://github.com/adafruit/Adafruit_Python_MCP4725.git cd Adafruit_Python_MCP4725 sudo python setup.py install |
3. После успешной установки библиотеку Adafruit MCP4725 library можно будет подключать в программе на python с помощью следующей команды:
1 |
Import Adafruit_MCP4725 |
Установка библиотеки для работы с ЖК дсиплеем
ЖК дисплей в нашем проекте будет использоваться для отображения аналоговых и цифровых значений. Для взаимодействия с ним мы будем использовать библиотеку от Adafruit. Для установки этой библиотеки выполните следующую последовательность шагов:
1. Откройте окно терминала и введите в нем следующие команды (одну за другой):
1 2 3 4 |
apt-get install git git clone https://github.com/adafruit/Adafruit_Python_CharLCD.git cd Adafruit_Python_CharLCD sudo python setup.py install |
2. После установки библиотеки для работы с ЖК дисплеем ее можно будет подключать в программе на python с помощью следующей команды:
1 |
import Adafruit_CharLCD as LCD |
Схема проекта
Схема подключения модуля ЦАП MCP4725 к плате Raspberry Pi представлена на следующем рисунке.
Соединения между ЖК дисплеем 16х2 и платой Raspberry Pi приведены в следующей таблице.
ЖК дисплей | Плата Raspberry Pi |
VSS | GND |
VDD | +5V |
V0 | к среднему контакту потенциометра для регулировки контрастности |
RS | GPIO25 |
RW | GND |
E | GPIO24 |
D4 | GPIO23 |
D5 | GPIO17 |
D6 | GPIO18 |
D7 | GPIO22 |
A | +5V |
K | GND |
Соединения между модулем ЦАП MCP4725 и платой Raspberry Pi приведены в следующей таблице.
MCP4725 | Плата Raspberry Pi | Мультиметр |
GND | GND | отрицательный вывод |
VCC | +5V | - |
SDA | GPIO2 (SDA) | - |
SCL | GPIO3 (SCL) | - |
OUT | - | положительный вывод |
После сборки схемы на макетной плате у нас получилась следующая конструкция проекта.
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты. Код программы вы можете передать в плату Raspberry Pi по протоколу SSH с помощью программы Putty или с помощью FTP клиента (например, FileZilla). Либо же вы можете подключить монитор к плате и набрать представленный код программы с помощью клавиатуры.
В данной программе мы будем передавать цифровое значение в диапазоне 0-4096 от платы Raspberry Pi к модулю ЦАП MCP4725 по шине I2C. На выходе модуля MCP4725 мы будем получать аналоговое значение в диапазоне от 0 до 5V, которое можно будет проверить с помощью мультиметра. И аналоговое, и цифровое значения будут отображаться на экране ЖК дисплея 16x2. Подаваемое на ЦАП MCP4725 цифровое значение в программе в цикле будет последовательно инкрементироваться начиная со значения 150 (0,150,300,450…4050).
Первым делом в программе необходимо подключить (импортировать) используемые библиотеки.
1 2 3 |
import Adafruit_CharLCD as LCD import Adafruit_MCP4725 import time |
Далее в программе укажем, к каким контактам платы подключен ЖК дисплей, а также зададим число строк и столбцов дисплея. После этого инициализируем ЖК дисплей.
1 2 3 4 5 6 7 8 9 10 11 12 |
lcd_rs = 25 lcd_en = 24 lcd_d4 = 23 lcd_d5 = 17 lcd_d6 = 18 lcd_d7 = 22 lcd_backlight = 4 # Define LCD column and row size for 16x2 LCD. lcd_columns = 16 lcd_rows = 2 lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,lcd_columns, lcd_rows, lcd_backlight) |
После этого покажем на экране ЖК дисплея приветственное сообщение.
1 2 3 4 5 |
lcd.message('Circuit Digest') time.sleep(2.0) lcd.message('\nDAC using Rpi') time.sleep(5.0) lcd.clear() |
Далее создадим объект для взаимодействия с ЦАП. При создании этого объекта укажем I2C адрес микросхемы MCP4725. В нашем случая она имеет адрес 0x60, если у вас будет другой адрес, то внесите соответствующие изменения в следующую команду.
1 |
dac = Adafruit_MCP4725.MCP4725(address=0x60) |
Далее в цикле мы будем передавать значение переменной x модулю ЦАП MCP4725 через интерфейс I2C. Значение переменной x будет изменяться в цикле от 0 до 4095 с шагом 150.
1 2 |
while True: for x in range(0,4097,150): |
Цифровое значение переменной x будет передаваться модулю MCP4725 с помощью следующей команды:
1 |
dac.set_voltage(x) |
Аналоговое значение напряжение будет рассчитывать по формуле:
1 |
voltage = x/4096.0*5.0 |
Значение 5 в этой формуле – это значение опорного напряжения, а x – наше цифровое значение.
Затем аналоговое и цифровое значения отображаются на экране ЖК дисплея с задержкой 2 секунды:
1 2 3 4 |
lcd.cursor_pos = (0,0) lcd.message("DAC Value: " + str(x)) lcd.message("\nAnalogVolt: %.2f" % voltage) time.sleep(2) |
Цифровое значение отображается на 1-й строке ЖК дисплея, а аналоговое значение – на второй строке. Для проверки значения аналогового значения напряжения к выходным контактам модуля MCP4725 подключен мультиметр. Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы на Python
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 |
import Adafruit_CharLCD as LCD import Adafruit_MCP4725 import time lcd_rs = 25 lcd_en = 24 lcd_d4 = 23 lcd_d5 = 17 lcd_d6 = 18 lcd_d7 = 22 lcd_backlight = 4 # Define LCD column and row size for 16x2 LCD. lcd_columns = 16 lcd_rows = 2 lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight) lcd.message('Circuit Digest') time.sleep(2.0) lcd.message('\nDAC using Rpi') time.sleep(5.0) lcd.clear() dac = Adafruit_MCP4725.MCP4725(address=0x60) while True: for x in range(0,4097,150): print(x) dac.set_voltage(x) lcd.cursor_pos = (0,0) lcd.message("DAC Value: " + str(x)) voltage = x/4096.0*5.0 lcd.message("\nAnalogVolt: %.2f" % voltage) time.sleep(2) lcd.clear() |