音乐狂魔妖娆花
本帖最后由 WEIHONGYU 于 2018-7-13 17:53 编辑近几个月来,抖音风靡全国,最魔性的就是妖娆花了,妖娆花的原型长这样:
于是,我也买了一个妖娆花来更紧时尚潮流。
欣赏了它妖娆风骚的表演
http://player.youku.com/player.php/sid/XMzUwMjMzOTQ1Ng==/v.swf
然而,拆机小能手并不能满足只是看着它表演,于是,我把它拆了
http://player.youku.com/player.php/sid/XMzcyMDgxNjYyMA==/v.swf
恩~~~的确很魔性
但我拆了以后发现,原理很简单,mp3芯片,里面烧录了很多首歌曲,扭动装置也就是一个通电的电机,完全没有技术含量所言。
于是,我想进行改造。
【目标】
随音乐的频率大小进行扭动,有扭动速度的变化过程。
........................................
........................................micro:bit版本分割线
.............................................................................
【材料】
序号名称 数量 图片
1micro:bit 1
2电机扩展板 1
3声音模拟传感器 1
4电机 1
5LED灯带1
6电池盒 1
7 microUSB连接线 1
【编写程序】
step1
利用声音模拟传感器获得不同的数值,并按区间分开分别赋予变量数字
将声音模拟传感器连接电机扩展板上的P0管脚,对着声音模拟传感器放声音,观察micro:bit显示屏上的数字变化。
step2:
连接电机到电机扩展板的M2口,烧录程序,观察电机转速
如果调试无误,应该可以观察到,当有声音的时候,电机转速会增加,显示屏上的数字也会变化,当声音频率增加时,电机转速增加,显示屏上的数字值增加。
这样,就基础的完成了声音传感器控制电机转速的目标
step3
增加灯光效果,想达到随着声音频率的增加,灯带亮灯速度增加。灯带连接p2引脚
通过改变亮灯的延迟时间,来控制亮灯的速度
【内部结构】
【实物效果】%5Bflash%5Dhttp://player.youku.com/player.php/sid/XMzcyMDgxNzE3Ng==/v.swf
--------------------------------
---------------------------------Arduino版本分割线
----------------------------------
音乐狂魔妖娆花也可以用arduino来实现
【所需材料】
序号名称 数量 图片
1 Romeo 1
2 MP3 1
3喇叭 1
4 频谱分析器 1
5声音模拟传感器 1
6 电机 1
7 电源 1
8 按钮 1
【内部结构图】
【代码】
#include <AudioAnalyzer.h>
#include <SoftwareSerial.h>
#include <Romeo_m.h>
#include <math.h>
#include <Adafruit_NeoPixel.h>
#define PIN 12
#define LED_COUNT 7
SoftwareSerial mySerial(10, 11);
int ledPin = 12;
Adafruit_NeoPixel leds = Adafruit_NeoPixel(LED_COUNT, PIN, NEO_GRB + NEO_KHZ800);
unsigned char order = {0xAA, 0x06, 0x00, 0xB0};
unsigned char stopmusic = {0xAA, 0x10, 0x00, 0xBA};
int E1 = 5;
int M1 = 4;
unsigned char pre = {0xAA, 0x05, 0x00, 0xAF};
Analyzer Audio = Analyzer(8, 7, 5);
int FreqVal;
int test;
int test1;
void setup() {
pinMode(ledPin, OUTPUT);
mySerial.begin(9600);
Serial.begin(115200);
leds.begin();
clearLEDs();
leds.show();
Audio.Init();
volume(0x1E);//音量设置0x00-0x1E
attachInterrupt(0, turn, RISING);
}
void loop() {
mySerial.write(order, 4);
analogWrite (E1, 150);
digitalWrite(M1, HIGH);
delay(30000);
}
void M(int a)
{
analogWrite (E1, 50 * a); //PWM调速
digitalWrite(M1, HIGH);
delay(1000);
}
void play(unsigned char Track)
{
unsigned char play = {0xAA, 0x07, 0x02, 0x00, Track, Track + 0xB3};
mySerial.write(play, 6);
}
void volume( unsigned char vol)
{
unsigned char volume = {0xAA, 0x13, 0x01, vol, vol + 0xBE};
mySerial.write(volume, 5);
}
void turn ()
{
mySerial.write(stopmusic, 4);
while (1)
{
Audio.ReadFreq(FreqVal);//返回7个带通滤波器过滤出的的7个对应值
test1 = max((FreqVal - 250), 0);
Serial.print("test");
test = test1 - 50;
Serial.print(test);
int flag;
if (test < 100)
{
flag = 1;
}
else if (test < 200)
{
flag = 2;
}
else if (test < 300)
{
flag = 3;
}
else if (test < 400)
{
flag = 4;
}
else
flag = 5;
M(flag);
rainbow(flag);
}
}
void rainbow(int k)
{ int i, j;
int h;
i = random (7) ;
j = random(1, 7);
h = 600 / k;
leds.setPixelColor(i , rainbowOrder(j));
delay(h);
leds.show();
clearLEDs();
}
uint32_t rainbowOrder(byte position)
{
if (position < 2)
{
return leds.Color(0xFF, position * 8, 0);
}
else if (position < 3)
{
return leds.Color(0xFF - position * 8, 0xFF, 0);
}
else if (position < 4)
{
return leds.Color(0, 0xFF, position * 8);
}
else if (position < 5)
{
return leds.Color(0, 0xFF - position * 8, 0xFF);
}
else if (position < 6)
{
return leds.Color(position * 8, 0, 0xFF);
}
else
{
return leds.Color(0xFF, 0x00, 0xFF - position * 8);
}
}
void clearLEDs()
{
for (int i = 0; i < LED_COUNT; i++)
{
leds.setPixelColor(i, 0);
}
}
6666666666 赞》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》 6666666666666666666666666666666666666666666666666666666666666666666666666666666666666 :Q{:5_125:} 会折腾 折腾的好 好玩是最要紧的! 越折腾,技术越高{:5_140:} 哈哈, 妹纸的一脸不屑。。。看来已经看透了一切。。。
页:
[1]