WaveシールドをArduino MegaやArduino Leonardoで使える様にしてみた
AdafruitのWaveシールドは音声再生が出来るArduino用シールド(拡張基板)としてはかなり昔に開発され、半田付けによる組み立ても必要なキットでありながら、書籍Prototyping Labでも紹介されるなど長く人気を保っている製品です。
※ピンソケット、ICソケットなど自前の部品を足してあります。
ところが、元々Arduinoの本流のArduino DuemilanoveやArduino Unoを対象に作られているため、Arduino MegaやArduino Leonardoでは、簡単に使用する事が出来ません。そこで、今回はこのWaveシールドをArduino MegaやArduino Leonardoで使える様にしてみました。
Arduino Megaで使う
まずはArduino Megaで使ってみましょう。その前になぜこのWaveシールドがArduino Megaでそのままでは使えないかについて説明しなければいけませんね。このWaveシールドでは音声ファイルが入っているSDカードへのアクセスにSPIという通信方式が使われています。それに使用するSS,MISO,MOSI,SCKの4つのピンがあり、Arduino Unoではデジタル入出力ピンの10〜13に割り当てられています。ところがArduino Megaではこれがシールドが刺さっていない50(MISO),51(MOSI),52(SCK),53(SS)に出ているのです。使用すべきピンがArduino基板とシールドで違っているのでは正しく動くはずが無いですね。
そこでArduino MegaでWaveシールドを使うにはこれらのピンをなんとかしてシールドの該当部分に繋がなくてはいけないという訳です。
ところで、このSPIのピンのうちMISO,MOSI,SCKは実はArduino UnoでもArduino MegaでもArduino Leonardoでも6ピンヘッダのICSP端子にも繋がっているのです。なので、Arduinoチーム純正のEtherシールドやワイヤレスSDシールド等では、この端子を使ってSPI通信をする仕様になっています。
実はこの事を利用して10〜13番ピンでSPI通信をするシールドをArduino MegaやArduino Leonardoで使える様にする変換シールドが製品として存在します。製品名がちょっと面白い?のですがトランスモグリシールドと言います。SparkFun Electronics製でスイッチサイエンスから入手する事が出来ます。
このシールドをシールドを使えばMISO,MOSHI,SCKの配線を上手く繋ぎ直してくれるので、あとはArduino Megaの53番ピン(SS)をWaveシールドの10番ピンにジャンパワイヤで繋げばOKです。これだけでWaveシールドをWaveHCライブラリ(wavehc20110919.zip)で使用する事が出来ました。
Arduino Mega 2560+トランスモグリシールド+Waveシールド
またトランスモグリシールドの代わりになるシールドを自作する事も可能です。こちらの記事をご参照ください。
Arduino Leonardoで使う
さて、こんどはArduino Leonardoですが、最初はArduino Megaと同じ手法で行けると思っていました。MISO,MOSI,SCKはトランスモグリシールド等で解決させるとしてSSはどこに出ているのかと回路図をチェックした所、なんとArduino LeonardoのSSピンはUSBシリアルの受信表示用LEDにのみ繋がっていて、ピンヘッダやピンソケットには出ていなかったのです。これは困りました。Waveシールドのライブラリ(WaveHC)はSDカードをSPI通信で有効にするピン(CS)を制御するためにSSピンを使う事に固定されいたのです。つまり表に出ていないピンをWaveシールドに接続しないと動かす事が出来ません。私は電子工作でなんとか出来なくも無いですが、見栄えも悪くなりますし、それが出来る人も非常に限られてしまいますね。
鳴かぬなら鳴かせてみようLeonardoまりすWaveシールドのライブラリがLeonardoに対応していない事態に臨んで。
そこで、仕方なくライブラリに手を入れる事にしました。ライブラリで該当箇所を探り当て、CSピンをSS含め任意のピンに繋げられる様、改良を施しました。
実際に変更したファイルはSdReader.h,SdReader.cpp,ArduinoPins.hの3つです。これをzipにまとめました。オリジナルのファイルと差し替えてお使いください。
※追記のライブラリファイルをお使いください。
スケッチは、SdReader card; と書かれている所を SdReader card(CSのピン番号); とカッコ内にSDカードのCSとして使いたいピン番号(Waveシールドの場合、10)を追加する修正をして下さい。
また、Serial通信をしている場合、Arduino Leonardoのお約束として、 Serial.begin(ボーレート); の直後に while (!Serial) { ; } を追加して下さい。
これでArduino LeonardoでWaveシールドを使える様になります。
Arduino Leonardo+トランスモグリシールド+Waveシールド
またこのライブラリの改良を施せば、上記のArduino Megaで必要だったSSピン接続用のジャンパワイヤを不要に出来ます。もちろん今まで通りUnoで使用する事も問題有りません。
教訓。SPIを使ったArduino用のライブラリを作成する場合、ハードウェアSPIモジュールのSSピンは当てにせず、CSピンを任意に割り付け出来る様に書かないとLeonardoで使えない物になる。
◇2014/06/26 追記
DACの使用ピンも任意に変更出来る様にしました。
SdReader card(10); // SDカードのCSピンを指定WaveHC wave(2,3,4,5); // DACのLCS,CLK,DI,LATピンを指定
の様にスケッチを変更出来ます。
下のファイルをダウンロードしライブラリ全体を差し替えて下さい。
« ATmega48/88/168/328用のヒューズリセッターをArduinoで作る | トップページ | Arduinoトラブルシューティング アップロード編 »
「Arduino」カテゴリの記事
- bitDuinoでメロディを奏でてみた(2014.09.09)
- 世界最小?のArduino互換ボードを作ってみた(暫定版)(2014.08.27)
- 知らないとソン!? Arduinoの小ネタ色々(2014.07.05)
- WaveシールドをArduino MegaやArduino Leonardoで使える様にしてみた(2014.06.15)
この記事へのコメントは終了しました。
コメント