本記事には古い情報が含まれている場合があります。まとめページ を作成しましたので併せて御覧下さい。
新ファームの公開を予定 と書いておきながら、2週間がたってしまいました。
主たるテーマだった 汎用アナログ入力(ADC)、Cosm対応 はさほど手間じゃなかったのですが、mbedの大元のライブラリを最新 Rev.41 に上げたら、これまで使えてた公開ライブラリたちが軒並みコンパイルエラーとなってしまいまして・・・
Rev.40 もダメで、39 に戻すと以前のままコンパイルが通りましたので、 Rev.39 に戻してリリースしてしまう方法もありましたけど、せっかくなので・・・と努力した結果、なんとか Rev.41 でもキチンとコンパイルが通るように出来ました♪
20120717版 ファームウェア一式 20120723版をお使い下さい。
注意(20120723)
自動省電力判定(savePower=2)時で、起動時にLAN線が刺さってなくて自動的に省電力モードに移行した際、ネットワークを利用するサービスを無効にしないといけないのですが、それをやり損ね、起動直後にフリーズしてしまうバグを作ってしまいました。20120723版にて修正されています。ご迷惑をおかけし申し訳ありません。
20120423版との機能比較 (20120423版の仕様はこちらを参照ください)
- 汎用アナログ信号の入力およびロギングの機能を追加
- cosm.com(pachube.comの後継)に正式対応
- cosm.comへ送信する際、移動平均化の中間時刻で測定値を送信する機能を追加
- メンテナンスモード(ボタン追加した上、押しながら電源ON)で挙動が不安定だった不具合を修正
- 起動シーケンスを見直し、mbedによるUSBフラッシュメモリー利用を初期化処理の前半にまとめる
- 押しボタンにデフォルトで p20 を割り当てていたものを取りやめ、使用時には明示が必要なように変更
汎用アナログ信号の入力およびロギングの機能を追加
複数GM管を繋いでおられる方はすでに mbed のピンがマンタンに近い状態かと思いますが、単管の人は随分とピンを余らせていると思います。
もったいない・・・ということで、せっかく24時間運用で黙々と放射線量を測ってるわけですから、温度や湿度も一緒に測らせると良いと思いませんか?ってことで実装してみました。
LM35DZ を例にして説明してみます。
こんな感じで mbed に繋いでみました。16ホールユニバーサル基板 1枚にラクラク載せられます。
最初は LM35DZ の出力をマイコンの入力ピンに直結させて使っていたのですが、ほぼ常に実際値の +3〜+5℃ くらいを示し、なおかつ変動が大きいなど挙動不信だったので、LM35DZ のインピーダンスが高すぎるんじゃないのか?ってことで、テキトーに 0.1μF をパラってみたら見事に落ち着きを取り戻しましたので、こんな風になってます。
10kΩは(念のための) LM35DZ の保護用です。
空のコンデンサへのチャージに LM35DZ が耐えられるか心配だったので入れときましたが、たぶん1kΩもあれば十分なはずです。(100℃=1V、1V÷1kΩ=1mA でコンデンサの等価抵抗が0Ωの瞬間があっても 1mA までしか流れない)
急激な温度変化に対する反応が数秒遅れくらいになると思いますが、測定対象が気温なら無問題でしょう。
定義ファイル | 項目名 | 目的 | 指定方法 | 省略時 |
env.ini | ADC0 | ADC 設定ファイル | ファイル名 | 未使用 |
env.ini | ADC1 | ADC 設定ファイル | ファイル名 | 未使用 |
env.ini | ADC2 | ADC 設定ファイル | ファイル名 | 未使用 |
env.ini | ADC3 | ADC 設定ファイル | ファイル名 | 未使用 |
env.ini | ADC4 | ADC 設定ファイル | ファイル名 | 未使用 |
env.ini | ADC5 | ADC 設定ファイル | ファイル名 | 未使用 |
ADC 設定ファイル | pin | 接続ピン | 必須 | |
ADC 設定ファイル | caribration | 3.3V=65535とした除数 | 数値 | 1 |
ADC 設定ファイル | offset | 除した結果に足す数値 | 数値 | 0 |
ADC 設定ファイル | decimalPlaces | 小数点以下の有効桁数 | 数値 | 1 |
(お詫び)p14 はアナログ入力ピンじゃないのにアナログ入力ピンだと勘違いして当初 p14〜p20 の7ピンがアナログ入力に使用可と書いてましたが、p14 はアナログ入力非対応でした。下記の文章も訂正させて頂いてます。
mbed の AnalogIn は p15〜p20 と6ピンもあるため ADC0〜ADC5 と最大で6種類の測定器を接続できるようにしましたが、標準 Mark2 の方は p15・p17・p18 が使用済みのため、残る3つのピンを使って最大3種類となります。
Mark2 互換機でお使いの方は、GM管の検出ピンを p21 に変更するなどして、p15〜p20 を空けるなど工夫すれば、最大で6種類の測定器を使えます。
計測値 = (入力信号電圧 ÷ 3.3) × 65535 ÷ caribration + offset
という風に内部計算していますので、これをもとに caribration と offset の値を設定します。
LM35 の場合、10.0mV/℃ で 0℃=0V、100℃=1V ですので、先の計算式に当てはめると
0℃ = (0.0 ÷ 3.3) × 65535 ÷ caribration + offset
100℃ = (1.0 ÷ 3.3) × 65535 ÷ caribration + offset
で、これを解くと caribration=198.591、offset=0 という風になるかと思います。
内部では 0.1秒おきにサンプリングして、10回分で平均化させて使ってます。(1秒間移動平均値)
手持ちの、電波時計に付いてた温度計との誤差が ±0.5℃程度内だったし、ゆらぎも±0.2℃程度ですので、数mVオーダーの細かい変化を測定しているわりには優秀な結果かな、と。
あと、所有してはいませんが、LM60BIZ のときの設定値も計算して同梱しておきました。(LM60.CFG)
持ってないので本当に正しい結果になるのか試せていないのですが、もし計算が変だとかあったらお知らせ下さい。
汎用アナログ入力の追加に伴い、Twitter、Logging、UdpSend、Serial、など出力書式を自由に定義できるサービスに、書式パラメータ %ADC0% 〜 %ADC5% が指定できるようにしました。
ツィート内容のメッセージ定義の中で「線量は %uSV%μSV/h、気温は %ADC0%℃ です」みたいに定義すると「線量は 0.098μSV/h、気温は 28.5℃ です」という感じに呟くようになります。
WebPost サービスでは ADC0〜ADC5 のうち定義ファイルが指定されているものにつき測定値を Post します。
また、Cosm(旧Pachube)にも、汎用アナログ入力の測定値をフィードすることができるようになってます。(↓でも書きます)
cosm.com(pachube.comの後継)に正式対応
この3ヶ月の間に、いつの間にやら Pachube が Cosm という更に(発音面で)難解なものに変わってしまってました。
1つのアカウントでいくつもの Feed を持てたり、各 Feed で6つ以上の DataStream(項目)を持てるようになったりと、これまで有料会員のみが利用可能だった部分が、無料会員にも全面開放された感じです。
有料会員制度がなくなった?
cosm 移行後も pachube.com のドメインが生かされていて下位互換として動作しているため、特に支障なく使えていますが、いつ pachube.com がなくなるか分からないので、きちんと cosm.com へ測定値を送信することにしました。
ちなみに旧 Pachube の人たちは、強制的に Cosm に移管されていますので、このファームを導入することで何か設定をいじる必要はありません。
(geiger.bin だけを上書きしていただき、設定ファイルはこれまでのものを流用ください)
また、これに伴っていくつかの機能強化を施してあります。
まず、項目ID(DataStream の ID)に、数値以外に文字列を指定できるようにしました。「0」〜「4」を指定するのが専らでしたが、こんな風 に文字も指定できます。
Cosmのコンソール画面から「Temp」という項目IDを作り、Cosm設定ファイルの中で「adc0=Temp」と指定して、前述の汎用アナログ入力機能で取得した LM35DZ で観測された気温をアップロードさせてます。
ただし、既に作成済みの 項目ID を変更する機能が cosm 側にはないらしく、過去のデータを自動的に引き継がせての 項目ID 変更は出来ない模様です。
(新しく項目IDを追加して新しく測定値を収集し始めるしかないぽい)
cosm.comへ送信する際、移動平均化の中間時刻で測定値を送信する機能を追加
先日の 降雨による線量変化を捉える で気になったのですが、例えば 13:00〜14:00 の1時間移動平均値を 14:00 に送信する際に「14:00 の測定値」として送信する今の方式は正しいのか?と
13:00〜14:00 の平均値なのだから、14:00 に「13:30 の測定値」として送信するのが本当は相応しいのではないのか??という気がしてきました。
同じように 13:50〜14:00 の10分間移動平均値は、14:00 に 「13:55 の測定値」として送信すべきじゃないか???って。
そんな疑問が沸いてきましたので、需要があるかどうか分かりませんが、その測定値の移動平均化処理に用いた時間帯の中間時刻を測定時刻として送信する機能を新設してみました。
Cosm設定ファイルの中で middleTime=1 と指定することで、中間時刻の扱いで測定値が Feed されるようになります。
この指定がなければ、これまでどおり、移動平均化処理に用いた時間帯の最終時刻を測定時刻として送信します。
押しボタンにデフォルトで p20 を割り当てていたものを取りやめ、使用時には明示が必要なように変更
押しボタンをどれくらいの人が実際に装着されているのか分かりませんが、2012/02/25 に当機能を追加したとき、何も考えずにデフォルト p20 で決めうちで書いてしまってました。
設定ファイルは何も弄らずに、p20 にボタンを接続するだけでボタンが機能するようになってました。
つまり、実際のボタン接続の有無にかかわらず、プログラムは p20 を監視して動くようにしていたのです。
今回、汎用アナログ入力機能を追加したわけですが、「アナログ入力の出来る貴重な p20 をボタンが占有するのは勿体ない」「ボタンなんか p21 あたりでいいじゃん」という意見が出るのは当然にして、さらに「俺はボタン繋げてないから p20 に温度計を繋ごう♪」って人が出たとき、Button=0 と明示した上で ADC 定義をしないといけないという仕様制限に気がつく可能性は限りなく低いだろうし、この不可解な設定を強要されることに対して強烈な違和感を抱くと思われましたので、ここら辺の仕様を大きく変更させて頂きました。
ずばり
押しボタンを追加している人は env.ini の中に Button=20 と明記して下さい!
(p21に繋いでる人は Button=21 と)
これを忘れると、今回のファームウェアから、もれなく押しボタンを無視します。
という風にさせて頂きました。
どうぞよろしくお願いいたします。
定義ファイル | 項目名 | 目的 | 指定方法 | 省略時 |
env.ini | cosm または cosm0 または pachube または pachube0 |
Cosm 定義ファイル | ファイル名 | 未使用 |
env.ini | cosm1 または pachube1 |
Cosm 定義ファイル | ファイル名 | 未使用 |
env.ini | cosm2 または pachube2 |
Cosm 定義ファイル | ファイル名 | 未使用 |
Cosm 定義ファイル | apikey | APIKEY(Create権が必要) | 文字列 | 必須 |
Cosm 定義ファイル | feedid | Cosmから採番されたFeed番号 | 数値 | 必須 |
Cosm 定義ファイル | usv0 | 10分平均μSV/hをFeedするときの項目名 | 文字列 | 非送信 |
Cosm 定義ファイル | nsv0 | 10分平均nSV/hをFeedするときの項目名 | 文字列 | 非送信 |
Cosm 定義ファイル | cpm0 | 10分平均cpmをFeedするときの項目名 | 文字列 | 非送信 |
Cosm 定義ファイル | usvlong0 | 1時間平均μSV/hをFeedするときの項目名 | 文字列 | 非送信 |
Cosm 定義ファイル | nsvlong0 | 1時間平均nSV/hをFeedするときの項目名 | 文字列 | 非送信 |
Cosm 定義ファイル | cpmlong0 | 1時間平均cpmをFeedするときの項目名 | 文字列 | 非送信 |
Cosm 定義ファイル | adc0 | adc0に接続した測定値をFeedするときの項目名 | 文字列 | 非送信 |
Cosm 定義ファイル | adc1 | adc1に接続した測定値をFeedするときの項目名 | 文字列 | 非送信 |
Cosm 定義ファイル | adc2 | adc2に接続した測定値をFeedするときの項目名 | 文字列 | 非送信 |
Cosm 定義ファイル | adc3 | adc3に接続した測定値をFeedするときの項目名 | 文字列 | 非送信 |
Cosm 定義ファイル | adc4 | adc4に接続した測定値をFeedするときの項目名 | 文字列 | 非送信 |
Cosm 定義ファイル | adc5 | adc5に接続した測定値をFeedするときの項目名 | 文字列 | 非送信 |
Cosm 定義ファイル | middleTime | 平均化処理の中間時刻でFeedする | 0 または 1 | 0 |