2017年9月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

最近のトラックバック

« ATmega48/88/168/328用のヒューズリセッターをArduinoで作る | トップページ | Arduinoトラブルシューティング アップロード編 »

2014年6月15日 (日)

WaveシールドをArduino MegaやArduino Leonardoで使える様にしてみた

 AdafruitのWaveシールドは音声再生が出来るArduino用シールド(拡張基板)としてはかなり昔に開発され、半田付けによる組み立ても必要なキットでありながら、書籍Prototyping Labでも紹介されるなど長く人気を保っている製品です。

Uno_wave
Arduino UnoとWaveシールドV1.1
※ピンソケット、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)で使用する事が出来ました。

Mega_wave
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シールドを使える様になります。

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」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« ATmega48/88/168/328用のヒューズリセッターをArduinoで作る | トップページ | Arduinoトラブルシューティング アップロード編 »