2018年11月5日月曜日

今更ですがESP32でニキシー管時計を作る


■はじめに■

先日、知人Kさんから依頼されてニキシー管時計を修理しました。一度うまくいったんですが、数日後また破損。もう一度調べてみたら高圧側のトランジスタが破損。交換しても直らなかったのであとはわからーんとギブアップしました。申し訳ない。

K氏はオークションで入手したそうですが……基板はヤニまみれ(フラックス洗ってない)でICもニキシー管もソケット無しの直付け状態、少し経験のある人なら基板見ただけで「ギャッ」と叫びたくなる代物でした。

ちゃんと作ればそれなりにできるんじゃね?ってことで、ついうっかり、アマゾンでニキシー管と74141互換チップなどをポチってしまいました。

てことで作ります。

■仕様と設計■

せっかくニキシーなので時計の基本機能をTTL(Nシリーズ)やDTLで作ったら超クールなのですが、そこまでは攻めません。手元にゴロゴロしているESP32を使います。ESP-WROOM-02と比べてGPIOが潤沢なので時計も簡単に作れます(そういえばまだESP32でデジタルクロック作ってないな)。

最近の私は3.3Vが標準電圧で、5Vは高圧です。しかしニキシー管は180vという超高圧で動作しますので怖いとかいっていられません。高圧を作るには、DC/DCを使います。せっかくADC付きのCPUがあるので、それをコントローラにして昇圧チョッパー回路で高圧を作ります。

ニキシー管はダイナミックドライブにして、セグメントドライブには前記の通り74141を使い、カラム側のスイッチにはMOSフォトカプラを使います。これならよっぽどバカな失敗をやらかさない限りはCPUなどが壊れることがないので。CPUはまだしもMacに高圧かかったらもう生きていけません。

チョッパ昇圧回路のスイッチング周波数とかL値どうしようかなと思っていたら、計算式が見つかった。すごいよインターネッツ。試算するとだいたい経験則と近い値が返ってきたので、使わせていただきます(Rds=200mΩ,L=220uH,V=5v,I=0.1Aで520kHz)。ありがとうございます。

なお、ESP32にはPWMをわりと細かく制御できるledcなんたらという命令群がありますが、8bit精度の場合には320khzあたりが上限みたいです。1000000hzと指定してもこのぐらいの周波数しか出てきません。手持ちのMOSFET(パワーMOSFET TK6Q60W (600V6.2A))はRdsが600mΩ程度なので上記計算式からL=470uHを使えば良い感じで昇圧回路が働くのではないかと思われます(ブレッドボードの直流抵抗もバカにならないんですが、とりあえず気にしない)。整流にはファストリカバリダイオード(ファストリカバリダイオード 1JU41 (10本入))、キャパシタにはこれ(電源用電解コンデンサ   47μF400V105℃(ルビコンBXC))を使います。ESP32のledcなんたらについてはこの辺。


■実験■

とにもかくにも高圧回路。次にニキシー管点灯を実験します。

マイコンで制御する高圧発生回路は以前はと撃退用にLPC1114FN28で作りました。今回もよくあるMOSFET使用のチョッパー型昇圧回路を作ります。発生電圧の計測は抵抗で1/100に分圧しマイコンのADCを使います。MOSFETはNPNトランジスタでドライブします。

MOSFETの使い方に関しては、ここの解説が定番かと思います。

PWM周期はカットアンドトライで詰めて300vまで出せることを確認しました。コンデンサなどの耐圧がボトルネック(400V)なので、こんなに高くする必要はもちろんないんですが、PWMのデューティーとリニアに比例するあたりで使わないと制御プログラムが複雑になるので。

あとは可変抵抗もADCに接続して手動で設定電圧を可変できるようにしておき、発生した高圧も分圧抵抗通して別のADCに入力。可変抵抗で調節した値に電圧が自動調整されるコードを実行して、プレートに高圧、適当な数字をGNDに接続して、点灯テストをしました。IN-12Aの場合、120Vぐらいからセグメント?の一部が光り始め125Vでフル点灯になりました。よっしゃよっしゃ。


その後、一度部品をバラして組み直したら何故か電圧が60Vぐらいしか上がらなくなってしまいました。原因は電解コンデンサの極性が逆でした。怖い怖い。これヘタすれば爆発しますからね。気をつけましょう。なお逆接続で使った電解コンデンサは内部の劣化が進んでいる可能性が高いので、勿体ないけど廃棄します。申し訳ない>電解

で、この電圧管理部分は他の処理でブロックされるわけにはいかないので、別タスクとして起動します。Arduino ESP32はFree RTOSベースなのでありがたいです。

■そして茨の道■

ニキシー管には12本の端子があります。6桁だと72本っすね……ええもう修行僧になって配線しましたよ。今回ダイナミック点灯で数字に関しては全部並列です。なので、エナメル線を使いました。先日UEW線を試してみてイマイチだったのですが、線を細いものに変えてみたらばっちりでした。


ラグにエナメル線を2回通して絡めておき、少し温度を高めにしたハンダごてでじっくり溶かし込んでやります。イヤな煙が出るけど、気にしません。ざっと2時間ぐらいかかりましたが、最初にワイヤを全部切っておいて試行錯誤なしなら小一時間ぐらいでしょうか。なお、写真上の方にあるのは、導通確認用に作った定電流IC+LED付き電池ボックスです。


先週金曜日にiPhone Xが届いたのですが、なんかムダに写真がキレイですw なおソケットの色むらは買ったときからで私が焦がしたわけではないので念のため。

それからアノードは各桁ごとに配線します。写真ではオレンジ色の配線。高圧側なので一応26AWGのシリコンワイヤを使いました。ダイナミック点灯のコードを書いて、無事6桁点灯しました。最初隣の桁が薄ぼんやり点灯する現象が起こったのですが、そこはソフトウェア制御なので、ガードタイムを設けてカバー。

コーヒーカップ、洗いなさい

■ソフト■

と、ここまで三連休のうち7時間ぐらいで終わりました。時計のソフトは何度も作っているので、翌週末の午後で何とか完成。もうちょっと掃除したら公開します。

でも、時計として使うには、ちゃんとケースに入れないとダメですね。電流弱いからトラッキング現象で炎上、なんてことにはならないでしょうけども。

ってことで、そのうちケースとソフト掃除が終わったら続きを書きます。

2018年10月25日木曜日

ESP-IDF+Arduinoで書いたプログラムをバイナリ配布する


LGPLなライブラリを使用している場合、当該ライブラリが静的リンクなら製品のソースを配布しなければならない等いろいろありますが、少なくともArduino coreを使用している場合には、ユーザ自身の環境でビルドしてライブラリのバージョンアップなどに対応できるようになっていればソース公開の必要はないとされています(※下記FAQの記載ですが実際に利用する際には弁護士などに確認してください)。

個人の開発であれば、面倒なのでgithubでソース公開しちゃえば良いのですが、企業での製品開発だとソース公開ができない場合も多いです。

そこでESP-IDFを利用している場合に製品のバイナリだけ配布する方法を調べてみました。試行錯誤でずいぶん手間取ってしまったのですが…結果としてはとても簡単です。コンポーネントはlib〜.aとしてまとめられるので、これをcomponent.mkで指定してmakeするだけです。通常はlibmain.aですが、componentsに自身で書いたコードが置いているときには、lib+コンポーネント名のlibができます。

  1. esp-idfでmake
  2. build/main下にあるlibmain.aをプロジェクトディレクトリに移動
  3. その他の自作コンポーネントがあれば同様にlib〜.aを移動
  4. main下のcomponent.mkに
    COMPONENT_ADD_LDFLAGS := libmain.a
    を追加する。他の自作コンポーネントがあればスペース区切りで列挙
  5. main下および自作コンポーネントのソース(.c, .cpp, .h)を消す
  6. buildディレクトリなど不要な要素を消す

これだけです。makeでビルドできるはずです。ビルドが確認できたら、component.mkへの追加事項などビルドに必要な情報を記載したreadmeとlib〜aを配布すれば、ライセンス要件をカバーできます(くれぐれも弁護士さんに確認してから実施することをおすすめします)。

ライブラリを追加すれば良いのはわかっていたのですが、COMPONENT_ADD_LDFLAGSで追加するという方法を見つけるまでさんざん苦労しました…お役に立てば幸いです。

2018年8月29日水曜日

鳩対策は終わらない:1


ベランダについては、電撃柵などの対策により、ようやく来なくなりました。

が、共同廊下側にまた来るようになりました。公団でテグスを張ったり、私がサーボで追い払ったり、止まらないようにカバーをつけたりして、2ヶ月ぐらいは来なかったのですが。

一度来るようになると、追い払っても毎朝来ます。そして大量のフンを残します。

小手調べとして、市販のセンサーライトを設置しました。PIRを使ったもので、生物が近づくとライトが点きます。ただ、明るいところでは点灯しないためのCdSセンサーがついているので、センサーの上にアルミ箔を貼って遮光してあります。ご覧の通りの2眼式?で目っぽく見えるのが味噌。かな。

昨日設置して、とりあえず今朝は糞がありませんでした。それで喜んでいたら、その後ジョギングから戻ったツマ「いや、普通に来てたよ」とのことorz

で、プランターなど「いかにも巣を作りたくなりそうなエリア」の近くにセンサーライトを移動しました。その翌朝、糞もないし、鳩も見かけませんでした。

今のところは。

しかし鳩が一度その場所に執着してしまうと、結局は物理的に排除しないとダメ(殺すのではなく防鳥ネットなどで入れないようにするという意味ですよ>鳥獣保護法)、というのが結論ではありますが、共同の廊下なのでそうもいきません。

なので、新しいガジェットに慣れたら次のものを用意するのではなく、なれるヒマを与えず次々と用意する、ってのはどうだろう。

ということで、いろいろ考えています。基本になるのは、ラズパイとカメラを使った顔認識+PIR。鳩を認識して、ってのができれば良いのですが、学習させている間に廊下が糞だらけになってしまうので…とりあえず「何か生物が来ている」から「顔を認識したから人だわ」を引き算すれば、「人間以外の生物が来ている」と判断できるんではないかと。

後ろ向きはどうする?ってのはありますが、普通の人は顔をこっちに向けて歩いてくるので、去っていく時間に余裕を見ておけばまぁ大丈夫かなーと。

で、アクチュエーター?部分ですが:
  • プロジェクタで猛禽類の映像を投影する
  • 電池駆動プラモに最小限の改造を加えて生物を検知するとぐるぐる走り回るようなものを作る
  • 蛇のおもちゃを複数のウインチ+モーターでつってSkycamならぬSkySnakeで驚かす
  • めんどくさいからルンバのパチモノ導入
  • いっそトイドローン飛ばして驚かしたらいいんじゃね
  • 空飛ぶドラえもんとか
  • 忌避剤スプレーをセンサー検知で噴霧
  • ISD1820にPIRつないでカラスの鳴き声を流す
  • ESP32にスピーカーつないで、動きを検知したらFlash内の音を再生する。Flash内の音は適宜http server経由で入れ替えができるようにする

最後のはうっかり途中までソースを書いてしまったw

「ボタンを押すと上がっていく」程度のトイヘリコプター(「空飛ぶドラえもん」など)に紐つけて飛ばすってのが私のヘボ技術力と予算と鳩への脅威という点で良さげだったのですが、ちょうど良いトイヘリが見つからず。

というわけで、続きます。

2018年10月15日
久しぶりに糞が落ちていました。糞を片付けてからその正面にPIRセンサーライトを1つ追加しました。なにもしないと糞を発見した後はエスカレートする一方(産卵期が終わると収束)なのですが、さて今回は防げるかどうか。

2018年10月30日
糞が落ちていました。ので、自作のPIRセンサーライト(2個のRGB LEDを様々なパターンで点滅させまくる)を追加しました。

2018年11月5日
ここまでPIRのGND浮き、風による誤検知、風邪寝込みなどありましたが特に糞はなし。ですが今朝方2個小さな糞が落ちているのを見つけました。産卵期特有の茶色いものですが、このまま悪化しないことを祈ります…。ただ、これまでの被害パターンと比べれば、格段に糞は少ないです。設置前は写真をここに貼れないレベルでしたので…。

2018年11月9日
ごく小さな糞が2個。

2018年8月22日水曜日

ESP-IDF 3.2で一度WiFi接続に失敗すると二度と接続できない

という現象が出てしまい、頭を抱えてました。
  • v3.2で一度WiFi接続に失敗するとそのボードは二度と WiFiに接続できない。ただし、一度3.0で接続した直後は正しいStationには接続できる。
  • v3.0ではこの現象はでない
  • v3.2でもごく単純なアプリでは出ないが、複数threadにまたがって処理するような規模のアプリで出る。
というWiFiマイコンESP32にとっては致命的な現象。そのSSIDが確かに存在しているのにエラーとして「WL_NO_SSID_AVAIL」が返ってくる、というのが特徴です。

ArdunoをESP-IDFのコンポーネントとして使っていて、WiFi接続にはArduinoのWiFiクラスを使っている、というのが影響しているのでしょうか。

結果として、以下のコードで解決しました。失敗したらesp_wifi_restore()を実行する、だけです。

ググって、同様のエラーにハマっている人がいましたが、どうも解決できていないようでしたので、記事にまとめました。I'm sorry this message is in Japanese, but I hope my sample code below may help you!

2018年8月2日木曜日

なんちゃって冷やし中華

重曹入れたお湯でパスタ茹でると中華麺っぽくなる。

ならば、冷やし中華にもなるんではないか?と思って研究してみました。

  1. お湯一リットルに塩10gと重曹10gをいれて、パスタをゆでる。細めのパスタはアルデンテ+1分、太めのものは+2-3分。
  2. ザルにあげてよく水洗いする。手で揉み洗いする感じ。粗熱をとったあと氷水で締めると尚良
  3. ザルで水を切る。大事なのは、手のひらでザルにぎゅううう、と押し付けて、水を絞り出すこと。すべての冷たい麺はこれで味がぼやけなくなります。
  4. 冷やし中華たれやバンバンジーたれなどで適当に味をつけて食う

結果、ちょっと沖縄ソバにも似たプツプツした歯ごたえの麺になります。

なお、普通冷製のパスタは細い麺を使いますが、重曹でゆでると太いのでも大丈夫。先祖返りっぽいですが、ダイスカットのトマトと刻んだバジルか青じそもしくは青じそ味のドレッシングなどかけても夏の昼食として美味しゅうございます。