Arduino ide настройка ацп
Не секрет, что все величины в физическом мире носят аналоговый характер. Для измерения этих величин, люди придумали множество различных приборов. Так, например, термометр позволяет узнать температуру вещества, барометр — давление газа, гигрометр — влажность воздуха. А с помощью весов можно измерить вес тела.
Все эти устройства имеют шкалу, которую мы используем для фиксации их показаний. Рассмотрим простой пример — определение температуры с помощью обычного градусника. Человек решает эту задачу очень просто: мы смотрим, к какому из делений ближе всего приблизился уровень жидкости в градуснике. Полученное таким образом значение и будет измеренной температурой. Иными словами, мы осуществляем преобразование аналоговой непрерывной величины в дискретную, которую можно записать на бумаге с помощью цифр.
Чтобы автоматизировать процесс измерения аналоговых величин, и возложить эту задачу на электронные приборы, инженеры создали особое устройство, называемое аналого-цифровым преобразователем (АЦП). Это устройство позволяет превращать аналоговый сигнал в цифровой код, пригодный для использования в ЭВМ.
В робототехнике АЦП являются важной составляющей системы датчиков машины. Акселерометр, гироскоп (гиротахометр), барометр, магнитометр, и даже видеокамера — все эти приборы соединяются с центральным процессором с помощью АЦП.
Конструктивно, АЦП может находиться в одном корпусе с микропроцессором или микроконтроллером, как в случае Arduino Uno. В противном случае, как и все современные электронные устройства, АЦП может быть оформлен в виде отдельной микросхемы, например MCP3008:
Следует отметить, что существует и устройство с обратной функцией, называемое цифро-аналоговым преобразователем (ЦАП, DAC). Оно позволяет переводить цифровой сигнал в аналоговый. Например, во время проигрывания мелодии на мобильном телефоне происходит преобразование цифрового кода из MP3 файла в звук, который вы слышите у себя в наушниках.
Для лучшего понимания работы АЦП нам потребуется интересная задачка. В качестве оной, попробуем сделать устройство для измерения оставшегося заряда обычных пальчиковых батареек — самый настоящий цифровой вольтметр.
Объяснение программы для Arduino
Полный код программы и видео, демонстрирующее работу схемы, приведены в конце статьи, здесь же мы кратко рассмотрим основные фрагменты кода программы.
Первым делом в программе нам необходимо подключить библиотеки для использования возможностей протокола I2C и для работы с ЖК дисплеем.
Все мы знаем, что микроконтроллеры умеют работать только с цифровыми значениями, однако в реальном мире нам приходится иметь дело с налоговыми сигналами. Поэтому для того, чтобы микроконтроллеры могли обрабатывать эти сигналы, их необходимо преобразовать в цифровую форму с помощью аналогово-цифрового преобразователя (АЦП). В английском языке они называются ADC - Analog to Digital Converter. Но если цифровые значения, хранящиеся в микроконтроллерах, необходимо конвертировать в аналоговую форму, используются цифро-аналоговые преобразователи (ЦАП). В английском языке они называются DAC - Digital to Analog Converter.
Простейшим примером необходимости использования ЦАП является воспроизведение какой-либо песни, хранящейся в цифровой форме. В свое время певец записал песню в студии используя микрофон. Затем эта песня была преобразована в цифровой формат и хранилась в виде файла с цифровыми данными. Чтобы затем воспроизвести эту песню в аналоговом виде с цифрового носителя данных и нужен ЦАП.
Цифро-аналоговые преобразователи (ЦАП) могут использоваться в различных приложениях, например, для управления двигателями и яркостью свечения светодиодов, в аудио усилителях, в видео-кодерах и т.п.
Во многих микроконтроллерах есть встроенные ЦАП, однако в платах Arduino, построенных на основе микроконтроллеров ATmega328/ATmega168, нет встроенного ЦАП (хотя есть АЦП). Поэтому в данной статье мы рассмотрим подключение цифро-аналогового преобразователя (ЦАП) MCP4725 к плате Arduino. Данную статью можно считать пособием для начинающих по использованию цифро-аналогового преобразования в Arduino.
0-5 Вольт
Простой пример, как измерить напряжение на аналоговом пине и перевести его в Вольты. Плата питается от 5V.
Таким образом переменная voltage получает значение в Вольтах, от 0 до 5. Чуть позже мы поговорим о более точных измерениях при помощи некоторых хаков. Почему мы делим на 1024, а не на 1023 , ведь максимальное значение измерения с АЦП составляет 1023? Ответ можно найти в даташите:
АЦП при преобразовании отнимает один бит, т.е. 5.0 Вольт он в принципе может измерить только как 4.995, что и получится по формуле выше: 1023 * 5 / 1024 == 4.995.. . Таким образом делить нужно на 1024.
Необходимые компоненты
Плата Arduino UNO
Источник питаний 5 В
ЖК дисплей 16х2 (JHD_162ALCD)
Конденсатор 100 пФ
Конденсатор 100 нФ
Потенциометр 100 кОм
Объяснение программы для Arduino
Вначале в программе нам необходимо подключить библиотеки для работы с протоколом I2C (wire.h) и ЖК дисплеем (liquidcrystal.h).
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- АЦП/ЦАП модуль PCF8591 (PCF8591 ADC/DAC Module) (купить на AliExpress).
- Потенциометр 100 кОм – 2 шт. (купить на AliExpress).
- Соединительные провода.
Сильно больше 5 Вольт
Для измерения постоянного напряжения больше 5 Вольт нужно использовать делитель напряжения на резисторах (Википедия). Схема подключения, при которой плата питается от 12V в пин Vin и может измерять напряжение источника (например, аккумулятора):
Код для перевода значения с analogRead() в Вольты с учётом делителя напряжения:
Как выбрать/рассчитать делитель напряжения?
- Согласно даташиту на ATmega, сумма R1 + R2 не рекомендуется больше 10 кОм для достижения наибольшей точности измерения. В то же время через делитель на 10 кОм будет течь ощутимый ток, что критично для автономных устройств (читай ниже). Если девайс работает от сети или от аккумулятора, но МК не используется в режиме сна – ставим делитель 10 кОм и не задумываемся. Также рекомендуется поставить конденсатор между GND и аналоговым пином для уменьшения помех.
- Если девайс работает от аккумулятора и микроконтроллер “спит”: пусть аккумулятор 12V, тогда через 10 кОм делитель пойдёт ток 1.2 мА. Сам микроконтроллер в режиме сна потребляет ~1 мкА, что в тысячу раз меньше! На самом деле можно взять делитель с гораздо бОльшим суммарным сопротивлением (но не больше 20 МОм, внутреннего сопротивления самого АЦП), но обязательно поставить конденсатор на ~0.1 мкФ между аналоговым пином и GND (вот здесь проводили эксперимент). Таким образом например при при R1+R2 = 10 МОм (не забыть про конденсатор) ток через делитель будет 1.2 мкА, что уже гораздо лучше!
- Коэффициент делителя (не тот, который в Википедии) равен (R1 + R2) / R2 . Коэффициент должен быть таким, чтобы при делении на него измеряемого напряжения не получилось больше напряжения питания МК. У меня в примере (10 + 4.7) / 4.7 ~ 3.13 . Я хочу измерять литиевый аккумулятор с максимальным напряжением 12.8 Вольт. 12.8 / 3.13 ~ 4 Вольта – отлично. Например для измерения 36 Вольт я бы взял делитель с плечами 100к и 10к.
- Можно воспользоваться онлайн-калькулятором.
Видео, демонстрирующее работу схемы
Также можете посмотреть еще одно видео про то, как использовать АЦП в Arduino Uno. Оно на английском языке, но зато очень подробное и доходчивое.
Аналого-цифровое преобразование играет исключительно важную роль в современных электронных устройствах. К примеру, многие датчики выдают на свой выход аналоговый сигнал, а микроконтроллеры могут оперировать только с цифровыми (двоичными) значениями, поэтому чтобы согласовать выход такого датчика со входом микроконтроллера, необходимо использование аналого-цифрового преобразователя (АЦП).
Некоторые микроконтроллеры, например, AVR, Arduino, MSP430, PIC16F877A, имеют в своем составе встроенные АЦП. Однако некоторые современные микроконтроллеры не имеют встроенных АЦП, например, 8051, Raspberry Pi. Поэтому с такими микроконтроллерами используют внешние АЦП, например, микросхемы ADC0804, ADC0808.
На нашем сайте вы можете посмотреть следующие проекты, использующие АЦП/ЦАП:
В этой же статье мы рассмотрим подключение АЦП/ЦАП модуля PCF8591 к плате Arduino.
Работа схемы
Схема устройства представлена на следующем рисунке.
В ЖК дисплее 16x2 если мы хотим задействовать черный цвет, то нам будут нужны все его 16 контактов, в противном случае нам будет достаточно 14 контактов. Эти 2 контакта, отвечающие за черный цвет, можно оставить неиспользованными. Среди оставшихся 14 контактов мы имеем 8 контактов данных (7-14 или D0-D7), 2 контакта для подачи питания (1&2 или VSS&VDD или GND&+5v), 3-й контакт для управления контрастностью (определяет насколько "жирными" будут выглядеть символы на экране дисплея) и 3 управляющих контакта (RS&RW&E).
На представленной схеме можно увидеть, что мы использовали только 2 управляющих контакта – это обеспечивает гибкость в управлении. Бит контраста и READ/WRITE используются редко, поэтому в нашем случае их можно замкнуть на землю – это обеспечивает ЖК дисплею максимальную контрастность и режим чтения. Таким образом, нам необходимо будет контролировать только контакты ENABLE и RS чтобы передавать на ЖК дисплей символы и данные.
В схеме необходимо будет сделать следующие соединения с ЖК дисплеем:
PIN1 или VSS на землю
PIN2 или VDD или VCC к источнику питания +5В
PIN3 или VEE на землю (обеспечивает максимальную контрастность – хорошо для начинающих)
PIN4 или RS (Register Selection) к контакту PIN0 ARDUINO UNO
PIN5 или RW (Read/Write) на землю (переводит ЖК дисплей в режим чтения, что упрощает взаимодействие с ним для начинающих)
PIN6 или E (Enable) к контакту PIN1 of ARDUINO UNO
PIN11 или D4 к контакту PIN8 of ARDUINO UNO
PIN12 или D5 к контакту PIN9 of ARDUINO UNO
PIN13 или D6 к контакту PIN10 of ARDUINO UNO
PIN14 или D7 к контакту PIN11 of ARDUINO UNO
Программная среда ARDUINO IDE позволяет пользователю использовать ЖК дисплей в 4-битном режиме. Этот тип взаимодействия с ЖК дисплеем позволяет сократить использование контактов ARDUINO, к тому же этот режим взаимодействия (4-битный) по умолчанию заложен в ARDUINO. На представленной схеме мы использовали 4-битный режим взаимодействия (контакты D4-D7).
То есть в сумме мы подсоединили 6 контактов ЖК дисплея к нашей плате Arduino, из которых 4 контакта будут использоваться для передачи данных и 2 контакта для целей управления.
Измерение напряжения
Чтение сигнала
“Аналоговые” пины могут принимать напряжение от 0V (GND) до опорного напряжения и преобразовывать его в цифровое значение, просто в какие-то условные единицы. АЦП на AVR и esp8266 имеет разрядность в 10 бит, т.е. мы получаем измеренное напряжение в виде числа от 0 до 1023 .
Функция, которая оцифровывает напряжение, называется analogRead(pin) . Она принимает в качестве аргумента номер аналогового пина и возвращает оцифрованное напряжение. Сам пин должен быть сконфигурирован как INPUT (вход). Нумерация:
- Arduino Nano:
- Просто номером А-пина: A0 – 0
- Как на плате: A0 – A0
- Порядковым номером GPIO: А0 – 14 , A1 – 15 .. А7 – 21
- Просто номером А-пина: A0 – 0
- Как на плате: A0 – A0
Пример, опрашивающий пин А0:
Хранить полученное значение разумно в переменной типа int , потому что значение варьируется от 0 до 1023.
Потенциометры
Аналоговые пины очень часто используются при работе с потенциометрами (переменный резистор). При помощи полученного значения можно влиять на ход работы программы, менять какие-то настройки и тому подобное. У потенциометра всегда три ноги: две крайние и одна центральная. Всё вместе это представляет собой делитель напряжения, который и позволяет менять напряжение в диапазоне 0-VCC: К Arduino потенциометр подключается следующим образом: средний вывод на любой A-пин, крайние – на GND и питание. От порядка подключения GND и питания зависит направление изменения значения. Что касается сопротивления, то читай заметку по делителям напряжения ниже в этом уроке. Чаще всего для МК ставят потенциометры с сопротивлением 10 кОм, но диапазон в принципе очень широк: от 1 кОм до 100 кОм. Чем больше, тем более шумным будет приходить сигнал, а если брать меньше – пойдут потери тока в нагрев потенциометра, а это никому не нужно.
Опорное напряжение (для AVR Arduino)
Опорное напряжение играет главную роль в измерении аналогового сигнала, потому что именно от него зависит максимальное измеряемое напряжение и вообще возможность и точность перевода полученного значения 0-1023 в Вольты. Изучим функцию analogReference(mode) , где mode:
- DEFAULT : опорное напряжение равно напряжению питания МК. Активно по умолчанию
- INTERNAL : встроенный источник опорного на 1.1V (для ATmega168 или ATmega328P) и 2.56V (на ATmega8)
- INTERNAL1V1 : встроенный источник опорного на 1.1V (только для Arduino Mega)
- INTERNAL2V56 : встроенный источник опорного на 2.56V (только для Arduino Mega)
- EXTERNAL : опорным будет считаться напряжение, поданное на пин AREF
После изменения источника опорного напряжения (вызова analogReference() ) первые несколько измерений могут быть нестабильными. Значение 1023 функции analogRead() будет соответствовать выбранному опорному напряжению или напряжению выше его.
В режиме DEFAULT мы можем оцифровать напряжение от 0 до напряжения питания VCC. Если напряжение питания 4.5 Вольта, и мы подаём 4.5 Вольт – получим оцифрованное значение 1023. Если подаём 5 Вольт – опять же получим 1023, т.к. выше опорного. Это правило работает и дальше, главное не превышать 5.5 Вольт. Как измерять более высокое напряжение, читайте ниже.
Что касается точности: при питании от 5V и режиме DEFAULT мы получим точность измерения напряжения (5 / 1024) ~4.9 милливольт. Поставив INTERNAL мы можем измерять напряжение от 0V до 1.1V с точностью (1.1 / 1024) ~0.98 милливольт. Весьма неплохо, особенно если баловаться с делителем напряжения.
Что касается внешнего источника опорного напряжения: использовать напряжение меньше 0V (отрицательное) или выше 5.5V в качестве внешнего опорного в пин AREF. Также при подключении внешнего опорного напряжения нужно вызвать analogReference(EXTERNAL) до первого вызова функции analogRead() (начиная с запуска программы), иначе можно повредить микроконтроллер!
Функции работы с АЦП
На этом уроке изучать работу АЦП мы будем с помощью платформы Arduino. В используемой нами модели Arduino Uno, наряду с обычными выводами общего назначения (к которым мы уже подключали светодиоды и кнопки) есть целых шесть аналоговых входов. В других версиях Arduino таких входов может быть и больше, например, у Arduino Mega их 16.
На карте Arduino Uno аналоговые входы имеют буквенно-цифровые обозначения A0, A1, …, A5 (снизу слева).
Во время работы всё с теми же кнопками, мы познакомились с функцией digitalRead, которая умеет считывать цифровой сигнал с определенного входа контроллера. У этой функции существует аналоговая версия analogRead, которая может делать то же самое, но только для аналогового сигнала.
результат = analogRead( номер_контакта );
после вызова этой функции, микроконтроллер измерит уровень аналогового сигнала на заданном контакте, и сохранит результат работы АЦП в переменную «результат». При этом результатом функции analogRead будет число от 0 до 1023.
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 земля для опорного напряжения Подключение
Чтобы измерить напряжение на батарейке, мы должны подключить её к нашей Arduino всего двумя контактами. Для примера используем щелочную батарейку на 1.5 Вольта.
Теперь откроем окно COM-монитора в Arduino IDE, и посмотрим какие значение выдает нам АЦП:
Что означает число 314? Вспомним, что 10-битный АЦП разбивает диапазон от 0 до 5 вольт на 1024 части. Значит точность 10-битного АЦП — 5/1024. Зная точность, мы можем записать формулу для преобразования показаний АЦП к вольтам:
где V — измеренное напряжение на батарейке;
ADC — результат работы функции analogRead.Подставим эту формулу в программу и снова попробуем измерить заряд батарейки!
Уже больше похоже на правду.
Итак, мы разобрались с весьма сложной и важной темой в мире электроники. АЦП используется повсеместно, и в робототехнике без этого устройства уж точно не обойтись. Для понимания окружающего мира роботам как-то нужно переводить аналоговые ощущения в числа.
На нашем портале можно найти несколько уроков, выполнение которых зависит от понимания темы АЦП: датчик температуры, ёмкостный датчик, фоторезистор, потенциометр и аналоговый джойстик. А в совокупности с еще одной важной темой — ШИМ, применение АЦП позволит создать диммер светодиодной лампы и регулятор хода двигателя. Успехов!
В прошлом уроке мы разобрали измерение и вывод цифрового сигнала, а в этом разберём аналоговый сигнал. Зачем нужно читать аналоговый сигнал? Микроконтроллер может выступать в роли вольтметра, измерять собственное напряжение питания, например от аккумулятора, может измерять ток через шунт (если вы знаете закон Ома), можно измерять сопротивление, а также работать с потенциометрами (крутильными, линейными, джойстиками), которые являются очень удобными органами управления.
В уроке про возможности микроконтроллера мы обсуждали аналоговые входы, т.е. входы, подключенные к АЦП – аналогово-цифровому преобразователю (ADC). Взглянем на распиновку популярных плат (Arduino Nano и Wemos Mini):
Пины, на которых выведен ADC, могут измерять аналоговый сигнал. На плате Nano это пины, маркированные буквой А (A0–A7), а у esp8266 такой пин всего один – A0.
Разрядность АЦП
Надо заметить, что число 1023 здесь появилось неспроста. Дело в том, что у каждого устройства АЦП есть такой важный параметр как разрядность. Чем больше значение этого параметра, тем точнее работает прибор. Предположим, что у нас есть АЦП с разрядностью 1. Подавая на вход любое напряжения от 0 до 2,5 Вольт, на выходе мы получим 0. Любое же напряжение от 2,5 до 5 вольт даст нам единицу. То есть 1-битный АЦП сможет распознать только два уровня напряжения. Графически это можно изобразить следующим образом:
АЦП с разрядностью 2 распознает уже четыре уровня напряжения:
- от 0 до 1,25 — это 0;
- от 1,25 до 2,5 — это 1;
- от 2,5 до 3,75 — это 2;
- наконец, от 3,75 до 5 — это 3.
На следующих двух картинках изображена работа АЦП с разрядностью 2 и 3 бит:
В Arduino Uno установлен 10-битный АЦП, и это значит, что любое напряжение на аналоговом входе в диапазоне от 0 до 5 вольт будет преобразовано в число с точностью 1/1024 вольта. На графике будет сложно изобразить столько ступенек. Имея такую точность, 10-битный АЦП может «почувствовать» изменение напряжение на входе величиной всего 5 милливольт.
Сильно меньше 5 Вольт
Для более точных измерений маленького напряжения можно подключить пин AREF к источнику низкого опорного напряжения (об этом было выше), чтобы “сузить” диапазон работы АЦП. Источник может быть как внешний, так и внутренний, например изменив опорное на внутреннее 1.1V ( analogReference(INTERNAL) ) можно измерять напряжение от 0 до 1.1 Вольта с точностью 1.1/1024 ~ 1.01 мВ.
Опорное напряжение
Есть нюанс, который может стать причиной ошибки измерения с помощью АПЦ. Помните тот диапазон от 0 до 5 вольт в котором работает устройство? В общем случае этот диапазон выглядит иначе:
от 0 до опорного напряжения
Это изменение повлечет за собой изменение формулы расчет точности АЦП:
точность = опорное напряжение/1024
Опорное напряжение определяет границу диапазона, с которым будет работать АЦП.
В нашем примере опорное напряжение будет равно напряжению питания Arduino Uno, которое дал USB порт компьютера. У моем конкретном случае это напряжение было 5.02 Вольта, и я могу смело заявить, что измерил заряд батарейки с высокой точностью.
Что если вы питаете микроконтроллер от другого источника? Допустим у вас есть четыре NiMh аккумулятора на 1.2 Вольта. В сумме они дадут 4.8 Вольта (пусть они немного разряжены, ведь в действительности их заряжают до 1.4 Вольта). Точность измерения будет равна 4.8/1024. Это следует учесть в нашей программе.
Наконец рассмотрим случай, когда мы питаем Arduino Uno одним напряжением, а в качестве опорного хотим установить совсем другое, например, 3.3 Вольта. Что делать? Для такого варианта на Arduino Uno есть специальный вывод Vref. Чтобы решить проблему, нам нужно подать на этот контакт напряжение 3.3 Вольта, и разрешить использование внешнего источника опорного напряжения функцией:
которую следует вызвать внутри функции setup нашей программы.
Также следует учитывать, что результат измерения значения напряжения не может превышать границы диапазона. Если мы выбираем в качестве опорного напряжения 3.3 Вольта, а поступающий сигнал будет с большим напряжением, то мы получим неправильное значение напряжения, поскольку АЦП «не знает» о наличии более высокого напряжения.
Объяснение работы программы
Для того, чтобы полноценно использовать АЦП в Arduino Uno, необходимо сделать следующие вещи:
analogRead(pin);
analogReference();
analogReadResolution(bits);Прежде всего необходимо отметить что каналы АЦП Arduino Uno имеют по умолчанию опорное значение 5 В (опорное напряжение). Это означает, что максимальное входное значение напряжения для каждого канала АЦП Arduino составляет 5 В. Но некоторые датчики имеют выходное напряжение в диапазоне 0-2,5 В, поэтому если мы будем использовать опорное напряжение по умолчанию (5 В), то мы потеряем в точности измерений. В связи с этим полезно иметь возможность изменения значения опорного напряжения, для Arduino Uno это делается с помощью команды “ analogReference(); ”.
По умолчанию мы имеем разрешающую способность АЦП, равную 10 бит, разрешение АЦП мы также можем изменить используя команду “ analogReadResolution(bits); ”. Это может быть полезно в ряде случаев.
Теперь, если все установки параметров работы АЦП нами сделаны, мы можем считать значение АЦП с канала ‘0’ просто используя инструкцию “analogRead(pin);”, где “pin” означает контакт (вывод), на который мы подаем аналоговый сигнал, в нашем случае это будет контакт “A0”. Значение с выхода АЦП может быть преобразовано в число типа integer, например, с помощью инструкции “ int ADCVALUE = analogRead(A0); ”, в результате выполнения этой инструкции значение с используемого канала АЦП после проведения преобразования (то есть АЦП) сохраняется в переменной целого типа (integer) под названием “ADCVALUE”.
Далее мы должны указать какой именно тип ЖК дисплея мы будем использовать. Существуют различные типы ЖК дисплеев, например, 20x4, 16x2, 16x1 и т.д. Мы в нашем проекте будем использовать ЖК дисплей 16x2, поэтому мы должны будем записать команду ‘ lcd.begin(16, 2); ’. А если бы у нас был дисплей 16x1, то нам бы пришлось использовать команду ‘lcd.begin(16, 1);’.
Далее мы Arduino Uno должны указать, к каким ее контактам мы подключили ЖК дисплей. В нашем случае мы к Arduino Uno подключили следующие выводы ЖК дисплея: “RS, En, D4, D5, D6, D7”. Мы подключили их к контактам 0, 1, 8, 9, 10, 11 Arduino Uno, поэтому в нашем случае соответствующая команда будет иметь следующий вид: “LiquidCrystal lcd(0, 1, 8, 9, 10, 11);”.
После всего этого мы можем приступит к передаче данных на ЖК дисплей. Сделать это можно, к примеру, с помощью следующей команды: “ lcd.print("hello, world!"); ”. В результате выполнения этой команды на экран ЖК дисплея будет выведена строка ‘hello, world!’.
Исходный код программы
В этом разделе статьи будет представлен полный код программы для обработки данных с АЦП Arduino Uno и последующего их вывода на ЖК дисплей. Если у вас возникнут вопросы, то вы можете задать их в комментариях к данной статье.
ADCVALUE.toCharArray(ADCSHOW, 5); // преобразуем эту строку в символьный массив
lcd.print(ADCSHOW); // выводим значение этого символьного массива на экран ЖК дисплея
lcd.print(" ");
lcd.setCursor(0, 0); // устанавливаем курсор в нулевой столбец 1-й строки
>Необходимые компоненты
- Плата Arduino Uno или Arduino Nano (купить на AliExpress).
- MCP4725 DAC IC (микросхема цифро-аналогового преобразователя) (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Потенциометр 10 кОм - 2 шт. (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Схема проекта
Схема подключения АЦП/ЦАП модуля PCF8591 к плате Arduino представлена на следующем рисунке.
Как видите, схема достаточно проста. В этой схеме мы будем считывать аналоговые значения с любого из аналоговых контактов и изменять эти значения с помощью потенциометра 100 кОм. Контакты VCC и GND модуля подключены к контактам 5V и GND платы Arduino. Контакты SDA и SCL модуля подключены к контактам A4 и A5 платы Arduino – это обеспечивает связь по протоколу I2C. Средний контакт потенциометра подключен к контакту AIN0 модуля PCF8591. Контакты данных (D4-D7) ЖК дисплея подключены к цифровым контактам D5-D2 платы Arduino, а контакты RS и EN ЖК дисплея подключены к контактам D12 и D11 платы Arduino. Контакт V0 ЖК дисплея подключен к потенциометру, который используется для регулировки его яркости.
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Программа
Наша первая программа с использованием АЦП будет крайне простой: каждую секунду мы будем измерять аналоговое значение на входе A0, и передавать его в последовательный порт.
Теперь загружаем программу на Arduino, и переходим к измерениям.
Схема проекта
Схема подключения цифро-аналогового преобразователя (ЦАП) MCP4725 к плате Arduino представлена на следующем рисунке.
В следующей таблице представлены необходимые соединения между MCP4725, платой Arduino Nano и мультиметром.
MCP4725 Arduino Nano Мультиметр SDA A4 NC SCL A5 NC A0 или OUT A1 +ve terminal GND GND -ve terminal VCC 5V NC Соединения между ЖК дисплеем 16x2 и платой Arduino Nano представлены в следующей таблице.
ЖК дисплей 16x2 Плата 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 в ЦАП 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. Затем значения с АЦП и ЦАП будут отображаться на экране ЖК дисплея.
АЦП/ЦАП модуль PCF8591
Значением входного напряжения можно управлять с помощью ручки потенциометра, присутствующего в составе модуля. Также в составе модуля есть три переключателя: J4 – позволяет подключать цепь термистора, J5 – позволяет подключать цепь фоторезистора, J6 – позволяет подключать цепь регулировки напряжения. Для доступа к этим цепям можно использовать адреса этих переключателей (джамперов): 0x50 для J6, 0x60 для J5 и 0x70 для J4. В составе модуля есть два светодиода: D1 показывает интенсивность (уровень) выходного напряжения, а D2 показывает уровень питающего напряжения. То есть чем больше уровни выходного и питающего напряжений, тем, соответственно, более ярко горят светодиоды D1 и D2.
Внешний вид и назначение контактов (распиновка) модуля PCF8591 показаны на следующем рисунке.
Видео
В этой статье мы рассмотрим различные аспекты использования аналого-цифрового преобразования (АЦП, в англ. ADC - Analog to Digital Conversion) в Arduino Uno.
Плата Arduino имеет 6 каналов АЦП, как показано на следующем рисунке.
Любые из этих каналов (или даже все сразу) можно использовать для подачи на них аналогового напряжения. АЦП в Arduino Uno имеет разрешение 10 бит, то есть получаем диапазон целых чисел, соответствующих этому разрешению, от 0 до 2^10-1 (до 1023). Это означает, что значение входного аналогового напряжения от 0 до 5 В преобразуется в целое число от 0 до 1023. То есть получаем шаг АЦП равный 5/1024= 4.9 мВ.
В нашем проекте мы будем подключать потенциометр к каналу ‘A0’, а результат аналого-цифрового преобразования на этом канале показывать на жидкокристаллическом (ЖК) дисплее. В радиолюбительской практике наиболее распространены жидкокристаллические (ЖК) дисплеи 16x1 и 16x2. ЖК дисплей 16x1 может отображать 16 символов, расположенных на одной строке. ЖК дисплей 16x2 может в сумме отображать 32 символа на двух строках – 16 символов на первой строке и 16 символов на второй. Здесь необходимо принимать во внимание тот факт, что каждый символ в подобных дисплеях состоит из 5x10=50 пикселов (точек). То есть чтобы отобразить 1 символ все эти 50 пикселов должны работать вместе. Но мы можем об этом не беспокоиться, потому что за их совместную работу отвечает контроллер HD44780 – его визуально можно увидеть на обратной стороне ЖК дисплея.
Читайте также: