Аналого-цифровое преобразование (АЦП, на англ. ADC — аnalog to digital conversion) играет важную роль в современных электронных системах. Многие современные датчики (температуры, влажности, силы и т.д.) обеспечивают на своем выходе аналоговое значение, а микроконтроллеры, являющиеся, как правило, «сердцем» встраиваемых систем, могут работать только с цифровыми значениями. Поэтому чтобы подавать аналоговое значение с датчиков на цифровые входы микроконтроллеров необходимо выполнить аналого-цифровое преобразование этих значений. Для выполнения этой задачи используются устройства, которые называют аналого-цифровыми преобразователями.
Некоторые современные микроконтроллеры, такие как AVR, MSP430, PIC, плата Arduino имеют в своем составе встроенные аналого-цифровые преобразователи (АЦП), но в плате Raspberry Pi встроенные АЦП отсутствуют, поэтому для подключения к ней аналоговых устройств необходимо использовать внешние модули АЦП. Ранее на нашем сайте мы уже рассматривали подключение к плате Raspberry Pi простейшего модуля АЦП ADC0804. В этой же статье мы рассмотрим подключение к плате Raspberry Pi модуля АЦП/ЦАП PCF8591, обладающего возможностью работы по интерфейсу I2C. Ранее мы рассматривали подключение этого модуля АЦП/ЦАП к плате Arduino.
Необходимые компоненты
- Плата Raspberry Pi (купить на AliExpress).
- PCF8591 ADC Module (модуль АЦП) (купить на AliExpress).
- Потенциометр 100 кОм (купить на AliExpress).
- Соединительные провода.
Модуль АЦП/ЦАП (ADC/DAC) PCF8591
PCF8591 представляет собой 8-битный аналого-цифровой или цифро-аналоговый преобразователь, то есть аналоговому значению соответствует число от 0 до 256. Также на плате модуля PCF8591 имеются фоторезистор (LDR) и терморезистор. Модуль имеет 4 аналоговых входа и 1 аналоговый выход. Он работает по протоколу I2C, поэтому он содержит также контакты SCL и SDA данного интерфейса. Модуль работает на напряжения питания 2.5-6V и имеет низкий ток потребления в режиме ожидания.
Управлять чувствительностью аналогового входа модуля можно с помощью потенциометра 10 кОм, имеющегося в его составе. Также на плате модуля PCF8591 имеется 3 переключателя (джампера). Переключатель J4 обеспечивает доступ к цепи терморезистора (термистора), переключатель J5 обеспечивает доступ к цепи фоторезистора, а переключатель J6 – доступ к цепи регулировки уровня входного напряжения. Также на плате модуля имеется два светодиода: D1 показывает уровень выходного напряжения, а D2 – уровень питающего напряжения. Чем больше уровни этих напряжений, тем ярче соответственно горят светодиоды D1 и D2. Протестировать работу этих светодиодов можно подключив потенциометр к контактам VCC или AOUT модуля.
Внешний вид и назначение контактов (распиновка) модуля PCF8591 показаны на следующем рисунке.
Контакты I2C в плате Raspberry Pi
Для подключения модуля PCF8591 к плате Raspberry Pi первым делом необходимо узнать где располагаются контакты интерфейса I2C в плате Raspberry Pi и включить использование этого интерфейса в плате.
На следующей распиновке платы Raspberry Pi показано расположение контактов интерфейса I2C: GPIO2 (SDA) и GPIO3 (SCL).
Включение интерфейса I2C в Raspberry Pi
По умолчанию интерфейс I2C отключен в плате Raspberry Pi. Чтобы его включить необходимо выполнить следующую последовательность действий:
- В окне терминала ввести команду sudo raspi-config чтобы войти в панель настроек платы Raspberry Pi.
- В панели настроек выбрать настройки подключения (Interfacing options) и в них включить использование интерфейса I2C (enable the I2C).
- После включения использования I2C перезагрузите плату Raspberry Pi.
Определение адреса I2C модуля PCF8591 с помощью Raspberry Pi
Чтобы начать взаимодействие с модулем PCF8591 плате Raspberry Pi необходимо знать его адрес I2C. Для его определения подключите контакты SDA и SCL модуля PCF8591 к контактам SDA и SCL платы Raspberry Pi. Также подключите контакты +5V и GND.
После этого откройте окно терминала и введите в нем следующую команду чтобы узнать адрес I2C модуля PCF8591:
1 |
sudo i2cdetect –y 1 or sudo i2cdetect –y 0 |
После этого вам в окно терминала будет выведена таблица с адресами I2C подключенных к плате Raspberry Pi устройств.
Схема проекта
Схема подключения модуля АЦП/ЦАП PCF8591 к плате Raspberry Pi представлена на следующем рисунке.
Как видите, схема достаточно проста. Мы будем считывать аналоговое значение, подаваемое на один из аналоговых входов модуля PCF8591, и отображать его в окне терминала платы Raspberry Pi. Изменять подаваемое на вход модуля PCF8591 аналоговое значение мы будем с помощью потенциометра 100 кОм. Также в схему можно добавить ЖК дисплей 16×2 чтобы отображать на нем считываемое аналоговое значение.
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе подключим (импортируем) необходимые библиотеки: smbus для работы с протоколом I2C и time для организации временных задержек в программе.
1 2 |
import smbus import time |
Далее инициализируем необходимые нам переменные: address – в ней будет храниться адрес шины I2C, A0 – в ней будет храниться адрес первого аналогового входного контакта.
1 2 |
address = 0x48 A0 = 0x40 |
Далее создадим объект для работы с шиной I2C.
1 |
bus = smbus.SMBus(1) |
После этого в бесконечном цикле while мы будем давать команду модулю PCF8591 произвести измерение значения на его первом аналоговом входном контакте. Вторая команда в этом цикле сохраняет считанное с аналогового контакта значение в переменной value. Затем мы выводим значение value в окно терминала.
1 2 3 4 5 |
while True: bus.write_byte(address,A0) value = bus.read_byte(address) print(value) time.sleep(0.1) |
Теперь сохраним код нашей программы на python в файле с расширением .py и запустим эту программу на выполнение с помощью команды:
1 |
python filename.py |
Перед запуском программы на выполнение убедитесь в том, что у вас сделаны все соединения в схеме и в настройках платы Raspberry Pi включено использование интерфейса I2C, иначе в результате выполнения программы будут выдаваться ошибки. Считываемые аналоговые значения будут показываться в окне терминала как на приведенном ниже рисунке. Вращайте рукоятку потенциометра и вы увидите как будет изменяться значения на экране. Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы на Python
1 2 3 4 5 6 7 8 9 |
import smbus import time address = 0x48 bus = smbus.SMBus(1) while True: bus.write_byte(address,A0) value = bus.read_byte(address) print(value) time.sleep(0.1) |