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

RGB-ночник, с возможностью управления цветом ночника с помощью движения рук. С помощью 3-х датчиков расстояния будем изменять яркость каждой из 3-х составляющих 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 с тремя отверстиями под датчики расстояния

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

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

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

    Список радиоэлементовОбозначение
    Тип
    Номинал
    Количество
    ПримечаниеМагазинМой блокнот

    Плата ArduinoArduino Nano 3.01

    Сдвиговый регистрCD74HC5954

    Ультразвуковой датчик расстоянияHC-SR043

    8×8 RGB-матрица1

    Резистор220 Ом24
    Добавить все

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

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

    Добавить комментарий

    Ваш адрес email не будет опубликован.