开源智能彩虹音乐触摸灯/zh

来自Microduino Wikipedia
Radiumray9@gmail.com讨论 | 贡献2016年3月9日 (三) 01:50的版本 概述
跳转至: 导航搜索
Language English

概述

  • 项目名称:开源智能彩虹音乐触摸灯
  • 目的:当有人触摸时,相应的彩灯亮并产生一个音符
  • 难度:中
  • 耗时:2小时
  • 制作者:ray

简介: 本次教程我们将使用Microduino产品模块快速搭建一个智能彩虹音乐触摸灯, 该系统通过触摸按键探测表面是否有人触摸。当有人触摸时,就会有对应位置的彩灯亮并产生一个对应的音符。

Microduino 1.JPG

材料清单

  • Microduino设备
模块 数量 功能
Microduino-Cube-S1/zh 1 扩展板
Microduino-Core+/zh 1 核心板
Microduino-USBTTL/zh 1 下载程序
Microduino-BT/zh 1 蓝牙模块
Microduino-Audio/zh 1 音频播放
Microduino-Amplifier/zh 1 功率放大
Microduino-Sensorhub/zh 1 与传感器相连
Microduino-TOUCH/zh 7 触摸传感器
  • 其他设备
模块 数量 功能
Micro-USB线 1 下载程序,供电
喇叭 1 发声
螺丝 5 固定模块
彩灯带 1
外壳 1

实验原理

开源智能彩虹音乐触摸灯主要分为触摸检测与音频播放控制两个部分。按键检测部分采用按键触摸传感器Microduino-TOUCH,能够检测是否有人触摸。控制部分主要为声光控制,发光部件采用14个彩灯为一的彩灯带,能让彩虹灯呈现美轮美奂的颜色;音频部分通过Microduino-Aduio模块管理音频文件,Microduino-Amplifier功率放大模块驱动1个喇叭发出动听的声音。

Microduino 2.JPG

整体系统的控制原理即接入以上两个部分,Microduino-Core+核心通过触摸传感器探测到有人触摸后,系统控制彩灯带对应的灯产生颜色,Auido模块将产生一个对应的音符,从而实现彩虹触摸灯的效果。

  • 主要传感器

Microduino-TOUCH/zh是电容式触摸检测传感器模块。

电容特性为充放电时间短、通交流阻直流。触摸传感器的回路电流为直流电,所以触摸传感器两端在通电后相当于开路,触摸传感器两端为高电平。人体组织和体液都可以导电,人体接触电容两端之后,触摸传感器两端变成低电平。人体结束和触摸传感器的接触后,电容暂瞬间开始充电,达到电容的额定容量之后,电容两端相当于开路,触摸传感器两端又变成高电平。触摸传感器通过两端电压的变化判断是否有触摸。

文档

触摸灯代码:【触摸灯代码下载

触摸灯代码github:BluButterflyLight

Android客户端:

注意:新版BT是蓝牙4.0,需要Android 4.3以上的系统才能支持。这里只提供Android的APP。

手机APP和测试程序:[1]

调试过程

  • 下载程序

将Microduino-Core+与Microduino-USBTTL叠加(无上下顺序),通过USB数据与电脑连接起来。

Download1.jpg

打开BluButterflyLight.ino文件

Dl1.jpg

在工具->板那里选择Microduino-Core+(644pa)。在处理器选项里面选择处理器(Atmega644pa@16M,5V),在端口选项里面选择正确的端口号,然后直接烧录程序。

使用USB数据线将Microduino-Audio模块与电脑连接。 连接成功能显示出一个名为Microduino Audio的CD驱动器

Dl5.jpg

打开CD驱动器后以管理员权限执行音乐更新软件Music Update tool,选择“音频加载”选项

Dl6.jpg

点击“浏览”,选择“keytones”文件夹中的音频文件,将音频文件添加到软件中

在”更新下载”选项中选择“更新”,更新完成后,音频文件就已写入flash中

Dl8.jpg

组装

拼装时首先将Microduino-Duo-S1板用尼龙螺柱固定在底板上面。

Microduino 3.jpg

之后将Core+(在最下),BT,Audio,Amplifier,Sensorhub(在最上)按顺序叠加起来,之后加在Microduino-Duo-S1底板上

Microduino 4.jpg

将喇叭连接到Amplifier的接口上(没有左右顺序区别)

Microduino 5.jpg

之后将触摸传感器和彩灯带与Hub连接,按如图所示位置

Microduino 6.JPG

彩灯带有线的头方向放在靠底板那边,触摸传感器按照上面图和下面图顺序依次放好

Microduino-7.jpg

喇叭的固定座放在喇叭上

然后将固定座和喇叭一起连接到外壳

Microduino-9.jpg

之后把内部结构拼好

Microduino-10.jpg

最后把侧面也装上

Microduino-11.jpg

这样彩虹灯外形拼好了。然后用USB数据线将电脑和彩虹触摸灯连接上,用手触摸彩虹灯上面,就会产生一个音符并在对应位置LED灯亮。

Microduino-12.jpg

程序说明

  • 蓝牙部分
void ble() {
    if (my_Serial.available() > 0) {        //如果有蓝牙发送的信息  
      currentInfo = my_Serial.readStringUntil('\n');      //读取信息
      Serial.println(currentInfo);        

      if(currentInfo=="ERROR") {
        return;
      } else if (currentInfo.startsWith("Connected")) {       //成功读取则进行下一步
        bleEnable=true;
      } else if (currentInfo.startsWith("Disconnected")) {
        bleEnable=false;
      } 

      if(!bleEnable) {              //不成功读取则结束
        return;
      }

      if (currentInfo.startsWith("do")) {              //接收到的不同命令
        audio_play(1, 5, 500);
        led_off(1, 5); 
      }else if (currentInfo.startsWith("re")) {
        audio_play(2, 5, 500);
        led_off(2, 5); 
      }else if (currentInfo.startsWith("mi")) {
        audio_play(3, 5, 500);
        led_off(3, 5); 
      }else if (currentInfo.startsWith("fa")) {
        audio_play(4, 5, 500);
        led_off(4, 5); 
      }else if (currentInfo.startsWith("so")) {
        audio_play(5, 5, 500);
        led_off(5, 5); 
      }else if (currentInfo.startsWith("la")) {
        audio_play(6, 5, 500);
        led_off(6, 5); 
      }else if (currentInfo.startsWith("si")) {
        audio_play(7, 5, 500);
        led_off(7, 5); 
      } else if (currentInfo.startsWith("xxx")) {
          for(int a=0;a<42;a++) {
            audio_play(songs[0][a*2], 5, songs[0][a*2+1]);
            led_off(songs[0][a*2],5);  
          }
      } else if (currentInfo.startsWith("lzlh")) {
          for(int a=0;a<42;a++) {
            audio_play(songs[1][a*2], 5, songs[1][a*2+1]);
            led_off(songs[1][a*2],5);  
          }
      }else if (currentInfo.startsWith("apple")) {
          for(int a=0;a<42;a++) {
            audio_play(songs[2][a*2], 5, songs[2][a*2+1]);
            led_off(songs[2][a*2],5);  
          }
      }

  }
}

视频