Изучаем 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.