秋月電子で、マイクロSDカードスロットDIP化キット(AE-MICRO-SD-DIP)を買って、Arduinoとつなげ、温度湿度を記録しようと考えた。ところが、マイクロSDカードの読み書きがなかなかうまくいかない。いろいろ工夫し、何とかそれなりに使えそうになってきた。それを記録しておく。(ちなみに、秋月のこの商品のマニュアルはとても情報量が少ない。たくさんの秋月の商品を利用してきたが、このマニュアルは秋月にしては残念過ぎる。)
SDライブラリのサンプルにあるReadWriteを使う。配線も書いてある通り、 SDO - pin 11、 SDI - pin 12、 CLK - pin 13である。 CS - pin 4でいいが、空いているI/Oポートで変えても構わない。この場合はスケッチもそのピンNo.に合わせて変える必要がある。あとはGND。最も問題になるのは3.3Vであろう。私は、UNOの改造版の3.3V、8MHzのものを使った。5Vであれば、いろいろ工夫が必要であろう。ロジックレベル変換モジュールを使う(https://qiita.com/hikoalpha/items/c7812a34182db07036ef)のがいいであろうが、抵抗だけで分圧を使っても十分であろう(https://deviceplus.jp/arduino/entry021/)。
以下、うまく読み書きできない状態から、読み書きできる確率が上がっていった工夫を列挙してみる。ただし、まったく関係ないものとかもあるかもしれないが、あくまでもこれらをした結果、読み書きの確率が上がった。比較的安定的に読み書きできるようになった。さらに丁寧に条件をそろえればより確定的なことが言えるだろうが、そこまでのことはしていない。
◎ パソコンでFORMATしてから読み書きするとよい。うまく読み書きできなくなったら、また、FORMATすればよい。
◎シリアルモニタ(パソコンを使って、ArduinoIDEを使って)を開いたまま、スケッチをArduinoに書き込むと、うまくいかないことが多い。シリアルモニタをOFFにし、スケッチが書き終わるまで待ち、その後シリアルモニタをONにすると、うまくいくことが多い。
◎書く前にOPEN、そして書く、そしてCLOSEする。書いたあと、終了処理(Close)せずに終わると、その後の読み書きがうまくいかない。そんな時、FORMATしなおすことが必要になる。
◎スケッチでvoid setup(){ の前に const int chipSelect = 4; がある。そしてvoid setup() { の部分に pinMode(chipSelect,OUTPUT); を追加した。もともとのReadWrite.ino にはないが、いろいろ調べると、これを加えているものがあった。これは加えたほうがいいだろうと思って加えたが、やや不明? もともとないので、不要なのかも?SPI接続でほかのSPI接続の機器がない場合、SDのCS端子はGNDでもいいらしい。しかし拡張性を考えると、コントロールできるようにきちんとArduinoのどこかの端子に接続しArduinoでコントロールできるようにしておくべきだろう。digitalWrite(chipSelect,LOW) ; をOPENの前に置き、意識的に機器を指定しておいたほうがいいように思う。実際にdigitalWrite(chipSelect,LOW); を書いて試してみたが、正常に動く。(ついでながら、closeの後に digitalWrite(chipSelect,HIGH); も書いても、もちろん動く。open の前に digitalWrite(chipSelect,LOW); があれば。)複数のSPI接続機器の場合、pinModeとかdigitalWriteとかで機器をコントロールする必要があるだろう。
◎GNDと3.3Vの間にパスコン0.1uFを入れると安定するとのことで、入れてみた。入れなくてもいいか?入れても悪さはしないだろう。
◎SDI端子は10kΩでプルアップしておくと安定するとのことで、入れてみた。入れなくてもいいか?
◎マイクロSDカードを何度か出し入れする。実際これで動き始めることがあるが、こういうことで動き始めるのは正直とても困る。
◎void setup(){ }の中の始めのほうに以下を入れておく。
if (!SD.begin(chipSelect)) {
delay(100);
while (!SD.begin(chipSelect));
}
この状態で、SD.begin がうまくいかないとき、マイクロSDカードを一度抜き、再び入れると、SD.begin がうまくいくことが多い。SDへの読み書きができるようになる。一度、うまくいくと、SDを抜かない限りSD.begin はかなりの確率でうまくいく。うまくいかなかったら、再度、マイクロSDカードを抜き差しする。
◎Arduinoをresetする。
◎Arduinoに別のスケッチを書きこんでから、再度、目的のスケッチを書きこんで、実行する。
0コメント