自作電子小物/温度・湿度データロガー/SDカード版
自作電子小物/温度・湿度データロガー/SDカード版
Thermo hygrometer SD logger mini
2009年7月25日土曜日
屋内環境用の温度・湿度データロガーです。データはメモリーカード”SDcard”に日時とともにCSV形式で記録されます。大きさはだし巻き卵ぐらいの手のひらサイズで、電源の無い所でも、独立して数ヶ月の連続記録が出来ます。表計算ソフトを利用すれば、簡単に温・湿度の推移をグラフ化したり、汎用的なデータフォーマットなので、ほとんどの分析ソフトウエアで取り込む事が出来ます。温度センサにはサーミスタ、湿度センサには高分子湿度センサHS15P、マイコンにCypress semiconductor社のPSoCを使用し、ソフトウエアはC言語にてコーディングしています。
<機能/特徴>
■測定場所・時間を選ばず、設置にも困らない
■SDカードを差し込むだけでロギング開始の簡単な使い方
■データに日時が入り、CSVなのでほとんどのデータ分析ソフトウエアに取り込める
2009年8月27日から11月10日まで、秋から冬にかけての二ヶ月半、2台分のデータを表計算ソフトMicrosoft Excelでグラフ化したものです。1台は10月から屋外での計測になっています。左側が一時間毎に集計した物ですが、細かすぎて大変見にくくなってしまいました。傾向がつかみにくいので、日単位にしたものが右側です。室内・室外とも、だんだん気温が下がっていく様子が見て取れます。11/4の外気温(ピンク)が急激に下がった日は、初雪でした。湿度は日で大きく変化しており、平均化すると段々上がっていくようです。
(データファイル:th-data.zip)
<仕様>
名称:「簡易」温度・湿度データロガー
分類:環境温度・湿度記録計(メモリーカード型)
対応メディア:SD card(変換アダプタでmini, microも可能)
ファイルシステム:FAT16、フォーマット済である事(FAT12,FAT32等は不可)
データ形式:CSV(カンマ区切りテキスト、行末コードはCR/LF)
ファイル名:固定”TH.csv”、既にファイルがある場合は追記されます
データ項目:日付、時刻(時分秒)、温度-20.0~80.0[℃] 0.1単位、湿度20.0~99.9[%RH] 0.1単位
精度:温度 誤差±5%以下、湿度 誤差±10%RH以下
サンプリング間隔:1秒、10秒、1分、1時間のいずれか
最大蓄積量:使用するSDカードの容量または約5000万サンプル以下。40byte/サンプル、例えば1GBのSDカードで1秒間隔にした場合、約9ヶ月分
本体表示項目:最新サンプルの「日時(年月日時分)、温度、湿度」、サンプリング間隔、記録中、書込み中、バッテリー状況
外形:幅66.5mm、奥行42mm、高さ42.5mm
電源:単3型乾電池×2本
動作時間: 約4ヶ月(充電池1.2V*2Ahで、1分間隔計測時の計算値)
製作費:約3000円ぐらい
<構成・方式>
出来れば、簡単に済ませたいのでデジタル出力の温湿度IC/モジュールにしたい所ですが、結構な値段がしますし、そんなに高級・高精度な小物でも無いので、とにかく安いものを探しました。
GE社のHS15Pという湿度センサが比較的安く入手出来き (実は部品箱の肥やし)、計測回路も何とかなりそうなので、使ってみる事にしました。このセンサは1V-1KHzの正弦波を加えると湿度と連動した抵抗値(インピーダンス)を持つと言う物です。
SDカードの関係からPSoCを使用する事に決めていた事から、PSoCブロック、CPUパワーを最大限利用し、外付け部品を可能な限り少なくなるように考えました。
インピーダンスの測定は、駆動電圧と電流測定用の抵抗Riの電圧を、整流・平滑・LPFなどの後処理をせず、そのまま3チャネルA/Dコンバータで同時に取込み、ソフトウエアで処理・計算します。一般的なマイコンでは通常1つのA/Dコンバータの入力を切り替える事で多チャネルを実現していますので、どうしても測定値に時間差があり、同時性が重要な場面ではソフトウエアで補正が必要になります。PSoCではA/Dコンバータを複数持たせる事が出来ますので、本当の意味で同時に取込みが実現出来ます。扱う信号は正弦波ですので、常に値は変化しサンプリングのタイミングは単純にはいきません。ですが、そもそもPSoC内で1KHzを作っていますので、トリガタイミングはコントロール出来るはずです。ところが、実際やってみると安定した値が得られません。 結局、原因を突き止めるまでには到らず、回避策として多サンプリングする方式にしました。なお、電圧と電流に位相差がなかったため、単純なオームの法則のみで計算可能でした。
校正はソフトウエアで行う方式です。
PSoC内部には温度センサが入っており、FlashTempユーザモジュールを使えば、外付け部品無しに環境温度を取得出来ますが、±20℃ではお世辞にも精度が良いとは言えません。精度を上げる方法はないものかと、色々試してはみましたが、あまり拘らないと思っていても許容出来る範囲を超えています。
そうなると外付けになりますが、やはりIC温度センサは値段も安いし、扱いも楽なので最適だと思います。
しかしながら、今回は、あえてサーミスタを使用しました。理由は、単に部品箱にあったのと、勉強のため1回は使ってみようと思ったためです。
サーミスタの使い方は難しいものではありません。単に温度によって抵抗値が変化するだけです。考える必要があるのはリニアな変化ではない所です。精度を落とさず処理しやすいように、直列抵抗を使い変化のカーブを鈍らせ、あとはソフトウエアで補正する単純な方法を使いました。補正は、テーブル参照+線形補間ロジックを使いました。
校正は、直列抵抗を半固定抵抗にする事により調整できるようにしましたが、湿度部と合わせてソフトウエア校正で良かったかもしれません。
サーミスタ使った評価としては、反応速度が速く扱いやすいので一般的にはとても良いと思うのですが、湿度センサHS-15Pはそれほど反応速度は良くないので、急激な変化中の誤差率が増えます。この「小物」としては選択ミスだったと思われます。やはり、サーミスタより安いIC温度センサで十分でした。
■メモリカード部
入手性の良さからSDカードを選択します。
SDカードの通信仕様は簡単なものではないようで、解読にはかなり時間がかかりそうです。また、ファイルシステムまで規定している訳ではないようで、事実上標準のFATファイルシステムも実装する必要があります。時間は惜しくはありませんが、今更、FATを実装するまで寄り道する気が起こらないので、標準でSD/MMCカードサポートモジュールが提供されているPSoCを使う事にしました。
※PSoC Designer 5 SP5以降では、SD/MMCカードサポートモジュールが削除されています。配置済みのプロジェクトを開いたり、ビルドする事は可能との事です。実際、SP5.5で動作確認できています。新規でPSoCでSDカードを利用したものを作ろうと考えている方は注意する必要があります。SD/MMCカードサポートモジュールが使われている既存のプロジェクトを開き、別の名前でプロジェクトを保存すれば、モジュールを利用する事は可能のようですが、Cypress社の本意ではないでしょう。2009.11.28
※SD/MMCカードサポートモジュールのサポート終了に対しては、同等の機能を新規開発する事にしました。最低限の機能に絞っており、APIも変更していますので乗り換えには既存アプリケーションプログラムの書き換えが必要ですが、コードサイズは若干小さくなっています。本「小物」ではバージョン0.2cとして公開しています。PIC18でも動きます。2010.01.18
■表示部
出来れば付けたくありませんでしたが、日時の入力を行うため何らかの表示装置が必要です。電池駆動が前提なので、LCDなのでしょうがマイコンから見直ししなければなりません。SC1602等のキャラクタLCDモジュールは、バッテリー駆動の場合、5V電源や消費電力5mW級の仕様は、微妙な部品でした。
そう言う事もあり、今年5月にStrowberryLinux社からSB1602B低電圧I2CインタフェースのキャラクタLCDモジュールが販売された時に、すぐ何個か買い置きしてしまいました。I2CでI/Oピン数が節約出来る上、アイコン表示が追加されており、同時表示できる情報量がぐっと増え表示設計が楽です。
SDカード使用と言う事で、3.3V系の電源を用意する必要があります。バッテリーも出来るだけ少ない本数の方がサイズ的に有利なので、DC-DCコンバータの登場となります。
他の小物で見送ったPSoCのSMP機能を考えてみました。意外に、一番安く済むHOLTEK社のHT77xxAと比べても同じ程度なので、使ってみる価値はありそうです。試算ではHT77xxA構成=185円、SMP構成=137円。
必要な電流量100mA級なので、PSoC内のドライバでは賄いきれず、FETを追加した構成になります。この辺は、Cypress社のアプリケーションノートAN2349の通りです。
ロジックIC(インバータ)は1V以下から動作しなければならないのですが、入手しやすい東芝のTC7SGで問題ないと思います。用意できたN-MOS-FETが2SK1772しかなかったので、残念ながらバッテリー1本では起動しませんでした。VGSが1V級のFETにすれば、1本でもいける可能性があります。今回は、どうしても1本にするというこだわりもなく、どちらかというと連続稼働時間を稼ぎたいので、2本で行く事にします。
強制シャットダウンする手法が考えつかず、過放電対策は未実施状態ですので、とりあえず二次電池は未サポートと言う事で...
<回路図>
基本は方式設計通りです。複雑なように見えますが、よく見ると大した事はありません。
節電対策で、サーミスタのバイアス電源はPSoCのピンから出力するようにし、計測時のみ電流を流すように制御します。
LCDモジュールも同様にPSoCのピンから電源を取るようになっていますが、現在のソフトウエアバージョンでは常にオンです。更なる節電対策時のためにハードウエア側の対応をしておきます。
SDカードの挿入検出とプッシュスイッチは、当初PSoC内のプルアップ抵抗を利用していましたが、こちらも節電対策のため外部の高抵抗に置き換えました。
6Pのピンヘッダは電源部基板との接続に使いますが、ISPも兼用にしています。MiniProg1でプログラムを書き込む際、5Vが印可されますので、 SDカード、LCDモジュール、1ゲートロジック等、5Vに耐えられない部品を切り離せるように、1ゲートロジックを使っている電源部を別基板にしました。
追加情報:SDカードによっては、電源の能力が不足する場合があるようです。pqi社microSD/1GBを挿入すると、LCDの表示が瞬いたりまれに再起動されてしまう現象が発生します。使用する部品の見直しが必要です。
<部品表>
基板、ケース関係を除きます。
合計約3000円ですが、1個売りしていない部品が多いので実際はもっと費用はかかります。
<コンフィグレーション>
ブロックの配置は以下のように行いました。 緑色は正弦波生成部、青色は3チャネルA/Dコンバータ、茶色はSDカード、黄土色は1Hzを刻むタイマ、薄黄色はSMPゲートパルスのカウンタ、その他はPGAです。残りブロックはデジタルが4つ、アナログASDブロック3つと、意外と埋まってしまいました。
グローバルリソースは以下の通りです。
BPF2のフィルターデザインは以下のように設定しました。試行錯誤でやっとここまでの特性になりました。
ピン割当ては、次のようになります。
<ソースコード>
C言語(HI-TECH C)にてコード化しております。最終的にコードメモリ領域の使用率は92%でかなり窮屈になりましたが、メインは600行程度のものです。(メモリ割当の注意点あり、下部参考情報参照)
V0.2で「ImageCraft C Compiler」に移行しました。移行上の難点であったstdio.hが無い事に対しては、sprintf()のサブセット版を新規コーディングで対応です。コードメモリ領域の使用率は70%台に減りましたので、機能追加も出来る様になりました。stdio.hに関しては ImageCraft C 7.02で追加されているようですが、実際使ってみると機能しない部分も見受けられましたので、戻すのはまだ早いと判断しました。
main.c: 本アプリケーションのソースコード。ローカルサブルーチンも含め、全てこの中に記述しています。
i2c_lcd.c: LCDモジュールSB1602Bの制御サブルーチン
i2c_lcd.h: 同ヘッダファイル
tsprintf5.c: 標準Cライブラリsprintf()に似せたサブルーチン
tsprintf5.h: 同ヘッダファイル
■SDカード書き込み
書き込みには多くの消費電流が必要なので、特に書き込み頻度が高くなる1秒間隔の場合は、バッファリング動作させています。最初、SD/MMCカードサポートモジュール内でもバッファリングしていると思い、SDcard_x_fflush()で楽に済ませようとしましたが、実書込みタイミングが単純/規則的に見えなく、かえって消費電流が増えてしまう結果になってしまいます。という事でユーザアプリ側での対応となった訳です。
■LCDモジュール制御
SB1602Bは、I/OがI2Cに変わっただけで、制御方法は基本的に従来の物と同じです。Designerの標準ユーザモジュールを流用できないものか頭をひねってみましたが、新規で作っても大した事はありません。外付け関数化して、再利用しやすくしました。APIはLCDユーザモジュールに似せてありますので、関数名を機械的に置換するだけで済みます。追加機能として、アイコン表示とコントラスト設定のAPIを追加してあります。
内部ではソフトウエアI2Cマスタユーザモジュール(I2Cm)を利用しています。ハードウエアI2Cモジュール(I2CHW)でも良いのですが、若干使用メモリ量が多いため、ソフトウエアの方を選択しました。i2c_lcd.h内の#defineを変更すれば、I2CHWにも対応は可能です。
■バッテリーインジケータ
せっかくLCDモジュールにアイコンが付いていますので、バッテリー状況を表示しようと考えました。バッテリー電圧を読み取って処理しようとしましたが、4レベル程度の情報なので、もっと簡単な方法がないものか考えていた所、DC-DCコンバータのブースト状況の情報が利用出来そうだと思いつきました。今回はSMPを使っていますのでPFMでゲートドライされています。単位時間当たりのパルス数をカウントする事によりブーストレートを得られると考えました。実際、色々なバッテリーで試してみると、使えそうな感じでしたので、この方式を実装しました。以下に、その時のデータを示します。
カウント/ms 電池種別 無負荷電圧 電池メーカ名など
75~86 マンガン 1.45 東芝(赤)
39~43 アルカリ 1.51 Panasonic(黒) ほぼ新品
120~130 アルカリ 1.20 Panasonic EVOLTA
133~143 アルカリ 1.16 富士通
69~82 オキシライド 1.34 Panasonic
73~80 NiMH 1.34 三洋 eneloop 充電直後
104~119 NiMH 1.21 三洋 eneloop ほぼ使い切り
■省電力
いつものパターンで節電対策を行います。①一番多い部分を発見しそこを削減。②スリープする。③クロックを下げる。目標は平均300μA/3.3Vです。以下、時系列で対策を示します。電流値は全てVdd=3.3Vの条件です。
(1)対策前
通常稼働時:43.6mA
(2)まずCPU系かPSoCブロックでの消費か切り分け
各ユーザモジュールのStart()で停止:43.6mA
Start()もせず:9.2mA →大部分はPSoCブロックで使われている
(3)PSoCブロックの節電
GlobalResourceを変更
Op-Amp BiasをHigh→Lowに変更:24.5mA (-19.1mA:効果大)
A_buff_PowerをHigh→Lowに変更:24.5mA (変化無し)
ソースコードを変更
PGAのPowerSettingをHIGHPOWER→MEDPOWERに変更:19.3mA (-5.2mA)
BPFのPowerSettingをHIGHPOWER→MEDPOWERに変更:16.5mA (-2.8mA)
ADCのPowerSettingをHIGHPOWER→MEDPOWERに変更:12.1mA (-4.4mA)
PGA,BPFのPowerSettingをMEDPOWER→LOWPOWERに変更:NG 正常に動かず
これで、PSoCブロック(ユーザモジュール)部分は2.9mA。
(4)次に処理ステップ毎の消費電流を調べる
(1分間隔の場合)
A/D変換:100ms 11.5mA →3.8mWs(2.8%)
表示処理:50ms 8mA →1.3mWs(1.0%)
SDカードI/O:150ms 42mA →20.8mWs(15.3%)
アイドル:59700ms 560μA →110mWs(80.9%)
合計で136mWs(100%)
やはり、アイドルが大部分を占めますので、ここを集中的に対策します。
(5)アイドル時SLEEP適用
単純SLEEP時:3mA
ソースコード変更:アナログブロックを動的にオフ:560μA (-2.44mA:効果大)
内訳 LCD:140μA →広告値250μAより少なくgood.
回路:180μA
サーミスタバイアス:165μA
HS15Pバイアス:3μA
不明:12μA
PSoC自身:240μA
データシート上では通常4μA前後、最大でも27μAのはず
アナログバッファをオフ:3μA →データシート通り
回路変更:サーミスタ/HS15Pバイアスオフ:392μA (-168μA)
ソースコード変更:アナログバッファを動的にオフ:155μA (-237μA:効果大)
上記まででアイドル時30.5mWsになり、合計56.4mWs、それぞれの割合は6.7%, 2.3%, 36.7%, 54.2%
これで平均電流は285μAとなり、目標達成となります。
(6)クロック減速
単純に下げても処理時間が伸びる事で結局電力量は下がらない事があります。減速しても処理時間が伸びない部分、例えば「待ち」が多いと効果が高いと考えられます。今回では、A/D変換待ち、SDカードI/O待ち、表示データ転送待ちが考えられますので、大きな効果があると思われます。現ソフトウエアバージョンではまだ対応しておりません。さらなる節電対策が必要になった場合に検討したいと思います。
目標値:バッテリー容量×回路効率÷連続稼働時間=(1.2V×2本×2Ah)×(70%)÷(1年)=380μW=116μA。ですが、LCDモジュールだけで250μA食いますので、とりあえず300μAと設定します。稼働時間は約4ヶ月です。
<ダウンロード>
EAGLE5.6プロジェクトファイル : TH_SDloggerPCBR4.zip (840KB Macアーカイブ)
Designer5プロジェクトファイル :
PCB版数がR4の場合、温度が0.8℃以下で誤った値を表示・記録してしまう不具合を解消しました。
関連ファイル : THCSV.zip (1.2MB Macアーカイブ)
ライセンス: フリーソフトウエア(GPL v3)
作成者:富樫豊彦 tog001@nifty.com
開発環境:
WindowsXP HomeEdition SP3 / Parallels Desktop for Mac Build3226
CadSoft Computer EAGLE 5.6 Light Edition for Mac
CY3210 MiniProg1
V0.1まで
Cypress Semiconductor PSoC Designer 5.0 (SP3a Build718)
HI-TECH C for the PSoC Mixed-Signal Array Version 9.60PL5 (Lite版)
Cypress Semiconductor PSoC Programmer 3.05
V0.2から
Cypress Semiconductor PSoC Designer 5.0 (SP5.5 Build985)
ImageCraft C compiler Release V7.01
Cypress Semiconductor PSoC Programmer 3.06
V0.2cから
Cypress Semiconductor PSoC Designer 5.0 (SP6 Build1127)
ImageCraft C compiler Release V7.02
Cypress Semiconductor PSoC Programmer 3.06
やはり最初は、ブレッドボード上に回路を組み上げ、ソフトウエアの開発は殆どこの状態で行われました。
SDカードソケットはminiSD変換アダプタにワイヤを直接ハンダ付けし、空中に浮いた状態(写真右上)で動かしてました。SDカードを買うと、変換アダプタが付いている場合が多く、余っているので利用させてもらいました。
測定値の検証には、持っている温度計/湿度計を動員して比較していましたが、温度は大体全部同じ数値を示すのに比べ、湿度についてはバラバラな数値になってしまいます。そのため、精度が良い物を探し、新たに購入する事になってしまいました。意外と、アナログ式の方が比較的精度が良く安いものを見つける事が出来ました。
<R4基板>
とりあえず2台、場合によってはもっと必要になる事が予想されたため、基板を起こす事にしました。色々悩んでしまって4回目の再設計でやっと落ち着きました。2枚構成でフロント側の基板は、この上にLCDを装着します。リア側に電源部の基板があります。詳しい情報はダウンロード出来ますので、そちらをご覧下さい。無料で使えるPCB設計ソフトウエアEAGLEの設計ファイルですので、そのまま再利用も出来るでしょう。
組み上がりの写真です。
今回、「クイックポジ感光基板」に変わった事で、作業にかなりの時間と出費があり、相当高価な基板になってしまいました。 同じミスの無いようにご注意下さい。(下部、参考情報)
<ケース>
ケースはいつものように有り合わせのアクリル板を切って曲げて作りました。(寸法図面:Save.TIF、Save0001.TIF、Save0002.TIF)側面全て1枚の細長い板の4カ所を曲げて筒状にします。向かい合った部分がきっちり合うように正確に作業します。解りにくいですが、右側の真ん中が接合部です。切るのはプラカッターで簡単にカットできますが、曲げるのは専用の棒状のヒータ、接着も専用のものが必要です。
もう2枚、正面・背面分を正確に切り出し、サンドペーパーでカット面を削り、ぴったり入るよう微調整を行います。とにかく正確に作業しているつもりですが、曲げの部分を正確に加工するのは相当難しいです。
正面パネルは2種類作ってみました。
<性能検証>
■計測値
基準とする計器に、正確な物が用意出来ず、一般的に安く入手出来る製品を基準として校正作業を行いました。
主基準器を精度±2%RHのアナログ式のものに、副基準器を±8%のデジタル式にして比較しております。なかなか、温度・湿度条件を作り出す事が面倒なので、時間がかかってしまいます。とりあえず、現状(2009.08.05)の時点での情報です。X軸方向が主基準器の値です。
温度は半固定抵抗を調整し校正をしております。このグラフには現れていませんが15~35℃まで、ほぼ問題ない精度である事が確認出来ました。
湿度はソフトウエアで校正を加えています。具体的には、固定値で数%のオフセットを与えています。左のグラフは校正後のもので、40~70%RHの間は±5%RH以内に収まる所まで確認出来ました。70%RH以上については、測定に問題があった可能性もあり、40%RH以下も含めて追加作業が必要です。
V0.2と示しているのはRiを1KΩに変更したHS15P駆動安定化版を表しており、ImageCraft版との違いではありません。
なお、校正する時の湿度環境条件を作り出すのが結構面倒です。最初は「生活環境での数値を記録して行けば、いつかは数字が揃うだろう」程度にしか考えていませんでしたが、基準器さえも数値が安定しません。きりがないので段ボール箱と小型ファンで簡単な測定環境を作りました。しかし、これでも数値が安定せず色々試行錯誤した結果、湿度はムラが出やすいようで、まんべんなく空気をかくはんしないと安定した測定結果が得られないようです。また、温度・湿度を一定に保つのも難しく、変化している状態での計測をしなければなりませんが、機器によって反応時間も違うので、その特性も考慮が必要です。
こちらが、実運用での計測比較結果です。
屋根の付いたベランダに、校正元のアナログ式の温度・湿度計と共に設置し、1日1〜2回程度値を記録しました。
都合良く低温、高湿度、低湿度のデータが取れ、仕様に従う数値を確認できました。しかし、段ボール箱で確認出来ていた50%あたりの中間湿度の結果が合致しません。可能性としては、急激な湿度変化でアナログ式の反応速度に追いついていない事が考えられます。本ページ上部の長期記録グラフを見て頂ければ判りますが、山形のこの時期の湿度変化は予想を越える大変激しいものでした。
私的には、許せる精度だと思いますので、実際使用して行きます。まず手始めに、屋外に設置してある電子機器を収納しているボックス内がどの程度の条件になっているか確認したいのです。
■稼働時間
充電式ニッケル水素電池で1秒間隔の場合、
バッテリー: 三洋電機エネループ単三形HR-3UTG 1.2V2Ah × 2本 充電直後
設置場所: 屋内 20〜30℃程度の環境
SDカード: 保存あり トランセンドmicro SDcard 1GB 型式不明 →19日間の連続稼働の実績
SDカード: 保存あり トランセンドmini SDcard 512MB 80倍速 型式不明 → 20日間の連続稼働の実績
1分単位の場合、SDカードの書込み頻度が1/6になるので約4ヶ月が期待できます。(偶然仕様通りとなったようです)
問題点あり:バッテリーの2本の内1本が過放電状態となっていた。元々、過放電に近い状態に陥った前歴がある個体なので、原因の特定が難しい。どちらにしても、今のシャットダウンのやり方ではうまく行かない場合がある。
マンガン乾電池で1秒間隔の場合、10日間の連続稼働の実績
バッテリー: 東芝電池マンガン乾電池単三型RSSG(JE) × 2本 新品
SDカード: 保存あり トランセンド micro SDcard 1GB 型式不明
設置場所: 屋内 20〜30℃程度の環境
マンガン乾電池で60秒間隔の場合、75日間の連続稼働の実績
バッテリー: 大創産業(ダイソー/製造メーカ不明)BLACKマンガン乾電池8本組単三型R6PU 1.5V(実測550mAh, 664mWh) × 2本 新品
SDカード: 保存あり トランセンドmini SDcard 512MB 80倍速 型式不明
設置場所: 屋内一ヶ月と屋外一ヶ月の環境。
充電式ニッケル水素電池で60秒間隔の場合、4ヶ月間の連続稼働の実績
バッテリー: 三洋電機エネループ単三形HR-3UTG 1.2V2Ah × 2本 充電直後
SDカード: 保存あり ハギワラシスコムmicro SDcard 2GB SD-C02G
設置場所: 屋内 10〜35℃程度の環境。
<参考情報>
■HI-TECH CからImageCraft C Compilerへの移行について
下記の点は最低限変更が必要です。
・const*属性の厳密化
const属性が付いているアドレスポインタ(配列)と付いていないポインタは互換がない。castも出来ないので、大幅な見直しが必要となる。マイコン技術者の方は当たり前すぎて奇異に感じられるかもしれないが、マイコンはROMという特殊?なメモリを持ち、(CPUによっては)アドレス空間が異なるのでアクセスするコードも変えて行かなければならない。コンパイラが(例えば)constをROMに配置する実装を行っていれば、ポインタ値が違う意味を持つ事は理解できる。ところが、HI-TECH Cではコンパイラがこの違いを吸収するコードを生成するので、意識しないで済んできた。メモリはより多く使うようだ。(CPUアーキテクチャを隠蔽する実装レベルの違い、Cが高級言語かどうか)
ポインタを扱うサブルーチンはROM用、RAM用と2種類用意する必要がある。コードサイズが増える。
誤解しやすいが「CONST ≠ const」
・標準Cライブラリはほとんど無い
ないものは自分で作る。
itoa()系の引数に注意。
数が違う、順番が違う等があり標準ではないので、流用される可能性があるのなら使わない方が良い。
・その他細かい所
空引数はコンパイルエラー func() → func(void)
main()はint型ではなくvoid型
interrupt指定は不要
■HI-TECH Cのメモリ割当について
ターゲットのRAM容量の残りが十分あるのに、ビルド時にリンクエラーになってしまう事があります。メッセージが判りにくいのですが、どうもauto領域は別に管理されているようで、ここがオーバフローしている様です。変数にstatic属性を付けると回避はできますが気持ちよくありません。
変数の割当領域属性static/autoは、未指定の場合autoで一般的なコンピュータではヒープもしくはスタック領域に動的に確保されます。参照範囲を局所化させた方が都合が良い(変数名誤りにすぐ気がつく、ソースコードを読む時に判りやすい)ので、好んで小さなコードのブロックでもauto変数を使うようにしているので、すぐこのような状況に陥ってしまいます。本来なら、ソースコードで対応するのではなくコンパイル環境をいじるべきでしょが、調べ切れない所です。
■サマリ機能
データ分析を表計算ソフトで行おうとすると、データ件数が多くて処理し切れない・遅いといった時があります。例えば1秒単のデータを1時間単位に集計する機能が必要になってきます。Mac OS X限定ですが、集計スクリプトも作りましたので、一緒に公開致しています。
・ダウンロードの関連ファイルをデスクトップに置きます。
・THCSVフォルダ内に集計元ファイル”TH.CSV”を用意。
・THCSVフォルダ内のワークフロー”sum12”をダブルクリックして実行ボタンを押します。(sum12.awkの方は関係ありません)
・“th-*.csv”というファイル名で10秒、1分、10分、1時間、1日単位の集計ファイルが出力されます。
■クイックポジ感光基板について
サンハヤト社が販売している「ポジ感光基板」は2009年5月より「クイックポジ感光基板」に切り替わりました。感光時間が早くなり作業時間は少し短くなりましたが、これまで使えてきたOHPシートも使えなくなりました。 現像剤、エッチング剤等他の材料は昔の物が使えます。感光されるようなのですが現像するとコントラストが薄いというか、露光を深くしてもレジストが抜けるまで行かないのです。結局は、純正のインクジェットフィルムが唯一の選択肢のようで、インクジェットプリンタが必須になりました。また、過去作ったマスクは間違って使わないように全部廃棄(封印)し、作り直しが必要となります。
もしかしたら純正以外の選択肢があるかもしれませんが、今後、他の工程でも同様な事象に悩まされる事があるかもしれませんので、全てサンハヤト社製品を揃えないといけないかもしれません。少しでも安く済ませたいユーザには厳しい所です。
(私見)旧感光基板のユーザ層を考えれば、色々な応用をして使っていた事は想定出来るでしょうから、相違点を明示する等のアナウンスが必要だったと思います。出来ていた事が出来なくなる訳ですから、製品切換えに対する配慮が不足していたのではないでしょうか。これでサンハヤト社が少し嫌いになってしまった訳で、これからは他の基板製作方法に注目していく事となるでしょう。
<関連>
「 自作電子小物/温度・湿度データロガー/SDカード版0.2」
<余談>
当初の目的だった屋外小箱の環境調査を終え、今は野菜保管場所のチェックに使っています。タマネギ、ニンジン等は冷蔵庫での保管より、涼しい場所の方が長持ちします。この涼しい場所というのが季節によって変わるので、調べるのに重宝しています。
富樫 豊彦 tog001@nifty.com
Thermo/Hygrometer with memory card data logger.