В этой статье мы рассмотрим различные аспекты использования аналого-цифрового преобразования (АЦП, в англ. 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’, а результат аналого-цифрового преобразования на этом канале показывать на жидкокристаллическом (ЖК) дисплее. В радиолюбительской практике наиболее распространены жидкокристаллические (ЖК) дисплеи 16×1 и 16×2. ЖК дисплей 16×1 может отображать 16 символов, расположенных на одной строке. ЖК дисплей 16×2 может в сумме отображать 32 символа на двух строках – 16 символов на первой строке и 16 символов на второй. Здесь необходимо принимать во внимание тот факт, что каждый символ в подобных дисплеях состоит из 5×10=50 пикселов (точек). То есть чтобы отобразить 1 символ все эти 50 пикселов должны работать вместе. Но мы можем об этом не беспокоиться, потому что за их совместную работу отвечает контроллер HD44780 – его визуально можно увидеть на обратной стороне ЖК дисплея.
Необходимые компоненты
Плата Arduino UNO
Источник питаний 5 В
ЖК дисплей 16х2 (JHD_162ALCD)
Конденсатор 100 пФ
Конденсатор 100 нФ
Потенциометр 100 кОм
Работа схемы
Схема устройства представлена на следующем рисунке.
На представленной схеме можно увидеть, что мы использовали только 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 контакта для целей управления.
Объяснение работы программы
Для того, чтобы полноценно использовать АЦП в 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”.
Теперь несколько слов о работе с ЖК дисплеем 16×2. Сначала мы должны подключить необходимый заголовочный файл с помощью команды ‘#include <LiquidCrystal.h>’, этот заголовочный файл содержит все необходимые функции для работы с ЖК дисплеем. По умолчанию функционал этого файла настроен для работы с ЖК дисплеем в 4-битном режиме. С помощью этого заголовочного файла нам не нужно будет заботиться о том, чтобы передавать данные в ЖК дисплей бит за битом и писать какие либо собственные функции для работы с ЖК дисплеем.
Далее мы должны указать какой именно тип ЖК дисплея мы будем использовать. Существуют различные типы ЖК дисплеев, например, 20×4, 16×2, 16×1 и т.д. Мы в нашем проекте будем использовать ЖК дисплей 16×2, поэтому мы должны будем записать команду ‘lcd.begin(16, 2);’. А если бы у нас был дисплей 16×1, то нам бы пришлось использовать команду ‘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 и последующего их вывода на ЖК дисплей. Если у вас возникнут вопросы, то вы можете задать их в комментариях к данной статье.
#include <LiquidCrystal.h>
// подключаем необходимый заголовочный файл для работы с ЖК дсиплеем
LiquidCrystal lcd(8, 9, 10, 11, 12, 13); // сообщаем Arduino номера контактов, к которым мы подключили ЖК дисплей
char ADCSHOW[5]; //объявляем переменную для хранения результата АЦП
void setup()
{
// устанавливаем число столбцов и строк для ЖК дисплея
lcd.begin(16, 2);
}
void loop()
{
// устанавливаем курсор в нулевой столбец 1-й строки
lcd.print(" CIRCUIT DIGEST"); //выводим на экран ЖК дисплея строку
lcd.setCursor(0, 1); // устанавливаем курсор в нулевой столбец второй строки
lcd.print("ADC RESULT:"); // выводим на экран ЖК дисплея строку "ADC RESULT:"
String ADCVALUE = String(analogRead(A0)); //сохраняем значение АЦП в переменной типа "строка"
ADCVALUE.toCharArray(ADCSHOW, 5); // преобразуем эту строку в символьный массив
lcd.print(ADCSHOW); // выводим значение этого символьного массива на экран ЖК дисплея
lcd.print(" ");
lcd.setCursor(0, 0); // устанавливаем курсор в нулевой столбец 1-й строки
}
Видео, демонстрирующее работу схемы
Также можете посмотреть еще одно видео про то, как использовать АЦП в Arduino Uno. Оно на английском языке, но зато очень подробное и доходчивое.