刷卡音乐盒/zh

来自Microduino Wikipedia
跳转至: 导航搜索

概述

  • 项目名称:Microduino刷卡音乐盒
  • 目的:通过刷带有明暗条纹的卡片,更换音乐
  • 难度:中
  • 耗时:2小时
  • 制作者:
  • 简介:

本次教程我们将使用Microduino产品模块快速搭建一个刷卡控制的音箱。该音箱可以读取卡片上的明暗条纹,选择播放不同的音乐。只要我们准备想要的卡片,就可以听到想要的音乐,省去了对音箱的操作,能够让我们尽情的享受音乐。

材料清单

  • Microduino设备
模块 数量 功能
Microduino-Core/zh 1 核心板
Microduino-USBTTL/zh 1 下载程序
Microduino-Line track/zh 1 供电
Microduino-Duo-V1/zh 1 降低高度
Microduino-Sensorhub/zh 1 与传感器相连
Microduino-Audio/zh 1 音频控制
Microduino-Amplifier/zh 1 功率放大
Microduino-Lantern/zh 1 彩色LED灯
  • 其他设备
模块 数量 功能
喇叭 2 发声
Micro SD卡 1 存储音乐
Micro-USB线 1 下载程序
螺丝 9 固定模块
外壳 1

实验原理

刷卡音箱采用Microduino-Line track灰度传感器识别卡片的灰度,将卡片扫过灰度传感器,Microduino-Core会记录下传感器读到的明暗相间的条纹数,再根据记录下的数据控制Microduino-Audio模块播放相应的音乐。此处Microduino-Core记录数据时采用超时处理,即1秒钟内灰度传感器识别的灰度没有发生变化,就认为卡片读取完毕,此时记录下的数据就是该卡片最终读取的数据。 这里还有一个呼吸灯能指示出刷卡音箱的状态。在刷卡音箱没有识别到卡片时,呼吸灯会显示红色,并按1秒间隔闪烁;只有刷卡音箱正在读取卡片时,呼吸灯会一直显示黄色。

  • 主要传感器

灰度传感器 灰度传感器是一种模拟传感器,有一只发光二极管和一只光敏电阻,安装在同一面上。灰度传感器利用不同颜色的检测面对光的反射程度不同,光敏电阻对不同检测面返回的光敏阻值也不同的原理进行灰度深浅检测。在有效的检测距离内,发光二极管发出白光,照射在检测面上,检测面发射部分光线,光敏电阻检测此光线的强度并将其转换为控制器可以识别的模拟信号。 这里我们可以利用灰度传感器检测卡片上明暗条纹的灰度值,从而可以识别出不同的卡片。

文档

调试过程

  • 程序下载

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

Download1.jpg

打开Arduino IDE编程软件,点击【文件】->【打开】

Dl1.jpg

浏览到项目程序地址,点击“CardPlayer.ino”程序打开。

在CardPlayer.ino文件中,”#define music_num_MAX 10”定义了音箱控制的最大歌曲数,可以修改该参数来增加控制的歌曲,并确认你要控制的歌曲数目小于该数值。 点击【工具】,在板选项里面选择板卡(Microduino-Core),在处理器选项里面选择处理器(Atmega328p@16M,5V),再在端口选项里面选择正确的端口号,然后直接烧录程序。

Dl3.jpg

将MicroSD卡插入Microduino-Audio模块的SD卡槽内,再使用USB数据线将Microduino-Audio模块与电脑连接

连接成功后能显示出一个名为Microduino Audio的CD驱动器和一个可移动磁盘

在可移动磁盘根目录内新建一个“01”文件夹

将music文件夹中的音频文件拷贝到该“01”文件夹中。

  • 搭建

使用螺丝将Microduinno-Duo-V1、Microduino-Line track、Microduino-Lantern固定在外壳上

把外壳的黑色部分用螺丝固定到外壳主体上。

把用到的设备叠加到Microduino-Duo-V1上。

  • Microduino-Core
  • Microduino-Audio
  • Microduino-Amplifier
  • Microduino-Sensorhub

把Microduino-Line track接到Senorhub的A0接口,Microduino-Lantern接到Sensorhub的D6接口

将喇叭固定到外壳的侧边上,然后接到Amplifier的喇叭接口上

将外壳组装好,组装好后的刷卡音箱如下

用USB线连接外壳的USB接口,确认音箱已上电。此时会看到音箱的呼吸灯按1秒间隔闪烁

将如图卡片匀速扫过刷卡口,刷卡时会看到呼吸灯显示黄色,刷完后音箱开始播放音乐

注意事项

程序说明

  • 主程序部分
#include "audio.h" 
 
#define PIN_key A0    //灰度传感器输入引脚 
 
#include <Adafruit_NeoPixel.h> 
#define PIN 6            //Lantern灯引脚 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800); 
 
#define music_num_MIN 1        //歌曲最小数,固定 
#define music_num_MAX 10    //歌曲最大数,可改 
 
int music_vol = 26; //初始音量0~30 
 
//--------------------------------- 
boolean music_status = false;    //歌曲播放状态 
int music_num = 1;                //歌曲序号 
 
void setup() 
{ 
    Serial.begin(9600); 
 
    strip.begin();    //初始化LED 
    strip.show(); // Initialize all pixels to 'off' 
 
    colorWipe(strip.Color(0, 255, 200), 10);    //初始化颜色 R,G,B 
 
    audio_init(DEVICE_TF, MODE_loopOne, music_vol);   //初始化mp3模块 
    audio_pause();                                    //暂停播放 
} 
 
unsigned long time1, time2; 
 
#define paper_val_MIN 100        //黑白传感器触发小值 
#define paper_val_MAX 600        //黑白传感器触发大值 
boolean paper_sta = false; 
int paper_num = 0;                //纸张格数 
 
int LED_vol_sta = 0;    //LED呼吸灯反转 
int LED_vol = 0;        //LED呼吸灯值 
 
 
boolean key = HIGH;            //按键 
boolean key_cache = LOW;        //检测按键松开缓存 
 
boolean vokey(boolean _vokey) 
{ 
    key = analogRead(PIN_key) < paper_val_MIN;    //触发时 
 
    switch(_vokey) 
    { 
    case 0: 
        if(!key && key_cache)        //按下松开后 
        { 
            key_cache = key;        //缓存作判断用 
            return true; 
        } 
        else 
        { 
            key_cache = key;        //缓存作判断用 
            return false; 
        } 
        break; 
    case 1: 
        if(key && !key_cache)        //按下松开后 
        { 
            key_cache = key;        //缓存作判断用 
            return true; 
        } 
        else 
        { 
            key_cache = key;        //缓存作判断用 
            return false; 
        } 
        break; 
    } 
} 
 
 
void loop() 
{ 
    if(vokey(0))        //触发时 
    { 
        colorWipe(strip.Color(255, 255, 0), 10); 
        paper_num++;    //计数 
        // Serial.print("+"); 
 
        paper_sta = true;    //读取模式 
 
        time1 = millis(); 
    } 
 
    if(millis() - time1 > 1000 && paper_num != 0)  //触发,并且闲置超过一秒,结束扫描 
    { 
        audio_choose(paper_num);    //播放扫描歌曲 
        Serial.println(paper_num); 
        audio_play(); 
        //Serial.println(""); 
        //Serial.print("num:"); 
        //Serial.print(paper_num); 
        paper_num = 0;        //归零 等待下次扫描 
 
        paper_sta = false;    //读取模式结束 
    } 
 
    if(!paper_sta)        //非读取模式,LED呼吸 
    { 
        if(LED_vol >= 255) 
        { 
            LED_vol_sta = 1; 
        } 
        if(LED_vol <= 0) 
        { 
            LED_vol_sta = 0; 
        } 
 
        if(!LED_vol_sta) 
        { 
            LED_vol += 4; 
        } 
        else 
        { 
            LED_vol -= 4; 
        } 
 
        colorWipe(strip.Color(LED_vol, 0, 0), 10);        //呼吸灯显示亮度 
    } 
 
    delay(10); 
} 
 
 
// Fill the dots one after the other with a color 
void colorWipe(uint32_t c, uint8_t wait) 
{ 
    for(uint16_t i = 0; i < strip.numPixels(); i++) 
    { 
        strip.setPixelColor(i, c); 
        strip.show(); 
        delay(wait); 
    } 
} 
  • 音频控制部分
#include "arduino.h" 
 
byte sn_reset[4] =                //复位指令 
{ 
    0x7E, 0x02, 0x0C, 0xEF 
}; 
 
byte sn_choose[6] =                //选择曲目指令 
{ 
    0x7E, 0x04, 0x03, 0x00, 0x01, 0xEF 
}; 
 
byte sn_vol[5] =                    //调节音量指令 
{ 
    0x7E, 0x03, 0x06, 0x18, 0xEF 
}; 
 
byte sn_device[5] =                //设备设置指令 
{ 
    0x7E, 0x03, 0x09, 0x01, 0xEF 
}; 
 
byte sn_pause[4] =                //暂停指令 
{ 
    0x7E, 0x02, 0x0E, 0xEF 
}; 
 
byte sn_play[4] =                //播放指令 
{ 
    0x7E, 0x02, 0x0D, 0xEF 
}; 
 
byte sn_mode[5] =                //设置播放模式指令 
{ 
    0x7E, 0x03, 0x11, 0x00, 0xEF 
}; 
 
//----------------------------- 
void audio_pause()                //音频暂停 
{ 
    Serial.write(sn_pause, 4); 
    delay(50); 
} 
 
void audio_play()                //音频播放 
{ 
    Serial.write(sn_play, 4); 
    delay(50); 
} 
 
#define MODE_loopOne 1 
#define MODE_loopAll 0 
//play mode     "0:All loop ,1:One loop 
void audio_mode(byte _audio_mode)        //设置播放模式 
{ 
    sn_mode[3] = _audio_mode; 
    Serial.write(sn_mode, 5); 
    delay(100); 
} 
 
#define DEVICE_Flash  5 
#define DEVICE_TF  1 
//device select "tf"   U/TF/AUX/SLEEP/FLASH      00-05 
void audio_device(byte _audio_device)        //设置存储方式 
{ 
    sn_device[3] = _audio_device; 
    Serial.write(sn_device, 5); 
    delay(1500); 
} 
 
void audio_vol(byte _audio_vol)            //播放下一曲目 
{ 
    sn_vol[3] = _audio_vol; 
    Serial.write(sn_vol, 5); 
    delay(50); 
} 
 
void audio_choose(byte _audio_choose)    //播放上一曲目 
{ 
    sn_choose[4] = _audio_choose; 
    Serial.write(sn_choose, 6); 
    delay(100); 
} 
 
void audio_reset()                //复位 
{ 
    Serial.write(sn_reset, 4); 
    delay(500); 
} 
 
//初始化 
void audio_init(int _audio_init_device, 
int _audio_init_mode, int _audio_init_vol) 
{ 
    delay(500); 
    audio_reset(); 
    audio_device(_audio_init_device); 
    audio_mode(_audio_init_mode); 
    audio_vol(_audio_init_vol); 
    audio_choose(1); 
    audio_pause(); 
} 

视频