esp32でSDcardに書き込んでみる
esp32(esp-wroom-32)を使ってsdカードに書き込みをしてみました。
当初、SDカードを認識してくれず、認識しても書き込んでくれず、arduinoとして使えるesp32ですが、ちょっと違ったところもあるようです。
ということで、esp32を使ったSdcardについてまとめてみました。
esp32を使ったsdcard トラブル
sdカードを認識してくれない場合や、書き込めないなどのトラブルと解決策をまとめてみました。
ピンモードを指定したり、プルアップ抵抗をつけたり…と無駄な抵抗を繰り返しましたが結局、何もせずに書き込みが出来るようになりました。
SDcardを認識しない
カズがハマったのが時々認識したり、しなかったりということでした。
SDカードは2GBを使いましたが、一度だけ認識して、後は全く認識してくれませんでした。
そこで、SDHC16GBに替えてみましたが結果は同じでした。
結論は複合要因のようです。
SDカードを認識しない場合には
- SDカードリーダーを替えてみる。
- SDカードを初期化してみる。
これで、SDカードを認識するようになりました。
SDカードリーダーは接点が大事なようです。
この製品は3.3Vでも動作しますのでesp32から電源を引けますね。
また、SDカードを初期化してみるか、新しいSDカードに替えてみるのも方法です。
SDカードのファイルシステムは
2GBまではFAT16
4GB~32GBまではFAT32
で初期化します。
カズはこの2つの方法でSDカードを認識してくれるようになりました。
SDカードに書き込めない
SDカードを認識するようにはなりましたが、認識することと、書き込みは別の問題です。
これの解決法はスケッチ(プログラム)のようです。
cs(チップセレクト)の指定には単純に整数型であるintで指定しました。
int cs_SD = 5;
整数型での指定はarduinoで使ってきましたが、esp32でも使えるようです。
一方、esp32では厳格なところもあって、ファイル名とディレクトリを指定しておかないとエラーになるようです。
const char* f_name ="test1.txt";
これだとSDcardは認識しますが、書き込みは失敗します。
const char* f_name ="/test1.txt";
このように階層が判るようにしなければいけないようです。
SDカードに一行だけ書き込む
arduinoでSDcardに書き込むにはFILE_WRITEを用いますね。
FILE_WRITE: 読み込みと書き込みを目的に開きます。ファイルの末尾から処理をはじめます
しかし、esp32でFILE_WRITEを使うと常にファイルの頭から書き込みをするようです。
結果、一行だけの書き込みとなります。
これを避けるにはFILE_APPENDを使います。
myFile = SD.open(f_name,FILE_APPEND);
esp-wroom-32 SDcard pinMAP
esp-wroom-32とSDcardの配線はこのようになります。
SD MOSI → esp-wroom-32 GPIO 23
SD MISO → esp-wroom-32 GPIO 19
SD CS(SS) → esp-wroom-32 GPIO 5
SD SCK → esp-wroom-32 GPIO 18
SD VCC → esp-wroom-32 3.3V
SD GND → esp-wroom-32 GND
SDスケッチ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | # include <SD.h> int cs_SD = 5; const char* f_name = "/test1.txt" ; int bangou = 0; File myFile; void setup() { Serial.begin(115200); } void loop() { SD.begin(cs_SD); Serial.println( "SD_conect..." ); delay(10); if (!SD.begin(cs_SD)){ Serial.println( "Card failed" ); } //------------------------ if (SD.begin(cs_SD)){ Serial.println( "card ok!" ); myFile = SD.open(f_name,FILE_APPEND); bangou++; if (myFile){ myFile.println( "" ); myFile. print (bangou); myFile. print ( " : test kakikomi OK!" ); Serial. print ( "" ); Serial. print (bangou); Serial. print ( " : Card kakikomi ok" ); myFile.close(); } else { Serial. print ( " : Card kakikomi shippai" ); } delay(1000); } |
SDcardの認識とSDcardの書き込みを分けています。
認識はするが書き込めていないことがあったので原因究明のためです。
下手なスケッチはご愛敬ということで (;^ω^)
書き込みの結果は….
これで温度や湿度センサーからのデータをSdcardに記録出来ますね。