偶然心血来潮,想要做一个声音可视化的系列专题。这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,逐步积累些有用的音乐频谱可视化的资料,也会争取成型一些实用好玩的音乐可视器项目。这回在网上采购了50米的光导纤维,想试试作为音乐灯是否可行,不过收到快递时还是吓我一跳,太细太迷你了。
网上搜了一下,光导纤维,或称光学纤维(英语:Optical fiber),简称光纤,是一种由玻璃或塑料制成的纤维,利用光在这些纤维中以全内反射原理传输的光传导工具。微细的光纤封装在塑料护套中,使得它能够弯曲而不至于断裂。通常光纤的一端的发射设备使用发光二极管或一束镭射将光脉冲发送至光纤中,光纤的另一端的接收设备使用光敏组件检测脉冲。包含光纤的线缆称为光缆。由于信息在光导纤维的传输损失比电在电线传导的损耗低得多,更因为主要生产原料是硅,蕴藏量极大,较易开采,所以价格很便宜,促使光纤被用作长距离的信息传递介质。随着光纤的价格进一步降低,光纤也被用于医疗和娱乐的用途。
光纤主要分为两类,渐变光纤(英语:graded-index fiber)与突变光纤(英语:step-index profile)。前者的折射率是渐变的,而后者的折射率是突变的。另外还分为单模光纤及多模光纤。近年来,又有新的光子晶体光纤问世。
光导纤维是双重构造,纤芯部分是高折射率玻璃,表层部分是低折射率的玻璃或塑料,光在纤芯内传输,并在表层交界处不断进行全反射,沿“之”字形向前传输。这种纤维比头发稍粗,这样细的纤维要有折射率截然不同的双重结构分布,是一个非常惊人的技术。各国科学家经过多年努力,创造了内附着法、MCVD法、VAD法等等,制成了超高纯石英玻璃,特制成的光导纤维传输光的效率明显提升。现在较好的光导纤维,其光传输损失每公里只有零点二分贝;也就是说传播一公里后只损耗4.5%。
声音模块,使用性价比更高的MAX4466声音传感器。
MAX4466模块特点
电源电压:+2.4V至+5.5V(可直接接STM/ARDUNIO/树莓派等开发板)
电源抑制比:112dB
共模抑制比:126dB
AVOL:125dB(RL = 100kΩ) 轨到轨输出
静态电源电流:24μA
增益带宽:600kHz
尺寸:20.8mm x 13.8mm x 7.5mm/0.8 x 0.5 x 0.3inch
该模块在 Vcc 和接地引线上都包含铁氧体,以最大限度地减少电源噪声。如果与 MCU 一起使用,最好使用 2.4V – 5.5V 范围内可用的最安静的电源。在 Arduino 上,这通常是 3.3V 电源。
输出是直流耦合的。当输出信号处于静止状态时,它将位于 Vcc/2。如果 Vcc 为 5V,则输出将为 2.5V。如果输出需要交流耦合,可以在输出引脚和它驱动的电路的输入之间增加一个100uF的电容。
背面的小型单圈电位器可让您将增益从 25x 调整到 125x。逆时针旋转电位器会增加增益,而逆时针旋转会降低增益。
LED使用WS2812B
WS2812B是一种将控制电路和rgb芯片集成在一起的智能控制led光源。5050组件的包装。内部包括智能数字端口数据锁存和信号整形放大驱动电路。还包括精密内部振荡器和12V电压可编程恒流控制部分,有效保证了像素点光色高度一致。数据传输协议采用单NZR通信方式。像素上电复位后,DIN端口接收数据来自控制器,第一个像素收集初始24位数据,然后发送到内部数据锁存器,其他数据由内部信号整形放大电路通过DO端口发送到下一个级联像素进行整形。后对于每个像素的传输,信号要减少24位。像素采用自动整形传输技术,使像素级联数不受信号传输的限制,只取决于信号传输的速度。复位时间>280μs,中断时不会造成误复位,支持较低频率,价格低廉单片机。刷新频率更新到2kHz,画面频率低,高清摄像机无闪烁,提高出色的展示效果。LED具有驱动电压低、环保节能、亮度高、散射角大、一致性好、功率低、寿命长等优点。集成在led上的控制芯片越来越多电路简单,体积小,安装方便。
WS2812B采用四位模块
四位模块电原理图
模块引脚
VCC---这个引脚需要由一个5V-7V的直流电源接入。电压过高(7V)的话会烧毁LED,电压太低(5V)的话则会造成亮度过低,甚至造成LED不工作。
GND---公共引脚,接地,即接电源的负极。
IN---微控制器(或者是另外一个WS2812)的数据从这个引脚传入LED。
OUT---数据从这里输出给下一级的WS2812,如果这个WS2812是最后一级,则可直接悬空此引脚。
头回上手的光导纤维太细了,准备裁剪为10厘米一段,总长50米,算来也会有500段
光导纤维的原理
光纤是圆柱形的介质波导,应用全内反射原理来传导光线。光纤的结构大致分为里面的纤芯部分与外面的包覆部分。为了要局限光信号于纤芯,包层的折射率必须小于纤芯的折射率。渐变光纤(英语:graded-index fiber)的折射率是缓慢改变的,从轴心到包覆,逐渐地减小;而突变光纤(英语:step-index profile)在核心-包覆边界区域的折射率是急剧改变的。图为各种各样的光纤。
光导纤维的二个概念
1、折射率
折射率可以用来计算在物质里的光线速度。在真空里,及外太空,光线的传播速度最快,大约为3亿米/秒。一种物质的折射率是真空光速除以光线在这物质里传播的速度。所以,根据定义,真空折射率是1。折射率越大,光线传播的速度越慢。通常光纤的核心的折射率是1.48,包覆的折射率是1.46。所以,光纤传导信号的速度粗算大约为2亿米/秒。电话信号,经过光纤传导,从纽约到悉尼,大约12000公里距离,会有最低0.06秒时间的延迟。
2、全内反射
镭射的反弹于一根压克力棍内部,显示出光线的全反射。
当移动于密度较高的介质的光线,以大角度入射于核心-包覆边界时,假若这入射角(光线与边界面的法线之间的夹角)的角度大于临界角的角度,则这光线会被完全地反射回去。光纤就是应用这种效应来局限传导光线于核心。在光纤内部传播的光线会被边界反射过来,反射过去。由于光线入射于边界的角度必须大于临界角的角度,只有在某一角度范围内射入光纤的光线,才能够通过整个光纤,不会泄漏损失。这角度范围称为光纤的受光锥角(英语:acceptance cone),是光纤的核心折射率与包覆折射率的差值的函数。
剪裁下来的500根光导纤维
找到二只瓶盖,来做底座
光导纤维的端口要切齐
固定四位LED模块
迷你的光导纤维灯
【花雕动手做】有趣好玩的音乐可视化系列小项目(17)--光导纤维灯
项目程序之一:简单测试的呼吸灯
/*
【花雕动手做】有趣好玩的音乐可视化系列小项目(17)--光导纤维灯
项目程序之一:简单测试的呼吸灯
*/
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define MAX_LED 4
#define ADD true
#define SUB false
int val = 0;
boolean stat = ADD;
Adafruit_NeoPixel strip = Adafruit_NeoPixel( MAX_LED, PIN, NEO_RGB + NEO_KHZ800 );
void setup() {
strip.begin();
strip.show();
}
void loop() {
uint32_t color = strip.Color(val, val, val);
strip.setPixelColor(0, color);
if (val >= 235)
stat = SUB;
if (val <= 0)
stat = ADD;
strip.show();
delay(15);
if (stat == SUB) val --;
else if (stat == ADD) val++;
}
实验场景图 动态图
【花雕动手做】有趣好玩的音乐可视化系列小项目(17)--光导纤维灯
项目程序之二:使用FastLED库的简易流动变色
/*
【花雕动手做】有趣好玩的音乐可视化系列小项目(17)--光导纤维灯
项目程序之二:使用FastLED库的简易流动变色
*/
#include <FastLED.h>
#define LED_PIN 6
#define NUM_LEDS 4
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
for (int i = 0; i <= 3; i++) {
leds[i] = CRGB ( 0, 0, 255);
FastLED.show();
delay(80);
}
for (int i = 3; i >= 0; i--) {
leds[i] = CRGB ( 220, 0, 0);
FastLED.show();
delay(80);
}
for (int i = 0; i <= 3; i++) {
leds[i] = CRGB ( 0, 230, 0);
FastLED.show();
delay(80);
}
for (int i = 3; i >= 0; i--) {
leds[i] = CRGB ( 150, 50, 0);
FastLED.show();
delay(80);
}
}
实验场景图 动态图
【花雕动手做】有趣好玩的音乐可视化系列小项目(17)--光导纤维灯
项目程序之三:光纤音乐反应灯
/*
【花雕动手做】有趣好玩的音乐可视化系列小项目(17)--光导纤维灯
项目程序之三:光纤音乐反应灯
*/
#define FASTLED_INTERRUPT_RETRY_COUNT 0
//#define FASTLED_ESP8266_RAW_PIN_ORDER
#include <FastLED.h>
#define NUM_LEDS 4
CRGB leds[NUM_LEDS];
const int ledPin = 6;
int sensorPin = 7;
boolean val = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(sensorPin, INPUT);
FastLED.addLeds<WS2812B, ledPin, RGB>(leds, NUM_LEDS);
}
void loop () {
val = digitalRead(sensorPin);
Serial.println (val);
if (val == HIGH) {
leds[0] = CRGB(250, 0, 0);
FastLED.show();
delay(8);
leds[1] = CRGB(0, 250, 0);
FastLED.show();
delay(8);
leds[2] = CRGB(0, 0, 250);
FastLED.show();
delay(8);
leds[3] = CRGB(250, 0, 250);
FastLED.show();
delay(8);
}
else {
leds[4] = CRGB(250, 20, 20);
FastLED.show();
}
FastLED.clear();
}
实验的视频记录(1分04秒)
https://v.youku.com/v_show/id_XNTg5NDMxMTIwMA==.html?spm=a2hcb.playlsit.page.1
实验的视频记录(5分23秒)
https://v.youku.com/v_show/id_XNTg5NDMyMDIyNA==.html?spm=a2hcb.playlsit.page.1
实验场景图
三春牛-创客2023.01.25
赞
三春牛-创客2023.01.25
厉害厉害