查看: 1019|回复: 8

音乐狂魔妖娆花

[复制链接]
本帖最后由 WEIHONGYU 于 2018-7-13 17:53 编辑

近几个月来,抖音风靡全国,最魔性的就是妖娆花了,妖娆花的原型长这样:
截图201807131138486234.png


于是,我也买了一个妖娆花来更紧时尚潮流。
欣赏了它妖娆风骚的表演

然而,拆机小能手并不能满足只是看着它表演,于是,我把它拆了

恩~~~的确很魔性
但我拆了以后发现,原理很简单,mp3芯片,里面烧录了很多首歌曲,扭动装置也就是一个通电的电机,完全没有技术含量所言。
于是,我想进行改造。
【目标】
   随音乐的频率大小进行扭动,有扭动速度的变化过程。


........................................
........................................micro:bit版本分割线

.............................................................................
【材料】




序号名称 数量 图片
1micro:bit 1 截图201807131339508921.png
2电机扩展板 1 截图201807131338397156.png
3声音模拟传感器 1 截图201807111020453295.png
4电机 1 截图201807131342092454.png
5LED灯带1 截图201807131343221985.png
6电池盒 1 截图201807131400329780.png
7 microUSB连接线 1 截图201807131344385469.png




【编写程序】
step1
利用声音模拟传感器获得不同的数值,并按区间分开分别赋予变量数字
截图201807131348231056.png
将声音模拟传感器连接电机扩展板上的P0管脚,对着声音模拟传感器放声音,观察micro:bit显示屏上的数字变化。
step2:
连接电机到电机扩展板的M2口,烧录程序,观察电机转速
截图201807131352428937.png
如果调试无误,应该可以观察到,当有声音的时候,电机转速会增加,显示屏上的数字也会变化,当声音频率增加时,电机转速增加,显示屏上的数字值增加。
这样,就基础的完成了声音传感器控制电机转速的目标
step3
增加灯光效果,想达到随着声音频率的增加,灯带亮灯速度增加。灯带连接p2引脚
截图201807131356208586.png
通过改变亮灯的延迟时间,来控制亮灯的速度
【内部结构】


截图201807131401553809.png

【实物效果】[flash]%5Bflash%5D[/flash][/flash]






--------------------------------
---------------------------------Arduino版本分割线
----------------------------------
音乐狂魔妖娆花也可以用arduino来实现
【所需材料】



序号名称 数量 图片
1 Romeo 1 截图201807131745044060.png
2 MP3 1 截图201807111004501800.png
3喇叭 1 截图201807131746409837.png
4 频谱分析器 1 截图201807111019422719.png
5声音模拟传感器 1
6 电机 1 截图201807111021482247.png
7 电源 1 截图201807130941214052.png
8 按钮 1 截图201807131750004755.png






【内部结构图】
12353679769615155.jpg


【代码】
#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[4] = {0xAA, 0x06, 0x00, 0xB0};
unsigned char stopmusic[4] = {0xAA, 0x10, 0x00, 0xBA};
int E1 = 5;
int M1 = 4;
unsigned char pre[4] = {0xAA, 0x05, 0x00, 0xAF};
Analyzer Audio = Analyzer(8, 7, 5);
int FreqVal[7];
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[6] = {0xAA, 0x07, 0x02, 0x00, Track, Track + 0xB3};
  mySerial.write(play, 6);
}
void volume( unsigned char vol)
{
  unsigned char volume[5] = {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[3] - 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);
  }
}












chinazmde  中级技师

发表于 2018-7-17 14:58:14

6666666666
回复 支持 反对

使用道具 举报

gray6666  中级技匠

发表于 2018-7-17 15:56:05

赞》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
回复 支持 反对

使用道具 举报

喜羊羊  初级技师

发表于 2018-7-17 17:51:58

6666666666666666666666666666666666666666666666666666666666666666666666666666666666666
回复 支持 反对

使用道具 举报

dt  初级技师

发表于 2018-7-18 09:17:40

会折腾 折腾的好
回复 支持 反对

使用道具 举报

digi_cow  初级技匠

发表于 2018-7-19 10:00:44

好玩是最要紧的!
回复 支持 反对

使用道具 举报

安卓机器人  初级技神

发表于 2018-7-19 15:00:37

越折腾,技术越高
回复 支持 反对

使用道具 举报

yoyojacky  初级技匠

发表于 2018-7-26 12:09:40

哈哈, 妹纸的一脸不屑。。。看来已经看透了一切。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
关于楼主

楼主的其它帖子

上海智位机器人股份有限公司 沪ICP备09038501号-4

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

mail