2017年4月1日土曜日

FlashAir+Arduino+Raspberry Piで温湿度計(2):iSDIOを使いながらSDカードを読む

[This report is also available in English.]

もくじ
  1. 準備〜センサから値を読む
  2. iSDIOを使いながらSDカードを読む
  3. Arduino から Raspberry Pi に測定値を送る
  4. Raspberry Pi で見える化する〜完成

前回はDHT22で温度と湿度を計測しました。

今回は計測結果を送信、、、と言いたいところですが、その前に FlashAir の iSDIO ライブラリを改造します。

FlashAir の iSDIO と SDカード機能を両立させる

FlashAir Developers のチュートリアルに従うと、FlashAir で iSDIO を使って HTTP 接続できます。
FlashAir Developers:Arduino 向けチュートリアル

ところが、このチュートリアルでは SD カードアクセス機能が殺されています。
このチュートリアルのソースを使っていると Arduino 標準の SD カードライブラリが動作しなくなるので、自力でライブラリを改造する必要があります。

  1. まず、チュートリアルのソースコードをダウンロードしてZIPを解凍します。
    arduino_tutorial_06.zip
  2. Arduino の標準 SD カードライブラリから、次のファイルを解凍後の「iSDIO」フォルダ内にコピーします。
    File.cpp, FatStructs.h, SdFatUtil.h, SdFile.cpp, SdVolume.cpp。
    さらに、SD.cpp, SD.h をそれぞれ SDExt.cpp, SDExt.h という名前に変えてコピーします。


    コピーが終わると iSDIO フォルダは次のようになります。
  3. iSDIO フォルダの SDExt.h, SdFat.h, SdVolume.h を開き、「Sd2Card」という単語を全て「Sd2CardExt」に置換します。
  4. iSDIO フォルダの File.cpp と SDExt.cpp を開き、「SD.h」を「SDExt.h」に置換します。
  5. iSDIO フォルダを ZIP 圧縮します。
  6. Arduino IDE で次のメニューを選んで ZIP ファイルを読み込みます。
    スケッチ > ライブラリをインクルード > .ZIP 形式のライブラリをインストール

出来上がった iSDIO ライブラリを GitHub に置きました。
GitHub - onthehand - iSDIO


改造した iSDIO ライブラリの使い方

改造した iSDIO ライブラリで FlashAir のストレージにアクセスする場合は次のようにします。
#include 

void loop() {
  File file = SD.open("file.txt", FILE_READ);
       :
  file.close();
  delay(1000);

具体的には、「SD.h」を include する代わりに「SDExt.h」を include しています。
また、SDカードへのアクセス後に delay を挟んでいます。
理由はよく分かりませんが、SDカードにアクセスした直後にWiFi にアクセスすると不安定になるようです。
それ以外は通常の SD.h の使い方と同じです。


改造した iSDIO ライブラリで FlashAir の WiFi を使う場合、
FlashAir Developers のチュートリアルから次の点を変更します。
  • 「utility/Sd2CardExt.h」ではなく「SDExt.h」を include する。
  • 「Sd2CardExt card;」をグローバルで宣言しない。
  • 「card.readExtMemory」など cardオブジェクトを使っているところを
    全て「SD.card.readExtMemory」など SD.card に変更する。

    そもそも Sd2CardのcardオブジェクトはSDクラスのメンバ変数です。
    SDクラス(SDExtクラス)が使えるようになったのでメンバ変数としてアクセスする必要があります。
    外部から直接 card オブジェクトにアクセスすると挙動がおかしくなるので。


ようやく準備が揃ったので、次回では WiFi でセンサデータを送信します。

0 件のコメント:

コメントを投稿