2019年1月10日木曜日

ArduinoにPmodSDを接続してSDカードの読み書きをする

Digilent社のPmodSDをGetしたので、Arduino UNOに接続してファイルの読み書きを行います。
今現在はPmodSDはあんまり売っておらず、秋月ではPmodMicroSDなら買えるようです。ピンアサインは変わらないのでPmodMicroSDでもこの記事と全く同じことができます。

ライブラリはArduino IDEに標準で入っているSDカード用ライブラリを使います。




ArduinoにPmodSDを接続する

リファレンスを見ると、PmodSDの回路図は以下のようになっています。
全部で12ピンですが、Arduino IDE標準のSDライブラリはSPIモードでの通信なので1~6ピンまでしか使いません。

PmodSDの1ピン(CS)をArduinoの4番ピンに接続します。CSはチップセレクトピンで、SSピン(スレーブセレクトピン)とも言われます。SPI通信でどのモジュールに接続するかを選択するピンです。

PmodSDの2ピン(MOSI)をArduinoの11番ピンに接続します。MOSIはMaster Output Slave Inputの略です。

PmodSDの3ピン(MISO)をArduinoの12番ピンに接続します。MOSIはMaster Input Slave Outputの略です。

PmodSDの4ピン(SCK)をArduinoの13番ピンに接続します。SCKはSPI通信でのクロックの役割をはたします。

MOSI、MISO、SCKの接続ピンはArduinoMEGAの場合は異なりますので一番下の補足を見てください。

PmodSDの5ピン(GND)をArduinoのGNDピンに、PmodSDの6ピン(VCC)をArduinoの3.3Vピンに接続します。


SDカード読み書きのスケッチ例を開く

Arduino IDEのファイル→スケッチの例→SD→ReadWriteを開きます。

SDカードにtest.txtというファイルを作成し、そこにtesting 1, 2, 3.と書き込み保存し、さらにそのテキストを読み取って表示するスケッチです。

以下にスケッチの例を記述しておきます。
/*
  SD card read/write

 This example shows how to read and write data to and from an SD card file
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4

 */

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

File myFile;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop() {
  // nothing happens after setup
}


このライブラリではSPI通信でSDカードと通信するため、#include <SD.h>のほかに#include <SPI.h>をインクルードします。
File myFile;でファイルディスクリプタを保存するための変数を定義しています。
SD.begin(4)でArduinoの4番ピンをSPI通信時のPmodSDのチップセレクトに定義して通信可能にしています。
myFile = SD.open("test.txt", FILE_WRITE);でtest.txtというファイルを読み書きモードで開いています。
myFile.println("testing 1, 2, 3.");でtest.txtに「testing 1, 2, 3.」を書き込んでいます。
myFile.close();で開いたファイルをクローズします。
myFile = SD.open("test.txt");では読み込みモードでtest.txtを開いています。モードを指定しないと読み込みモードになるようです。
myFile.available()はファイルから読み込み可能なバイトがあればtrueを返します。
myFile.read()はファイルから1バイト読み取っています。


スケッチを書き込んで実行する

スケッチを書き込んで実行してみます。スケッチをコンパイルして書き込んでシリアルモニタを開きます。11080バイトのフラッシュメモリと1012バイトのRAMを使用しているみたいです。

シリアルモニタはこんな感じです。

ちゃんとSDカード内にファイルが作成されていましたが、なぜか全部大文字です。

ファイルの中身はちゃんと書き込まれていました。


補足

CSはArduinoの4番ピン以外に接続して、SD.begin()の引数で接続したピンを指定することもできます。ただしその場合は10番ピン(ArduinoMEGAなら53番ピン)だけは出力にしておく必要があります(10番ピンにCSをつないでSD.begin()で10を指定してもいいです。というか、SD.begin()で引数なしにすれば、デフォルトで10番ピンがcsという設定になります。)。
またArduinoMEGAを使う場合は、MOSIは50番ピン、MISOは51番ピン、SCKは52番ピンにつないでください。


今回やったことと、前にDHT11で温度・湿度を取得する(DHT11を使ってArduinoで温度と湿度を取得する)のを合わせて、SDカードへの温度・湿度データロガーでも作ってみたいと思います。

0 件のコメント:

コメントを投稿