Ардуино: трехцветный светодиод — RGB

На предыдущем уроке мы уже попробовали зажигать и гасить с помощью Ардуино обычный светодиод. Теперь же разберемся с многоцветным светодиодом, который часто называют сокращенно: RGB-светодиод.

RGB — это аббревиатура, которая расшифровывается как: Red — красный, Green — зеленый, Blue — синий. То есть внутри этого устройства размещается сразу три отдельных светодиода. В зависимости от типа, RGB-светодиод может иметь общий катод или общий анод.

1. Смешение цветов

Чем RGB-светодиод, лучше трех обычных? Всё дело в свойстве нашего зрения смешивать свет от разных источников, размещенных близко друг к другу. Например, если мы поставим рядом синий и красный светодиоды, то на расстоянии несколько метров их свечение сольется, и глаз увидит одну фиолетовую точку. А если добавим еще и зеленый, то точка покажется нам белой. Именно так работают мониторы компьютеров, телевизоры и уличные экраны.

Матрица телевизора состоит из отдельно стоящих точек разных цветов. Если взять лупу и посмотреть через нее на включенный монитор, то эти точки можно легко увидеть. А вот на уличном экране точки размещаются не очень плотно, так что их можно различить невооруженным глазом. Но с расстояния несколько десятков метров эти точки неразличимы.

Получается, что чем плотнее друг к другу стоят разноцветные точки, тем меньшее расстояние требуется глазу чтобы смешивать эти цвета. Отсюда вывод: в отличие от трех отдельностоящих светодиодов, смешение цветов RGB-светодиода заметно уже на расстоянии 30-70 см. Кстати, еще лучше себя показывает RGB-светодиод с матовой линзой.

2. Подключение RGB-светодиода к Ардуино

Поскольку многоцветный светодиод состоит из трех обычных, мы будем подключать их отдельно. Каждый светодиод соединяется со своим выводом и имеет свой отдельный резистор.

В уроке мы используем RGB-светодиод с общим катодом, так что провод к земле будет только один.

Принципиальная схема

Подключение RGB многоцветного светодиода к Arduino

Внешний вид макетаПодключение RGB многоцветного светодиода к Arduino

3. Программа для управления RGB-светодиодом

Составим простую программу, которая будет по очереди зажигать каждый из трех цветов.

const byte rPin = 3;
const byte gPin = 5;
const byte bPin = 6;

void setup() {
    pinMode( rPin, OUTPUT );
    pinMode( gPin, OUTPUT );
    pinMode( bPin, OUTPUT );
}

void loop() {
    // гасим синий, зажигаем красный
    digitalWrite( bPin, LOW );
    digitalWrite( rPin, HIGH );
    delay( 500 );
    // гасим красный, зажигаем зеленый
    digitalWrite( rPin, LOW );
    digitalWrite( gPin, HIGH );
    delay( 500 );
    // гасим зеленый, зажигаем синий
    digitalWrite( gPin, LOW );
    digitalWrite( bPin, HIGH );
    delay( 500 );
}

Загружаем программу на Ардуино и наблюдаем результат.

Немного оптимизируем программу: вместо переменных rPin, gPin и bPin применим массив. Это нам поможет в следующих заданиях.

const byte rgbPins[3] = {3,5,6};

void setup() {
    for( byte i=0; i<3; i++ )
        pinMode( rgbPins[i], OUTPUT );
}

void loop() {
    digitalWrite( rgbPins[2], LOW );
    digitalWrite( rgbPins[0], HIGH );
    delay( 500 );
    digitalWrite( rgbPins[0], LOW );
    digitalWrite( rgbPins[1], HIGH );
    delay( 500 );
    digitalWrite( rgbPins[1], LOW );
    digitalWrite( rgbPins[2], HIGH );
    delay( 500 );
}

4. Семь цветов радуги

Теперь попробуем зажигать одновременно по два цвета. Запрограммируем такую последовательность цветов:

  • красный
  • красный + зеленый = желтый
  • зеленый
  • зеленый + синий = голубой
  • синий
  • синий + красный = фиолетовый

Оранжевый цвет мы для упрощения опустили. Так что, получилось шесть цветов радуги 🙂

const byte rgbPins[3] = {3,5,6};
const byte rainbow[6][3] = {
    {1,0,0}, // красный
    {1,1,0}, // жёлтый
    {0,1,0}, // зелёный
    {0,1,1}, // голубой
    {0,0,1}, // синий
    {1,0,1}, // фиолетовый
};

void setup() {
    for( byte i=0; i<3; i++ )
        pinMode( rgbPins[i], OUTPUT );
}

void loop() {
    // перебираем все шесть цветов
    for( int i=0; i<6; i++ ){
        // перебираем три компоненты каждого из шести цветов
        for( int k=0; k<3; k++ ){
            digitalWrite( rgbPins[k], rainbow[i][k] );
        }
        delay( 1000 );
    }
}

В результате работы программы получается:

5. Плавное изменение цвета

Мы не зря подключили RGB-светодиод к выводам 3, 5 и 6. Как известно, эти выводы позволяют генерировать ШИМ сигнал разной скважности. Другими словами, мы можем не просто включать или выключать светодиод, а управлять уровнем напряжения на нем. Делается это с помощью функции analogWrite.

Сделаем так, что наш светодиод будет переходить между цветами радуги не скачкообразно, а плавно.

const byte rgbPins[3] = {3,5,6};

void setup() {
    for(byte i=0; i<3; i++){
        pinMode( rgbPins[i], OUTPUT );
    }
    // начальное состояние - горит красный цвет
    analogWrite(rgbPins[0], 255);
    analogWrite(rgbPins[1], 0);
    analogWrite(rgbPins[2], 0);
}

void loop() {
    // гасим красный, параллельно разжигаем зеленый
    for(int i=255; i>=0; i--){
        analogWrite( rgbPins[0], i/dim );
        analogWrite( rgbPins[1], (255-i)/dim );
        delay(10);
    }
    // гасим зеленый, параллельно разжигаем синий
    for(int i=255; i>=0; i--){
        analogWrite( rgbPins[1], i/dim );
        analogWrite( rgbPins[2], (255-i)/dim );
        delay(10);
    }
    // гасим синий, параллельно разжигаем красный
    for(int i=255; i>=0; i--){
        analogWrite( rgbPins[2], i/dim );
        analogWrite( rgbPins[0], (255-i)/dim );
        delay(10);
    }
}

Загружаем программу на Ардуино.

Задания

  1. Индикатор температуры. Добавим в схему термистор и подключим его к аналоговому входу. Светодиод должен менять свой цвет в зависимости от температуры термистора. Чем ниже температура, тем более синий цвет, а чем выше, тем более красный.
  2. RGB лампа с регулятором. Добавим в схему три переменных резистора и подключим их к аналоговым входам. Программа должна непрерывно считывать значения резисторов и менять цвет соответствующей компоненты RGB-светодиода.

 


Изменено: