« Arduino - Arduino 2009とEthernetShield | トップページ | Arduino - Arduino用容量倍化ATmega328P到着 »

Arduino - ArduinoでSDカード

せっかくArduinoを手に入れたので、年末何を作ろうかと考えた。
いくつかネタはあるのだけど、前回EthernetShieldのSDカードについて触れたこともあり、まずはSDカードとのアクセスに挑戦。

Arduino_sdcard2

と、その前にEthernetShieldのSDカード部分について更なる調査をしてみた。

EthernetShieldの回路図を見てみると(下図)、SDカード部分は完全にセパレートされいた。

Arduino_enshld_sdEthernetShield回路図からSDカード部分のみを抜粋

Digital10~13はEthernetととの通信用に確保されているので、Digital4、7、8、9の4本をSDカード用に割り当てている。
ということは、この4つのピンでアクセスすれば良いということなのか。。。
が、しかし、そうは問屋が卸さないのです。

SDカードの動作電圧は2.7V~3.6Vとなっていて、現状ほとんどは3.3Vで動作しているはず。
で、3.3VならArduinoのPowerからも出力されているから、SDカードのVccにはそれがそのまま使える。
問題になるのは信号ラインで、これも同じ3.3Vでやらないとならないから、そのままArduinoのI/Oから5V信号を突っ込むとまずいのです。

これを解決するには3.3Vへシフトする回路を組み込まないとならないので、ちょいと一手間掛かる。
回路図を見たところ、そのままI/Oへ直結されているので、このまま使ってしまうとSDカードが破壊されるという事態になってしまうかも・・・
恐らくこのSDカードのパターンが使用されない理由はそこではないかと思ってます。

実を言うとEthernetShieldの核であるWIZnetのW5100というチップは3.3Vが動作電圧なんだけど、何故、信号ラインは5Vのままで問題が起きないのかというと、このW5100のI/Oについては5Vでも動作するように作られているというカラクリ。
結果、SDカードの部分だけがそのまま使用することが出来ないという結末

同じタイプのSDカード・ソケットを買ってきて取り付けたところで、電圧をシフトさせないとダメというわけで、このパターンは無いものとするしかないのかなあ・・・
もっとも、電圧シフトする回路をチップ抵抗とかでうまい具合に小さく作って、スロットも載せてぴったり納められれば言うことはないのだけど・・・

2009.1.5追記
それをじゅんさんが実現されました(詳しくはLinkからどうぞ~)

--

というわけで、そんなところに労力を費やすより、別にSDカードの回路を作ったほうが早いので、早速ブレッドボードに組んでみる。

Arduino_sdcard3

回路はWaveShieldのSDカード部分を参考にしてみました。
シフトしている部分は正確には抵抗分圧と言い、2つの抵抗を使って降圧させてます。

この場合、4.7kと10kの抵抗を使っているけど、結果的に目的の電圧が取り出せれば良いので、この組み合わせでないといけないわけではないのです。
なので、1.8kと3.3kの組み合わせなどでも良く、そこは手元にある抵抗と要相談で。

抵抗分圧の回路自体はとても単純で、2つの抵抗の間の電圧を得るだけで良く、下図左側の回路が基本となってます。

Resistor_divider_2

右側が実際に電圧と抵抗値を入れた状態で、得られる電圧は約3.4V。
動作範囲なのでこれで大丈夫なんだけど、他の組み合わせによって3.3Vにもっと近づけることも出来ます。

計算式は、

Vout = (R2 ÷ (R1 + R2)) × Vin

で求められるけど、面倒な場合は自動的に抵抗値を割り出してくれる抵抗計算ツールという便利なサイトもあります。

--

お次はSDカードをマウントするのに、何か良い方法はないかと探ってみた。
スロットは持っているのだけど、加工するのもアレだし、ブレッドボードで使うのに勿体無いしなあ。

Sdcard_slot1

というわけで、microSDを買った時に必ずといっていいほど付属してくるSDカードアダプタ。
これに直接ピンヘッダを取り付けて、スロット代わりにしてしまうことにした。
何枚も持て余していたから丁度良かった。microSD専用になってしまうけど。

試しにアダプタを分解してみた。

Sdcard_slot2

蓋をひっぺがすとこうなっている。
ちなみにこれと同じものを作ろうとしている方は、剥がさないように注意して下さい。
microSDを入れたときに蓋がゆるいと接触不良を起こしてしまうからです。

Sdcard_slot3

更に金具を外したところ。

Sdcard_slot4

ピンヘッダを当てはめてみるとぴったり合った。
ピン自体はちょっと指で押してずらしてます(本当は片側が長い)。
ここではピンヘッダは9本分にしたけど、外側の8と9番はリザーブで使用されていないので、7本だけでも良いと思う。

Sdcard_slot5

はんだ付け完了。
なんとも汚い・・・30代も後半になると集中力が・・・
テスターで導通チェックをして完成。

--

回路図

Sdcard_sch

プロテクトや挿入検出などは省略。
そして改造アダプタを回路に接続。

Arduino_sdcard4

microSDはCFDの2GBを使用し、FATでフォーマットした後、適当なファイルを入れた。
今回はデフォルトではSDHCは使えないので注意。
回路が出来上がったところで、今度はソフトウェアだ。

--

参考にした資料はArduino Forum - SD card read/write with Arduinoに掲載されていたものをそのまま利用。
このままではコンパイル出来ないので、ライブラリをインストールする必要がある。
先ほどのForumの「The library can be downloaded here」にあるライブラリをダウンロード。

圧縮ファイルを解凍し、出来た「SDcard」というフォルダごと、ArduinoIDEをインストールした場所の \hardware\libraries に移動して完了。
最終的に インスト場所\hardware\libraries\SDcard\ となっていればOK。

注意しなければならないのは、このライブラリ自体はいろいろなプロジェクトで使われていたりするので、同じインクルードファイル名で改造されていたりする。
同名のライブラリがあれば当然衝突するので、コンパイルが曖昧となりエラーの原因になる。
なので他でもSDcardライブラリを使用している場合は、使用してない方をマスクしたほうが良いでしょう。

準備が出来たらPCと接続して実行し、IDEのコンソールに切り替え。
コマンドの説明メッセージが表示され、続いてSDカードの情報が表示されたら成功~
以下、実行結果(コンソールからのコピペ)。

sizeの項目を見るとほぼ2GBとなっているので、ちゃんと動作しているみたいだ。
続いて r コマンドで最初の25byteを読み取ってみたら、何もないので全てゼロとなった。

そのまま s コマンドでデータの書き込みテスト。

適当なところで q コマンドを入力して終了し、表示された数値が書き込まれたか r コマンドで確認してみる。

おぉ、ちゃんと書き込みも出来ている

今回使用したライブラリは低レベルライブラリなので、直接SDカードへ書き込んでます。
軽量だけどFATファイルシステムなどは扱えない。
それをするにはファイルシステムにアクセス出来る高レベルのライブラリが必要。

--

そこで最後にFATファイルシステムへのアクセスを試みる。
これについてもWaveShieldの記事を参考にした。
このシールド欲しい・・・

まずWaveShieldサイトのDownloadから AF_Wave ライブラリをダウンロードして、前述のSDcardライブラリ同様にAF_Waveライブラリをインストールする。
SDcardの低レベル部分が衝突するので、念のためSDcardライブラリを外しておく(フォルダ名を変更しておくか別の場所へ退避させる)。

WaveShieldのプログラムをベースに、ファイルの内容表示を行うように改造したものが下記ソースです。
ディレクトリ一覧を取得して表示し、各ファイルのサイズと内容を表示していきます(無限ループ)。
注意としてルートしかアクセスすることが出来ません。

Arduino用ソース

実行する前にSDカードに適当なファイルを用意しておきます。
FAT16なので、ファイル名は8.3表記です。
テストとして、下図のように12個のファイルを用意して、中身をテキストデータとして保存してます。

Test_sdcard_files

準備出来たらコンソールに切り替え見てみると、下記の結果が表示されました。

実行結果

どうやら一応成功みたい
「一応」というのは、ループを繰り返していると、やたら返りが遅くなるときがあったり、エラーが出たりして安定しないから・・・
最初のうちは調子良く出るんだけどなあ

取り敢えず、回路の方はおいおい調べていくとして、実行結果はちゃんと出たから良しかな。
それから、このファイルシステムは容量が大きいです。
コンパイルすると約12Kにもなるので、残り2Kくらいしかない・・・ちょっとしたルーチン入れたらすぐに無くなりそうだね。

ForumではFATファイルシステムを軽量化したものが紹介されていたりするので、そういうのを取り込むことも考察していくべきかも。
もしくはATMEGA328に乗せ換えることも出来るそうなので、交換して倍の容量にしてしまっても良いかも・・・日本ではまだ手に入らないけど

スイッチサイエンスさんでATMEGA328の予約が開始されました!(2009/1/3)
しかもブートローダ書き込み済みサービス!(\750)
なので早速予約しときましたよ

それにしてもこんなに簡単に出来るのか、と改めて驚いてしまう。
SDカードの回路やFATファイルシステムのライブラリを構築してくれた方々ありがとうございましたm(_ _)m
WaveShield欲しい。。。誰か使っている人いないかな?

|

« Arduino - Arduino 2009とEthernetShield | トップページ | Arduino - Arduino用容量倍化ATmega328P到着 »

電子工作」カテゴリの記事

コメント

こんにちは、楽しく拝見させて頂いています。

このブログを参考にSD card slot付きEthernetShieldを改造してみました。
http://www.geocities.jp/jun930/etc/arduinosd.html
良かったURL見てやってください。^_^/

投稿: じゅん | 2009-01-05 12:01

じゅんさん、はじめまして(^-^)/
サイト拝見させて頂きました!
いや~実に素晴らしい成果です!
まさにやりたかったことですよ~
しかもスロット付きだなんて、羨ましい・・・
これからEthernetShieldを手に入れる方はスロットが外されているのでしょうねえ。
なんだか実現した物を見て、こちらもすっきりしましたw
そのスロットだけでも欲しいです・・・(^-^;

PSoCもやってらっしゃるんですね~
なかなかminiProgが買えずにFirstTouchだけで遊んでますw

投稿: SatE-O | 2009-01-05 22:15

SatE-Oさん

お返事ありがとうございます。

スロットが外された事実はココで初めて知りました。残念ですT_T
ちなみにスロット付きはスイッチサイエンスさんで昨年11月に購入したものです。

PSoCはハマりますねぇ^^;
MiniProgはここしばらく秋月でも在庫切れが続いているようで、自分の周りの人々はDigi-Keyから買っていますョ

http://parts.digikey.jp/1/1/1208943-kit-miniprog-psoc-cy3217.html

投稿: じゅん | 2009-01-06 10:31

うちもスイッチサイエンスさんで12月に購入したのですが、ほんの1ヶ月差でスロット無くなってしまったんですねえ(;д;)

MiniProgをDigi-Keyで購入しても良いのですが、送料高いし7500円の送料無料にするほど買うものないしorz
利用されている方に便乗できたら・・・

あ、リンク張らせて頂きますね~(^-^)

投稿: SatE-O | 2009-01-06 21:58

ウチもリンクはりました~

投稿: じゅん | 2009-01-07 23:58

じゅんさん、ありがとうございます
今年も宜しくお願いします(^-^)

投稿: SatE-O | 2009-01-08 00:07

はじめまして。
Arduinoのデータロガーを作ろうと思い、このサイトにお邪魔しました。
サイトの回路図や写真を見ながら回路を組み立てたのですが、うまくいきません。
あやしいな、と思うところは回路図のDigital10のところが1kΩになっているところかと思います。
しかしながら、自分なりに組み合わせを変えて(4.7k 10k)実験したのですが、すべてfaildになるか、表示されません。

もしよろしければ、ヒントをいただけないでしょうか?

投稿: いわさ | 2010-01-26 22:17

先ほど申し遅れました。
ArduinoはATMEGA328Pでverusさんの所に掲載されてあった方法で、
”識別子__AVR_ATmega328P__をSDカードに対するピンマップ宣言っぽいところに追加”しました。
http://d.hatena.ne.jp/verus/20090916/1253105765

投稿: いわさ | 2010-01-26 23:56

いわささん、はじめまして(^-^)

当時はmega168でしたのでライブラリの違いについては言及出来ないのですが、上記回路での動作は確認出来てました。
実際どうアドバイスして良いのか分からないのですが、元のWaveShieldではCS端子に3.3Vを安定して制御させるためにツェナーとプルアップ抵抗を入れているようです。
http://ladyada.net/make/waveshield/design.html

現在WaveShieldのバージョンは1.1となっているようで、74HC125によってレベル変換しています。この方法を取り入れてみてはどうでしょうか?

もしくは簡単に4.7Kと10Kのみで(Digital11,13と同回路にして)制御してみても良いかと思います。

最近では、なんでも作っちゃう、かも。さんの「Arduinoで遊ぼう - SDメモリカードを読み書きする」という記事を参考にしてみると良いかもです。他力本願ですが(^^;・・・
http://arms22.blog91.fc2.com/blog-entry-294.html

投稿: SatE-O | 2010-01-27 07:31

アドバイス・参考URLありがとうございました。
コンデンサを交換したところ、無事に解決致しました。
お忙しいところお手数をおかけして申し訳ありませんでした。
これからもご活躍をお祈りします。
失礼致します。

投稿: いわさ | 2010-01-27 18:42

え、コンデンサなのですか(^-^;
パスコンの部分でしょうかね?
とりわけ無事動作されたようで良かったです。
頑張って下さい(^-^)

投稿: SatE-O | 2010-01-28 00:57

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: Arduino - ArduinoでSDカード:

« Arduino - Arduino 2009とEthernetShield | トップページ | Arduino - Arduino用容量倍化ATmega328P到着 »