#情人节#--像素范 , 蓝牙播放器

2017-12-228.5万
精华项目
AI 快速预览详细 收起
这款像素范蓝牙播放器是一款创意表白神器,结合了32x16 RGB LED Matrix点阵屏和DFRduino Mega2560 V3.0控制器。它不仅能够播放音乐,还能通过快速傅里叶变换(FFT)分析音频并在点阵屏上显示音乐频谱。此外,还可以通过取模软件制作自定义的表情图案。这个项目适合DIY爱好者和想要创意表白的人。
  像素范,蓝牙播放器。比心
  #情人节#--像素范 , 蓝牙播放器图1
  当你的男神/女神答应和你愉快的约会,是不是心脏都激动无比。
  然后迷之微笑的开始筹划美好的一天。于是乎想着送个什么了
  像素,我的理解:色彩、颗粒............sony大电影《像素大战》
  喜欢一个人的纯粹、天真
  #情人节#--像素范 , 蓝牙播放器图2
  色彩的第一反应是点阵屏(比如32x16 RGB LED Matrix )
  颗粒、颗粒,不就是乐高颗粒吗?
  #情人节#--像素范 , 蓝牙播放器图13
  除了情人节表白利器,还是个带音乐频谱的蓝牙播放器
  #情人节#--像素范 , 蓝牙播放器图3
准备材料清单:
   .  32x16 RGB LED Matrix 点阵屏
   .  DFRduino Mega2560 V3.0控制器
   .  蓝牙音频模块
   .  无源音箱小喇叭
   .  I2C颜色识别传感器 - TCS34725 (可选)
   .  乐高积木颗粒(40粒左右)
电子部分接线:
  #情人节#--像素范 , 蓝牙播放器图12

  rgb matrix点阵屏的接口有16根接线(R1.G1.B1  R2.G2.B2  A.B.C  CLK LAT OE  4个GND),
  Arduino mega2560(24.25.26  27.28.29  A4.A1.A2  11  A3  9). 蓝牙音频板包括左右声道接2个小喇叭,
  蓝牙音频板还包括音量+、音量-等等功能按钮。可以连接几个4脚按键,最后电源可以自己加入锂电独立供电,也
  可以外部usb和dc直流插头供电(如下图)。
  #情人节#--像素范 , 蓝牙播放器图11
  在你的理解中,一段音乐是什么呢?
  或者说声音是什么,比较直观的就是一堆上下起伏的波(波里面包含很多信息,所以看起来比较杂乱)
  更加形象的理解是:五线谱的乐符
  #情人节#--像素范 , 蓝牙播放器图14
  我们如何分析 形象化的表现音乐了,下面来学习音频的快速傅里叶变换(FFT):
  "你眼中看似落叶纷飞变化无常的世界,实际只是躺在上帝怀中一份早已谱好的乐章“
  #情人节#--像素范 , 蓝牙播放器图8
  抱歉,这不是一句鸡汤文,而是黑板上确凿的公式:傅里叶同学告诉我们,任何周期函数,都可以看作是不同振幅,不同相位正弦波的叠加。在第一个例子里我们可以理解为,利用对不同琴键不同力度,不同时间点的敲击,可以组合出任何一首乐曲。
  而贯穿时域与频域的方法之一,就是传中说的傅里叶分析。傅里叶分析可分为傅里叶级数(Fourier Serie)和傅里叶变换(Fourier Transformation),我们从简单的开始谈起
  #情人节#--像素范 , 蓝牙播放器图7
  音乐播放情景:音乐在32个频域上的幅度显示
  #情人节#--像素范 , 蓝牙播放器图5
  音频.c代码:
  1. #define LOG_OUT 1 // use the log output function
  2. #define FFT_N 256 // FFT采样数:16.32.64.128.256
  3. //#define DEBUG
  4. #include <FFT.h> //快速傅里叶转换头文件声明
  5. #include <Adafruit_GFX.h>   // Core graphics library
  6. #include <RGBmatrixPanel.h> // Hardware-specific library
  7. #define Cycle 3 //因为单次采样会有极大的噪音干扰,故用多次采样取平均值的方法
  8. #define SIZE_WIDTH 32    //rgb显示宽度
  9. //#define MAX_SPECTRUM 32
  10. #define GAIN 2.3
  11. //#define FREQUENCY_INDEX(I) ((I)*3 + 10)
  12. int Spectrum[SIZE_WIDTH];//数组记录多次采样值并在最后取平均数
  13. // Similar to F(), but for PROGMEM string pointers rather than literals
  14. //#define F2(progmem_ptr) (const __FlashStringHelper *)progmem_ptr
  15. #define CLK 11 // MUST be on PORTB! (Use pin 11 on Mega)
  16. #define LAT A3
  17. #define OE  9
  18. #define A   A4
  19. #define B   A1
  20. #define C   A2
  21. RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);
  22. const unsigned char myBitmap [] PROGMEM = {
  23.   // 'Designbolts-Free-Valentine-Heart-Heart, 16x16px
  24.   0x00, 0x00, 0x1c, 0x38, 0x7e, 0x7e, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe,
  25.   0x3f, 0xfc, 0x1f, 0xf8, 0x1f, 0xf8, 0x0f, 0xf0, 0x03, 0xc0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00,
  26. };
  27. void setup() {
  28.    Serial.begin(115200); // use the serial port
  29.    TIMSK0 = 0; // turn off timer0 for lower jitter - delay() and millis() killed
  30.    ADCSRA = 0xe5; // set the adc to free running mode
  31.    ADMUX = 0x40; // use adc0
  32.    DIDR0 = 0x01; // turn off the digital input for adc0
  33.    matrix.begin();
  34. //           matrix.fillScreen(matrix.Color888(0, 150, 255));
  35. //while(true);
  36. }
  37. void loop() {
  38.   int ave;
  39. //  matrix.fillScreen(0);
  40.   for (int m=0;m<SIZE_WIDTH;m++){
  41.     Spectrum[m]=0;
  42.   }
  43.   for (int n=0;n<Cycle;n++){   //n记录采样次数
  44.   //while(1) { // reduces jitter
  45.     for (int i = 0 ; i < 512 ; i += 2) { // save 256 samples
  46.          // cli();  // UDRE interrupt slows this way down on arduino1.0
  47.       while(!(ADCSRA & 0x10)); // wait for adc to be ready
  48.         ADCSRA = 0xf5; // restart adc
  49.         byte m = ADCL; // fetch adc data
  50.         byte j = ADCH;
  51.          int k = (j << 8) | m; // form into an int
  52.          k -= 0x0200; // form into a signed int
  53.          k <<= 6; // form into a 16b signed int
  54.          fft_input<i> = k; // put real data into even bins
  55.          fft_input[i+1] = 0; // set odd bins to 0
  56.        }
  57.             // sei(); // turn interrupts back on
  58.        // window data, then reorder, then run, then take output
  59.        fft_window(); // window the data for better frequency response
  60.        fft_reorder(); // reorder the data before doing the fft
  61.        fft_run(); // process the data in the fft
  62.        fft_mag_log(); // take the output of the fft
  63.       /* for (byte i = 0 ; i < FFT_N/2 ; i++)
  64.        {
  65.           Serial.println(fft_log_out<i>); // <--输出到串口  
  66.        }*/
  67.        //Serial.write(255); // send a start byte
  68.        //Serial.write(fft_log_out, 128); // send out the data
  69.       }
  70.       
  71.       static int times = 0;
  72.         if(times++ == 0){
  73.           times=0;
  74.                 for(int m=0;m<SIZE_WIDTH;m++){
  75.         ave=0;
  76.         for (byte i=m*4;i<(m+1)*4;i++){
  77.           ave+=fft_log_out<i>;
  78.         }
  79.         ave/=4;
  80.         ave/=2;
  81.         Spectrum[m]=ave;
  82.         Spectrum[m]/=Cycle;
  83.         Serial.print(Spectrum[m]);
  84.         Serial.print("-");
  85.         if (m ==15)
  86.         {
  87.           Serial.println("||");
  88.         }
  89.         
  90.           Spectrum[0] = Spectrum[1]-22;
  91.           //Spectrum[1] = Spectrum[1]-7;
  92.           //Spectrum[2] = Spectrum[2]-6;
  93.           //Spectrum[3] = Spectrum[3]-6;
  94.          
  95.          
  96.         int y = Spectrum[m]-8;
  97.         if(y>26)
  98.         y = 15;
  99.         
  100.         /*if(y<=7){
  101.          
  102.            //y = 0;
  103.            matrix.fillScreen(0);
  104.         }*/
  105.         
  106.        matrix.drawLine(m, 0, m, y, matrix.Color888(0, 150, 255));
  107.        matrix.drawLine(m, y+1, m, 15, matrix.Color888(0, 0, 0));
  108.       }
  109.         }
  110.    
  111. }</i></i></i>
复制代码

如何制作表情(图形)?
#情人节#--像素范 , 蓝牙播放器图6
取模软件:

http://javl.github.io/image2cpp/点击进入
选择我们绘制好的图形,更改设置和预览
#情人节#--像素范 , 蓝牙播放器图9
最后设置数据输出格式和绘制模式(水平或者垂直)
#情人节#--像素范 , 蓝牙播放器图10
数据格式一般都是一下:
  1. // 'Designbolts-Free-Valentine-Heart-Heart', 16x16px
  2. const unsigned char myBitmap [] PROGMEM = {
  3. 0xff, 0xff, 0xe3, 0xc7, 0x81, 0x81, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
  4. 0xc0, 0x03, 0xe0, 0x07, 0xe0, 0x07, 0xf0, 0x0f, 0xfc, 0x3f, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff
  5. };
复制代码

表情情景演示:
#情人节#--像素范 , 蓝牙播放器图4
表情.c代码:
  1. #include <Adafruit_GFX.h>
  2. #include <Adafruit_SPITFT.h>
  3. #include <Adafruit_SPITFT_Macros.h>
  4. #include <gfxfont.h>
  5. // testshapes demo for Adafruit RGBmatrixPanel library.
  6. // Demonstrates the drawing abilities of the RGBmatrixPanel library.
  7. // For 16x32 RGB LED matrix:
  8. // <a href="http://www.adafruit.com/products/420" target="_blank">http://www.adafruit.com/products/420</a>
  9. // Written by Limor Fried/Ladyada & Phil Burgess/PaintYourDragon
  10. // for Adafruit Industries.
  11. // BSD license, all text above must be included in any redistribution.
  12. #include <RGBmatrixPanel.h> // Hardware-specific library
  13. #define CLK 11  // MUST be on PORTB! (Use pin 11 on Mega)
  14. #define LAT A4
  15. #define OE  9
  16. #define A   A0
  17. #define B   A1
  18. #define C   A2
  19. RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);
  20. // 'Designbolts-Free-Valentine-Heart-Heart', 16x16px
  21. const unsigned char myBitmap [] PROGMEM = {
  22.   0xff, 0xff, 0xe3, 0xc7, 0x81, 0x81, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
  23.   0xc0, 0x03, 0xe0, 0x07, 0xe0, 0x07, 0xf0, 0x0f, 0xfc, 0x3f, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff
  24. };
  25. void setup() {
  26.   matrix.begin();
  27.   matrix.drawBitmap(0,0,myBitmap,16,16,0xff);
  28.   
  29. }
  30. void loop() {
  31.   // do nothing
  32. }
复制代码

更多玩法...............

加入颜色传感器TCS34725


创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(44)
JOVI
JOVI
学习学习
耘想
耘想
6666666666666
耘想
耘想
66666666666666666666
耘想
耘想
评论内容
耘想
耘想
评论内容
三春牛-创客
三春牛-创客
厉害厉害!
三春牛-创客
三春牛-创客
哇!!!!
我我
我我
大佬,请问用那个音频代码时,验证出错是什么原因呀?那个FFT库,我是在网上找了一个直接放进去的,没用你给的那个(积分不够,下载不了),会不会是这个原因?
RFhonor
RFhonor回复我我
我也遇到了相同的问题,请问你解决了吗?
我我
我我
大佬,新手想请教一下,那个rgb led点阵屏的供电接在什么地方呀?
Mr-k
Mr-k
厉害!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
T2e51sJp
T2e51sJp
楼主 蓝牙音频模块和无源音箱小喇叭是什么型号的呀 求告诉
20060606
20060606
arduino的算力能带动这么大的点阵屏
20060606
20060606
arduino的算力能带动这么大的点阵屏
酒酒樱桃
酒酒樱桃
好棒!
酒酒樱桃
酒酒樱桃
好棒!
chen1xuan
chen1xuan
学习了
DFrJnCdAk8B
DFrJnCdAk8B
这个生活中好多地方都可以用到
小马1
小马1

好漂亮啊应该做一个送给女朋友
陸
好炫呀,好喜欢,支持一下
熹宝快睡觉
熹宝快睡觉
挺好的、挺有创意的,赞赞赞