電子工作初心者のESP32勉強会③~SD編~


前回

I2C編

SDカードを使う

ロケット電装ではセンサーで取得した値などの保存先が必要です。それが今回はSDを用います。
SDカードを用いるにあたってマイコン環境によっては内蔵されてる場合もありますが、多くの場合、モジュールを使うかなと思います。

配線は若干複雑で、I2C通信のようにシンプルな仕組みにはなっていませんでした。

準備物

-microSDカード CK-40
- ESP32
- 10kΩ抵抗 × 3
- 30kΩ抵抗 × 4
- ジャンパー線

SPI通信モード

センサーはI2C通信によってデータを取得しました。SDモジュールはSPI通信(Serial Peripheral Interface)を使います。今回は名前だけ覚えてもらえれば大丈夫だと思います。
SPI通信はI2C通信よりも複雑で、難しかったので割愛。(私もあまりわかってない)

回路

回路は以下の通りです。

追記
- MISOとSCKの接続が逆でした

左がESP32
右がmicroSDモジュール

PIN19から出ている線はプルアップしています。

コード

SDの基本となるコードは以下の通りです。
githubのreferenceを見ると、ライブラリの使い方が載っています。
https://github.com/esp8266/Arduino/blob/master/libraries/SD/src/SD.h

"hello world"を繰り返し、出力します。

densou.ino
//ライブラリを取得
#include <SD.h>

// CSを5に設定
const uint8_t cs_SD = 5; 

///ESP_Densou_test.txtというファイルがSDに生成される
const char* fname = "/ESP_Densou_test.txt";

int i = 0;

//Fileオブジェクトをfile(任意)と定義
File file;

//SD準備関数
void prepare_sd(){
// 連続書き込みモードでファイルを開く
  file = SD.open(fname, FILE_APPEND);

// 20回hello worldを書き込む
for(i=0; i<20; i++){
  //書き込み
  file.println("Hello world");

  //シリアルモニタに"Writing now"と表示がされる
  Serial.println("Writing now");

  // ファイルを閉じる
  file.close();
  delay(1000);  
}

//初期化関数
void setup{
//IDEのデータ通信速度を9600bpsとしてください
Serial.begin(9600);

//SDモジュールが接続できるか否か
if(SD.begin(cs_SD, SPI, 24000000, "/sd")){
  Serial.println("OK!");
}
else{
  Serial.println("NG!");
}
}

//ループ関数
void loop{
//SD準備関数実行
prepare_sd();
}

連続して書き換えたいなら、FILE_APPEND
一度だけの書き込みなら、FILE_WRITEにしてください。

fo = SD.open(fname, FILE_APPEND);

結果はHello worldが繰り返し、書き込まれているのではないでしょうか。

やってみよう

加速度センサーで取得した値などをSDに保存するコードを書いてみましょう。
センサーの取得はこちらの記事を参照に

データ

以下の画像は他のセンサーの値をSDに書き込ませた様子です。

シリアル通信でのご様子

SDでのご様子

参考文献

http://blog.livedoor.jp/sce_info3-craft/archives/9621848.html
この方がいなければ僕は未だ闇にさまよっていました。まさに救世主です。

次回

次回はモーターでも動かしていきますか