2018年1月23日火曜日

ArduinoでSD記録ロガーを作ってみよう

井戸ポンプ用制御回路をArduinoで作りましたが動作状況は次のように確認できます。
1.本体のLED
2.Bluetoothで測定温度と10秒間平均値をモニター
リアルタイムでの確認の他にはBluetooth経由でタブレットに記録を残すことはできます。

一日の動作状況を確認したいのでSDメモリーにログが残るようにしたいと思います。
今使用しているArduino_pro_minのプログラムメモリーは十分な記憶容量が残っているので、機能を追加する事にします。

Arduinoにはタイマー機能がないので外部RTCと記録用のSDアダプタをamazonで手に入れました。
(ブレッドボードで試作し動作確認を行っています)
右から、Arduino_Nano、RTC(DS3231)、SD、真ん中手前がレベル変換器
電源はPCのUSBから供給しています。


後はArduino_IDEのライブラリーからRTCとSDのスケッチを参考にして作成するだけ。
(合体するだけです。ははは・・)

RTC用スケッチの改造点はRTCの年~秒のデータをシリアルポートに垂れ流しているのを一つの文字列に合体してからシリアルポートに出力することです。
SD用のスケッチからライブラリーとファイルオープン・クローズ関係の記述をRTC用スケッチに移植します。SDへの記録データは先に作った文字列をそのまま使用しました。
実験なので途中で電源を切ってもデータが確実に残るよう、データ1個毎にファイルのオープン・クローズを行っています。
delayを1000mSとしているのでファイル処理の時間分の遅れが蓄積し7~8秒に1回取りこぼしが発生しています。


参考にさせていただいたのは↓です。ありがとうございました。
   https://ht-deko.com/arduino/rtc_ds3231.html
   https://qiita.com/hikoalpha/items/c7812a34182db07036ef

メモ
#include <DS3231.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
File myFile;
DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;
byte year, month, date, DoW, hour, minute, second;
int temperature;
int das[10];
char* dat[]={"-","-"," ",":",":"," "," "};
void setup() {
Wire.begin();
Serial.begin(9600);
   while (!Serial) {
    ;
   }
   Serial.print("Initializing SD card...");
   if (!SD.begin(4)) {
     Serial.println("initialization failed!");
     return;
     }
   Serial.println("initialization done.");
}
void ReadDS3231()
{
  das[5]=Clock.getSecond();
  das[4]=Clock.getMinute();
  das[3]=Clock.getHour(h12, PM);
  das[2]=Clock.getDate();
  das[1]=Clock.getMonth(Century);
  das[0]=Clock.getYear();
  das[6]=Clock.getTemperature();
}
void loop() {
  myFile = SD.open("test.txt", FILE_WRITE);
  ReadDS3231();
  String tes="20";
  for (int i=0;i<=6;i++){
  if (das[i]<10){tes.concat("0");}
  tes.concat(das[i]); tes.concat(dat[i]);
  }
  Serial.println(tes);
  myFile.println(tes);
  delay(1000);
  myFile.close();
}


2018年1月16日火曜日

5vと3.3vの電圧レベル変換

arduinoでSDカードの使用にはarduinoの信号(5V)とSDカードの信号(3.3V)を接続するためのレベル変換器が必要となります。方法としては5V側の送り信号を抵抗により分圧、3.3V側の送り信号はそのまま接続すればOKの様です。
そのほかにはレベル変換用の専用ICが有るようなので今後の事も考えレベル変換器を購入することにしました。

amazonでチェックすると4回路の物が260円で有ったので3個ほど購入し使ってみるとこれが動かない。3個ともダメなので別に購入した物を使うと正常動作でするので原因の調査を行うことに。
【赤=正常動作   青=不良】

5Vの信号として10MHzのVXOCを分周したTTL信号をレベル変換器に入力して動作チェック。結果は3.3Vに変換されるがオーバーシュートで5Vがおよそ1μS出力されていました。これではSDカード側が壊れてしまいます。


正常動作するレベル変換器ではしっかり3.3Vに変換されており、オーバーシュート・アンダーシュートはほとんど有りませんでした。


amazonの出品者に連絡を取ると返金処理していただけるとの事で良かったです。
今回の物は中国からの国際便で届きましたので中華製と思われますが、安くて良い物も在りますが玉石混同だなと思います。でもトラブル対応が非常に良かったのは救いですね。

2018年1月7日日曜日

井戸ポンプの制御とarduinoについて(2)

正月のうちに井戸ポンプの制御装置をほぼ完成させました。
駐車場の融雪用なので、気温に合わせた動きとした。基本的に雪は気温が3℃以下となった場合に降るそうなので3℃以下で動作するようにしています。
こんな感じです。
 1.3.0℃以上  不動作
 2.1.5~3.0℃ 5分間動作後に5分間停止
 3.1.5℃以下  連続動作
 4.手動でON-OFF操作可能
 1.5℃以下で連続動作としたのは散水パイプの凍結防止のためです。

 ポンプ制御装置は屋外に置くのでケースには防水が必要ですが簡単に作ってみました。
 材料は100均(セリア)で購入しました。黒い蓋付きボックスです。真ん中のLEDが赤く光っている箱と2種類を手に入れました。
         

arduinoを入れている蓋つき箱で、温度によってLEDが点灯します。
【左から青:1.5℃以下、緑:1.5~3℃、赤:3℃以上】

arduino_pro_miniがユニバーサル基盤上のコネクタに実装されています。
基盤にはarduinoのコネクタとLED点灯用の抵抗他が少々付いているだけです。

初代のセンサーです。LM-35とLM358を使って1℃当たり100mVとしています。この後、LM-35の取付方を変更しています。

井戸ポンプの電源入切の制御です。秋月の半導体リレー(20A)を使っています。負荷がモーターなのでゼロクロス・コントロール出来る所が気に入りました。
タッパーを加工して実装しました。絶縁重視です。

全部箱に入れたところです。

手前にarduinoの箱がありますが、その左側にオレンジ色のコードで温度センサーが繋がっています。
AC100Vを内蔵のコンセント(2個口)でポンプ用プラグとACアダプタを接続しています。
ここで問題が発生。半導体リレーの電圧降下分が熱となりほんのりと温かくなり、結果してケース自体が暖めれて温度センサーに影響が出るようでした。このためLM-35の取付方を工夫しケースの外に出しました。

だいたい上手く動いておりますが、この後、ソフトを改良し遊んでおります。
現在は温度検出を1秒間に1回実施し10回の平均値で動作を決める様にしています。また、1秒ごとの温度検出結果と平均をタブレットでモニターできるようにしています。
(Bluetooth経由です)

2018年1月4日木曜日

タブレット(LAVIE Tab)の電源が入らなくなったが・・・後に復活(修理)

 arduinoにはまり井戸ポンプ制御回路の動作確認を屋外で実施するため、久々にLAVIE_Tabを使おうと思い電源を入れたら全然起動しない。
 多分長期に渡り電源を入れていなかったのでバッテリーが完全放電したのだと思われる。
 一晩充電し再度起動してみたが反応が無い。少々焦り、ネットで再起動方法の情報検索をしたがLAVIE_Tabについては見つけられなかった。
 ASUSのTabと同じように色々とスイッチを操作したりリセットをかけても全然起動できなくあきらめ掛けた。(ここまで3日)

 最後は壊しても良いと思いつつ裏蓋を開けてバッテリーを一旦取り外し基盤の完全リセットを行う事とした。
 Tabを観察し蓋の外し方を考えた。
 USB端子やwindowsのスイッチがある黒い部分を基準にして、裏蓋に力を入れ後ろへズラスすと少し隙間ができたので、隙間に爪を入れユックリと本体-裏蓋を分離していくときれいに外れた。

 本体の裏に薄いバッテリーユニットが確認でき、基盤へ電池パックを接続するコネクタも発見した。
 コネクタは基板から浮かすように基盤側から爪で上に上げるとスルリと外れた。この状態で1~2分放置し再度コネクタを接続した。


 ドキドキしながら電源SWを入れたが反応が無い。やっぱり駄目かと諦め悔しさ紛れに電源スイッチを数回乱打したら画面にNECのロゴが出てビックリ。


 その後、サインイン画面に移行し無事起動できた。
 ちなみにバッテリーの充電状況は80%でした。(起動できるだけ充電しているのになぜ?起動しない?)
 レジューム状態でバッテリーが完全放電したので通常のリセットでは起動できなかったのかな?

 結果して多分ラッキーで復活したのだと思う。参考にされる場合は自己責任で行ってください。

 早速arduino_IDE_1.85を入れて使ってみよう。