2016年2月29日月曜日

ESP8266のオートプログラム仕様

最近発売されるESPブレイクアウトボードには、「GPIO0をGNDに落とした状態でRESETを押す」なんて面倒なことをしなくても、Arduino IDEでcmd+Uを押すだけで勝手にコンパイル→アップロードが済むようになってます。Auto Program機能ってやつですね。フリップ&フロップやダイオードを使ったものなど何種類かあるようです。

DTRからの出力を時間差を作ってRESETとGPIO_0につなぐだけなので、組み込むのは造作もないことなのですが、私の設計している基板には搭載していません。

それは、ESP8266/ESP-WROOM-02にはリセット時に内部クロックがGPIO_0(ゼロ)から漏れてくる、というバグがあるからです。ただ漏れるだけなら大したことはないのですが、個体によっては -1 〜 5v まで変動するという計測結果もあり、これは回路によってはFTDIやUSB端子までも壊しかねない電圧です。

私の基板は、開発用ではなく「使い倒す基板」がコンセプトです。そのためにオーバークォリティ気味のレギュレータとOS-CONを搭載し、大きな面積を食うネジ穴を3つも開け、何より開発の時にしか使わないものに電流を食われることを排除しています。

ArduinoみたいにIDEでcmd+Uをタイプするだけでアップロードできるのは確かに便利ですが、ESP以外の基板を破損するようなリスクは極力小さくしたい、と思ってます。なので、GPIO_0にはスイッチとプルアップ抵抗しかつないでいません。

なお、あんまり作例ではみかけないのですが…GPIO_0に取り付けたスイッチは、プログラムをアップロードするときだけでなく普通にスイッチ入力として使えます。スイッチが1つ付いているだけですごく便利なんですよね。ただ、チャタリングを避けつつ長押しとちょい押しを判断するプログラムって以外と面倒くさいので、今度、作ります。

閑話。



写真がないと寂しいので、今日の昼飯(仕出し弁当430円)の写真を貼っておきますw 430円の割には野菜分が多いので愛してます。

なお、今日から「特茶」飲み始めました。

知人がこれで数キロ落とすことに成功したというので、箱買しました。その安易な姿勢が(ry

メイカーへの道(笑)


10枚だけ頼んだのに(付箋にも「数量 10」って書いてあるし)、明らかに30枚ぐらい入っている件w どうしたelecrowさん?!

というわけで試作バージョン5の基板が届きました。

バージョン4からの変更点は一箇所だけだったし当初の予定から大幅に遅れているので「さすがにもう治すところないだろw」と量産(まぁ20個だけどね)発注しようと思ったけど、思いとどまって基板のみ発注しました。

…まぁそういう場合、大抵問題はないんですよね、私の場合。「大丈夫だろう」でGOするとコケるけど、「一応、念のため」で確認すると問題のない人生。嗚呼。

それにしても、Viaが小さいです。こんな穴どうやって開けてるんでしょう。白のレジストは比較的厚めになるので、どこにViaがあるのかわからないです。一時期、私のEagleで自動設計するとViaが0.6mmぐらいあってレイアウトに苦労したんですが、あれはDesign Ruleの指定を間違えていたのだろうか。

今回スイッチ用に大きめのスルーホールをあけたんですが、この内面がエラいこと綺麗です。いいメッキだわ。これで春節明けから10日丁度、2000円かからないんだから、もうブレッドボードからユニバーサル基板を飛び越してプリント基板を作るのも当たり前って感じ。

レジスト白か赤かで悩んでました。色味としては赤が一番きれいのですが、老眼的には白が一番見やすいので。

あと部品のValueを入れるかどうかも悩みどころ。Valueが入るとどうしても基板表面がごちゃごちゃして美しくないのですが、メンテや説明の時に情報量が多い方がラクなので入れてみました。

そんなこんなで、これで量産発注するぞー!

…繰り返しますが、20個だけですけどね。

余談ですが、先日、映画スティーブ・ジョブズを見てきました。「カスタマーは自分が何を欲しているか知らない」というのはジョブズさんの有名な言葉ですが、「メイカー」っぽいことをしているとその言葉を実感することがしばしばあります。それに人は目の前にあるものを改善したくなる生き物なので、カスタマーの声ばかり聞いているといつまで経っても製品としてリリースできなくなってしまいます。

時にはカスタマーの声にあえて耳を塞ぐこともリリースするためには必要ですね。

これからも「自分が欲しいものを作る」ことを大事にしていきたいと思います。

何事も慢心は禁物(リフロー編

あれほどの作業効率を誇っていたサンハヤトの特殊ハンダクリームも劣化が始まったのか、基板への付着性が今ひとつ。注射針から押し出したクリームも以前のような光沢がなくザラついた感じです。

適量のせるのが難しく、乗らないか乗りすぎるか、というデジタルな状況。ハンダが多すぎるなぁ…とは思いつつ、一部だけ拭き取るのは難しいので「まぁいいか」と進めた結果がコレです。



いやー酷いですねーw レジストを白にしたのでフラックス汚れが目立つというのもありますが、汚いです。

この後、ハンダゴテと吸取り網で激しくナナメになった部品を取り除いてから手ハンダ付けしました。

今日はもう一枚大きな基板をリフローする予定だったのですが、新しいハンダクリームが届いてからにしようと思います。

で。

その後、ElecrowへのEMS伝票とインヴォイスを書いたのです。中国にものを送るとなると住所がまず長いというのもありますし、英語表記だとHang Feng Road, Gushu…みたいな感じでなるのでとにかく長くなってしまうので。今回は、前回書ききれなかった反省を踏まえて字を小さくきっちりと見事に書き上げました。

…EMS伝票(書類用)でした。

もう一枚書く気力がないので、郵便局に印刷伝票の手配を依頼しました…。

2016年2月24日水曜日

ESP-WROOM-02 + 空気質センサー


空気室なら知ってるけど、空気質ってあんまり聞かない / 使わない言葉ですね。意味わかるけど。


ずっと前にaitendoで衝動買いしてそのまま忘れていました(空気質センサモジュール [MQ135-4P])。それにしても空気質。指標はいろいろありますが、いったい何を測定してくれるのでしょうか。とりあえず、この手のものとしては秋月で売っているTGS2450が電子工作界ではおなじみだと思います。

秋月のサイトから

ただしTGS2450は結構気難しいというかヒーターの電圧や加圧時間を間違えるとすぐに焼損することで有名です。私も使ったことがあります(懐かしい記事はこちら)。

でも、こっちの空気質センサーは、モジュールになっていて電源5vをかければ0-4vで空気の質がわかる、というシロモノです。

ということで、使ってみました。

<追記 2016-03-18> 90mAも消費するだけあって、動作させたままだと結構暖かくなります。放射温度計で測ったところ、一番暖かい場所で51度でした(室温24度)。お使いになる時はこのことを覚えておいてください。

■構成■

毎度おなじみESP-WROOM-02のTOUTをアナログ入力として使います。TOUTは1v入力なので、空気質センサーの出力は分圧してから使います。

接続はこれだけです。空気質センサのDoutは使いません。なお、空気質センサーは100mA近い電流を消費するので、小さなUSBシリアルだと電流容量不足になります。

ESP-WROOM-02USBシリアル半固定抵抗空気質センサ
5vVcc
Vcc3.3v
GndGnd1Gnd
TxRx
RxTx
Tout2
3Aout

■調整方法など■

分圧には10kΩの半固定抵抗を使いました。

ぶっつけ本番でいきなりToutにつなぐとESP-WROOM-02をぶち壊す可能性が高いので、最初はブレッドボードの上で半固定抵抗の1を5v、3をGndに接続し、2とGndの間の電圧をテスターなどで測定しながら抵抗のツマミをまわし、約1.2vになるように調整します。

空気質センサーの出力が4vなのだから5vで調整するとしたらフルスケール1.25vなのですが、少し余裕を見ます。なお、半固定抵抗の1と3は対称なので、調整後に組み込む際に間違えないようにします。私の場合はツマミのついている側を1に決めています。

先日のSCL/SDA同様、こういう決め事を作っておくと事故を防ぐことができます。

…と、数多くの事故にまみれてきた私が言うのだから説得力があります。

…いや、無いのか。

■ソフトウェア■

毎度おなじみの秒単位簡易リングバッファで1分間の平均値を取ってThingSpeak.comへ送っています。


■計測結果■

計測結果ですが、ほぼ無臭のフロンガスのエアダスターに対しては1mぐらい離れたところで使っても反応があります。無水アルコールにもわりと敏感ですね。私が「ハーッ」て息を吐きかけると、てきめん、数字が上がるので心が傷つきます。

[19]で息を吹きかけました。

ThingSpeak.comでの計測値はこんな感じ。


さて。加齢臭にはどうなのか。知りたいような知りたくないような。明日、換気状態で出勤して値はどう変わるのか。追ってご報告申し上げたいと思います。

…私が寝ている間に62まで下がりました。04:15ごろ起床。

2016年2月23日火曜日

コテ先交換

before

長年(まぁ10年ぐらい電子工作してなかった時期もありましたが)使ってきたハンダゴテ、コテ先が摩耗したり変形したりで、さすがにもう使い続けるのは無理、という状態になりました。

が、私の愛用のハンダゴテはGootのPX-338というガングリップ型、もう10年以上前に製造中止になってます。そうなるとコテ先を検索することもできません。

新しいのを買おうにも今はもうガングリップ型って自動ハンダ用か温度調整もついてない簡易型しかないんですよね。

ということで、メーカーさんに問い合わせたところ、親切丁寧なお答えを頂戴しました。コテ先の型番がわかったので、ぐぐってみたらヨドバシに在庫があるw ずっとSB型を使ってきましたが、SBと一緒に2BC型も買ってみました。

で。

いやー、新しいコテ先、馴染む馴染む。今までのコテ先にも特に不自由を感じたことはなかったのですが、ハンダがコテ先全体を回りこむように溶けてくれるので、作業の自由度が高くなりました。

after

特にBC型、細いわりに熱容量大きいのが特徴なのですが、「そんな大した違いはないだろw」と思っていたら大違い。今までハイパワーモードでやっと付けていたベタアースでもすっとハンダが乗ってくれます。表面実装部品でも2012はもちろん1206でも特に困りません。

もっと早く切り替えればよかった…。

2016年2月21日日曜日

ESP-WROOM-02+放射温度計+サーボ = 遠隔温度計測


autolayout面倒くさい

■やりたいこと■

赤外線放射温度計というものがあります。リフロー用に2000円で買ってきて、リフローだけでなく餃子を焼くときのフライパン温度やチャーハンに卵を投入する前のフライパンの温度やカラアゲを作る際の油の温度計測などに幅広く利用しております。

このセンサー部分が手に入りました。センサーを以前使ったサーボモータのチルト&パン台(Crowtail- Pan- Tilt)に固定しておき、遠く離れたところからiPhoneで角度を変えるとその方向に首を振り、計測した温度を送り返してくれる…というものを作ります。

以前サーボモータを動かした時には、単に首振ってるだけで考えてみればESP-WROOM-02を使うメリットというのはまったくなかったのですが、今度はしっかりとセンサーを駆動します。

リモートセンシングやで。

■要素技術の確認■

赤外線放射温度センサーMLX90614のライブラリ、いろいろ試しましたが、一発で動いたのはコレでした。
https://github.com/adafruit/Adafruit-MLX90614-Library

MLX90614のピンの並びは残念ながら手持ちのESPボードと異なっているので、変換ケーブル?を作ります。単にGND-VCC-SDA-SCLをそれぞれの並びに合わせてヘッダピンにハンダ付けしてスミチューブで固定するだけです。

サーボは以前にも使ったElecrowのtilt&panです。サーボのコネクタはマイコンでは使いにくいのでぶった切ってピンヘッダと付け替えます。その際に2ch分をコンパクトに使えるように3ピンと4ピンのヘッダを使い、GNDとVCCは共通、信号線は1つずらして接続します(GND-VCC-SIGNALとGND-VCC-NC-SIGNAL)。こうすればブレッドボードに並べて挿して共通の電源とそれぞれのSIGNAL入力をつなぐだけで済みます。

制御入力と表示にはiPhoneを使います。最初iPhoneをうにうに傾けるとそれに合わせてtilt&panが動くようにしたのですが、表示が大変見づらいという欠点が発覚したので画面上の●をドラッグする方式に変更しました。●の座標をTCP/IPで値を送ります。


あとはESPとiPhoneの通信ですが、ゼロコンフィグとかやると死ぬので固定IP決め打ち一発でTCP/IP接続してデータを送受信します。TCP/IP通信にはCFNetworkのinput/output streamを使ってます。

■サーボとの接続■

ESP-WROOM-02にサーボとMXL90614を接続します(前回記事:ESP + 2軸サーボ)。

ただ、前回ワイヤ直結したら抜けやすくて大変不便だったので、crowtail仕様のコネクタを切断してピンヘッダを取り付けました。その際、3ピンのピンヘッダと4ピンのピンヘッダを用意し、4ピンのは「信号」「空き」「Vcc」「Gnd」、3ピンは「信号」「Vcc」「Gnd」の並びで作りました。こうすれば、ブレッドボードに挿した時に配線が少なくてすみます。
手前が4p、奥が3p。右からVccとGndを引いてます

IO14, IO15はジャンパ経由でESPと接続
テープで剥がれる机の塗装orz

■MLX90614との接続■


これはI2Cなので、Vcc, Gnd, SDA, SCLをそれぞれ接続します。今回購入したモジュールはプルアップ抵抗付きなので、ESPとつなげばおしまいです。これもヘッダピンとワイヤをハンダ付けして専用ケーブルを作りました。ESPのIO4とSDA、ESPのIO5とSCLを接続してください。

なお、私はワイヤの色をSCL白、SDA緑、Vcc赤、Gnd黒と決めています。

こっち見んなw(お約束


■MLX90614とサーボ■

3Dプリンタが届くのを待っていたのですが、3月一杯に延期されてしまったので、とりあえずテグスで括りつけました。ははは(力ない笑い

■ESP用プログラム■

ESP_WiFiTelnetToSerialというサンプルプログラムを参考にしました。大まかな構造としては、

  • iPhoneからデータが届いたら、それを目標座標とする
  • 1秒間に100回のタイマーで、サーボの目標座標目指してゆっくり指示座標を変えていく。これはいきなりiPhoneからの値が飛ぶとサーボが高速で動いて電力消費やらメカ強度やらに悪影響を与えるので、それを防止するためです。通信でメカを動かす場合の基本ですね。
  • 1秒に1回、MLXからデータを読み込んでiPhoneへ送信する

サーボの制御と温度データの送信を切り離しています。こうすることでプログラムが複雑にならないようにしています。



■iPhone用プログラム■

最初swiftで書いてSIOSocketがうまく組み込めずに挫折した(設定ミスorz)とか、その後obj-cでSIOSocket使ってみたけどしっくりこないので捨てた、というのは割愛します。

プロジェクトは後日githubに公開します。とりあえずViewControllerと座標ドラッグ用のControlViewをgistにまとめて貼っておきます。今気づいたけど、ControlViewじゃなくてControllViewだな(恥


2016年2月17日水曜日

ユーザサポートをどうしよう


というわけで、もうじき、倉橋設計のボードが市販される予定なのですが、そのサポートをどうしようかという問題が残っていまして。

当初の予定ではGoogle +にする予定だったのですが、せっかくだからといいうことで、SlackとSalesforce Chatterも試してみました。

理想としては、リンクを貼っておいて、そのリンクをクリックすると申し込みページに飛び、中の人が承認して使えるようになる…というものですが、今回の3つはそれには対応していない様子。

以下の3つはいずれも、話題ごとにグループを作ることが出来て、グループを横断的にタイムラインとして眺めることもできるっぽい。

■Google+■

そんなに悪くないと思うのですが、まだお試し中。

■Slack■

コードスニペットをそのまま貼れるし、プログラマ的には非常によいツールなんですが・・・私はパソコンユーザとしてそれなりのスキルがあるつもりなのに、あれこれ戸惑うことが多い。何よりもグループ名に日本語使えないのはダメですね。また、将来会社として使う場合に、スタッフだけが見るグループとユーザだけが見るグループ、という風に切り分けるには有償のアカウントが必要で、しかも有償の場合にも一人の有償に対して5人までしか別ドメインのユーザを呼べないので、たくさんユーザが増えたら使えません。

■Salesforce Chatter■

懐かしい・・・。何だかんだで4-5年使っていたものなので馴染んでいるせいか、私はそんなに違和感ないのですが、某林さんの拒否反応が(申し訳ないです

とりあえずiOS版クライアントSalesforce1の出来が悪いのはダメですね。そのうち、私が簡単なのを作るから許してくれい。

--

で、悩んだのですが、裏にCRMの機能が備わっていること、Chatter自体は無料で使えること、タイムラインが見やすいこと…などからSalesforce Chatterを使うことになるのかな・・・。スマフォ比重が高いとGoogle+の方が使いやすいですし、ソースコードをさくさく扱うならSlackですね。

うーん、悩みが解決しない・・・。

2016年2月13日土曜日

2000円のGPSとArduino / ESP-WROOM-02

ベランダにて。シャッター速度の関係で表示が途切れてます


せっかくESP-WROOM-02を使っていますが、ほぼArduinoとして使っているのでこういうタイトルとなりました。

■GPS入手■

秋月の新製品をチェックしていたら、なかなか安くて使いやすそうなGPSのキット(GPS受信機キット 1PPS出力付き 「みちびき」対応)が出ていたので、会社帰りに立ち寄って買ってみました。

秋月のサイトから

が。家に帰って見てみたら、買ったのはWebに出ている新製品ではなくて別の新製品でした(GPS-54型GPSレシーバーモジュール)。キットじゃなくてGPS受信ユニットと2mmピッチ10pコネクタ2個がぽろりと入っているだけorz

秋月のサイトから

私が買ってきた方は衛星「みちびき」にも対応していないみたいだし、消費電流も多いし、何のメリットがあるんだろうorz 余計なシリーズレギュレータが入ってないので3.3vで使えるのがメリットかなw 

勿体ないので使います。そういえばGPSモジュールを買ってマイコンにつないで使うって初めてじゃないだろか。

■結線など■

GPSモジュールのコネクタは2x4pなので、付属の2mmピッチ 10pヘッダソケットを真ん中で切断し、ヘッダソケットに1-5番ピンにそれぞれ配線します。反対側には2pと3pのヘッダピンをハンダ付けします。2pはTxとRx用、3pは3v3が2本とGND用です。

秋月のスチロールケースにカッターナイフで穴を開けて、そこにマウント?しました。こういう小学校的工作懐かしい。

Arduinoの場合、SD0は0, RD0は1と接続します。

ESP-WROOM-02では、SD0はRxD、RD0はTxDと接続します。

GndはGnd、BATTとVCCは3.3v電源と接続します。なお、今回仕様なのでVATTにはバックアップ用のバッテリをつながないで電源をそのまま供給していますが、この端子にバッテリを使う場合に関してはいろいろ注意事項があるので、秋月サイトのメーカー資料を参照してください。9/23ページには「動作時やバックアップ電圧投入時には、BATT電流がバックアップ時よりも多く流れます。」って書いてありますので、その辺注意が必要かと思います。まぁ通常のコイン型のアルカリ / リチウム電池で問題ない程度ですが。

■ヒシチューブ/スミチューブ■

余談ですが、結線といえば今までヒシチューブとスミチューブってメーカーが違うだけの同じものだと思っていて、ずっと30年ぐらい前に買ったヒシチューブを使っていました。が、とうとう30年目にして使いきってしまったので秋月で熱収縮チューブを買ってきました。

そしたら、まず感触からして違うんですよね。在庫のヒシチューブは硬質ビニールみたいだったけど、買ってきたものはゴムっぽい。最初「うちのはそんなに劣化してたんかいw」と思ってコミュニティに書いたら、「別物です」と教えていただきました。そうだったのかー(AA略

勉強になりました m(_ _)m

使ってみると、ヒシチューブよりもキレイに仕上がるような気がします。

■ソフト■

ライブラリを探したのですが、特に見つからず。まぁそんなに面倒くさい処理でもないので、仕様書をみながら何十年かぶりにシリアル信号処理プログラムを書きました。昔、PeopleオンラインのMac版クライアントとか書いたっけなー(遠い目

GPSモジュールは、ただ淡々とデータ(NMEA準拠)を送ってくるので、1行ずつ読み込んで目的の$GPRMCで始まる行が来たら、それぞれのカンマ区切りの後が何文字目なのかを数えつつカンマを \0 で潰してc文字列末としていきます。何番目が何の意味かは決まっているので、あとはそれを読みやすい形式に変えてから表示してます。

といいつつ、めんどくさいので時刻はUTCのままです。ちゃんと日本時間で見たい場合には9時間足せばOKです。移動速度もノット単位です。

ソフト開発Tipsを1つ。こういう「お外に出ないとちゃんと受信できない物」のプログラムを組む場合には「ちゃんと受信できたらこうなるはず」の文字列をダミーとして用意しておき、それが机の上でちゃんと処理されることを試してから外に出ましょう。128-131までのコメント部分がソレです。



■使ってみる■

ダメだろうなーと思いつつ南向きベランダに出してみます。

やっぱり測地できません。が、とりあえず日時は表示されているので、受信には成功しているようです。ということで、広い公園に出て撮ってみたのが一番上のビデオです。コールドスタートだと仕様通り1分少々かかりますね。

でも一度捕捉してしまえば、影に入ったあとでも数秒で再捕捉されます。

さて、これで「真のサイクルコンピュータ」でも作りましょうかね。WiFiテザリングでiPhoneと接続する、単三電池3本で4-8時間ぐらいしか電池の持たないサイクルコンピュータをw なお、「iPhoneってGPSも付いてますよね」という疑問を持ってはいけません。

2016年2月10日水曜日

プルアップ抵抗は小さければ良いの?

すべての回路を思い切り単純化するとLCRです。どーんと電流が流れようとすればインダクタンスLが立ち上がりを邪魔し、静電容量Cが貪欲に電荷を飲み込み、抵抗Rがそれらを邪魔します。今どきのマイコンの入力端子はほとんど全部MOSなので、端子ごとにコンデンサが挟まっているような状態です。

もう1つ前提として、マイコンなどロジックICの仕様書にはスレッショルドというものが記載されています。これは、これ以下の電圧なら確実にLowと判断され、こっち以上なら確実にHighとなる、という仕様を示すものです。数Khz以下の回路であれば、十分な余裕をもってLowはGnd近く、Highは電源近くまで振れますので、問題ありません。

でも、余裕が大きすぎると電圧の振り幅が大きくなるので消費電力が増えるし、動作も低速になります。逆に余裕が小さい場合にはノイズや電源変動で誤動作しやすくなります。

以上を踏まえて見ていきます。

■プルアップ抵抗が大きすぎる場合■

Cに充電するまで時間がかかってしまい、立ち上がり / 立ち下がりの波形がなまってしまいます。これはオシロで見れば一目瞭然なので、問題視する人は多いです。

■プルアップ抵抗が小さすぎる場合■

では、小さくすれば良いのでしょうか?

今度は、Low出力がVcc側に引っ張られることが問題になります。今どきのセンサーやマイコンは省電力仕様なので、大電流を供給できる作りになっていません。センサーの出力をマイコンにつなぐような場合、センサー内部からドライブ回路への出力がLowレベルになっていたとしても、プルアップ抵抗が小さすぎてドライブ回路の能力が足りないとGndに引っ張ることができず出力電圧が下がらずにHighと誤認識されてしまいます。

それに前述の通り今どきのマイコン / センサーの入力端子はコンデンサーみたいなもんなので、Lowに落とす場合ドライブ回路はコンデンサーに溜まった電荷とプルアップ抵抗から供給される電流に立ち向かわなければなりません。

周波数が数百Khzを越える回路だと、回路の静電容量Cや電流供給能力が問題になって、波形がなまりがちです。でも、少し極論になりますが、スレッショルド電圧から離れたところで波形が多少暴れても大きな問題ではありません。要するにデジタル回路は、スレッショルドより上か下かで動く回路なので。

ちなみにドライブ回路からの電流供給能力を支援する意味でもパスコンは重要なのです。ドライブ回路が電流を流そうとしても電源が追いついてくれなければ結局波形は鈍ってしまうのですが、そこにパスコンがついていればコンデンサに蓄積された電荷がドライブ回路に迅速に電荷を供給してくれます。センサーなどを使うときには必ずメーカー推奨回路に目を通してどのぐらいのパスコンをつければ良いか調べておきましょう。

そんなこんなで、デジタル回路も高速になるとアナログ的な配慮が必要になってくるから困ったもんですね。

2016年2月9日火曜日

ダストカウンターPPD42について

先日、ESP-WROOM-02とダストカウンターPPD42 / DSM501を接続しました。

ESP-WROOM-02カスタム基板:ダストカウンター&OLED

受注前に作例を探してみたのですが、Arduinoに接続しているほとんどの作例がP1かP2のどちらか一方の信号しか使っていません。それらのソースを読んでみると、だいたいこんな処理でした:
  • 時計をリセット
  • pulseInでlowの時間を計測し、集計する
  • 時計が30秒経過したら集計結果を計測値とする

pulseInはlowまたはhighの継続時間を簡単に測ることができて便利なのですが、2つ以上の独立事象には対応できません。今回のダストカウンターのように2つのパルスがバラバラに来るものを同時に測定することはできません。まぁ15秒ごとにP1とP2交互に切り替える等で対応は可能ですが、同時でないとなんとなく気持ちわるいですねぇ。

なので私はArduinoと違いESPにはインターバル割り込みがあることを利用して次のような処理を行いました:
  • 100μ秒ごとに割り込みを発生する
  • 割り込みごとにLowだったら回数をカウントする
  • 1秒ごとに結果をテーブルに格納する

これであれば、1秒間に10000回それぞれのポートを見に行って状態を調べることができるので、かりに計測対象がもう少し多いとしても理論上一万分の一の精度が得られます。まぁ原理的に言ってもセンサー自体そこまで高い精度はないのですがw

なお、上で「1秒ごとに結果をテーブルに格納する」と書いてますが、テーブルは60個の要素を用意してます。「秒」を配列の添字にすることによって、ごく単純に「過去60秒間のデータによる移動平均」を求めています。昔からあるリングバッファという技術を単純化したものですが、ダストカウンターのみならず温度や湿度などセンサーへのノイズなどでバラつくデータを扱うときには簡単で良いです。

応用として10秒間の移動平均を取りたい時には table[second()] の替わりに table[second() % 10] と書けばOKです。「%」は割り算の余りを求める演算子なので、秒が0-59に変化しても[ ]の間は0-9までしか変化しないので、結果として過去10秒分をぐるぐるとエンドレスサマーするわけです。nice boat。

また、2秒分集計して1分間なら table[second() / 2] と書きます。正式(?)なリングバッファはいろいろと面倒くさいのですが、時間が相手なら便利に使える方法です。ちなみに、second()のかわりにmillis()やmicros()を使えばミリ秒, マイクロ秒単位での集計も可能です。Arduinoでマイクロ秒はさすがにキツいと思いますが。

以上、最近ハードばっかりいじっているので、ソフトの記事も書いてみました。

しかしソフトの記事だと適当な写真がないな。でもソフトの話だからってgetti imageあたりから外国人幼女がソフトクリームを舐めているフリー写真(鼻の頭にクリームをつけているのはお約束)を貼ったりするのもアレなので、DustCounter基板の写真を貼るw


最初の頃と比べるとリフロー上達したなー、と、誰も言ってくれないので自分で言うw