curious4dev

色々ダメなandroidアプリを開発したい会社員 高橋が綴る、androidアプリ開発やArduinoについて

*

Arduino+EEPROM+YMZ294で曲の抜き差し

 

お疲れ様です。高橋です。

I2Cの256KBitなEEPROMに曲データを書き込み、書き込んだデータを読みこみながらYMZ294で演奏する実験が終了しました。

IMG_5483

私が買ったI2C EEPROMはこれ。秋月で1個90円。こいつは中に256KBit(つまり32KByte)のデータを格納出来ます。

中は32KBit(4KByte)毎にブロックで区切られています。

今のArduino+YMZ294の構成だと、曲を差し替える度に毎回書き込み作業を行うのが面倒です。それなら最初からEEPROMに曲データだけ書き込んどいて、あたかもファミコンのカセットの如く抜き差しすれば曲が変更出来る、というタイプにしてみたかったのが主な理由です。

042901

そして、ATmega328はプログラムFlash領域が32KByteもあるので、ほぼほぼ問題無いですが、それでも容量が足りなくなってくる事があると思います。その時のためにEEPROMの使い方を学んでおきたかった、っていうのもあります。

実体配線図

読み書きするため、そしてArduinoでEEPROMを使う上で参考にしたのが、きむ茶工房ガレージハウスさんのEEPROM(24LC256/1024)と接続して読み書きを行って見ますというページです。

実体配線図は下記のような感じです。書き込む際にYMZは不要です。

042902

ライブラリは、きむ茶工房さんがページにアップロードしているライブラリ「skMC24xxx」を使います。

EEPROMへの書き込みフォーマット

私が曲をArduinoで演奏させる時は、こんな流れで作っています。

042903

 

SMF2YMZで吐き出した「Arduino code」は、下記のような感じになっています。

要は、set_chで音階とチャンネルを設定し、delayで経過時間を設定する、というだけのものです。

これをEEPROMにByteで書き込むため、下記のような感じでbyteの配列にします。

命令 値1 値2
set_ch 1: 音階設定 1~3: チャンネル 0~127: 音階
delay 2: 待機時間設定 時間を100で割った商 時間を100で割った剰余
曲の終了 3: 終了

このルールを踏まえると、さっきの曲データは

というように美しいバイト配列に変換されます。これをEEPROMにアドレスを指定しながら書き込めばOK。

書き込みスケッチ

下記がスケッチ。曲データの中のset_chメソッドとuser_delayメソッドの呼び出しはそのまま使い、メソッド内でバイト配列に変換して、3バイトずつEEPROMに書き込んでいます。

ハマった事

  • なぜか64byte毎に書き込みがおかしくなるアドレスがあった事。ここは、アドレスを64で割った余りが0の場合だけ、アドレスを強制的に++させる事でしのいでいます。原因は後ほど追求。。おそらくEEPROM内部のブロック跨ぎが原因な気がします。
  • それと、アドレス0に書き込もうとしたら、エラーにはならなかった物の、データがおかしくなりました。原因は不明ですがアドレス1から書き込む事にしてます。
  • EEPROMに3バイトずつ書き込んでいますが、次の3バイトを書き込む前にdelay(5)を仕込んでおかないと、Write時にエラーとなります。

write時のSerialデバッグ結果と、Read時のSerialデバッグ結果を突き合わせ、全件OKになるまで、実験を何度も繰り返しました。。

042904

読み込みスケッチ

EEPROMに書き込んだ曲データを3バイトずつ読み込みながらYMZ294で演奏するスケッチがこちらです。

3バイトずつ読み込んで、

  1. 先頭バイトが1だったら音階設定なので、次の1バイトでチャンネル番号を取得し、その次の1バイトで音階を取得します。
  2. 2だったら待機時間なので、次の1バイトで時間を100で割った商を取得し、その次の1バイトで100で割った余りを取得し、時間を生成します。
  3. 3だったら演奏終了なので、読み込みアドレスを1に戻してループさせる、

という感じにしています。

本当はコレ、ATtiny13AとEEPROMの組み合わせで実現出来たら最高なんですが、ATtiny13Aのプログラム領域は1KByte。今の読み込み側のスケッチが4,912Byteなので、1/5にダイエットしないとイケないのですが、多分無理。

小さくて素敵なんだけどなあ。。

 

以上、よろしくお願い致します。

 - 電子工作

  関連記事

電子オルゴール 基板実装 #1

お疲れ様です。高橋です。 Pro Mini互換機を贅沢に使った電子オルゴールの仮 …

音階LED実装 #2

お疲れ様です。高橋です。 本日も昨日に引き続き半田付け。 今日の進捗 昨日の残り …

遠隔でRaspberryPi+DCモーターを制御してaitendoの名刺をクルクルさせる。

お疲れ様です。高橋です。 「猫×おもちゃ×動画×アプリ」のための要素技術として必 …

音階LEDの再設計

お疲れ様です。高橋です。 本日帰宅途中に電車をぼーっと待っている時、ふと、音階L …

音階に合わせてLEDを光らせてみた。

お疲れ様です。高橋です。 主旋律に合わせてLEDを光らせてみる実験を行いました。 …

MIDI INの実験

お疲れ様です。高橋です。 Arduino+YMZをMIDI化するための第一歩の実 …

耳コピミキサー 試作

お疲れ様です。高橋です。 iPhoneから流す音と電子ピアノから流す音を合成する …

PCとArduinoをJavaでシリアル通信

お疲れ様です。高橋です。 先日作ったコレ。 よくよく考えると、書き込む際にいちい …

【完成】 耳コピミキサー

お疲れ様です。高橋です。 作成途中だった耳コピミキサー、やっと完成しました。 思 …

満員電車内でのオナラと検知 #2

お疲れ様です。高橋です。 最近なんだか忙しかったので、なかなか物が作れませんでし …