Sensirion製温湿度センサーの湿度が100%になる?2016年05月09日 07時34分56秒

自作のWeatherSensorShield

現象

Weatherduinoという製品のサンプルライブラリをベースにセンシリオン製のSHT-11という温湿度センサーからのデータ取得を行っておりました。

ソースコードを何度確認してもデータシート通りの演算のように見えるのに、観測結果の湿度がいとも簡単に頻繁に100%に達してしまうのです。

Weatherduino用のライブラリはこちらから入手可能です。

このセンサーの入手はストロベリーリナックスが比較的安くて良いでしょう。

Weatherduinoのサンプルプログラムのバグ

さて、本題です。 上記の菅工房のサンプルライブラリG7Weather3.cppのSHT-11の処理では以下の演算部分があります。

// SHT11 温度(℃)・湿度(%)取得
void G7Weather::get_sht11 (float *temp, float *humi) {
       unsigned short sot, sorh;
       float t, rhl, rht;
 
       // 温度読込み
       sht_tsseq();
       sht_write(0x03);
       SHT_SDA_H;
       while (SHT_SDA); // 変換終了待機
       sot = (unsigned short)sht_read(1) << 8;
       sot |= sht_read(1);
       sht_read(0);

       // 湿度読込み
       sht_tsseq();
       sht_write(0x05);
       SHT_SDA_H;
       while (SHT_SDA); // 変換終了待機
       sorh = (unsigned short)sht_read(1) << 8;
       sorh |= sht_read(1);
       sht_read(0);

       // 温度補正 14bit (3.3V)
       sot &= 0x3fff;
       t = -39.66 + 0.01 * (float)sot;
       *temp = t;

       // 湿度補正 12bit
       sorh &= 0x0fff;
       // rhl = -4.0 + 0.0405 * sorh + (-2.8 * 0.000001) * (sorh * sorh); // Ver.3
       rhl = -2.0468 + 0.0367 * (float)sorh + (-1.5955 / 1000000.0) * (float)(sorh * sorh); // Ver.4
       rht = (t - 25.0) * (0.01 + 0.00008 * (float)sorh) + rhl;
       if (rht > 99.0) rht = 100.0;
       *humi = rht;
}

この処理の中でのバグは以下です。

(float)(sorh * sorh)

この部分だけですね。問題があるのは。 sorhという変数はunsigned shortで有効なデータは12ビット分です。単独で使う場合は16ビットで十分ですが2乗すると演算結果は16ビットでは足りなくなります。

バグ修正

なので、以下のように修正の必要があります。

(float)((long)sorh * (long)sorh)

観測データは12ビットなので最大値は4095となります。 それを2乗すると16769025となり16ビットの最大値である65535を 超えてしまっていたわけです。

一方、符号付のlongの正の最大値は2147483647ですので十分に格納可能になります。 この修正により、湿度が簡単に100%になる問題は解消しました。 原因解明に3年かかりました。

ちなみに、写真の基板はWeatherduinoではなく自作品です。 ArduinoUnoとの組み合わせで使っています。

モータードライブコントローラとステッピングモータの接続2015年07月07日 23時45分49秒

五藤光学8cm赤道儀用モータードライブ製造で、今回使用するモータはビクセンMT-1とMD-5/MD-6で使われている日本パルスモーター社製です。
モデルとしては同じモータを使っています。
以前に10個購入した物の在庫を使います。

以下の在庫から1個使って製造。
※写真としてはこの日のものではありません。未来です。左に写っているのが完成品のモータードライブです。

モータはタカチMB-1というアルミケースに組み込みます。これはMARK-X赤道儀用で選定した部品で、コントローラ内蔵型のモータードライブとなり、製造過程や方法論も全てMARK-X赤道儀用で開発したやり方です。


配線して駆動確認。問題ありません。
※後日「カタカタ」音が気になって個体を変えますが改善しませんでした。



モータードライブコントローラ追加製造完了と発振周波数記録2015年07月05日 22時46分25秒

五藤光学8cm屈折赤道儀の赤道儀の純正モータードライブは現在入手することは困難です。メーカも対応できません。そんな中でモータードライブの相談を受けましたので、注文を受け付けました。

モータードライブコントローラ基板製造1ロット10枚分完了しました。

部品実装完了しましたので発振周波数測定です。




1枚づつ分周した結果の周波数を測定しているところです。これを逆算して実際の発振周波数を求めます。水晶発振子は8MHzの物を使っています。

私のモータードライブコントローラの製造では単純な水晶発振子の仕様上の周波数では計算せずに、実測値でタイマーカウンタの分周設定をするようにしているからです。

16pinSOPデータで18pinSOPの手抜き基板設計2014年04月29日 23時00分37秒

PM型ステッピングモータの駆動でトランジスタアレイを使うのですが、これまで7回路内蔵のICを使っていました。
ステッピングモータの駆動には4回路しか使いません。つまり、3回路無駄になっていたのです。
当初は7回路のICしか知らなかったので仕方ないのですが、現在は8回路内蔵のICがあるのを知っています。
8回路のトランジスタアレイであれば2回路×4でステッピングモータの駆動にはちょうど良くなります。

なので8回路のICを使いたいのはやまやまだったのですが、回路・基板設計に使っていたEAGLEには該当するライブラリデータがなく、先送りにしていました。

本日、手抜きの対応が完了したので、一応、記録を残しておきます。



上記が8回路トランジスタアレイのIC、TD62083AFを使った基板パターンです。
TD62083AFの部品はなかったので使っている部品はULN-2003Aのものです。
7回路のトランジスタアレイなので16pinのSOPのデータですが、PAD部品を2つ追加して18pinのSOPが載せられるようにごまかしました。
動けば良いのです。

当然のことながらもともとの部品データのGNDを別のところにつないでいるのでERCでは叱られます。

以下が該当部分の回路図です。

FusionPCB発送追跡2013年04月12日 06時37分54秒

FusionPCBからの発送後の追跡結果です。
前回の状況はこちらです。

2013/04/03 19:57     引受               HONG KONG
2013/04/09 11:43     国際交換局から発送         KOWLOON D     HONG KONG
2013/04/09 23:48     国際交換局に到着         成田国際空港郵便局     千葉県
2013/04/10 09:00     通関手続中             成田国際空港郵便局     千葉県
2013/04/10 09:50     国際交換局から発送         成田国際空港郵便局     千葉県
2013/04/11 08:04     到着               ●●●     東京都
2013/04/11         ご不在のため持ち戻り     ●●●     東京都
2013/04/11 23:24     窓口でお渡し           ●●●     東京都