RGB-ночник, с возможностью управления цветом ночника с помощью движения рук. С помощью трех датчиков расстояния будем изменять яркость каждой из трех составляющих RGB-цвета при приближении-удалении руки. В качестве микроконтроллера использовалась плата Arduino.
Вот что получилось:
Для проекта потребовались следующие детали (цены Китай)
- Контроллер Arduino — 1шт; (12$)
- 8×8 RGB-матрица — 1 шт; (8$)
- Ультразвуковой датчик расстояния HC-SR04 — 3 шт; (8$)
- Сдвиговый регистр — микросхема 74hc595 — 4 шт; (2$)
- Резистор 220 Ом — 24 шт; (12 руб)
- Блок питания 5V 2A (Китай) — 1 шт. (~4$)
- Плафон с подставкой; (51 руб)
- Провода, припой и пр.
Итого 750 руб.
В качестве RGB-матрицы использовалась GTM2088 — с общим анодом, схема расположения выводов представлена ниже
Принципиальная схема RGB-ночника:
Вот как это выглядело после пайки (4 блока):
- матрица;
- сдвиговые регистры;
- Arduino и датчики hc-sr04;
- блок питания.
Разработка скетча. При разработке скетча задал следующие параметры:
— расстояние 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); }
Сборка лампы
Из подставки плафона удаляем патрон и делаем отверстие, чтобы прошла матрица
.
Вставляем блок сдвиговых регистров и закрываем, вырезанным из пенопласта кругом.
Обрезаем «резьбу» плафона, чтобы он зацепился за подставку
Далее добавляем подставку из полиэтиленовой трубы диаметром 100 с тремя отверстиями под датчики расстояния
и дно из пенопласта
получается в сборе так
Теперь остается только его только украсить и можно пользоваться
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
Плата Arduino | Arduino Nano 3.0 | 1 | ||||
Сдвиговый регистр | CD74HC595 | 4 | ||||
Ультразвуковой датчик расстояния | HC-SR04 | 3 | ||||
8×8 RGB-матрица | 1 | |||||
Резистор | 220 Ом | 24 | ||||