micro:bitでYMF825を鳴らす

イギリス発のSTEM教育向けマイコンボードmicro:bitに、FM音源のYMF825Boardを接続して音を鳴らしてみました。

#回路の準備
##YMF825Boardの3.3V対応
micro:bitは3V動作(3.3Vも可）なので、YMF825と接続するSPIが3Vになります。
そのため、[このページ](http://uda.la/fm/)を参考に、YMF825BoardのIFを3.3V化します。
チップ抵抗の取り外しと、ハンダでパッドをショートする必要がありますが、かなり極小箇所の修正なので、多少の苦労は覚悟してください。

##YMF825Boardへの5V供給
YMF825Boardは、IFを3.3v化しても、5Vの電源は必要です。
やり方はいろいろ考えられますが、私はUSBを利用して5Vを得るために、以下のようなサブ基板を作成しました。

![IMG_3395.jpg](https://qiita-image-store.s3.amazonaws.com/0/36719/98853bdf-b736-cac9-636e-8d09d74c64bb.jpeg)

USB microB端子から、5Vを取り出し、三端子レギュレータで3.3Vを作って、micro:bitおよびYMF825Boardに電源を供給します。
micro:bitには、[専用のコネクタ](https://www.amazon.co.jp/gp/product/B01JOQXWRS/ref=oh_aui_detailpage_o03_s00?ie=UTF8&psc=1)で3.3Vを供給します。
YMF825Boardには、5Vと3.3Vを供給するピンを立てておきます。

##micro:bitとYMF825の接続
micro:bitの回路を拡張するために、micro:bit専用の[このコネクタ変換基板](https://www.switch-science.com/catalog/3181/)を利用します。
先ほどの電源供給基板と合わせると、全体は以下のようになります。

![IMG_3396.jpg](https://qiita-image-store.s3.amazonaws.com/0/36719/9058da36-6512-e2bb-c6e9-0e1e7276f436.jpeg)

コネクタ変換基板とYMF825Boardを、下の写真で示されたように接続します。
![IMG_3397.jpg](https://qiita-image-store.s3.amazonaws.com/0/36719/8379e3ef-087f-9178-87ad-12cddb048527.jpeg)

なお、上記の接続をすべて一枚の中に納めた、以下のような基板を製作しました。
（興味のある方は kigakudoh@gmail.com まで問い合わせください）

![IMG_3450.jpg](https://qiita-image-store.s3.amazonaws.com/0/36719/11ca6aaf-68fa-d167-0f28-f5dfb427e205.jpeg)



#mbed環境作成

今回はmicro:bitをmbed環境で開発します。
以下の説明では、mbed開発環境にある程度親しんでいることを前提に進めますのでご了承ください。

##Platformにmicro:bitを足す
以下の画面から、自分のmbed環境のPlatformに、micro:bitを追加します。

![platform.png](https://qiita-image-store.s3.amazonaws.com/0/36719/a7e91ff9-224a-35e1-e3fc-5c09251e2c9a.png)

##mbed用ライブラリのインポート
mbed環境上でまず新しいプログラムを作成します。
その後、プログラムにmicro:bitのライブラリをインポートします。まず、インポートスイッチを押して、検索窓で「microbit」と書くと、以下のような画面が現れるので、一番上にあるライブラリをインポートしてください。

![library.jpg](https://qiita-image-store.s3.amazonaws.com/0/36719/6c619867-ab32-ff10-dc78-d0987c8f197e.jpeg)

これでmbed環境でプログラムする準備が出来ました。

#YMF825のsample2を取り込む

##Githubからダウンロード

今回はYMF825のこの[サンプルプログラム](https://github.com/yamaha-webmusic/ymf825board/tree/master/sample2)を利用して音を出します。
Githubにある上記のプログラムをまずダウンロードしてください。
今回は /common フォルダと /arduino フォルダ内のファイルを利用します。/common 内にあるファイルはそのまま利用出来ます。/arduino 内のファイルは、micro:bitに合わせる必要があります。

##fmsd1_ino.cppを修正

まず、fmsd1_ino.cppを、micro:bit用に修正します。ファイル名も fmsd1_micro.cpp のように書き換えておきましょう。
ファイルの冒頭の部分を以下のように変更します。

```cpp:fmsd1_micro.cpp
#include "MicroBit.h"

SPI ymf825(MOSI, MISO, SCK);
MicroBitPin ss(MICROBIT_ID_IO_P16,MICROBIT_PIN_P16,PIN_CAPABILITY_DIGITAL);
MicroBitPin rst(MICROBIT_ID_IO_P8,MICROBIT_PIN_P8,PIN_CAPABILITY_DIGITAL);
```

次にポート書き込みの修正です。
fmsd1_ino.cppでは

```cpp:fmsd1_ino.cpp
digitalWrite(10, LOW);
```

と書いていたところを

```cpp:fmsd1_micro.cpp
ss.setDigitalValue(0);
```

と書き換えます。"digitalWrite"が使われているのが７箇所ありますので、同様に書き換えてください。

それからSPIの修正です。
fmsd1_ino.cppでは

```cpp:fmsd1_ino.cpp
// init
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV4);
SPI.setDataMode(SPI_MODE0);
SPI.begin();
// write
SPI.transfer(adrs);
```

と書いていたところを

```cpp:fmsd1_micro.cpp
// init
ymf825.format(8);
ymf825.frequency(4000000);
// write
ymf825.write(adrs);
```

と書き換えます。"SPI"で検索して、該当する箇所を上のように書き換えてください。


##main.cppを作成

main.cppは好きなように書いていただいていいのですが、とりあえずサンプルソースの
 /arduino/ymf825board_sample2.ino に合わせて、以下のようなコードを書いてみました。
YMF825で音を鳴らすだけでなく、micro:bitのLEDにテーブル tone_name[] の文字を表示させています。

```cpp:main.cpp
#include "MicroBit.h"

extern "C" {
#include    "fmif.h"
};
#include    "fmsd1.h"

MicroBitDisplay mbd;

const ManagedString tone_name[12] = {
    "C","c","D","d","E","F","f","G","g","A","a","B"
};

int main( void )
{
    int i=60;

    initSPI();
    initSD1();
    Fmdriver_init();

    while(1){
        mbd.print(tone_name[i-60]);
        Fmdriver_sendMidi(0x90);
        Fmdriver_sendMidi(i);
        Fmdriver_sendMidi(0x7f);
        wait_ms(200);
        Fmdriver_sendMidi(0x90);
        Fmdriver_sendMidi(i);
        Fmdriver_sendMidi(0);
        wait_ms(200);
        i++;
        if ( i>72 ){ i=60;}
    }

    return 0;
}
```

#最後に
日本においてもmicro:bitはSTEM教育用に大きな可能性を秘めていると思います。
このボードにYMF825Boardを接続することで、FM音源を使った面白いガジェットを容易に作ることが出来るようになります。micro:bitとYMF825Boardの組み合わせを、子供向けワークショップなどで利用してみてはいかがでしょうか。