RGB-нічник, керований руками

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

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

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

  1. Контроллер Arduino - 1шт; (12$)
  2. 8x8 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
8x8 RGB-матрица 1
Резистор
220 Ом
24

Прикрепленные файлы:

Top