気圧計bmp280-mega328   

 苦心の作(?)の気圧計が壊れました。センサーモジュールを取り外しても表示値が変わりません。モジュールはLPS25Hで、R8C/M12Aで、自前のI2Cを書いて完成させたものでした。モジュールを交換使用にも秋月では今は扱っていないようです。

 1 構 想  
 2 LCD表示  
 3 BMP280の実装  
 4 RTC DS3232  
 5 SDカード  
 6 基本機能の完成(一応) 
 7 回路図とスケッチ 
 8 機能の変更と追加(計測間隔・分未満四捨五入) 





 1 構 想   2018.06.17

 現在の主力気圧センサーはBMP280のようです。amazonで安価に購入できます。私に取って難点は、R8C/M12Aの自作のソフトウェアI2Cが使えないことと、直接読み取っても複雑な計算が必要なことです。
しかし、arduinoを使えばライブラリーがあって、簡単に計測値が求められます。一般にライブラリーは便利ですが使用メモリは多いように感じます。手持ちのmega328の32kBでどれだけ盛り込むことができるのか、その実感も兼ねて作ってみようと考えています。
仕様は、
 リチウムイオン電池を使用して可搬型とすること(省電力までは考えていない)
 RTC(DS3232を予定)を使い時刻と気圧、気温をLCDに表示すること
 メモリに余裕があればデータをSDカードに記録すること
を考えています。

手順として、ブレッドボード(3.3V電源)にBMPP280を取り付け、LCDに表示、次にRTCの設定と読み取りとLCD表示、最後にSD仕様の実験、を考えています。  
1 構 想  おわり top



 2 LCD表示    2018.6.17

 気圧センサーとSDカードを考えれば3.3V駆動になります。LCDは手持ちが5Vですからうまく繋がりません。以前に3.3V用のLCDを作って置くと便利だと考え、74LS04で3.3Vの矩形波を作り、整流によってマイナス電源を準備する3.3V用LCDを使うことにしました。メインCPUで発振させると回路が簡単になりますが、配線が若干複雑になります。個別部品で完成度の高いものが楽なのでこれを使うことにしました。

日本語リファレンスに出ているLiquidCrystal()ライブラリーの通り接続して、指示通りのスケッチで文字の表示が確認できました。  
2 LCD表示  おわり top



 3 BMP280の実装    2018.6.17

 モジュールは以前に購入してピンをはんだ付けしてあるものを使いました。

これをI2Cで使うには、CSBとSDOをVccに接続すればよいとのことです。
ライブラリーは #include <Adafruit_Sensor.h>  #include <Adafruit_BMP280.h> とありますので、
Adafruit_BMP280 と Adafruit_Sensor-master をダウンロードしました。
プログラムは難解で私には理解できませんが、手本の通り書くと簡単に温度と気圧が得られます。どこがどうなっているのかわかりません。  
3 BMP280の実装  おわり top
 



 4 RTC DS3232    2018.6.18

 RTCは以前にモジュール化(?)したものを使いました。
ソケットに挿せるようにピン(真鍮線)をつけて、バックアップ用のリチウム一次電池を取り付けているだけです。
この時計は実に正確で、1年間放置してもいくらも狂いません。確かな数値は忘れましたが1年に2分以内だったと思います。
データシートによると2ppmですから、1年に64秒、1分強ということになります。一般には出回っていないようで、メーカーからの購入はかなり高価になっています。
かなり以前にサンプルとして頂いたものですが、本当によくできた製品だと思います。
今新規に考えるなら、amazonのDS3231がよいのかもしれません。

この扱いも、ライブラリーが充実していて、私には理解困難ですが、簡単に時刻を読み取れます。また、時刻設定も提供されているルーチンで、UARTを通じて、yy,m,d,h,m,s をコンマ区切りで送ると簡単にできます。

(2018.06.22追記) RTCをDS3232M(Mがついたもの)がありましたので使ってみました。今は、NよりもMが主流の感じがします。Nは2ppmですが、Mは5ppmだそうです。1年に2分半ほど違いが出るそうです。

Sに比べるとパッケージが小さくなり、また8本足と少なくなっています。
リードでCR2032をぶら下げてoff時のバックアップをしています。
ライブラリーはSと変わらずそのまま差し替えて実行できます。もっともDS3231でも使えましたが。
上にも書きましたが、ライブラリーが難解で、小細工をしたいのですが手のつけようがありません。



 
4 RTC DS3232  おわり top
 



 5 SDカード    2018.6.19

 マイクロSDカードのフォルダは以前のまとめ買いのものを使いました。小さくまとめたかったので、最小の基板に接着剤で貼り付けてピンを付けました。
ピン配置は今までの購入モジュール・自作フォルダと同じにしています。

arduinoのライブラリーで書き込むことができれば、極めて多くのデータを蓄えることができます。記録メデアが満杯になる心配もありません。
記録容量が大きければ、単位データが冗長であっても耐えられますからデータが単純ですみます。
一つのデータごとに 「年月日」と書き込んでも容量を心配することがありません。例えば、50バイトのデータを10秒ごとに1年間書き込んでも157MBです。2GBのSDなら何年使えるでしょうか。
また、テキストファイルで作れれば読み出しに一般のアダプタ(リーダー)が使えて便利な上、エクセルに乗せることも簡単です。

(2018.06.22追記) スペースを小さくするために、基板上に直接SDフォルダを取り付けました。

両面スルーホール基板のため、裏面での不要なショートを避けるためにカプトンテープで絶縁しています。(絶縁しないとSDカードフォルダの端子間隔が短いので大きなランドで不要接触の危険があります)
細かな端子のはんだ付けにはΦ1mmの1C鏝先が役に立ちました。
 
5 SDカード  おわり top
 




 6 基本機能の完成(一応)    2018.06.22

 気圧センサーBMP280、RTC DS3232M、SDカード記録、の基本的な動作はブレッドボードでは確認していましたが、少しずつテストしながら基板上に作り上げて来ました。


左側の上下に2つのタクトSWが並んでいますが、上が通常のリセットSWで、下のスイッチONの状態でリセットするとシリアルで時刻設定できるルーチンが作動します。時刻を合わせたいときは、下スイッチONでリセットして、Teratermで、yy,m,d,h,m,sをコンマ区切りで書き込みます。
右のSDカードの下にあるスイッチは「分未満四捨五入」のために準備したものです。右上に赤と黄色の2つのLEDがありますが、プログラムのテスト用に空いたGIOに接続したものです。

私としては、結果的に高密度配置となりました。また、ポートも2つを残すだけであとは使用しています。

リチウムイオン電池で可搬型として動かせ、また、低電圧のRTCとSDカードのために3.3V動作としています。安定化のために、三端子レギュレーターを使いますが、NJM2845DLは実に素晴らしい製品です。ドロップ電圧が0.18Vと小さいので電池が有効に使えます。これが0.5Vになるとリチウムイオン電池がほとんど使えなくなります。電源から3.34V加えたときもOUTが3.29Vありましたから3.3V電源でも問題なく動作します。

細かな設計は後まわしで、1秒毎に表示を更新し、シリアルとSDカードには10秒ごとに年月日時刻、温度、気圧を出力しています。

現在のテスト状態で、mega328の、ROM75% RAM62%を使っています。なお、ヒュースは FF D9 FF となっています。

LCDは7404で発振を行い、整流によってマイナス電源を作り、3.3V用に改造したものを使っています。

 
6 基本機能の完成(一応)  おわり top
 




 7 回路図とスケッチ    2018.06.23

回路構成はこの様になりました。


また、スケッチ(プログラム)をここに置きます。ここには次の「計測間隔の変更と分未満四捨五入スイッチ」が含まれています。

プログラムはArduino-IDE(1.8.5)を使い、Arduino pro mini (mega328p 8MHz)でコンパイルしていますが、ブートローダーは使わずプログラマ(pic18spx)で書き込んでいます。なお mega328p のヒュースは上にも書きましたが F7 D9 FF としています。
 
7 回路図とスケッチ  おわり top
 




 8 機能の変更と追加(計測間隔・分未満四捨五入)    2018.06.23

計測・表示ルーチンは1秒間に何回もループしていますが毎回表示はちらつきますので1秒に1回としています。計測の「秒」の数値が変わったときだけ表示して、1秒に1回としています。前の回の「秒」を記憶して、今回の「秒」と違ったときだけ表示します。

シリアルとSDカードへの記録はテスト用に毎秒1回(表示と同じ)としていましたが、その必要がないので10分に1回としました。フラグが立っていて、かつ、分の「一の位」がゼロのときデータを記録してフラグを倒し、分の「一の位」が9になると次に備えてフラグを立てています。

分未満四捨五入のスイッチを有効にしました。RTCの精度が高いので大幅な時刻調整は必要ありません。公称月差15秒ですから、1,2分の誤差までかなりの時間があります。29秒以下切り捨て で 30秒以上切り上げ のスイッチがあればPCによる時刻設定はほとんど必要ありません。
ライブラリの理解が困難ですから、ライブラリを使わず直接 Wire ルーチンでRTCレジスタに書き込んでいます。
    // 分未満四捨五入
    if (digitalRead(15) == HIGH) digitalWrite(14, HIGH);//関係ありません
    if (digitalRead(15) == LOW) {//スイッチが押されたら
	 //(wire.begin が最初にいるはずですが、ライブラリで宣言されているようです)
      digitalWrite(14, LOW);//パイロットLED
      min2 = minute();
      if (second() > 29) min2++;//秒が29を超えると分をインクリメント
      min2 = (min2 / 10) * 16 + min2 % 10; // int to BCD
      Wire.beginTransmission(0x68);//RTC 7ビットアドレス
      Wire.write(0); // 秒のインナーアドレス
      Wire.write(0); // 秒のレジスタに0を書く
      Wire.write(min2); // 分のレジスタに数値を書く
      Wire.endTransmission();//Wire終了
      setSyncProvider(RTC.get);   // the function to get the time from the RTC ←ライブラリルーチン
    }
この機能があると時刻調整が楽になります。


最終的にこのような姿になりました。

 
8 機能の変更と追加(計測間隔・分未満四捨五入)  おわり top
 


























 1    2018.

 
1  おわり top
 






















工事中














  

inserted by FC2 system