RGB-ночник управляемый руками

RGB-ночник, с возможностью управления цветом ночника с помощью движения рук. С помощью трех датчиков расстояния будем изменять яркость каждой из трех составляющих RGB-цвета при приближении-удалении руки. В качестве микроконтроллера использовалась плата Arduino.

Вот что получилось:

Для проекта потребовались следующие детали (цены Китай)

  1. Контроллер Arduino — 1шт; (12$)
  2. 8×8 RGB-матрица — 1 шт; (8$)
  3. Ультразвуковой датчик расстояния HC-SR04 — 3 шт; (8$)
  4. Сдвиговый регистр — микросхема 74hc595 — 4 шт; (2$)
  5. Резистор 220 Ом — 24 шт; (12 руб)
  6. Блок питания 5V 2A (Китай) — 1 шт. (~4$)
  7. Плафон с подставкой; (51 руб)
  8. Провода, припой и пр.

Итого 750 руб.

rgbmatrix1.jpg

images.jpg

rgb-matrix1-2.jpg

В качестве RGB-матрицы использовалась GTM2088 — с общим анодом, схема расположения выводов представлена ниже

rgbmatrix2.jpgrgbmatrix2-1.jpg

Принципиальная схема RGB-ночника:

Принципиальная схема RGB-ночника

Вот как это выглядело после пайки (4 блока): 

  • матрица;
  • сдвиговые регистры;
  • Arduino и датчики hc-sr04;
  • блок питания.

rgbmatrix4.jpg

Разработка скетча. При разработке скетча задал следующие параметры:
— расстояние 1-20 см, 1 — максимальная яркость, 20 — нулевая
— датчики расстояния в цикле считывают данные и применяют полученное расстояние для установления яркости
— если за цикл расстояние меняется с 1-20 см до больше чем 20 (рука уходит в сторону) — эта яркость фиксируется для данного цвета

Яркость задается подачей ШИМ-сигнала на выводы матрицы для групп R,G,B. Частота ШИМ-сигнала примерно 60Гц. Сигнал ШИМ формируется следующим образам:

Например, расстояние 5 см

Сигнал ШИМ — 15-(5-1)=10 циклов прерывания светодиоды данного цвета горят
   4 — 1 — светодиоды данного цвета не горят
   (на анод всегда подается 1) 
для экономии выводов Arduino для управления матрицей используются сдвиговые регистры 74hc595, что позволяет обойтись 3 выводами Arduino.

В скетче использовались библиотеки SPI и Ultrasonic, MsTimer2. 

Скетч получился следующим: 

 // inslude the SPI library: #include "SPI.h" // set pin 8 as the slave select for the digital pot: const int displayPin = 8;  // библиотека для прерываний по таймеру #include "MsTimer2.h" int offset=0; // библиотека для ультразвукового датчика #include "Ultrasonic.h"   Ultrasonic ultrasonic1(4,5);  // красный Ultrasonic ultrasonic2(9,6);  // зеленый Ultrasonic ultrasonic3(2,3);  // синий // структура для хранения значений R, G, B struct RGB     {   int r;      // позиция R   int g;      // позиция G   int b;      // позиция B   int offset; // кол-во ШИМ-циклов }; RGB RGB1={0,0,0,0};  void setup() {      Serial.begin(115200);   Serial.println("start");   Serial.println("led matrix");   // set the slaveSelectPin as an output:   pinMode (displayPin, OUTPUT);   // initialize SPI:   SPI.begin();    // запуск прерывания по таймеру   MsTimer2::set(1, showDisplay); //     MsTimer2::start();    //clearDisplay();   Serial.println("led matrix");    } int dist=0; void loop() {    delay(100);     // для красного    dist = (int)ultrasonic1.Ranging(CM);  // считать для R    //Serial.print("dist.r=");    //Serial.println(dist);    if(dist>0 && dist<20)        {RGB1.r=dist;}    // для зеленого    dist = (int)ultrasonic2.Ranging(CM);  // считать для R    //Serial.print("dist.g=");    //Serial.println(dist);    if(dist>0 && dist<20)        {RGB1.g=dist;}    // для синего    dist = (int)ultrasonic3.Ranging(CM);  // считать для R    //Serial.print("dist.b=");    //Serial.println(dist);    if(dist>0 && dist<20)        {RGB1.b=dist;}          } // обработка прырывания по таймеру // динамическая индикация void showDisplay() {    // инкремент счетчика    RGB1.offset=max(2,(RGB1.offset+1)%15);    digitalWrite(displayPin,LOW);    // вывод данных    if(RGB1.b меньше RGB1.offset)      // blue      SPI.transfer(B00000000);       else      SPI.transfer(B11111111);       SPI.transfer(B11111111);   // анод    if(RGB1.g меньше RGB1.offset)      // green      SPI.transfer(B00000000);       else      SPI.transfer(B11111111);       if(RGB1.r меньше RGB1.offset)     //red      SPI.transfer(B00000000);       else      SPI.transfer(B11111111);       // take the SS pin high     digitalWrite(displayPin,HIGH);   }

Сборка лампы

Из подставки плафона удаляем патрон и делаем отверстие, чтобы прошла матрица

.rgb-matrix5.jpg

rgb-matrix5-1.jpg

Вставляем блок сдвиговых регистров и закрываем, вырезанным из пенопласта кругом.

Обрезаем «резьбу» плафона, чтобы он зацепился за подставку

rgb-matrix7.jpg

Далее добавляем подставку из полиэтиленовой трубы диаметром 100 с тремя отверстиями под датчики расстояния

rgbmatrix11.jpg

и дно из пенопласта

rgbmatrix12.jpg

получается в сборе так

rgbmatrix13.jpg

Теперь остается только его только украсить и можно пользоваться

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Плата Arduino Arduino Nano 3.0 1
Сдвиговый регистр CD74HC595 4
Ультразвуковой датчик расстояния HC-SR04 3
8×8 RGB-матрица 1
Резистор 220 Ом 24