День ото дня мы продвигаемся в плане освоения платформы Ардуино. Мы узнали, как можно научить контроллер общаться с пользователем (отправлять и получать необходимую для работы информацию). Выучили, как управлять работой «камушка» при помощи различных типов циклов (for и while).
В сегодняшней статье речь пойдёт о следующем. До сих пор все наши команды имели чисто дискретную составляющую. Своими действиями (командой DigitalWrite) мы задавали на выводах контроллера или высокий (5В) или низкий (0В) уровень сигнала, иными словами: мы то включали, то выключали подсоединенную к плате нагрузку. Однако, правда жизни в том, что в большинстве случаев нужно задавать какие-то промежуточные значения, а не метаться из крайности в крайность. Возможно, нам понадобится напряжение в 1,2 или 2,3 В…
Не все выводы платы Ардуино УНО имеют возможность задавать значения «по аналоговому принципу». Только выводы, напротив которых расположена волнистая линия: 3, 5, 6, 9, 10, 11.
Как бы быстро технический процесс не двигался в направлении цифровых (дискретных) сигналов, в мире техники и электроники, всегда будет необходимость в применении аналоговых напряжений. Для задания, на сконфигурированным выводе, значения напряжения в пределах от 0 до 5В применяется команда analogWrite.
К сожалению, в аргументах функции analogWrite, нельзя записать просто значение напряжения, которое мы хотим получить. Мы должны указывать целое число в пределах от 0 до 255.
Например.
Команда analogWrite (pinLed, 0) сделает следующее: установит на выводе pinLed 0В (иными словами выключит питание). Если же записать analogWrite (pinLed, 255), то на выводе pinLed будет установлен высокий уровень сигнала (5В). В случае же, если мы напишем analogWrite (pinLed, 127), то установим на выводе значение напряжения, что равно около 2,5В.
Примечание: значение 255 – это 2 в 8 степени. Значение степени определяется разрядность ЦАП (цифро-аналогового преобразователя).
Это всего лишь несколько примеров, для более точного соответствия значений-напряжений выполним ряд математических расчётов.
Нам нужно получить уравнение, которое позволит вычислить коэффициент, который будет необходимо использовать для получения значения напряжений.
Для выведения уравнения будем использовать две точки, полученные из приведённого графика.
По оси Х откладываем напряжения, по оси Y откладываем аналоговое значение.
Первая точка имеет координаты (0,0) – напряжение на выводе равно 0, аналоговое значение 0. Вторая точка (5, 255) – напряжение на выводе равно 5В, аналоговое значение 255. Между этими двумя точками проводим прямую линию. Использую данных график, можно приблизительно определять необходимые для функции analogWrite аргументы.
Более правильным подходом в данном случае будет на основании имеющихся данных рассчитать поправочный коэффициент.
K = (value2-value1)/(voltage2- voltage 1) = (255-0)/(5-0) = 51
(value - value1)=K*(voltage - voltage1)
Как вы помните, первая точка имеет координаты: (value1, voltage1) = (0,0).
Подставляем значения: (value -0) = 51*(voltage – 0) => value = 51*voltage
Где, voltage - это напряжение, которое мы хотим получить, а value - это значение, которое необходимо задать.
Полученное уравнение позволяет нам точно рассчитать, какое значение необходимо указать в аргументе функции analogWrite, чтобы получить желаемое напряжение.
Например, мы хотим получить ровно 2В на выводе pinLED => 2*51 = 102 => analogWrite (pinLED, 102).
Практическую часть будем «откатывать» на схеме из двух светодиодов.
Продолжаем работать с кодом, написанным в предыдущем уроке. Я немного видоизменил программу, составленную нами в 15 уроке, а именно:
- запрос на ввод данных от пользователя теперь выполняется всего один раз;
- зелёный светодиод работает с циклом for, а красный – с циклом while.
Нам нужно заменить четыре команды digitalWrite на команды analogWrite. Допустим, что вместо 5В мы хотим подать на светодиод 1В (светодиоды будут слегка мерцать) Для этого напряжение*коэффициент = значение аргумента => 1*51 = 51. Команда включения светодиода будет иметь следующий вид:
analogWrite (greenLed, 51) или analogWrite (redLed, 51).
Обратите внимание на следующее: команды digitalWrite (greenLed, LOW) и digitalWrite (redLed, LOW) по-прежнему будут выключать светодиоды, но лучше пускай все будет выполнено в одном стиле.
Изменим программу, присвоив переменным, что отвечают за количество миганий определённые значения (теперь пользователь не будет их задавать). Поменяем сообщения, которые контроллер отправляет пользователю перед запуском основной программы. Затем объявим 2 новые переменные, которые будут хранить аналоговые значения напряжений. Заменим «аналоговые значения» на переменные
analogWrite (greenLed, 51);
analogWrite(redLed,51);
на
analogWrite (greenLed, anologValueGreenVoltage);
analogWrite(redLed,anologValueRedVoltage);
Продолжение следует…