SDカードに書き込む

まずSDカードシールド(シールドとは、いろいろ部品の載った基盤と思ってもらえばよいです。「モジュール」とほぼ同じ意味で使っていますが、Arduinoにピッタリはまるように形作られた基盤のものをシールドと呼ぶことが多いようです)を買って下さい。いろいろ売っていますが、管理人は下記の3種類を使っています。

 

①シールドその1

マイクロSDカードが挿せます。5V入力専門です。Arduino UNOは5Vで動くので問題ありませんし、3.3V出力端子もあります。Arduino Pro Mini 3.3V 8MHzで使うときは、3.3V系なので、そのままでは使えません。少しいじると(5V -> 3.3V電圧レギュレータをバイパスする)使えるとは思いますが。これに気付かず、秋田の堤防でサクション計測を行ったときは数週間無駄にしました。

 

 

②シールドその2

マイクロSDカードが挿せます。3.3V向け。一番小型で、最近のお気に入りです。

 

 

③シールドその3

フルサイズSDカードが挿せます(マイクロSDを買ったときによくついてくるアダプタにはめれば、マイクロSDカードも使えます)。5V・3.3Vそれぞれ向けの端子があり、どちらでもいけます。個人的な意見ですが、こいつはなぜかよく壊れる気がします。

 

 

なお、SDカードは64GB以上だとSDXC規格になります。SDXCは使えないようでした。32GB以下のものを用意してください。また、SDHC規格でも、相性とでもいうのか、16GBや32GBだと機能しない場合もあります。8GBくらいのSDカードを用意するとよいです。

 

SDカードシールドとArduinoは6本の線でつなぎます。以下のようにつないでください。ここでは②のシールドでいきましょう。

 

(Arduino側)―(SDカードシールド側)

   13                CLK (SCK)

   12                MISO

   11                MOSI

   10                CS

   3.3V             3.3V (5Vのシールドに対しては「5V」という出力端子がArduinoにあります。3.3Vのすぐ隣り)

   GND             GND

 

ここで、Arduinoのピン10~13は、A0~A5とは異なり「A」とついていません。これらはデジタルピンで、汎用入出力GPIO(General-Purpose Input Output)とも呼ばれます。Aとついているアナログピンとは異なり、入力された電圧がHighかLowかしか判断できません。また、逆にHigh(5V)かLow(0V)を出力することもできます。これを通じて、周辺機器(ここではSDカード)と信号を交換し、データのやり取りするのです。

 

参考1:Arduino UNOではなくArduino MEGAを使用する場合

SPI通信用(後述)のデジタルピンが異なります。

UNO: 10 (CS)、11 (MOSI)、12 (MISO)、13 (CLK)

MEGA: 50 (MISO)、51 (MOSI)、52 (CKS)、53 (CS)

 

前回から電池はピンA0につないだままとして、その電圧値を記録しましょう。写真は②のシールド(3.3V)の例、図は③のシールド(5V)を使った例です。

 

 

 

 

 

 

 

ここまでハードの準備ができたら、以下のコードを書き込んで下さい。このコードでは、ファイルはAppendモード(書き足し)となるので、過去のデータは自分で消さない限り永遠に消えません。

 

#include <SPI.h> 
#include <SD.h>

const int chipSelect = 10; // Arduino UNOでは10、Arduino MEGAでは53

void setup(void)
{
    /* ----- Setting up serial communication with PC ------ */
    /* ここでUSBを介してPCとシリアル通信を始める。9600はシリアル通信のボーレート */
    Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
    //何らかの問題があってシリアルポートに接続できないときは、このループにトラップされる    
    }

    /* ----- Initialisation of SD card ------ */
    Serial.print("Initializing SD card...");
     //see if the card is present and can be initialized:
    if (!SD.begin(chipSelect)) {
       Serial.println("Card failed, or not present");
       // don't do anything more:
      return;
    }
    Serial.println("card initialized.");
}

void loop(void)
{
    int ainput; //読み取ったbit数:intは整数
    float vinput; //bit数を電圧に変換したもの:floatは浮動小数点数

    /* データの読み取り */
    ainput=analogRead(A0); //ピンA0から電圧をbitとして読む
    vinput=5000.0*ainput/1024; //上記を電圧mVに変換
    //ここで5000.0でなく5000とすると、整数としてvinputにキャストされてしまう)
    //粗い値になったり、おかしな値になったりする

    /* PCのシリアルモニタに表示 */
    Serial.print(ainput);
    Serial.println(" bit"); //" bit"と表示、printではなくprintlnとすることで改行する
    Serial.print(vinput);
    Serial.println(" mV"); //" mV"と表示、printではなくprintlnとすることで改行する

    /* SDカードに書き込み */
    File dataFile = SD.open("datalog.csv", FILE_WRITE);
    if (dataFile)
    {
      dataFile.print(ainput);
      dataFile.println(" bit"); //" bit"と表示、printではなくprintlnとすることで改行する
      dataFile.print(vinput);
      dataFile.println(" mV"); //" mV"と表示、printではなくprintlnとすることで改行する
    }    
    dataFile.close();
    
    delay(2000); //2000ミリ秒=2秒の停止
}

 

Arduinoへのコードの転送が済んだ時点から動作は開始しますが、シリアルモニタを開くとリセットされ、最初からまた始まります。シリアルモニタに以下のような画面が見えると思います。

 

ここでSDカードを抜いて(Arduinoを止めないで抜いても基本的には壊れることはありません・・・たぶん。よっぽどタイミング悪いときに外さない限り)、PCに挿すと、電圧値がテキストファイルとして残っていることがわかります。

 

 

ちなみに、SDカードの読み書きは、カードが認識されず手こずることが多いです。もしSDカードが認識されずうまくうかないときは:

・SDカードがSDXC規格でないかもう一度確認してください。SDHC規格でも、8GB以下のものを試してみてください。

・FAT32でフォーマットしてみてください。Windows PCでSDカードのドライブを右クリックして「フォーマット」からFAT32を選べます。

・接続を確認してください。

 

参考2:SDカードとマイクロSDカード

SDカードとマイクロSDカードはどちらがよいか?単に形が違うだけですが、後者はアダプタにはめることで前者になるので、同じくらいの値段なら後者を選ぶとよいと思います。しかし・・・フィールドで細かい作業していると、指から滑ってカードを草むらに落とすことがたまにあります。マイクロSDは、小さすぎて落とすとまず見つかりません。せめて、同じくらいの価格なら派手な色のものを選ぶとよいでしょう(SanDiskの灰色と赤とか目立ちますね)。

 

参考3:SPI通信とI2C通信

SDカードとマイコンは、SPI通信と呼ばれるプロトコルでデータ通信をします。SPIはI2Cとならんで、マイコンでよく使われる周辺装置との通信方法です。モトローラ社が開発したとのことです。SPIは、CS(Chip Select)という端子を周辺機器(この例ではSDカード)ごとに一つ使って通信先を区別するようです。いうならば、糸電話を5つもって、それぞれの先を5人に渡して、「お前!」「次、お前!」と一人ずつ呼ぶようなものです。個々に呼び出し線があるので、周辺機器にそれぞれ固有の名前は要りません。自分が呼ばれているとわかります。逆に、I2C(アイスクエアシーと読む:フィリップス社が開発)は、周辺装置にそれぞれ固有のアドレスがあるので、「田中!」「山田!」と呼べるようなものであり、すべて芋づる式に共通線で接続できます。その代わり、同じ固有のアドレスを持った周辺措置を2台以上つなげません。地盤工学で使うようなものとしては、SPI通信のモジュールとしてはSDカードシールド以外には熱電対アンプなどがあります。他はI2Cのほうが多いような気がします。では同じI2C装置を複数台使うときはどうすればよいのか?それには、I2Cマルチプレクサーというスイッチング装置があります。後の回で紹介したいと思います。