Главная » Arduino
Призовой фонд
на октябрь 2021 г.
1. Рюкзак Mean Well
Компэл
2. Инвертор авто Mean Well 150 Ватт
Компэл
3. Термос MeanWell
Компэл
4. 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
Сатфайндер Набор начинающего радиолюбителя
вверх