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

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


Реклама ⓘ

Аудио спектроанализатор на RGB-ленте WS2812

Имелась в наличии светодиодная лента на базе управляемых RGB светодиодов WS2812 (5м 150 светодиодов), оставшаяся от проекта  Аргентина - Ямайка (5:0) (табло результатов ЧМ 2014 по футболу для пивбара). Пока не используется и решил сделать аудио спектроанализатор на Arduino и MSGEQ7 с визуализацией на этой ленте. MSGEQ7 - 7-ми полосный фильтр для графического эквалайзера. Данный 8-ми выводной чип способен из входного аудиосигнала выделить частотные полосы 63Гц, 160Гц, 400Гц, 1кГц, 2.5кГц, 6.25кГц и 16кГц:

На сайте есть проекты использования микросхемы MSGEQ7, например здесь, где рассмотрена работа MSGEQ7 в связке с Arduino. Так что задача - реализовать красивый вывод данных.

Доска 10x15 

Доска 10x15 LED

В качестве контроллера используем CraftDuino от российского "Robocraft". Это по сути Arduino Duemilanove. 

Схема следующая

Принципиальная схема

И плата. Плата вставлена в CraftDuino как шилд,

Печатная плата

Учтены ошибки проекта Аргентина - Ямайка 5:0 , приведшие к сгоранию светодиодов. Перед подключением ленты к источнику тока необходимо добавить конденсатор (1000 μF, 6.3 В или выше). Это предотвратит секции от начального всплеска тока. Кроме того желательно добавить резистор от 300 до 500 Ом резистор между выводом Arduino и вводом данных на первом диоде для предотвращения всплесков напряжения, которые могут повредить первую секцию ленты. 

В качестве блока питания используется блок питания компьютера.

Теперь написание скетча.

Вывод осуществляем на прямоугольник 9x14. Разделяем спектр на 7 полос и выводим на 14 столбцов (2 на полосу) разными цветами. Цвета хранятся в массиве colors[14][3]. Кроме того делаем круговое смещение (движение) цветов по горизонтали. Используется Arduino библиотека Adafruit_NeoPixel.

#include "Adafruit_NeoPixel.h"
#define PIN 6

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(150, PIN, NEO_GRB + NEO_KHZ800);

#define MAX_X 10
#define MAX_Y 15

byte maska[135]={
   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
   0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,
   0,1,1,0,0,0,0,1,0,0,0,0,1,1,1,
   0,1,1,0,0,0,1,1,1,0,0,1,1,1,1,
   0,1,1,0,1,1,1,1,1,0,0,1,1,1,1,
   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
   };
int colors[14][3]={{0,150,0},{0,255,0},
                   {100,255,0},{255,255,0},
                   {150,0,0},{255,0,0},
                   {255,0,100},{255,0,255},
                   {150,0,255},{0,0,255},
                   {0,0,150},{0,150,255},
                   {0,255,255},{0,255,100}
                   };
int offcolor=0;
unsigned long millis1=0;
// плохие светодиоды
int badleds[]={0,1,15,30};


//
#define msg7RESET 11
#define msg7Strobe 12
#define msg7DCout 0

int arr1[7]={0,0,0,0,0,0,0};


void setup() {
  Serial.begin(9600);
  pinMode(msg7RESET, OUTPUT);
  pinMode(msg7Strobe, OUTPUT);
  strip.begin();
  for(int i=0;i<135;i++)
    {
    correctstrip(i,0,0,0);
    }
  strip.show();
  Serial.println("oksetup");
  }

void loop() {
    digitalWrite(msg7RESET, HIGH);   // осуществляем сброс MSGEQ7
    delay(5);
    digitalWrite(msg7RESET, LOW);
 
    for (int x = 0; x < 7; x++){             // семь частот - семь стробирующих импульсов
        digitalWrite(msg7Strobe, LOW);
        delayMicroseconds(35);           // ждем установления значения 35 мкс
        int spectrumRead = analogRead(A0);      // считываем значение с аналогового входа
 
        int PWMvalue = map(spectrumRead, 0, 1024, 0, 255);  // преобразовываем диапазон 0-1024 к диапазону 0-255 для ШИМ
        setVals(x,PWMvalue);
        arr1[x]=spectrumRead;
         digitalWrite(msg7Strobe, HIGH);
    }
    for(int i=0;i<7;i++)
      {Serial.print(" ");Serial.print(arr1[i]);}
    Serial.println();

  strip.show();
  if(millis()-millis1>1000)
    {millis1=millis();offcolor=(offcolor+1)%7;
    }  
}
///// 
//удалить испорченные
void correctstrip(int place,int color1,int color2,int color3)
  {
  int offset=0;
  for(int i=0;i=j*28)
       {
       correctstrip((9-j)*15+i*2+1,colors[((i+offcolor)%7)*2][0],colors[((i+offcolor)%7)*2][1],colors[((i+offcolor)%7)*2][2]);
       correctstrip((9-j)*15+i*2+2,colors[((i+offcolor)%7)*2+1][0],colors[((i+offcolor)%7)*2+1][1],colors[((i+offcolor)%7)*2+1][2]); 
       }
    else
      {
      correctstrip((9-j)*15+i*2+1,0,0,0);      
      correctstrip((9-j)*15+i*2+2,0,0,0);      
      }  
    }  
  }

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
МикросхемаMSGEQ71 Поиск в магазине ОтронВ блокнот
Плата ArduinoCraftDuino (Duemomilanove)1 Поиск в магазине ОтронВ блокнот
RGB-лентаWS28121 10x15Поиск в магазине ОтронВ блокнот
C1, C2, C4 Конденсатор0.1 мкФ3 Поиск в магазине ОтронВ блокнот
C5 Конденсатор39 пФ1 Поиск в магазине ОтронВ блокнот
Конденсатор6.3 В 1000 мкФ1 Поиск в магазине ОтронВ блокнот
R1 Резистор
200 кОм
1 Поиск в магазине ОтронВ блокнот
R2, R3 Резистор
22 кОм
2 Поиск в магазине ОтронВ блокнот
R4 Резистор
300 Ом
1 Поиск в магазине ОтронВ блокнот
Блок питания400 Вт1 ATXПоиск в магазине ОтронВ блокнот
Добавить все

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

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

Теги:

Опубликована: 0 0
Я собрал 0 1
x

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

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

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

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

0
RGB #
Я думаю первый светик всё таки от статики выходит из строя.
Ответить
0

[Автор]
victoruni #
Возможно и так, но пока после добавления резистора 300 Ом все нормально, а будущее покажет
Ответить
0
Nem0 #
Что-то как-то не очень..
Мне кажется одноцветный был бы лучше, чем эта ёлочная гирлянда
Ответить
0

[Автор]
victoruni #
Здесь установить одинаковые цвета - и будет одноцветным
int colors[14][3]={{0,150,0},{0,255,0},
{100,255,0},{255,255,0},
{150,0,0},{255,0,0},
{255,0,100},{255,0,255},
{150,0,255},{0,0,255},
{0,0,150},{0,150,255},
{0,255,255},{0,255,100}
};
Ответить
0
Nem0 #
Можно программно. Но дешевле было бы просто купить одноцветную ленту чем RGB
Ответить
+1
Халил #
Почему как елочная гирлянда? Все даже нормально. Единственный недостаток: не разделен по каналам и спектр вперемешку. А так, хорошо.
Ответить
0
Nem0 #
Моргать разными огнями - это функция гирлянды. Спектр анализатор же должен просто отображать уровень по частотам.
Ответить
0
kliff #
Если вместо аудиоджека использовать микрофон? Будет ли работать схема без изменений?
Ответить
0

[Автор]
victoruni #
Не пробовал, но думаю, да
Ответить
0
Сергей #
Подскажите, как правильно подключить ленту, она идет с 5-ю проводами, у вас на схеме 3. И конденсатор 1000мкФ, поставить между линией 5в (к ленте) и землей?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
Мультиметр Mastech MS8268 UNI-T UT-61A
вверх