電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>使用Arduino UNO播放SD卡中的Midi文件

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

2023-01-31 | zip | 0.13 MB | 次下載 | 2積分

資料介紹

描述

這個(gè)項(xiàng)目展示了如何制作一個(gè)基于 Arduino 的 midi 播放器。Arduino 連接到包含 SD 卡讀卡器的 DS1307 數(shù)據(jù)記錄器擴(kuò)展板。Arduino 輸出保存到 Data Logger Shield 中 SD 卡的 midi 文件的 midi 流。此 MIDI 流可以連接到任何可以播放音樂(lè)的 MIDI 合成器或 MIDI 設(shè)備。

這是主要組件

  • 阿杜諾烏諾
  • DS1307 數(shù)據(jù)記錄器擴(kuò)展板
  • PCB 安裝 MIDI 母頭 DIN5 插孔
  • MC74HC14A 六路施密特觸發(fā)器反相器
  • 2 x 220 歐姆電阻
  • 按鈕
  • 中線線

DS1307 數(shù)據(jù)記錄器擴(kuò)展板

這個(gè) Arduino 擴(kuò)展板可從多個(gè)來(lái)源獲得;亞馬遜、eBay 和全球速賣(mài)通等等。

Adafruit 發(fā)布的盾牌版本 2 有一個(gè)很好的概述

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

該項(xiàng)目中使用的擴(kuò)展板是硬件版本 1,與 Adafruit 描述的不同。但是,所有代碼和示例都適用于版本 1。

DS1307 是一個(gè)實(shí)時(shí)時(shí)鐘芯片,用于提供精確的時(shí)間值。它可以與備用電池一起使用,因此即使關(guān)閉周?chē)娐返?a target='_blank' class='arckwlink_none'>電源也不會(huì)浪費(fèi)時(shí)間。

該項(xiàng)目中使用的數(shù)據(jù)記錄器擴(kuò)展板包括一個(gè) DS1307 和一個(gè) SD 讀卡器。屏蔽的主要用途是記錄來(lái)自傳感器的數(shù)據(jù),并在讀數(shù)中添加精確的時(shí)間戳。信息存儲(chǔ)在 SD 卡上,可以隨時(shí)檢索以進(jìn)行分析。

對(duì)于這個(gè)特定項(xiàng)目,我們不使用 DS1307 功能,只使用 SD 讀卡器(抱歉)。

這是盾牌的圖片。

poYBAGPXLwyAbBUCAAEMmdLAb3A725.png
DS1307 防護(hù)罩
?

盾牌的一些有趣的特點(diǎn)

  • 盾牌帶有一個(gè)原型制作區(qū),這個(gè)以后會(huì)有用
  • Arduino 接頭在屏蔽上可用,可以通過(guò)將電線焊接到與接頭相鄰的通孔來(lái)訪問(wèn)
  • 屏蔽包括兩個(gè)內(nèi)置 LED電阻器。您的電路可以通過(guò)接線點(diǎn)連接到它們。
  • SD 卡讀卡器的芯片選擇 (CS) 連接到此擴(kuò)展板的 Arduino 引腳 10(不像其他擴(kuò)展板那樣是引腳 4)

Arduino 通過(guò) SPI 接口與 SD 卡通信。這是引腳分配。

pYYBAGPXLxGAf9wmAABKdL2_1a8791.png
?

在連接屏蔽層之前,通過(guò)以下步驟測(cè)試 SD 卡是否正常工作:

  • 在計(jì)算機(jī)中格式化 SD 卡。它必須格式化為 FAT32(如果你懷舊的話,也可以格式化為 FAT16)
  • 復(fù)制一些文件到卡上。由于讀者的限制,文件名不能超過(guò)8個(gè)字符,文件擴(kuò)展名限制為3個(gè)字符(記住MSDOS)
  • Arduino IDE 應(yīng)該預(yù)裝了 SD 庫(kù)。在文件→ SD 示例下檢查。如果不安裝庫(kù)。
  • 將擴(kuò)展板連接到您的 Arduino 并插入 SD 卡。上傳程序 SDCardReadFiles 并運(yùn)行它。如果一切正常,串行監(jiān)視器應(yīng)該列出 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 六路施密特觸發(fā)器反相器

施密特觸發(fā)器反相器用于確保 MIDI 信號(hào)包含正確電壓的干凈方波。施密特觸發(fā)器電路包括滯后功能,可確保數(shù)字信號(hào)從高電平到低電平以及從低電平到高電平的精確轉(zhuǎn)換。

鏈接到數(shù)據(jù)表

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

如果您對(duì)施密特觸發(fā)器逆變器背后的理論感興趣,互聯(lián)網(wǎng)上有許多描述其操作的文章。

電路

這是該項(xiàng)目中使用的電路示意圖:

pYYBAGPXLxOAcf3wAABqoAdemJg300.png
原理圖
?
  • 原理圖未顯示 MC74HC14 芯片所需的 5V 電源和接地連接。這些是有線的:5V 到引腳 14,接地到引腳 7。
  • 兩個(gè) LED 和電阻器內(nèi)置在防護(hù)罩中。要使用它們,請(qǐng)將 Arduino 引腳 5 和 6 橋接到 L1 和 L2 通孔。
  • midi 流從 Arduino 的 TX 引腳發(fā)送。默認(rèn)情況下,它連接到 Arduino 板上的引腳 1。在程序中,Serial.write 命令會(huì)將 midi 命令發(fā)送到引腳 1,然后發(fā)送到 midi 輸出電路。

如圖所示的電路連接在屏蔽的原型區(qū)域。這需要一些精細(xì)的工作,但這是可能的。這是完成的盾牌的圖片。

pYYBAGPXLzqAFJ9ZAAtEGFfFPbs595.jpg
?
pYYBAGPXL02AEKmFAAmmckXuDuo364.jpg
?

作為替代方案,電路可以構(gòu)建在無(wú)焊料面包板上。參考www.midi.orgt上的一篇文章hat 描述了這種方法

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

poYBAGPXL1KATcnpAABGIXkaZ-c134.jpg
原圖來(lái)自www.midi.org
?

完成后,將擴(kuò)展板連接到 Arduino

pYYBAGPXL1aANBaPAARp7HyKIw0864.jpg
完成 Arduino 和 Shield
?

圖書(shū)館

為了使代碼工作,需要安裝以下庫(kù)。

  • SdFat(用于訪問(wèn) SD 卡的庫(kù))
  • MD_MIDIFile(用于播放 SD 卡中的 midi 文件的庫(kù))

使用 Tools → Manage Libraries 進(jìn)行安裝。截圖如下:

pYYBAGPXL1qAZ8zTAABfRjuviNQ863.png
?
poYBAGPXL1yAIXT4AABTTqxj3KA486.png
?

Midi 庫(kù)的文檔位于這兩個(gè)鏈接

https://github.com/MajicDesigns/MD_MIDIFile

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

GitHub 存儲(chǔ)庫(kù)中包含的示例概述了該庫(kù)的工作原理。此外,還包括一些示例 MIDI 文件。

播放 Midi 文件

要播放 midi 文件,請(qǐng)按照以下步驟操作:

  • 在格式化的 SD 卡上加載 midi 文件。文件名不能超過(guò)八個(gè)字符,后跟擴(kuò)展名“.mid”
  • 在 Arduino IDE 中打開(kāi)草圖“MinimalMidiPlayer”
  • 在 Arduino sketch 中,更改聲明行 [const char *loopfile = “LOOPDEMO.MID”] 以指定 SD 卡上的文件
  • 確保 SD_SELECT = 10
  • 將草圖上傳到 Arduino
  • 斷開(kāi) Arduino 與電源的連接
  • 將 SD 卡插入讀卡器。
  • 通過(guò) MIDI 電纜將 MIDI 輸出插孔連接到合成器或 MIDI 播放器。
  • 將 Arduino 連接到電源。不要使用 USB 連接器供電,它可能沒(méi)有足夠的能力為擴(kuò)展板和 Arduino 供電。而是使用連接到 Arduino 上的 DC 插孔的源
  • 按下盾牌上的按鈕,歌曲就會(huì)播放。成功!
#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();
}

多軌

作為對(duì)這個(gè)最小 midi 播放器的增強(qiáng),可以從 SD 卡播放多首歌曲。以下是說(shuō)明:

  • 在 SD 卡上加載多個(gè) midi 文件。這些文件必須都在根目錄中。子文件夾中的文件將無(wú)法播放。文件名不能超過(guò)八個(gè)字符,并且必須后跟擴(kuò)展名“.mid”
  • 在 Arduino IDE 中打開(kāi)草圖“MultiTrackMidiPlayer”。調(diào)整延遲(大約第 82 行)以允許歌曲之間更長(zhǎng)或更短的停頓
  • 確保 SD_SELECT = 10
  • 將草圖上傳到 Arduino
  • 斷開(kāi) Arduino 與電源的連接
  • 將SD卡插入讀卡器
  • 通過(guò) MIDI 電纜將 MIDI 輸出插孔連接到合成器或 MIDI 播放器
  • 將 Arduino 連接到電源。不要使用 USB 連接器供電,它可能沒(méi)有足夠的能力為擴(kuò)展板和 Arduino 供電。而是使用連接到 Arduino 上的 DC 插孔的源
  • 按下盾牌上的按鈕,歌曲將按順序播放,直到播放完所有歌曲。成功!

最后的話

這是一個(gè)最小的播放器,并且沒(méi)有在代碼中內(nèi)置所有可能的錯(cuò)誤檢查。需要一些額外的開(kāi)發(fā)來(lái)添加額外的功能。

?

?


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)