Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

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-SR043 Поиск в магазине ОтронВ блокнот
8x8 RGB-матрица1 Поиск в магазине ОтронВ блокнот
Резистор
220 Ом
24 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

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

Теги:

Опубликована: Изменена: 26.02.2016 0 0
Я собрал 0 Участие в конкурсе 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 1 чел.

Комментарии (10) | Я собрал (0) | Подписаться

0
Lazertok #
На видео он довольно резко мерцает при изменении цвета. Можно это сделать плавнее, без мерцания?
Ещё можно ввести функционал плавного перебора цветов автоматом. Ну и вообще супер... цветомузыка по реакции на звук...
Ответить
0

[Автор]
victoruni #
Я использовал для изменения расстояние 1(max)-20 см(0), можно увеличить это расстояние - станет более плавно, датчики HC-SR04 дают большую погрешность (заменить на инфракрасные sharp - будет лучше). Я делал для садовой беседки - устраивает такой вариант.
Автоперебор и фигуры разноцветные планирую для другого проекта - RGB-матрицу уже купил.
Ответить
0
вова #
И что, все время руку около ночника держать, чтобы светил?
Ответить
0

[Автор]
victoruni #
Посмотрите на видео: когда рука быстро уходит вверх - позиция остается - это момент перехода из расстояния 1-20 см в зону невидимости для датчика.
Ответить
0
Игнат #
А что бы подключить RGB-светодиод 1 Ватт, программный код остается прежним?
Ответить
0

[Автор]
victoruni #
В программе на каждый цвет - своя микросхема 74hc595 + отдельная на аноды. Если подключить каждый цвет светодиода и анод к отдельной микросхеме - то да. Но это конечно самый неэкономный вариант. Проще переделать функцию void showDisplay()
Ответить
0
Игорь #
А скинуть для DipTrace можешь свою микросхему?
Ответить
0

[Автор]
victoruni #
Я не рисовал для DipTrace - у меня все было спаяно проводками. Сейчас думаю заняться этим, как будет готово выложу.
Ответить
0
Altivex #
А можете добавить библиотеки ещё?
Вроде я нашел ультрасоник, но даже с правками он не хочет нормально работать на ide 1.6
Вылезает ошибка:
MsTimer2::set(1, showDisplay); //
In function 'void setup()':

rgb_matrix01:35: error: 'showDisplay' was not declared in this scope

exit status 1
'showDisplay' was not declared in this scope
И если я правильно понимаю - шоудисплей действительно нигде не определена.
Ответить
0
Аян #
А почему нельзя было просто подключить светодиоды к ШИМу, задать такт и пускай мигает с плавным переходом, для чего надо было использовать сдвиговые регистры?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Raspberry Pi 2
Raspberry Pi 2
Набор 4WD Kit Bluetooth Ручной фен 450 Вт с регулировкой температуры
вверх