52195浏览
查看: 52195|回复: 69

[项目] #情人节#--像素范 , 蓝牙播放器

  [复制链接]
  像素范,蓝牙播放器。比心
  #情人节#--像素范 , 蓝牙播放器图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


Mingming.Zhang  初级技匠
 楼主|

发表于 2018-6-12 09:29:24

EricLinRW 发表于 2018-6-12 09:27
楼主,arduino上的接线有点乱看不太清楚能不能讲下arduino上的线怎么接啊谢谢 ...

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);一一对应就好  文章里有这句的
回复

使用道具 举报

EricLinRW  学徒

发表于 2018-6-12 16:09:50

Mingming.Zhang 发表于 2018-6-12 09:29
rgb matrix点阵屏的接口有16根接线(R1.G1.B1  R2.G2.B2  A.B.C  CLK LAT OE  4个GND),
  Arduino mega2 ...

还有 既然蓝牙模块是直接连接手机播放音乐的 那怎么让音乐的频谱 直接显示在点阵屏上?因为我觉得arduino和蓝牙模块没有连在一起,不知是否正确?感谢楼主!
回复

使用道具 举报

Mingming.Zhang  初级技匠
 楼主|

发表于 2018-1-28 14:10:52

xyywo 发表于 2018-1-27 20:39
大神能做为时钟显示吗?能不能做呼吸灯显示?

1、时钟显示可以的(毕竟mega2560 那么多io口,加个简单的时钟模块  就可以显示了);
2、呼吸灯也是可以的(调整一下rgb的每个颜色占比的程度,就可以实现明暗变幻的效果)。
回复

使用道具 举报

pATAq  版主

发表于 2018-1-25 11:10:04

大赞!我也想弄这个来着,学习了
回复

使用道具 举报

kinghui  学徒

发表于 2018-1-26 11:05:47

非常好
回复

使用道具 举报

Mingming.Zhang  初级技匠
 楼主|

发表于 2018-1-26 11:56:08

本帖最后由 Mingming.Zhang 于 2018-5-22 17:42 编辑
pATAq 发表于 2018-1-25 11:10
大赞!我也想弄这个来着,学习了

因为时间有限,这个不是最终形态。
回复

使用道具 举报

Mingming.Zhang  初级技匠
 楼主|

发表于 2018-1-26 11:56:34


感谢 支持:D
回复

使用道具 举报

三体×三  见习技师

发表于 2018-1-26 13:00:54

厉害厉害
回复

使用道具 举报

pATAq  版主

发表于 2018-1-26 20:38:34

Mingming.Zhang 发表于 2018-1-26 11:56
因为时间有限,这个不是最终形态。

很期待
回复

使用道具 举报

xyywo  学徒

发表于 2018-1-27 20:39:30

大神能做为时钟显示吗?能不能做呼吸灯显示?
回复

使用道具 举报

flyme  中级技师

发表于 2018-1-29 12:45:24

大佬,能否提供 快速傅里叶 的头文件??
回复

使用道具 举报

Mingming.Zhang  初级技匠
 楼主|

发表于 2018-1-29 16:35:29

flyme 发表于 2018-1-29 12:45
大佬,能否提供 快速傅里叶 的头文件??

FFT3 头文件压缩包,只支持arduinoide1.6.12版本。

ArduinoFFT3.zip

28.76 KB, 阅读权限: 10, 下载次数: 27

售价: 30 创造力  [记录]

回复

使用道具 举报

flyme  中级技师

发表于 2018-1-29 20:05:04

Mingming.Zhang 发表于 2018-1-29 16:35
FFT3 头文件压缩包,只支持arduinoide1.6.12版本。

好的,谢了:)
回复

使用道具 举报

flyme  中级技师

发表于 2018-1-30 13:32:53

你好,库文件无法加载,第一次遇到这种情况
截图201801301332198745.png
回复

使用道具 举报

dbc0301  高级技匠

发表于 2018-1-31 08:36:36

用金属网格真没想到(因为容易落灰),不过这个做的还真不错。
回复

使用道具 举报

dbc0301  高级技匠

发表于 2018-1-31 08:50:24

等待楼主做出动画效果。:lol
回复

使用道具 举报

Mingming.Zhang  初级技匠
 楼主|

发表于 2018-1-31 10:55:01

dbc0301 发表于 2018-1-31 08:50
等待楼主做出动画效果。

你说的确实是的,我考虑用电脑机箱的金属滤网做结构(里面一层薄海绵防尘土)。加入像素画、hifi音质。
回复

使用道具 举报

Mingming.Zhang  初级技匠
 楼主|

发表于 2018-1-31 11:05:31

flyme 发表于 2018-1-30 13:32
你好,库文件无法加载,第一次遇到这种情况

#情人节#--像素范 , 蓝牙播放器图1
为什么 我的可以 你看上图  fft的库
回复

使用道具 举报

flyme  中级技师

发表于 2018-1-31 18:10:14

Mingming.Zhang 发表于 2018-1-31 11:05
为什么 我的可以 你看上图  fft的库

楼主,问题已经解决,FFT文件夹需要手动放到那个library里面,不能直接添加ZIP:))
回复

使用道具 举报

山舟2018  学徒

发表于 2018-2-1 09:40:32

楼主,这个能否让他显示视频,比如我们通常拍摄的视频???
回复

使用道具 举报

Mingming.Zhang  初级技匠
 楼主|

发表于 2018-2-1 10:23:44

山舟2018 发表于 2018-2-1 09:40
楼主,这个能否让他显示视频,比如我们通常拍摄的视频???

也可以,你可以选用一个全彩的显示屏(分辨率大点比如320*240、1920*1080等等)。这个是点阵 像素只有32*16.
回复

使用道具 举报

三体×三  见习技师

发表于 2018-2-9 14:04:17

哇,猴赛雷
回复

使用道具 举报

1234下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail