电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>电子资料>使用Arduino UNO播放SD卡中的Midi文件

使用Arduino UNO播放SD卡中的Midi文件

2023-01-31 | zip | 0.13 MB | 次下载 | 2积分

资料介绍

描述

这个项目展示了如何制作一个基于 Arduino 的 midi 播放器。Arduino 连接到包含 SD 卡读卡器的 DS1307 数据记录器扩展板。Arduino 输出保存到 Data Logger Shield 中 SD 卡的 midi 文件的 midi 流。此 MIDI 流可以连接到任何可以播放音乐的 MIDI 合成器或 MIDI 设备。

这是主要组件

  • 阿杜诺乌诺
  • DS1307 数据记录器扩展板
  • PCB 安装 MIDI 母头 DIN5 插孔
  • MC74HC14A 六路施密特触发器反相器
  • 2 x 220 欧姆电阻
  • 按钮
  • 中线线

DS1307 数据记录器扩展板

这个 Arduino 扩展板可从多个来源获得;亚马逊、eBay 和全球速卖通等等。

Adafruit 发布的盾牌版本 2 有一个很好的概述

https://learn.adafruit.com/adafruit-data-logger-shield/overview

该项目中使用的扩展板是硬件版本 1,与 Adafruit 描述的不同。但是,所有代码和示例都适用于版本 1。

DS1307 是一个实时时钟芯片,用于提供精确的时间值。它可以与备用电池一起使用,因此即使关闭周围电路的电源也不会浪费时间。

该项目中使用的数据记录器扩展板包括一个 DS1307 和一个 SD 读卡器。屏蔽的主要用途是记录来自传感器的数据,并在读数中添加精确的时间戳。信息存储在 SD 卡上,可以随时检索以进行分析。

对于这个特定项目,我们不使用 DS1307 功能,只使用 SD 读卡器(抱歉)。

这是盾牌的图片。

poYBAGPXLwyAbBUCAAEMmdLAb3A725.png
DS1307 防护罩
 

盾牌的一些有趣的特点

  • 盾牌带有一个原型制作区,这个以后会有用
  • Arduino 接头在屏蔽上可用,可以通过将电线焊接到与接头相邻的通孔来访问
  • 屏蔽包括两个内置 LED电阻器您的电路可以通过接线点连接到它们。
  • SD 卡读卡器的芯片选择 (CS) 连接到此扩展板的 Arduino 引脚 10(不像其他扩展板那样是引脚 4)

Arduino 通过 SPI 接口与 SD 卡通信这是引脚分配。

pYYBAGPXLxGAf9wmAABKdL2_1a8791.png
 

在连接屏蔽层之前,通过以下步骤测试 SD 卡是否正常工作:

  • 在计算机中格式化 SD 卡。它必须格式化为 FAT32(如果你怀旧的话,也可以格式化为 FAT16)
  • 复制一些文件到卡上。由于读者的限制,文件名不能超过8个字符,文件扩展名限制为3个字符(记住MSDOS)
  • Arduino IDE 应该预装了 SD 库。在文件→ SD 示例下检查。如果不安装库。
  • 将扩展板连接到您的 Arduino 并插入 SD 卡。上传程序 SDCardReadFiles 并运行它。如果一切正常,串行监视器应该列出 SD 卡上的所有文件
/*  SDlistFiles

 This example shows how print out the files in a directory on a SD card

 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 10

 This example code is in the public domain.
 
 */
#include 
#include 

File root;

// Chip Select for SD Card - Pin 10 for shield
const int chipSelect = 10;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  pinMode(chipSelect,OUTPUT);
  
  Serial.print("Initializing SD card...");

  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

}

void loop() {
  root = SD.open("/");

  printDirectory(root, 0);

  Serial.println("done!");

  delay(5000);
}

void printDirectory(File dir, int numTabs) {
  while (true) {

    File entry =  dir.openNextFile();
    if (! entry) {
      // no more files
      break;
    }
    for (uint8_t i = 0; i < numTabs; i++) {
      Serial.print('\t');
    }
    Serial.print(entry.name());
    if (entry.isDirectory()) {
      Serial.println("/");
      printDirectory(entry, numTabs + 1);
    } else {
      // files have sizes, directories do not
      Serial.print("\t\t");
      Serial.println(entry.size(), DEC);
    }
    entry.close();
  }
}

MC74HC14A 六路施密特触发器反相器

施密特触发器反相器用于确保 MIDI 信号包含正确电压的干净方波。施密特触发器电路包括滞后功能,可确保数字信号从高电平到低电平以及从低电平到高电平的精确转换。

链接到数据表

https://www.mouser.com/datasheet/2/308/MC74HC14A-D-601265.pdf

如果您对施密特触发器逆变器背后的理论感兴趣,互联网上有许多描述其操作的文章。

电路

这是该项目中使用的电路示意图:

pYYBAGPXLxOAcf3wAABqoAdemJg300.png
原理图
 
  • 原理图未显示 MC74HC14 芯片所需的 5V 电源和接地连接。这些是有线的:5V 到引脚 14,接地到引脚 7。
  • 两个 LED 和电阻器内置在防护罩中。要使用它们,请将 Arduino 引脚 5 和 6 桥接到 L1 和 L2 通孔。
  • midi 流从 Arduino 的 TX 引脚发送。默认情况下,它连接到 Arduino 板上的引脚 1。在程序中,Serial.write 命令会将 midi 命令发送到引脚 1,然后发送到 midi 输出电路。

如图所示的电路连接在屏蔽的原型区域。这需要一些精细的工作,但这是可能的。这是完成的盾牌的图片。

pYYBAGPXLzqAFJ9ZAAtEGFfFPbs595.jpg
 
pYYBAGPXL02AEKmFAAmmckXuDuo364.jpg
 

作为替代方案,电路可以构建在无焊料面包板上。参考www.midi.orgt上的一篇文章hat 描述了这种方法

https://www.midi.org/midi-articles/arduino-midi-output-basics

poYBAGPXL1KATcnpAABGIXkaZ-c134.jpg
原图来自www.midi.org
 

完成后,将扩展板连接到 Arduino

pYYBAGPXL1aANBaPAARp7HyKIw0864.jpg
完成 Arduino 和 Shield
 

图书馆

为了使代码工作,需要安装以下库。

  • SdFat(用于访问 SD 卡的库)
  • MD_MIDIFile(用于播放 SD 卡中的 midi 文件的库)

使用 Tools → Manage Libraries 进行安装。截图如下:

pYYBAGPXL1qAZ8zTAABfRjuviNQ863.png
 
poYBAGPXL1yAIXT4AABTTqxj3KA486.png
 

Midi 库的文档位于这两个链接

https://github.com/MajicDesigns/MD_MIDIFile

https://majicdesigns.github.io/MD_MIDIFile/

GitHub 存储库中包含的示例概述了该库的工作原理此外,还包括一些示例 MIDI 文件。

播放 Midi 文件

要播放 midi 文件,请按照以下步骤操作:

  • 在格式化的 SD 卡上加载 midi 文件。文件名不能超过八个字符,后跟扩展名“.mid”
  • 在 Arduino IDE 中打开草图“MinimalMidiPlayer”
  • 在 Arduino sketch 中,更改声明行 [const char *loopfile = “LOOPDEMO.MID”] 以指定 SD 卡上的文件
  • 确保 SD_SELECT = 10
  • 将草图上传到 Arduino
  • 断开 Arduino 与电源的连接
  • 将 SD 卡插入读卡器。
  • 通过 MIDI 电缆将 MIDI 输出插孔连接到合成器或 MIDI 播放器。
  • 将 Arduino 连接到电源。不要使用 USB 连接器供电,它可能没有足够的能力为扩展板和 Arduino 供电。而是使用连接到 Arduino 上的 DC 插孔的源
  • 按下盾牌上的按钮,歌曲就会播放。成功!
#include 
#include 
#define SERIAL_RATE 31250 // Midi standard serial rate is 31250 baud
#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))

const byte SD_SELECT = 10; // Chip select for Sd card is pin 10
const char *loopfile = "LOOPDEMO.MID"; // pointer to midi file on SD card
const int buttonPin = 7;    // the number of the pushbutton pin
const int ledPin = 6;      // the number of the LED pin
bool playFile = false; // boolean variable indicating if a file should be played


SDFAT  SD;
MD_MIDIFile SMF; // create an instance of a midi file

// Called by the MIDIFile library when a file event needs to be processed
// thru the midi communications interface.
// This callback is set up in the setup() function.
void midiCallback(midi_event *pev){
  if ((pev->data[0] >= 0x80) && (pev->data[0] <= 0xe0)){  
    Serial.write(pev->data[0] | pev->channel);
    Serial.write(&pev->data[1], pev->size-1);
  }
  else {
    Serial.write(pev->data, pev->size);
  }
}

void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // use built in pullup resistor with push button
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  
  Serial.begin(SERIAL_RATE);

  // Initialize SD Card
  if (!SD.begin(SD_SELECT, SPI_FULL_SPEED)){  
    while (true) ;
  }

  // Initialize MIDIFile
  SMF.begin(&SD);
  SMF.setMidiHandler(midiCallback);
  SMF.looping(false);
}

void loop() {
  // Wait for pushbutton input
  int reading = digitalRead(buttonPin);
  // If push button is depressed, load midi file and switch on LED
  if (reading == LOW) {
    playFile = true;
    digitalWrite(ledPin, HIGH); // Switch on LED
    SMF.load(loopfile);
    }

  // play the file if playFile is true
  if(playFile == true){
  // Play until end of file is reached  
    while (!SMF.isEOF()){
    SMF.getNextEvent();
    }
  }
  // Once file is finished playing, close midi file and switch off LED
  playFile = false;
  digitalWrite(ledPin, LOW);
  SMF.close();
}

多轨

作为对这个最小 midi 播放器的增强,可以从 SD 卡播放多首歌曲。以下是说明:

  • 在 SD 卡上加载多个 midi 文件。这些文件必须都在根目录中。子文件夹中的文件将无法播放。文件名不能超过八个字符,并且必须后跟扩展名“.mid”
  • 在 Arduino IDE 中打开草图“MultiTrackMidiPlayer”。调整延迟(大约第 82 行)以允许歌曲之间更长或更短的停顿
  • 确保 SD_SELECT = 10
  • 将草图上传到 Arduino
  • 断开 Arduino 与电源的连接
  • 将SD卡插入读卡器
  • 通过 MIDI 电缆将 MIDI 输出插孔连接到合成器或 MIDI 播放器
  • 将 Arduino 连接到电源。不要使用 USB 连接器供电,它可能没有足够的能力为扩展板和 Arduino 供电。而是使用连接到 Arduino 上的 DC 插孔的源
  • 按下盾牌上的按钮,歌曲将按顺序播放,直到播放完所有歌曲。成功!

最后的话

这是一个最小的播放器,并且没有在代码中内置所有可能的错误检查。需要一些额外的开发来添加额外的功能。

 

 


下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1山景DSP芯片AP8248A2数据手册
  2. 1.06 MB  |  532次下载  |  免费
  3. 2RK3399完整板原理图(支持平板,盒子VR)
  4. 3.28 MB  |  339次下载  |  免费
  5. 3TC358743XBG评估板参考手册
  6. 1.36 MB  |  330次下载  |  免费
  7. 4DFM软件使用教程
  8. 0.84 MB  |  295次下载  |  免费
  9. 5元宇宙深度解析—未来的未来-风口还是泡沫
  10. 6.40 MB  |  227次下载  |  免费
  11. 6迪文DGUS开发指南
  12. 31.67 MB  |  194次下载  |  免费
  13. 7元宇宙底层硬件系列报告
  14. 13.42 MB  |  182次下载  |  免费
  15. 8FP5207XR-G1中文应用手册
  16. 1.09 MB  |  178次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33566次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21549次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6656次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537798次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420027次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191187次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183279次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费