micro:bitから簡単にmp3再生できるカスタムブロックと接続ケーブルを作った


micro:bitで音は比較的簡単に鳴らせますがmp3などの音楽を再生させるのは簡単にできません。
それを簡単にするためのカスタムブロックとデバイスを作りました。

ケーブルはワニ口クリップを改造してPHコネクタをつけたもの。

DFR0534というメモリ内蔵の音声プレイヤーに接続できるようになっていて、これはモノラルですがSDカードなども必要なくシリアル通信で制御ができるものです。
https://akizukidenshi.com/catalog/g/gM-13708/
他にもよくあるものでDF Player miniなど安価なものはありますが、SDカード代が結構高くつくので個人的には全部コミコミでこの値段なのでこちらの方がおすすめです。ただしボタン操作などの端子がないのでそういう操作を考えてるならおすすめはできません。

スピーカー部分もワニ口クリップにしたのでイヤホンやスピーカーともよくあるV1.5でのmicro:bitで音を出す時と同様に接続することができます。

動作させたのはこちら。

カスタムブロックは以下を参照して雛形ベースにして作りました。
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で飛ばしたりいろんなデバイスと連携したりが容易になります。