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にダイエットしないとイケないのですが、多分無理。

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

 

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

 - 電子工作

  関連記事

マウスを入力I/Fとして使うのを断念してみた。

お疲れ様です。高橋です。 先日の「マウスを分解してみた」でマウスを分解し、ケーブ …

USBカメラ+Raspberry Pi

お疲れ様です。高橋です。 USBカメラをRaspberryPiに装着し、ストリー …

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

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

USBやDCジャックからの5Vを3.3Vにする物を作った

お疲れ様です。高橋です。 前にesp8266の動作試験を行った時、とても面倒だと …

【完成】ArduinoIDE1.6.4+ATTiny13Aで赤外線リモコン

お疲れ様です。高橋です。 苦戦していたArduinoIDE1.6.4を使ったAT …

【完成】 電子オルゴール

お疲れ様です。高橋です。 電子オルゴールの制作が佳境に入り、とうとうカルトナージ …

webからUSBカメラ+Raspberry Pi

お疲れ様です。高橋です。 The Internetから、RaspberryPiの …

iPhoneでルンバを操作してみたい

お疲れ様です。高橋です。 突然ですがiPhoneでルンバを操作したいと思います。 …

電子オルゴール設計

お疲れ様です。高橋です。 電子オルゴールがどんな形状になるのか、実体配線図を作っ …

大掃除を終え、aitendoで30円で売ってたタクトスイッチ基板でクリスマス

お疲れ様です。高橋です。 aitendoで店頭限定30円だったタクトスイッチ基板 …