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

2016年2月8日月曜日

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

出荷前連続稼働テスト(DSM501版)

■発端■

facebook友達のO先生が「PM2.5センサー欲しいけど高い」と書き込んでいて、私が「ポケットマネーで作れますぜ、しかもWiFi対応」とコメントしたところ、受注が決まりました。

話が早いw

■仕様確認■

当初は、倉橋屋謹製Board1をベースにしてユニバーサルボードかブレッドボードで、と考えていましたが、「持ち運ぶので丈夫かつコンパクトに」とのことで基板を起こすことになりました。
  • MCU:ESP-WROOM-02
  • 表示器:電子工作のお友達「0.96インチ OLED」
  • ダストセンサー:神栄テクノロジー製のPPD 42NJ
  • 電源:5vをモバイルバッテリなどから。USBコネクタは使わず変換ケーブル使用
  • 3ミリのネジ穴を4つ
  • センサー / OLEDはボードに乗せない。
  • センサー / OLEDとの接続は逆差し防止の爪付きコネクタ

コネクタの名前がわからなくて、某電子工作コミュニティに質問したら、みなさん教えてくださって、なかには「近くにいるから寄った」と写真まで取ってきてくださった方も。ありがとうございました。いつかコミュニティにお返しができれば良いのですが。

■設計■

Board1 Ver 0.3をベースにがっつりコネクタなどを配置。PPD 42NJについては5v電源・5v出力なので、抵抗で分圧してからESPに入力。

ほとんどauto route



はい、絵画的センス皆無ですorz

■検証■

Board1 Ver.0.0を使い、ブレッドボードでセンサーとディスプレイの動作を確認しました。ここまでだいたい48時間ほど。ホント、話が早いのは良いことです。


■基板発注〜納品■

例によって、最初の設計が出来てから2-3日寝かせます。今回ちょうど週末にかかっているのと他に3種類の基板が同時に設計出来上がったので、いいタイミングでした。

1/18....発注
1/26....深センから発送(EMS)
1/28....到着

DHLよりEMSの方が安くて早い。DHLは日本に着いてからが遅いんですよね。



で、週末の1/30、早朝からリフローです。2枚並行して作ろうと思ったのですが、もし設計にミスがあったら2枚分の部品がパーなので、1枚だけ作りました。なお、自分用にリフローする時は、ESPの端子には横一列にまとめてハンダペーストを置いてしまうのですが、今回は受託品なので丁寧に一個一個ランドに置いていきました。そしてホットプレートでリフローし、スルーホール部品をハンダ付けして完成。

とりあえずLチカを…と思ったのですが、LEDを取り付けたIO13にはダストセンサーをつなぐことになっているので、その替わりにTxラインに Serial.write("tarepanda");と送って、ランプが点灯することを確認しました。以前間違えてLEDと直列に10kΩの抵抗を入れたらホタルイカのようにササヤカな光が点ってそれはそれで味わいがありました。

今回は元の設計通り1kΩにしたのですが、明るいわぁ(笑)。あまりにも明るすぎるので納品版は2.2kΩにしました。それでも明るい。

■サンプルソース■

例によって難しいことはしていません。センサーからP1/P2の2本の信号線からパルスが出ていては、埃を検出した時間が長いほどP1/P2のLow時間が長くなるとのことです。P1は1.0μm、P2は2.5μmの埃を検出します。

よくあるサンプルだとArduinoのplusIn関数を使ってどちらかのパルスがLowな時間を計測し、それを30秒間合算しているという例が多いのですが、それだとP1/P2の両方を図ることができなくなってしまいます(どちらか一方のパルスに専有されてしまうので)。

なので、このサンプルでは、100μ秒ごとにポートを見に行き、LowかHighを判断し、Lowならカウンタを加算する、という単純な方法をとっています。60個の配列を用意し、各秒ごとに各配列の値を加算すれば、過去60秒間の各秒毎のLow時間を集計できますので、あとは全体を集計すれば過去60秒間の合計Lowを求めることができ、過去60秒間の移動平均も出すことができます。

追記(02/009):ソフトウェアについてもう少し詳しく書きました

あと、ESP-WROOM-02の作例では、set upで接続されるまで待って、それから処理を継続することが多いのですが、それだとWiFiとの接続ができない場所だとデモもできません。なので、とりあえずbeginで接続を試みたあとは、通常のloopの中で接続成功したか否かを見に行き、結果をOLEDに表示するようにしました。つながらなくてもとりあえず計測および表示を続けていて、つながったら1分ごとにThingSpeak.comへ送っています。



■公開情報■

githubにてeagleデータを公開準備中です。ソースとEagleのデータをひとまとめにして公開しようとしているのですが、ついでに自分の作業用ディレクトリも大整理しているところなので時間がかかってます。

■ビルド方法など■

長いことArduino / ESPを使っていると、いつの間にかいろいろなライブラリが充実しているのですが、「これが最初!」ということになると素直に走ってくれません。というわけで、ビルドに必要な方法を挙げて行きます。
  • USBシリアルのドライバをインストール
    • Windowsの場合は、お使いのUSBシリアルのドライバをインストールするだけ
    • MacOS Xの場合、10.8以降、ドライバに認証が必要になったため、ややこしくなってしまいました。
      • 大まかな手順としては、Appleの認証のないkextの使用を許可する、という設定をして、それからライブラリをインストールします。
      • 使用許可はセーフティモードで再起動した後、ターミナルから以下のコマンドを実行し、また再起動し、それからライブラリをインストールします。
      • 使用しているUSBシリアルがFTDIの場合はここからダウンロードします。
      • 最近多くなってきたCH340についてはここの一番下(らしいのですが読めないのでわかりません…)。
      • うまくいかない場合には、ご遠慮なくお問い合わせください。
  • Arduino IDE 1.6.5
    • とりあえず動作確認した環境は1.6.5です。
    • 公式ページからダウンロードしてインストールしてください。
  • OLEDライブラリ
    • 以下のgithubからzipをダウンロードします。
    • Arduino IDEを起動し、スケッチ>Include Library...>Add .ZIP Libraryで先ほどダウンロードしたOLEDライブラリを指定して読み込んでください。
  • Time.h
    • 時間を扱うためのライブラリに含まれます。
    • このページの「Download ZIP」をクリックしてダウンロードしたファイルを上記と同じ手順で読み込みます(スケッチ>Include Libraryうんぬん


■謝辞■

各ライブラリの作者の皆様、

そして、この基板の発注主であり記事として公開することを快く許してくださったO先生、

ありがとうございました。

■お問い合わせ■

ご購入や製品開発についてのご相談はこちらまでお気軽に。

ご参考までに今回のオーダーメイド完成品で1セット2万円以下です(完成品1個+未使用基板8枚、デモ用ソフトと送料)。

また、5台からElecrowにて量産可能です。その場合、今回のものなら外付け部品も全部そろえて10台5万円程度です。

オーダの流れ:
  • メールで「こんな機能が欲しい」とご相談ください。
  • 何度かのやりとりの後、構成案と費用をお知らせします。
  • PayPalにてお支払いください。
    • PayPalはショッピングプロテクションがあり、もし納品されない場合には返金されるので安心です。私もebayで何度かお世話になりました。
  • 試作、基板設計、基板発注、基板完成、実装…など各段階で進捗をお知らせします。
  • 宅配便にて完成品をお送りします。
  • Google+にてユーザサポートを承ります。
    • グループでのサポートは無償です
    • privateサポートについてはご相談ください。

□追記(2018年12月14日)□

経験値上昇の伴い、値上げしました。最低4万円からですm(_ _)m。

あと、お取引にはココナラハンドメイドを使いますので、契約時にクレジットカード等でココナラに対して支払っていただき、納品後に私に対して決済される形になります。

ご相談はこちらまで。お気軽にどぞ。

2016年2月7日日曜日

白ドットのESP-WROOM-02が正常に動作しない

■まとめ■

比較的最近のESP-WROOM-02のEN端子はVccに直結するか、少なくとも1kΩ程度の低い抵抗でプルアップしないと動作しない。

■詳細■

1月中旬に購入したESP-WROOM-02がおかしい。ESPはロットによって検査印の色が違いますが、白いドットのやつです(白が全部ダメというわけではないが、おかしいのは全部白)。

症状はこんな感じ:
  • パワーオンリセットしない。
  • ファームウェア書き込み後にワームブートしない。
  • リセットボタンを押しても反応しないことがある。
  • Arduino IDE  1.6.5から単純な1HzのLチカを実行した際に、点滅が不規則になる。それも3秒動いては1秒休むという状態。単純なカウンタを追加してシリアルから出力するとその間にリセットされている様子はない。
  • しっかりした電源をつないでいてもcause: 4でException
  • I2Cがおかしい。他で動くものが動いたり動かなかったり。

とりあえずArduino IDEのiot sdkではなくrtosのLチカを実行してみると正常に点滅を続けます。この手順でファームv1.2を組み込んでもiot sdkではやっぱりダメ。

いずれのファームウェアでもパワーオンリセットはかからないのは同じ。ESPの周辺の回路は普段ブレッドボードなどと同じだし、オシロで見ている限りは電圧ドロップアウトなども起こっていないけれど、status 4で落ちるのはどのファームでも同じ。

うーん。困った。で最近1ヶ月の記事で検索してみたらコレがヒット。

CH_ENを使って外部からESP8266を起動させていて、動作が不安定な場合はハードウェアユーザーガイドを参照し、RC遅延回路を追加すること

前にHardware Guideを読んだ時に見落としていたか…。

今までENは10kΩでプルアップしてて問題ありませんでした。で、上の記事に引用されているHardware Guideによれば内部的にプルアップしているから外付け不要とのことなのでプルアップ抵抗を外してみたのですが…まったく動きません。

でもVccと直結してみたら、パワーオンリセットが効くようになりました。つまり、内部ではプルアップされていないということですね。Lチカが不安定だったのもENが中途半端だったのが原因だったのでしょう。もう何を信じていいのかわかりません。

しかし困りました。

何が困ったって?

Elecrowでボードに組み込んでもらったので不良品が20個目の前にww


俺オワタwwwww

2016年2月2日火曜日

新製品リストに出てこない秋月

結構あるんですよね。たまたま別のものを検索してて見つけたり、秋葉原店頭の「新製品コーナー」で見つけたり。

今回見つけたのは以下の点。

秋月のWebから


並んでしまった。「4桁赤色7セグメントLED表示器(コロン付) カソードコモン(カソード共通)」はWebの新製品ページに並んでいるのですが、カソードコモン各色とアノードコモンの緑は未掲載です。さっそく全色買ってしまった。もう一回り大きければいいんだけどなぁ。でも、これで、時刻なのか経過時間なのか温度なのかが今ひとつわかりにくかった我が家の7セグLEDデジタル時計も改善されるってもんです(まだ作るのかデジタル時計)。

次。

秋月のWebから

12chLEDドライバIC MY9221TE

…この2つは写真が違うんだけど、見た目は似たようなもんだからいいやw で、この2つ、何が違うのかと思って両方買ってみたんですが、違うのはパッケージだけのようです。両方買った意味がなかった。

HT16K33みたいにシンクとドライブでマトリクス駆動みたいな使い方ができるのかと思ったんですが違いました。単に(と言ってはアレですが)12chのLEDを独立してかなり精密にPWM制御できる、というチップでした。RGBごと(3色☓4ch)に外付け抵抗で電流のリミットを決められるのでホワイトバランス(?)をアナログ的に設定できたり、それなりの小技は使えるようです。

でも、何に使ったらいいのかわからない…とりあえずナイトライダー的にクルマやバイクでチカチカさせたりするのには丁度良いのかも。LEDで検索すると、バイクやクルマのストップランプ / ウィンカーをLEDでどうにかしようっていう層が結構アツいんですよね。

なかにはかなり無謀な使い方をしている例(1A流してセメント抵抗で電流制限とかはまだ良いほう)もあるので、そういう方々にはマイコンとMOSFETでちょっくら制御して差し上げたい。

関係ないですが、AnlogDiscovery2が出ましたねぇ。Windowsを入れなくても使えるようになったみたいで、無印を買おうかどうしようか悩んでいた私の背中をどーんと押されたような気分ではあるのですが、さてどうしたもんか。

秋月のWebから

そういえば新製品で「2端子デジタルIC温度センサ LMT01LPG」、ってのも出てますね。2端子で電源どうすんだろう?と思ったら、【出力パルス数で、温度を表します「0℃:800パルス」「50℃:1600パルス」】とのこと。


へー、そんなのもあるんですね。88khz、100mSと書いてあるので間欠的にパルスが出てくるんでしょうか。150円とデジタルの温度センサとしては安い方ですし、入力1本しか使わないので、I/Oの足りないESP-WROOM-02で使うと良いかもしれません。

ってか、風呂温度計に丁度いいなぁ。買おうっと。

なお、安いデジタル温度センサといえば「高精度12ビットI2C接続デジタル温度センサ STTS751」なんてのもあります。こっちは100円。ただしSOT-23-6なので変換基板等が必要です。

そんなこんなで。

2016年2月1日月曜日

ピンソケットの小さな落とし穴

秋月電子通商のサイトより


秋月の「分割ロングピンソケット 1x42 (42P)」は大変便利です。10本単位で買って愛用しております(割引にならないのが残念)。

が。小さな落とし穴があります。

この分割ロングピンソケットは、ピンヘッダに対応していません。ピンヘッダのピンが接点までギリギリ届くか届かないか、という状態です。今までジャンプワイヤでしか使っていなかったのですが、同社の「超小型USBシリアル変換モジュール」に同梱のピンヘッダをつけて使おうとしたらスカスカで、指で軽く押さえていないと通信が途絶してしまいます。

なお、分割タイプでないピンソケットの場合には、ピンヘッダがしっかりと固定されます。中の接点の構造が異なるのでしょうね。また、長足タイプのピンヘッダは当然、問題なく使えます。

どうぞお気をつけて。