なんとしてもメモリが欲しいと、I2C I/O Expander経由でSPI SRAMを使えるようにしてみたものの、おそい。
あまりにも遅くてこれではI2CのEEPROMを使った方がひょっとしたら速いかもしれない。
最適化したわけではないからまだ速度は上がるにせよ、あまり芳しくないので成功法で攻めることに。
ただし、gamebuinoではこの方法つかえず、MAKERbuinoだけの特権。
MAKERbuinoの右上の方にはBREAKOUTというピンアウトがある。何が出ているのかと思えばほとんど電源関連なのだけど、そこに混じって D5とある。 そう、D5が空いているのだ。D5をCSにすれば普通にSPI SRAMにアクセスすることが出来る。
では早速やってみよう。
使うSPI SRAMは 23LCV512-I/SN という64kByteの SOICパッケージ。
表面実装の中では大きめなのでハンダ付けもしやすいはず。
電子工作のお店なんかにはまず置いていない。リンクはChip1Stopに張ってあるけれど、RSとかその他のセミコン屋さんには置いてあるので取り寄せて使う。
余談だけど、23LCVシリーズ、5Vまでいける。今までは3.3Vまでの23LCシリーズだけだった。(はず)
MAKERbuinoはもともと3.3Vだから関係ないけどほかの5V系Arduinoで使う場合にもレベル変換とかが必要ないのですごく良い。
さて話を戻し、配線。
液晶を外してATMega328の裏側のパターンから線を引き出す。
オレンジの線が出ているのが D5、赤はVCC、黒はGND。
グレーはSPIの線。写真で見て上からSCK、MISO、MOSIとなる。
SPI SRAMを変換器版にハンダ付け。考えてるほど難しくないので良い練習だと思ってやってみると案外簡単に出来るはず。前もって予備はんだしてもいいし。チップをテープで固定して普通にハンダ付けしてもいいし。
変換基板は秋月電子のものをつかった。
SPI SRAMの7番、8番ピンを100KΩの抵抗でつなぐ。
表面実装の抵抗を持ち合わせていなかったので普通ので。
MAKERbuinoの液晶の下の隙間は変換器版とSRAMの高さでクリアランスギリギリなのでそこを意識してハンダ付け。
足が出っ張ってしまうようならヤスリで削ってフラットにしておいたほうがいい。
線をつないでゆく。
SPI SRAMのピンと328はこの様につなぐ。
1 : -> D5
2 : -> MISO
3 : N/C
4 : -> GND
5 : -> MOSI
6 : -> SCK
7 : -> 100kohm -> 8
8 : -> VCC
となる。
ここまで作業して気づいたのだけど、先に変換器版側の配線をしておいた方が圧倒的に楽。
ここまでやってしまったので仕方がなくヘルパーを使いながらハンダ付けをした。
やりやすいようにやること。
ひととおり配線が終了。
この時点で一度液晶とバッテリーを仮付けして正常に動作するかテストをする。
もし電源が入らないなどという場合はすぐスイッチをOFFにすること。
動かないのにのんびりやっていると火災の危険性もあるので速やかに。
正常に動作するようなら変換器版を絶縁テープなどで固定する。
液晶ユニットの裏側にも配線パターンがあることを忘れずに!
元通り組み立てて作業終了。
SPI SRAMのアクセスは難しくないので普通にコードを書いてもいいし、もしもよくわからないようなら「なんでもつくっちゃう。かも。」さんがSPI SRAMのライブラリを提供してくれているので記事を参考にしてありがたく使わせてもらおう。記事では23K256を利用しているけど23LCV512でもアクセス方法はまったく同じなので気にしなくて大丈夫。ただ CSがD5だということだけは気をつけること。
記事中にあるサンプルプログラムをそのまま動かす場合。
SPISRAM myRAM(10); // CS pin
この部分を
SPISRAM myRAM(5); // CS pin
こうする。
以上! これでMAKERbuinoに64kByteの外付けメモリが追加された。
メモリが付いたからといって直接アクセスできるメモリでは無いので大きなプログラムが入るわけでもないし画像データを入れてもそのまま表示できるわけでは無いけれど。 いろんな使い道が有るはず。
バッファーとして便利につかおう。
MAKERbuinoにはもともとSPIデバイスが二つ存在しているので初期化のタイミングなどはしっかり考慮しないといけない。ゲームが起動された時点でSPIは開始している為、再度SPIをbeginするなどするとうまくいくかもしれない。
この点現在調査中のため完全な解決策があればこのページに追記するが、今のところ次のようなコードにすることで問題なく動作している気がする。
#include <SPI.h>
void init(){
gb.begin();
gb.titleScreen(F("myApplication"));
pinMode(5,OUTPUT); //CSピンをHIGHにした後にSPIを再度開始する。
digitalWrite(5,HIGH);
SPI.begin();
}