Изучаем Arduino: инструметы и методы технического волшебства - страница 12
• последнее выражение указывает, что должно произойти с переменной i каждый раз после выполнения операторов тела цикла. В нашем примере, значение счетчика цикла увеличивается на 100.
Чтобы лучше понять работу оператора for, подробно рассмотрим, что происходит за два прохода цикла:
1. Значение переменной i равно 100, 100 меньше или равно 1000, значит выполнять код в теле цикла.
2. На контакте 9 установлено значение HIGH, светодиод горит 100 мс (текущее значение i).
3. На контакт 9 подано значение LOW, светодиод потушен 100 мс (текущее значение i).
4. В конце цикла значение переменной i увеличивается на 100, теперь i равно 200.
5. 200 меньше или равно 1000, цикл повторяется снова.
6. На контакте 9 установлено значение HIGH, светодиод горит 200 мс (текущее значение i).
7. На контакт 9 подано значение LOW, светодиод потушен 200 мс (текущее значение i).
8. В конце цикла значение переменной i увеличивается на 100, теперь i равно 300.
9. Этот процесс повторяется, пока i не превосходит 1000 и затем i снова принимает значение 100 и все повторяется заново.
Итак, вы разобрались с работой цифровых контактов платы Arduino. Далее мы расскажем, как с помощью ШИМ сформировать аналоговые сигналы на цифровых контактах платы Arduino.
2.6. Широтно-импульсная модуляция с помощью analogWrite()
Вы освоили контроль над цифровыми контактами Arduino. Они очень удобны для переключения светодиодов, управления реле и двигателями постоянного тока. Но что делать, если необходимо вывести напряжение, отличное от 0 и 5 В. С помощью контактов одной только платы Arduino Uno это невозможно. Придется задействовать цифроаналоговый преобразователь или взять плату Arduino Due или добавить внешнюю микросхему ЦАП.
- 50 -
Тем не менее, можно сымитировать генерацию аналоговых значений на цифровых контактах с помощью широтно-импульсной модуляции (ШИМ). Для некоторых контактов Arduino сформировать ШИМ-сигнал можно командой analogWrite().
Контакты, которые могут выдавать ШИМ-сигнал на определенные периферийные устройства, помечены символом - на плате Arduino. На Arduino Uno контакты 3, 5, 6, 9, 10, 11 поддерживают выдачу ШИМ-сигнала. При наличии Arduino Uno проверить команду analogWrite() можно с помощью схемы, изображенной на рис. 2.1.
Если уменьшить напряжение на контакте 9 Arduino, яркость свечения светодиода должна стать меньше, потому что снизится ток, текущий через него. Этого эффекта можно добиться с помощью ШИМ и команды analogWrite().
Функция analogWrite() имеет два аргумента: номер контакта и 8-разрядное значение в диапазоне от 0 до 255, устанавливаемое на этом контакте.
В листинге 2.3 приведен код программы генерации ШИМ-сигнала на контакте 9 для плавного управления яркостью светодиода.
Листинг 2.3. Плавное изменение яркости светодиода — fade.ino
const int LED=9; // Константа номера контакта светодиода
void setup()
{
pinMode (LED, OUTPUT); // Конфигурируем контакт светодиода как выход
}
void loop()
{
for (int i=0; i<256; i++)
{
analogWrite(LED, i);
delay (10);
}
for (int i=255; i>=0; i--)
{
analogWrite(LED, i);
delay(10);
}
}
Что будет происходить со светодиодом при выполнении листинга 2.3? Вы будете наблюдать, как свечение светодиода изменяется от тусклого к яркому в одном цикле for, а затем от яркого к тусклому в другом цикле for. Все это будет происходить в основном цикле loop() до бесконечности. Обязательно обратите внимание на различие двух циклов for. В первом цикле выражение i++ является сокращением кода i=i+1. Аналогично, запись i-- эквивалентна коду i=i-1. Первый цикл плавно зажигает светодиод до его максимальной яркости, второй - постепенно гасит его.
- 51 -
Во многих случаях ШИМ пригодна для эмуляции аналогового выхода, но когда требуется неискаженный аналоговый сигнал, этот вариант неприемлем. Например, ШИМ отлично подходит для регулировки скорости двигателя постоянного тока (примеры будут приведены в следующих главах), но не годится для управления аудиоколонками (без дополнительной внешней схемы).
Чтобы понять все тонкости, разберемся, как на самом деле работает ШИМ. Рассмотрим графики, представленные на рис. 2.4.