Лампа хамелеон (color mixing lamp)

1 марта 2013, 18:01

В этом проекте, мы будем использовать трехцветный светодиод и три фоторезистора, чтобы сделать лампу, которая плавно меняет свой цвет, в зависимости от внешних условий освещения.

Arduino не может менять напряжение на выходах, оно может быть либо 0, либо 5 вольт. Однако для плавного изменения яркости светодиода можно использовать технику под названием широтно-импульсная модуляция (ШИМ). ШИМ с высокой частотой включает и выключает напряжение на выходе. Это происходит так быстро, что при подключении к такому выходу светодиода человеческих глаз не может это различить. Когда вы бысто меняете на выходе  HIGH и LOW, это как если бы вы меняли напряжение. Часть времени, когда на выходе HIGH, называется рабочим циклом. Чем больше рабочий цикл, тем ярче светится светодиод.

Для проекта мы использовали фоторезисторы (сенсоры, которые меняют свое сопротивление в зависимости от количества света, которое на них попадает). Если эти фоторезисторы подсоединить к Arduino, то можно измерять изменение сопротивления, измеряя напряжение на входе Arduino, к которому подключен сенсор.

Вот схема, которую мы будем собирать:

На каждый из трех фоторезисторов мы наденем цветную пленку (красную, синюю и зеленую). Благодаря этому на каждый из сенсоров будет попадать только свет опраделенной длины волны (цвета) и можно будет определить примерный уровень освещенности.

Трехцветный светодиод состоит из трех раздельных элементов (красный, зеленый и синий), которые имеют общий катод (минус). Подавая напряжение на контакты светодиода, которые подсоединены к аналоговым (ШИМ) выходам Arduino (обозначены на плате ~), мы будем плавно изменять его цвет. Для включения режима ШИМ на выходах Arduino используется команда analogWrite().
Макет готов:

После долгих трудов мы с Арсений получили вот такую программу:

int redSens=A0;//красный фоторезистор pin
int greenSens=A1;//зелёный фоторезистор pin
int blueSens=A2;//синий фоторезистор pin
int redLed=11;//красный диод
int blueLed=10;//синий диод
int greenLed=9;//зелёный диод
int redVal=0;//выводим накрасный диод
int greenVal=0;//выводим на зелёный диод
int blueVal=0;//выводим на синий диод
int redSensVal=0;//показания красного фоторизистора
int blueSensVal=0;//показания синего фоторизистора
int greenSensVal=0;//показания зелёного фоторизистора

void setup(){
  pinMode(redLed,OUTPUT);
  pinMode(blueLed,OUTPUT);
  pinMode(greenLed,OUTPUT);
  Serial.begin(9600);
}

void loop(){
  //считываем показания фоторизисторов
  redSensVal=analogRead(redSens);
  delay(5);
  greenSensVal=analogRead(greenSens);
  delay(5);
  blueSensVal=analogRead(blueSens);

  redVal=redSensVal/4;
  greenVal=greenSensVal/4;
  blueVal=blueSensVal/4;

  //выводим значения на экран компьютера
  Serial.print(«sensor Values \t Red: „);
  Serial.print(redSensVal);
  Serial.print(“ „);
  Serial.print(redVal);
  Serial.print(“\t Green: „);
  Serial.print(greenSensVal);
  Serial.print(“ „);
  Serial.print(greenVal);
  Serial.print(“\t Blue: „);
  Serial.print(blueSensVal);
  Serial.print(“ „);
  Serial.println(blueVal);

  analogWrite(redLed,redVal);
  analogWrite(greenLed,greenVal);
  analogWrite(blueLed,blueVal);
}

Здесь надо прокомментировать, что с аналоговых сенсоров мы получаем значения в диапозоне от 0 до 1023, а выводить на аналоговые выходы может значения от 0 до 254, по этому предварительно значения из одного диапазона надо «привести» к значениям из другого диапазона, в данном случае мы просто делим на 4.

Для большей зрелищности на светодиод мы надели шарик для пинпонга и получили такой небольшой светильник:

Популярное