В этом эксперименте мы рассмотрим широтно-импульсную модуляцию, которая позволяет Arduino выводить аналоговые данные на цифровые выводы, и применим эти знания для создания прозвольных цветов свечения с помощью RGB-светодиода.
Необходимые компоненты:
• контроллер Arduino UNO R3;
• плата для прототипирования;
• RGB-светодиод;
• резистор 220 Ом;
• провода папа-папа.
Arduino не может на цифровой вывод выдавать произвольное напряжение. Выдается либо +5 В (HIGH), либо 0 В (LOW). Но уровнем напряжения управляется многое: например, яркость светодиода или скорость вращения мотора. Для симуляции неполного напряжения используется ШИМ (широтно-импульсная модуляция, или PWM).
ШИМ – это операция получения изменяющегося аналогового значения посредством цифровых сигналов. Цифровой сигнал на выходе постоянно переключается между максимальным и минимальным значениями. Переключение имеет частоту в тысячи герц. Глаз не замечает мерцания более 50 Гц, поэтому нам кажется, что светодиод не мерцает, а горит в неполную силу. Длительность включения максимального значения называется шириной импульса. Для получения различных аналоговых величин изменяется ширина импульса (см. рис. 5.1).
Arduino-функция analogWrite() выдает ШИМ-сигнал на цифровой вывод Arduino. После вызова analogWrite() на выходе будет генерироваться постоянная прямоугольная волна с заданной шириной импульса до следующего вызова analogWrite(), частота выдаваемого ШИМ-сигнала равна 490 Гц. На платах Arduino Nano и UNO ШИМ поддерживают выводы 3, 5, 6, 9, 10 и 11, на плате Mega – выводы 2–13. Данные выводы отмечены знаком тильды ˜.
Необходимые компоненты:
• контроллер Arduino UNO R3;
• плата для прототипирования;
• RGB-светодиод;
• резистор 220 Ом;
• провода папа-папа.
Arduino не может на цифровой вывод выдавать произвольное напряжение. Выдается либо +5 В (HIGH), либо 0 В (LOW). Но уровнем напряжения управляется многое: например, яркость светодиода или скорость вращения мотора. Для симуляции неполного напряжения используется ШИМ (широтно-импульсная модуляция, или PWM).
ШИМ – это операция получения изменяющегося аналогового значения посредством цифровых сигналов. Цифровой сигнал на выходе постоянно переключается между максимальным и минимальным значениями. Переключение имеет частоту в тысячи герц. Глаз не замечает мерцания более 50 Гц, поэтому нам кажется, что светодиод не мерцает, а горит в неполную силу. Длительность включения максимального значения называется шириной импульса. Для получения различных аналоговых величин изменяется ширина импульса (см. рис. 5.1).
Arduino-функция analogWrite() выдает ШИМ-сигнал на цифровой вывод Arduino. После вызова analogWrite() на выходе будет генерироваться постоянная прямоугольная волна с заданной шириной импульса до следующего вызова analogWrite(), частота выдаваемого ШИМ-сигнала равна 490 Гц. На платах Arduino Nano и UNO ШИМ поддерживают выводы 3, 5, 6, 9, 10 и 11, на плате Mega – выводы 2–13. Данные выводы отмечены знаком тильды ˜.
Рис. 5.1. Зависимость значений ШИМ от ширины импульса
В данном эксперименте мы используем RGB-светодиод. RGB расшифровывается как аббревиатура Red, Green, Blue, при помощи этих цветов можно получить любой цвет путем смешения. Светодиод RGB отличается от обычного тем, что содержит 3 небольших кристалла R, G, B, которые смогут синтезировать любой цвет или оттенок. RGB-светодиод имеет 4 вывода (см. рис. 5.2). Подключим RGB-светодиод к плате Arduino и заставим переливаться его цветами радуги. На рис. 5.3 показана схема подключения RGB-светодиода к плате Arduino.
Теперь перейдем к написанию скетча. На самом деле радуга имеет множество цветов, а 7 цветов были придуманы только потому, что эти цвета наиболее устойчиво воспринимаются и определяются глазом и мы их можем назвать и вспомнить поговоркой «Каждый Охотник Желает Знать, Где Сидит Фазан».
Рис. 5.2. Выводы RGB-светодиода
Рис. 5.3. Схема подключения RGB-светодиода
Список этих 7 основных цветов радуги с разложением по компонентам R, G и B представлен в табл. 5.1.
Наш светодиод должен переливаться от красного до фиолетового, проходя через все 7 основных цветов. Алгоритм вычисления любого промежуточного цвета радуги следующий:
1. Примем за начальную точку отсчета красный цвет (255, 0, 0).
2. Будем постепенно увеличивать значение зеленой составляющей G, пока не достигнем значения оранжевого (255, 125, 0), а затем и желтого цвета (255, 255, 0).
3. Постепенно уменьшим значение красной составляющей R до значения зеленого цвета (0, 255, 0).
4. Постепенно увеличим значение синей составляющей B до значения голубого цвета (0, 255, 255).
5. Постепенно уменьшим количество зеленой составляющей G до значения синего цвета (0, 0, 255).
6. Постепенно увеличим количество красной составляющей R до значения фиолетового цвета (255, 0, 255).
7. Выдерживаем небольшую паузу и переходим к шагу 1. Содержимое скетча показано в листинге 5.1.
const int RED=11; // вывод красной ноги RGB-светодиода
const int GREEN=10; // вывод зеленой ноги RGB-светодиода
const int BLUE=9; // вывод синей ноги RGB-светодиода
int red; // переменная для хранения R-составляющей цвета
int green; // переменная для хранения G-составляющей цвета
int blue; // переменная для хранения B-составляющей цвета
void setup()
{;}
void loop()
{
// от красного к желтому
red=255;green=0;blue=0;
for(green=0;green<=255;green++)
setRGB(red,green,blue);
// от желтому к зеленому
for(red=255;red>=0;red--)
setRGB(red,green,blue);
// от зеленого к голубому
for(blue=0;blue<=255;blue++)
setRGB(red,green,blue);
// от голубого к синему
for(green=255;green>=0;green--)
setRGB(red,green,blue);
// от синего к фиолетовому
for(red=0;red<=255;red++)
setRGB(red,green,blue);
delay(2000);
} // функция установки цвета RGB-светодиода
void setRGB(int r,int g,int b)
{
analogWrite(RED,r);
analogWrite(GREEN,g);
analogWrite(BLUE,b);
delay(10);
}
const int GREEN=10; // вывод зеленой ноги RGB-светодиода
const int BLUE=9; // вывод синей ноги RGB-светодиода
int red; // переменная для хранения R-составляющей цвета
int green; // переменная для хранения G-составляющей цвета
int blue; // переменная для хранения B-составляющей цвета
void setup()
{;}
void loop()
{
// от красного к желтому
red=255;green=0;blue=0;
for(green=0;green<=255;green++)
setRGB(red,green,blue);
// от желтому к зеленому
for(red=255;red>=0;red--)
setRGB(red,green,blue);
// от зеленого к голубому
for(blue=0;blue<=255;blue++)
setRGB(red,green,blue);
// от голубого к синему
for(green=255;green>=0;green--)
setRGB(red,green,blue);
// от синего к фиолетовому
for(red=0;red<=255;red++)
setRGB(red,green,blue);
delay(2000);
} // функция установки цвета RGB-светодиода
void setRGB(int r,int g,int b)
{
analogWrite(RED,r);
analogWrite(GREEN,g);
analogWrite(BLUE,b);
delay(10);
}
Порядок подключения:
1. Чтобы видеть смешивание трех компонент R, G, B, а не отдельные составляющие, необходимо сделать поверхность светодиода шероховатой небольшой обработкой напильником или накрыть RGB-светодиод матовой пластиной.
2. Подключаем RGB-светодиод по схеме на рис. 5.3.
3. Загружаем в плату Arduino скетч из листинга 5.1.
4. Наблюдаем свечение светодиода переливающимися цветами радуги.
Листинги программ скачать