BS21 Lab の製品 - SRAM 512Kバイト シールド(製品番号:BS21LAB-018)
19/jan/2014 新規
3/feb/2014 更新
大容量 SRAM 512 キロバイト(=4メガビット)のシールドです。QVGA 画像3枚分が格納可能です。
SRAM なので、書き換え寿命は有りませんし、EEPROM の様にページ境界を気にする必要無しですが、電源が切れると記憶内容が消失します。
通信方式は SPI 方式のみです。通信速度も、余り高速ではありません。
- 概要
- 御注意
- ギャラリー
- ご購入方法
- 注意事項
- 免責事項
- 仕様
- SPI 通信速度について
- 組立て方法
- 使用方法
- ソフトウエア
・概要
Arduino Uno で使用している ATmega328P の内蔵 SRAM は、2キロバイトと小さいため、大きなデータを扱うのは困難です。
本シールドは 256倍の 512キロバイト(ビット換算にすると4メガビット)の SRAM を実装していますので、巨大なデータを読み書きする事が可能になります。
QVGA 画像(320×240×16bit=150kB)なら3枚分が格納できて、なお 60kB 以上余ります。(流石に VGA 画像(640×480×16bit=600kB)は無理です…)
ただし、通信方法は SPI 方式であり、また、本シールドの制御 IC の関係で、連続読み書き速度は実測 約85キロバイト/秒(=約680キロビット/秒)と高速とは言いがたい物が有ります
(つまり QVGA 画像1枚分の読み込みに約1.76秒かかると言う事)ので、ATmega328P の内蔵 SRAM と、上手く使い分ける必要があるでしょう。
またバッテリーバックアップなども有りませんので、電源が切れると、記憶内容が消失しますので、この点にも注意が必要になります。
本製品は組み立て式キットとなっています。全部品がスルーホール部品ですので、半田付け初心者でも、それほど悩まずに組み立てられるでしょう。
組み立て方は組立て方法を御覧下さい。
・御注意
2014/2/3 追記:SPISRAM512K ライブラリを v1.02 に更新しました。
・ギャラリー
使用例:クリックすると拡大します。Arduino 本体は付属していません。また、写真には LED が写っていますが、実際は有りません。
別方向からの写真。緑色のジャンパーピンで、デジタル2〜10ピンのいずれか1つを CSピンに選択できます。
・ご購入方法
本製品は、以下のサイトで取り扱って頂いております。
(株)スイッチサイエンス様
・注意事項
本製品は、電源を OFF にした状態で、ジャンパーの切り替えを行ってください。通電中にジャンパーを切り替えますと、IC 等を破壊する恐れがあります。
電源を OFF にした状態でも、ジャンパーを切り替える時は、静電気を逃がしてから行ってください。
また、本製品は端子等が露出しており、ショートなどで容易に故障しやすくなっておりますので、取り扱いには十分に注意してください。
鋭利な部分も多数有りますので、怪我等に十分に注意してください。
・免責事項
本製品は人命等に関わる装置への利用につきまして、考慮されておりません。
また、本製品を使用した事によって発生しました如何なる事象につきまして、弊社は責任を負いかねますので御了承下さい。
・仕様
Arduino UNO R3 ピン互換シールドです。
寸法 | 幅約68.6mm×長さ約53.3mm×厚み約1.2mm | 有鉛はんだを使用 |
高さ | 約20mm | ※ピンソケット頭から、Arduino 用ピン先まで |
穴位置 | φ3.2mm×4 | Arduino UNO R3 と穴位置コンパチ |
駆動電圧 | +2.7V〜+5.5V | Arduino 側に依存 |
SPI 通信速度 | 実測で約85kバイト/秒(=約680kビット/秒) | 連続読み書き時。1バイトだけの読み書きだと、アドレス指定3バイト+データ1バイトなので、実質約21kバイト/秒になってしまいます。 |
SPI 通信用ピンは、従来のデジタル 11/12/13 ピンを使用する方法と、ICSP ピンを使用する方法の、どちらか片方を選べれます。
(Arduino Leonardo 等は、必ず ICSP ピンでなければなりません)
また、CS ピンはデジタル2〜10ピンの9つから1つを選ぶ事が可能です。
回路図:
※ 実装していない部品も描かれています。
※ ICSP ピンの2ピンは、デフォルトでは Vcc と切り離されています。Vcc と繋げるには、基板裏の SJ1 を半田ショートさせる必要が有ります(通常はショートさせる必要は有りません。開放のままで OK です)。
これは、Arduino Due 等で SPI 通信は +3.3V でなければならないのに、この ICSP の2ピンは +5V 固定になっている為、後述の VccSel 機能で問題が発生しかねない為、ワザと切断してあります。
・SPI 通信速度について
制御 IC である ATmega8515L-8PU は、8MHz 駆動となっています(ATmega8515-16PU だと +3.3V に対応できない)。
また、AVR の仕様では、SPI スレーブ側は 1/4 クロックに設定しないといけませんので、SPI 通信速度は 2MHz に設定する必要が有ります
(Arduino 側が 16MHz の時は、SPI.setClockDivider(SPI_CLOCK_DIV8) と設定すれば、2MHz になります)。
この 2MHz の SPI 通信速度はビット単位ですので、1バイト(=8ビット)分を転送するには、ATmega8515L からすると 32クロックかかる事になります(=4クロック×8bit)。
さらに、1バイト分の SPI 転送後に、ATmega8515L の内部処理時間(SRAM への読み書き等)に 30クロック前後必要(コンパイラが吐き出した AVR のアセンブリコードから大雑把に推測)ですので、
1バイト分を処理するのに、32クロック+30クロックで、トータル 62クロック前後掛かる事になります。
実際は 62クロックきっかりにするとトラブりかねない(時々データを取りこぼす恐れがある)ので、余裕を見て、80クロック位にします。
前述の通り、ATmega8515L は 8MHz 駆動で、1バイト分の転送当たり 80クロック掛かるのならば、SPI の転送速度は 8MHz÷80クロック/バイト= 100キロバイト/秒前後になります。
さらに、SPI 通信では、CS ピンを ON/OFF したり、SRAM のアドレス指定(3バイト長)があったりしますので、実際の転送速度は、これよりも低下する事になります。
事実、実測してみると 512キロバイトの読み書き(トータル1MB)に約12秒かかりましたので、1MB÷約12秒=約85キロバイト/秒となりました。
※ 実際は、この転送速度(85キロバイト/秒)には、Arduino 自身が内部処理中で、SRAM512Kシールドは単に待機しているだけのムダ時間も含まれていると思われます。
しかも、この転送速度は 512バイト連続読み書きの時の値であり、1バイトだけを読み書きする時は、アドレス指定3バイト+データ1バイトと、実際は4バイト必要に
なってしまいますので、速度は更に 1/4 の約 21キロバイト/秒にまで低下します(という事は、可能な限り連続読み書きした方が得、という事になります。)。
本シールドで使用している SRAM AS6C4008 自体は、8ビットパラレルで 18MHz まで行けますので、余裕見ても 10メガバイト/秒までの高速化が可能だと思われます
(実際は、その前に Arduino の方の SPI がフン詰まってしまうので、1メガバイト/秒程度でも十分だと思われる)が、
そこまで持っていくには、制御 IC を ARM 等の表面実装部品にせざるを得ない為、全部品をスルーホール部品にする事ができません。
(そして、制御 IC を表面実装部品にするのなら、SRAM 自体も表面実装部品にしてしまった方が楽です。でも、3.3V⇔5V レベル変換が必要になり、コストアップになってしまいます。)
色々考えたのですが、結局、全部品をスルーホール部品にして、組み立てやすくする事を最優先とし、SPI 通信の遅さには目をつぶる事にしました。
と言う訳で、申し訳有りませんが、SPI 通信が遅いのは「仕様」とさせて下さい。
※ +5V限定で良いのなら、ATmega8515-16PU + 16MHzセラロック、にすれば、簡単に今の倍近い通信速度(約170キロバイト/秒)にする事は可能だと思われます。
ただ、ATmega8515-16PU は +3.3V 非対応なので、セラロックを8MHz/16MHz の2種類用意するだけでは駄目で、ATmega8515L-8PU と一緒に交換しなければならないので、頭の痛い状況になってしまいます。
ATmega162-16PU ならば 3.3V/8MHz と 5V/16MHz の両方に対応しているのですが、この ATmega162-16PU、めちゃくちゃ高価(2014年1月時点で1個800円)なんですよ…
CPU | +3.3V | +5V | コメント |
ATmega8515L-8PU | 8MHzセラロック | 16MHz 化不可 |
ATmega8515-16PU | 不可 | 16MHzセラロック | +3.3V 不可 |
ATmega162-16PU | 8MHzセラロック | 16MHzセラロック | 高価 |
※ DIP 40ピンで、その内 I/Oピンが最低34本(アドレス19本+データ8本+制御3本+SPI4本)有り、SPIに対応し、+3.3Vと+5V 両対応で、+3.3Vでも16MHz以上でブン回せる安い石があれば・・・
※ DIP 28ピンの PSoC1 を2個使う方法は考えました。コスト計算後に即座に却下しましたが。
・組立て方法
巨大なので、別ページにしました。「SRAM 512Kバイト シールド」の組立て方法 をクリックしてください。
・使用方法
★☆★☆★☆★☆★☆★☆
☆★☆ Vcc の選択 ★☆★
★☆★☆★☆★☆★☆★☆
基板上に "Vcc sel" とシルク印刷されている箇所があります。
御使用の Arduino の Vio 電圧に合わせて、ここのジャンパーピンを、以下の3つのいずれかに設定する必要があります。
御注意!! ここの設定を間違えた場合、ホスト側の SPI 通信機能を破壊する恐れがあります。十分に注意して下さい。
| Vcc 電圧 | ジャンパーピンの位置 | コメント | 例 |
@ | +5V 決め打ち | 5V−Vcc | SPI 通信を 5V で行う必要があるタイプ | Arduino Duemilanove, Arduino Uno(初代,R2,R3), AE-ATmega 等 |
A | +3.3V 決め打ち | 3V3−Vcc | SPI 通信を 3.3V で行う必要があるタイプ | Arduino Pro(3.3V仕様), Arduino Due |
B | IOREF に依存 | IOR−Vcc | IOREF ピンの電圧値(3.3V or 5V のどちらか)を参照すれば良いタイプ ※通常はこの設定を選んでおくのが無難です | Arduino Uno R3, Leonardo や Due 等の IOREF ピンが存在するタイプ |
SRAM512K の SPI 通信方式を、従来の 11/12/13 ピンを使用する方法か、もしくは、ICSP ピンを使用する方法のいずれかをジャンパーで選択できます。
この時、3つのジャンパーピンは同時に切り替えてください。
もしくは
の片方のみ(同時は不可)
SRAM512K の CS ピンの割り当ては、デジタル2〜10 ピンのいずれか1つを選ぶことができます。必ず1ピンのみ(2ピン同時とかは駄目)、また、他の SPI 機器と被らないピンを割り当てて下さい。
・ソフトウエア
Arduino 用ライブラリを用意しています。
以下の圧縮ファイルをダウンロードし、arduino フォルダの中の libraries フォルダの中に解凍するだけで OK です。
BS21Lab-ArduinoLib-SPISRAM512K-v1.02.zip 2014年2月3日版 ※setSpiConditionForSRAM512K 関数を追加しました
※ Arduino IDE 1.0.5 で動作確認しています。(Arduino IDE 1.5.5 では不明です)
アンインストールも、SPISRAM512K フォルダーごと削除するだけで OK です。
※ arms22 氏作成の「SPISRAMライブラリ」をベースに作成しました。
詳細は「なんでも作っちゃう、かも。 」の Arduinoで遊ぼう - シリアルSRAMを使ってメモリを拡張する を参照してください。
オリジナルの arms22 氏の「SPI SRAM 23k256 library for Arduino」はアドレスが unsigned int(16bit長)ですが、本ライブラリでは unsigned long(32bit長)になっています。
また、SPI 通信部分に5μ秒のウエイトが入っています。
v1.02 で追加しました setSpiConditionForSRAM512K 関数を呼び出すと SPI 通信速度が 2MHz になります。また、setSpiConditionForDefault 関数を呼び出すと 4MHz になります。
なお、begin 関数呼び出し直後は 2MHz になっています。
※ ただし、SPI 機器によっては、default とは違う設定にしないといけない物があるかもしれません。その場合、その SPI 機器のドキュメント等を見て、正しい SPI 設定にする必要があります。
【御注意】
Windows 用の Arduino IDE でしか動作確認していません。もしかすると、Mac 用や Linux 用の Arduino IDE では、問題が発生するかもしれません。その際は、御連絡下さい。可能な限り対応してみます。(頑張ったが無理だった、という結果になる可能性もあります…)
・最後に
microchip 社が 23LC4096 を製品化したら、一巻の終わり。本シールドは商品価値無し、になります。
もし、御希望ならば、SRAM 1メガバイトや2メガバイトシールドとかも作る事は可能だと思います。
ただし、表面実装部品+電圧レベルシフト機能、になるので、それなりの値段になってしまうと思われます。
製品リストに戻る
Copyright (C) 2014 BS21 Lab, All rights reserved.