7 февраля 2012 г.

Осиливаем ШИМ в теплой компании Arduino и RGB светодиода

Широтно-импульсная модуляция (ШИМ, PWM) - веселая штука, и особенно прикольно с ее помощью управлять сервомоторами, однако сегодня мы применим ее к трехцветному светодиоду. Это позволит нам управлять его цветом и получить некое подобие красоты.




ШИМ

Гениально определение ШИМ сформулировано в Википедии, поэтому я просто скопипащу его оттуда: "ШИМ - приближение желаемого сигнала (многоуровневого или непрерывного) к действительным бинарным сигналам (с двумя уровнями - вкл/выкл), так, что, в среднем, за некоторый отрезок времени, их значения равны. <...> ШИМ есть импульсный сигнал постоянной частоты и переменной скважности, то есть отношения периода следования импульса к его длительности. С помощью задания скважности (длительности импульсов) можно менять среднее напряжение на выходе ШИМ."


Теперь разберемся, что это значит. Пусть есть обычный такой прямоугольный сигнал:




Он имеет фиксированную частоту и скважность 50%. Это означает, что половину периода напряжение максимально, а другую половину оно равно нулю. Проинтегрировав этот сигнал за период, мы увидим, что его энергия равна половине максимальной. Это будет эквивалентно тому, как если бы мы все время подавали половину напряжения.


Если у нас максимальное напряжение равно 5 В, то напряжение, получаемое на выходе ШИМ равно скважность умножить на 5 В (и делить на 100% чтобы формал-nazi не привязывались):


Arduino позволяет записать на ШИМ-выход значение от 0 до 255, а это значит, что мы можем получить напряжение с дискретностью примерно 20 мВ. 


Трехцветный светодиод

Вот он, четырехногий красавец:


Самая длинная нога - это общий анод, а все остальные - это катоды, каждый отвечает за свой цвет: (смотрим на рисунок) самая нижняя - красный, вторая сверху - зеленый, самая верхняя - синий.

Если подать на длинную ногу +5В, а на все остальные 0В, то получится белый свет (умоляю, предохраняйтесь - ставьте ограничивающие резисторы!). Насколько он белый, можно судить по следующему видео:


Но получать белый цвет на нем как раз-таки неинтересно. Посмотрим, как заставить его переливаться разными цветами.

ШИМ на Arduino 

Частота ШИМ на Arduino - примерно 490 Гц. На плате Arduino UNO выводы, которые могут быть использованы для ШИМ - 3,5,6, 9, 10 и 11. На плате к этому есть подсказка - шелкографией перед номерами ШИМ-выводов есть тильда или диез.

Нет ничего проще, чем управлять ШИМ на Arduino! Для этого используется одна единственная функция analogWrite(pin, value), где pin - номер вывода, а value - значение от 0 до 255. При этом ничего не надо писать в void setup()!

Подробнее про это на английском языке можно почитать здесь и здесь.

Совсем немного работаем

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

Соберем незамысловатую схему:


И напишем незамысловатый код:


//обзываем выводы соответственно цвету
int REDpin = 9;
int GREENpin = 10;
int BLUEpin = 11;


void setup(){}


void loop(){
  for(int value = 0 ; value <= 255; value +=1) { 
    //яркость красного уменьшается
    analogWrite(REDpin, value);
    //яркость зеленого увеличивается
    analogWrite(GREENpin, 255-value);
    //синий не горит 
    analogWrite(BLUEpin, 255);
    //пауза
    delay(30);
  }


  for(int value = 0 ; value <= 255; value +=1) { 
    //красный не горит
    analogWrite(REDpin, 255);
    //яркость зеленого уменьшается
    analogWrite(GREENpin, value);
    //яркость синего увеличивается
    analogWrite(BLUEpin, 255-value);
    //пауза
    delay(30);
  }


  for(int value = 0 ; value <= 255; value +=1) { 
    //яркость красного увеличивается
    analogWrite(REDpin, 255-value);
    //зеленый не горит
    analogWrite(GREENpin, 255);
    //яркость синего уменьшается
    analogWrite(BLUEpin, value);
    //пауза
    delay(30);
  }
}


И получим подобие красоты:



Далее по теме Arduino и ШИМ

Arduino: управляем цветом RGB светодиода с помощью джойстика
Визуализация ШИМ на осциллографе

5 комментариев:

  1. Наконец нашел какая частота ШИМ на ардуино. Спасибо. Как поднять кстати не знаете?

    ОтветитьУдалить
    Ответы
    1. Нужно перенастроить таймер, отвечающий за ШИМ. Подскажу, что нужно менять значения в регистрах TCCR2A, TCCR2B, OCR2A, OCR2B = 50.
      Посмотрите здесь: http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM

      Удалить
  2. Можно воспользоваться библиотекой TimerOne и поиметь на 9,10 ШИМ во первых с частотами вплоть до мегагерца, а во вторых со скважностью, задаваемой не 256 значениями, а 1024.

    скачать библиотеку можно тут http://code.google.com/p/arduino-timerone/downloads/list

    ОтветитьУдалить
  3. Почему бы не поставить всего один резистор на землю, вместо трех на +??

    ОтветитьУдалить
    Ответы
    1. На моей схеме к +5V все-таки подключен анод, а резисторы к "земле".
      Представьте, что RGB-светодиод - это три светодиода, у которых просто соединены аноды (а это так и есть). Для каждого светодиода должен быть собственный токоограничивающий резистор, поэтому их три.

      Удалить