micro:bitで音は比較的簡単に鳴らせますがmp3などの音楽を再生させるのは簡単にできません。
それを簡単にするためのカスタムブロックとデバイスを作りました。
ケーブルはワニ口クリップを改造してPHコネクタをつけたもの。
DFR0534というメモリ内蔵の音声プレイヤーに接続できるようになっていて、これはモノラルですがSDカードなども必要なくシリアル通信で制御ができるものです。
https://akizukidenshi.com/catalog/g/gM-13708/
他にもよくあるものでDF Player miniなど安価なものはありますが、SDカード代が結構高くつくので個人的には全部コミコミでこの値段なのでこちらの方がおすすめです。ただしボタン操作などの端子がないのでそういう操作を考えてるならおすすめはできません。
スピーカー部分もワニ口クリップにしたのでイヤホンやスピーカーともよくあるV1.5でのmicro:bitで音を出す時と同様に接続することができます。
動作させたのはこちら。
コードの作りが悪くてレスポンスが遅かっただけでした。効果音に使える感じ。V2対応もしたので指パッチンでもMP3が鳴ります! pic.twitter.com/Krms7byKgH
— wakasa masao (@wks) December 18, 2020
カスタムブロックは以下を参照して雛形ベースにして作りました。
https://qiita.com/wakasamasao/items/eedf7f8d6308e828986a
コードはDFPlayer miniを操作できるブロックをベースに改造しました。
https://github.com/51bit/dfplayermini
とりあえず、曲番号指定で音楽が流れてVolumeが操作できればよいかなとそれだけしか書いてません。
コマンド自体は以下のサイトを参照にしています。
https://wiki.dfrobot.com/Voice_Module_SKU__DFR0534
コメントに書かれたものがブロック名になったりするので、そのあたりはいい感じに書いておいたほうが良いです。
//% weight=100 color=#0fbc11 icon=""
namespace dfr0534 {
let isConnected: boolean = false;
function sendData(dataArr:number[]): void {
let myBuf = pins.createBuffer(10);
for (let i = 0; i < 10; i++) {
myBuf.setNumber(NumberFormat.UInt8BE, i, dataArr[i])
}
serial.writeBuffer(myBuf)
basic.pause(100)
}
/**
* Connect DFR0534
* @param pinRX RX Pin, eg: SerialPin.P2
* @param pinTX TX Pin, eg: SerialPin.P1
*/
//% blockId="DFR0534_connect" block="connect to DFR0534, RX:%pinRX|TX:%pinTX"
//% weight=100 blockGap=20
export function connect(pinRX: SerialPin = SerialPin.P2, pinTX: SerialPin = SerialPin.P1): void {
serial.redirect(pinRX, pinTX, BaudRate.BaudRate9600)
isConnected = true
basic.pause(100)
}
/**
* Specified Audio
* @param track Track Number, eg: 1
*/
//% blockId="DFR0534_specifiedAudio" block="Specified Audio Play(1~255):%track"
//% weight=99 blockGap=20 track.min=1 track.max=255
export function specifiedAudio(track: number): void {
if(track<1) track=1
if(track>255) track=255
sendData([0xAA,0x07,0x02,0x00,track,track+0xB3])
}
/**
* Set Volume
* @param volume Volume, eg: 10
*/
//% blockId="DFR0534_volume" block="set volume(0~30):%volume"
//% weight=98 blockGap=20 volume.min=0 volume.max=30
export function volume(volume: number): void {
if(volume<0) volume=0
if(volume>30) volume=30
sendData([0xAA,0x13,0x01,volume,volume+0xBE])
}
}
実際に作ったコードはこちらを参考に。
https://makecode.microbit.org/_HgF0rKD6j9Ta
これで簡単にmp3が再生できる環境が整ったのでいろいろ遊べると思います。
特にブロック言語で作れるようにしたので、Radioで飛ばしたりいろんなデバイスと連携したりが容易になります。