2015年11月7日土曜日

「机ドン!」検出デバイスw


■追記■

ESP-WROOM-02にも対応しました(リンク)。

■原因はWindows/Excel■

どっちも嫌い。Excelは使い慣れているGoogle SpreadsheetやNumbersと比べてUI特にモード遷移が不自然で違和感の塊だし、ASCIIキーボード愛用マカーなので日本語切り替えキーが変なところにあるのもイヤ。

そんなこんなで職場でのイライラは募るばかり。

そのせいか、ついついキーボードを「バン!」と叩いていたようで、同僚氏からクレームが来ましたです。辛く当たってごめんよ、Apple Wireless keyboard(自腹購入)。

しかし、気をつけていても直らず。

ということで、振動を検出・通知するデバイスを作りました。

■仕様■

手っ取り早くArduino nanoと加速度センサーADXL345とマイコン内蔵LEDを使う。

一定以上の衝撃を検出したら、各軸に対応した色のLEDをペカペカ点滅させる。「一定以上」の値についてはボリュームで設定する。

手持ちで単純なRGB入りLEDもあるのでシリアルRGBを使う必要はないんだけど、当初ピンの少ないESP8266上で動かそうとしていたのです。しかしArduino用ライブラリでは動いてくれないので挫折、nanoにしました。

初めての秋月版、きれいにまとまったのに
なお、上の写真でADXL345(赤い基板)のハンダがすごく汚いですが、これは電子工作を再開した直後に作ったもの。隣の秋月ESPに免じて許してやってください。少しはきれいになったのは昔の勘を取り戻したというのもあるけど、大きなものでもルーペ使ってハンダ付けするようになったのが大きな要因だと思います。

■接続など■

Nano接続先
3.3v出力ブレッドボードの+ライン
GNDブレッドボードの-ライン
5v出力マイコン内蔵LEDのVdd
D2マイコン内蔵LEDのDin
A4ADXL345のSCL
A5ADXL345のSDA
A610KΩ半固定抵抗の真ん中

ADXL345接続先
SCLArduino A4
SDAArduino A5
SDOGND
CS3.3v
Vs3.3v
GNDGND
Vdd3.3v

その他、半固定抵抗の一端をGND, 他端を3.3v、マイコン内蔵LEDのGNDをGNDに接続します。あ、またパスコン入れ忘れた。

標準のArduinoだとA6って使えないんでしたっけ。その場合はA0-A3どれでも結構です。そしてソース上のanalogReadで指定しているピン番号をそれに合わせて変えてください…A0の場合は14です。

nanoではなくnanoパチ

■ソフトについて■

ADXL345のライブラリはAndroid Citiさんのライブラリ、マイコン内蔵LEDについてはAdafruitさんのライブラリを使用させていただきました。ありがとうございます。

あ、そろそろ年末だからAdafruitさんに何か注文しなきゃ(注:いつも同社が提供しているライブラリを他社製品でばかり使っているので、年に一度お礼代わりに何か買うことにしています)。

コードはsetupで各デバイスを初期化、点滅に必要なサインカーブ用テーブルを用意、装置の傾きなどを補正するために各軸からの値の平均値を取ってます。loopはぐるぐる回りながら加速度を読み込んで初期値との差分が一定値を超えていたら点滅用のカウンタをセットし、あとはカウンタをインクリメントしながら各軸の値をテーブルに従って変えています。無駄な演算多いけど許してください。

うーん、本当は「ドン!」のピーク値を算出し、それを元にして最大照度などを決定すべきなんですが・・・面倒くさいからやってません。また、現在は加速度で検出していますけど、重力加速度の影響で傾けたりしても誤動作してしまいます。それこそ毎度お馴染みFFTを実行して数Hz以上の加速度成分が一定値を超えたら作動する…って処理にすれば完璧だと思いますが・・・・面倒すぎるのでやってません。


2015年11月5日木曜日

表面実装立体化シリーズ:MOSFET

老眼鏡でも見えない件

最新のMOSFETはすっごいですよね。毎度お馴染みの2N7000あたりと比べるとオン抵抗、スイッチング速度、ドレイン電流、どの特性も一桁違う感じです。

しかし、残念ながら新しいのはみんな表面実装か大型パッケージ。

というわけで、またピンヘッダに直付けしてみましたw

以前のチップ抵抗/コンデンサは大変うまくいったのですが、今回は2個つくるのに30分もかかりました。最初はピンヘッダを内側にまげて、GDS配列のまま取り付けようとしたのですが、どーにも細かすぎて私のスキルでは無理。

なので、1と2を隣接するヘッダにハンダ付けし、3はジャンパで飛ばしました。試してみたらちゃんとスイッチングしているので、一応生きてはいるようです。

ちょっとゴツいけど、初期の点接触トランジスタみたいでちょっと萌えるw

ブレイクアウト基板ならもう少し簡単だけど、ディスクリート部品にはちょっと大げさになってしまうので、こういう作業を簡単にできるブレイクアウト・ピンヘッダみたいなのがあれば、それなりに売れるんじゃないかな。

おお起業ロマン!…と一瞬思ったのですが、こういうプラスチック型が必要で初期投資大きく、単価が安いものはリスクが大きいよね。

夢は見ないで大人しく寝ます。みなさんも良い夢を。

2015年10月28日水曜日

電子工作でのモバイルバッテリ利用について

今はなきエネループのモバイルバッテリKBC-L3、電子工作で手軽に使えて便利です。わりと安定した5vが出てくるしコンパクトだし。

電子工作の電源としてもっと普及しそうなのに、あんまりネタを聞かないなぁと思っていたのですが…新しくもっと大容量のモバイルバッテリを買ってその理由がわかりました。

エネループのモバイルバッテリは最低5mA流せばパワーオフしないのですが、新しく買った方は100mA流しても切れてしまいます。間欠利用でも500mA以上の電流を2秒流して8秒止める、ぐらいのパターンでないと切れます。

うーん、「大容量だから長時間もってくれるよね」って期待したのですが、甘かった。

このモバイルバッテリどうしよう。最近のスマフォ(iPhone6s plusに変えました)は電池切れないので、外付けなんて使わないし。

…と言っていたら、先日使う機会がありました。iPhoneを充電し忘れていて残量30%で家を出なければならなかったのですが、職場ではMacにデバイスをつなげられないので会社でモバイルバッテリから無事充電できました。

ちっともモバイルじゃないな…。

2015年10月25日日曜日

iPhoneアプリを考えてみた。

Beaconなどを使ってお互いの信号強度だけから相手の位置を求められないかと思って考えてみました。

アルゴリズムとしては相互の距離だけがわかっているn個の点について、二次元座標上のそれぞれの位置を求めなさい…っていう問題ですよね。

そんなに精度は期待できないしn=10ぐらいまでなら総当たりで一番確率高いのを正解とする、のも不可能ではないかと思って計算してみました。

えーとメッシュの交点が1000箇所あるとして、それぞれに10個を置く(重なる場合もあり)わけだから…1000x999x998....990=およそ10^30でえーと1回の演算が0.1μ秒として10^23秒。宇宙の年齢の10^6倍。

ちょっと遅いですね。もう計算が1-2桁違ってても気にならないレベルw

メッシュを減らしてから絞り込まないとどうにもならない。とはいえメッシュ100個でも約10^20秒なのでiPhoneが電池切れするどころかリチウムが半減期を迎えるレベルじゃないかな(リチウムの半減期がどのぐらいだか知らないけどさ)。

うん。無理。

計算の途中で「あ、この組み合わせはないわ」というのは比較的早くわかりそうなので、ここまでスゴいことにはならないかもしれないけど。

なお、以上は電卓でざっと叩いて検算もしていませんが、多少桁が違っていても宇宙的尺度からすれば大したことではなので、お気になさらないでください。

なお「あれ、順列と組み合わせのどっちだっけ?」とさっきから考えているのですが、間違っていても10!=6桁違うだけでたいしたことではありませんw

2015年10月24日土曜日

鳩対策2号機(動きモノ


学習能力のあるカラスは電撃一回で来なくなったようですが、鳩は電撃で対策した柵には寄りつかなくなったものの今度は室外機の上に来るようになりました。

ということで、今度は、光り物と動き物で脅かす作戦にしました。やつら「実害」がないとダメなので、当初は電極を振り回そうかと思ったのですが、製作中に私が「実害」を受ける未来しか浮かばないので保留。

■仕様■

まず使用機材:
  • 動作状況をモニタできるようにESP8266を使用
  • 動きモノはサーボモータSG90
  • 光りモノは赤色LEDを直接接続
  • 鳩検出はPIR
  • 動作状況の記録にはThingSpeakを使用
動作仕様:
  • PIRで何かを検出したら時計をセット
  • 時計がセットされていたらサーボ腕を振り回しつつLEDを点滅させる。5秒経ってもどかなければ、LEDの点滅を激しくする
  • 何かがいなくなったら、サーボとLEDを止めてから何秒とどまっていたかをThingSpeakに送信
  • それとは別に1分ごとに気温と湿度をThingSpeakに送信する

■ハードウェア制作■

ESP8266/ESP-WROOM-02の電源を甘く見てはいけません。最終的に毎度お馴染みの「超高効率DC-DCコンバーター(3.3V0.5A) M78AR033-0.5」を使い、アルミ電解コンデンサ470uF + タンタル4.7uF + 積層セラミック1uをブレッドボードの3.3v電源ラインに並べ、ESPモジュールの上、Vcc - GND間に直接積層セラミック0.1uをハンダ付けして、安定動作させることができました。VccとGNDが離れているのでパスコン付けにくいんですよね…。ロットでの差異や個体差もあると思いますが、ここまでやれば起動直後にドーンと電流食われてもだいたい安定します。

サーボモータはIOピン直結、LEDはVfの実測値1.8vだったのでESPのIO定格値12mAを超えないよう150Ωの抵抗を入れて制限します。

HDC1000は秋月のプルアップ抵抗内蔵モジュールを使いますので、電源とI2Cを接続するだけでOKです。

PIRはHC-SR501を使いました。アマゾンでも秋月でも入手できます。このPIRは4.5vから使うことができます。秋月では5-12vと書いてありますが、他サイトでは4.5-12vになっていて、実際に試しても5vで問題ないようです。SE-10のように5vって書いてあるけど5vで使うとしばらくして不安定になる、ということはありません。以下配線表です。


ESP-WROOM-02モジュール接続先
1Vcc3.3vライン
2EN10kΩを通して3.3vラインへ(プルアップ)
3IO14HDC1000のSCLへ
4IO12150Ωを介してLED1へ
5IO13150Ωを介してLED2へ
6IO15N.C.(無接続)
7IO2プルアップ
8IO0プルアップ
スイッチを通してGNDへ
9GNDGNDへ
10IO4HDC1000のSDAへ
11RxDFTDIのTxへ
12TxDFTDIのRxへ
13GNDGNDへ
14IO5N.C.
15RSTプルアップ
スイッチを通してGNDへ
16TOUTN.C.
17IO16SG90の信号線(オレンジ色)
18GNDGNDへ


この他、各モジュールには電源を接続します。HDC1000はモジュールに書いてある通り、PIRはここがわかりやすいです。サーボはこちらを参考にしました。

PIRは感度と出力秒数をボリュームで、ジャンパで出力モードを指定できます。感度ボリュームは検知範囲の指定ですが、人間よりも小さい鳩が対象なので最大(7m程度)にします。出力秒数は動きが検知されなくなった後何秒ぐらい出力HIGHをキープするかを設定します。よくある侵入警告灯などで使う機能ですね。これは居なくなったらできるだけ早く消えて欲しいので最小にします。ジャンパは信号出力中に動きを検知した場合に点灯時間を延長するか最初の検知から指定時間を経過したらその間動きがあってもOFFにするかを切り替えます。内側は動いている間はずっと出力、外側は指定時間でOFF。今回は鳩の滞在時間を調べたいので、内側にします。上記の通り出力が延長されてしまうので正確な記録にはならないのですが…まぁ傾向はわかるかなと。

■ThingSpeakすげえ■

今回、ThingSpeak初めて使ったのですが、こういうWebサービスの中では今までで一番簡単でした。開発中、「そろそろThingSpeakへの書き込みコードを用意しておこう」と思ってコピペしてAPI KEYや変数などを書き換えてそのまま放置していたんですが、画面の隅で何か動いているものがあるなと思ったらThingSpeakのグラフでした。これだけでグラフになっちゃったのは初めてです。いやー、恐ろしい。

なお、ThingSpeakへの書き込みコードはここからコピーしました。ありがとうございます。Particleも良いんだけどね…I2Cが動かないのと何よりも技適がないのでどうにもなりまへん。

■ESPをArduino IDEで使う場合のピン番号■

動かしたヒトならみんなご存じだと思うのですが、探しても明記しているページが出てこなかったので書いておきます。

Arduino IDEでpinmode, digitalOutなどを使い場合に指定するピン番号は、ESPのIO4, IO5などと書いてある数字を使います。物理的なピン番号ではありませんのでお間違いのないように。

■ハマり所■

  • 上にも書きましたが、ESP8266の電源はちゃんとインピーダンスを下げないと暴走します。それもArduino IDEが書き込み終わった直後に暴走(電解コンデンサ追加で改善)、動作するけど数分で止まる(タンタル4.7uF追加)、数十分で止まる(パスコンを基板上に直接ハンダ付けで改善)…と対策をすれば良くなりますので、安定して動作しないとお悩みの方はお試しあれ。
  • Arduino HDC1000ライブラリはそのままでは動きません。Wire.beginでSDL, SCLのピン番号を指定する必要があります。HDC1000.cppのコンストラクタでWire.begin(); を Wire.begin(4,14); にします。
  • 存在しないIO番号、例えば6を指定すると、Arduino IDEではエラーになりませんがpinmodeなどを実行した際にExceptionが出ます(シリアルコンソールにメッセージが出ます)。
  • サーボモータを使うのはこれが初めてです。サーボモータは0-180度で動作するとのことなんですが、激安サーボとして有名なSG90は45-135度ぐらいしか動作しませんでした。その範囲外を指定すると唸り始めます。5個買ったうちの2個が同じ状態だったのですが、そういうもの?
  • サーボモータをつないだままにしておくと信号が一定でもピクピクもぞもぞ動いていますが、これを止めるにはdetachします。使う時にまたatachします。消費電力の節減にもなります。

■ソース■

より高い威嚇効果を求めて複雑な動きをさせたら腕の動きが激しくなったときにサーボがモゲそうになったので、単純な動きにしていますが…RTOSあたりをつかって、ちゃんと加速度制御を考えた上で複雑な動きをさせたいものです。


2015年10月18日日曜日

鳩撃退装置作動中


赤はパイロットランプ兼モバイルバッテリ起床用、青は高電圧発生中ランプ。コンビニ袋に入れて、PIRセンサーは左側を向いている。

赤LEDは昼間でも明るく見えます。そのせいか、これを置いてからまったく鳩が来なくなりました。喜ぶべきことなのですが、痛い警告を与えるための散々苦労して作った高電圧発生装置がまったく機能していないのは寂しいorz

2015年10月16日金曜日

ものすごく久しぶりにユニバーサルボード使った

ほこりが…。
PIRでMOSFETをスイッチして、別に作った高圧発生回路の電源をon / offしているだけですけどね。

裏面
なお、PIRだけだと消費電流が少なすぎてモバイルバッテリが勝手に切れてしまうので、赤LEDを付けました。モバイルバッテリを寝かさないためには5mA程度流さないといけないのですが、今時の赤色LEDは5mAも流すととても眩しい。

困ったことに、動作確認用のランプ(青)がまったく目立たなくなってしまいました…。


2015年10月9日金曜日

ESP-WROOM連続稼働実験

ESP-WROOMの電源についての続き(前回)。

サイズの割にスゴいピーク電流が要求されるESP8266/WROOM-02、我が家での実験では普通の三端子レギュレータだと最大でも10時間連続稼働が限界でしたが、三端子DC/DCコンバータだと余裕で100時間を超えました。

秋月のサイトから

電源として9V2AのACアダプタを使ってもシリーズレギュレータでは安定せず、USBの5Vからでも三端子DC/DCだと安定しています。

秋月にはこのDC/DCより30円安い「スーパー三端子レギュレータ」ってのもあるんですが、最高電圧が「スーパー三端子」は28vまでなのに対し「超高効率DC-DC」は32vまで使えるので、我が家ではこちらを常備しています。

一度「スーパー三端子レギュレータ」を24vACアダプタにつないでいたらサージで壊れたようで、それも短絡モードで破損したために私の部品在庫としては比較的高価な24Ghz帯レーダーなどつながっている回路数千円分を道連れにしてくださったという苦い経験もありまして…。

ESPの話に戻りますが、某林さんのところでは安定稼働させるべくAnalog Discoveryまで購入してキャパシタなどで低ESR化を図っておられるご様子…まぁ低ESRはオーディオ方面にも効きますよね。しかし、いいなぁ、Analog Discovery。

うちは未だにテクトロのSTamigoだ(って知っている人、いないだろうなぁw

2015年9月28日月曜日

32bit CPU搭載インバータ改良

iPhone6s plus、カメラの性能すげええ

前回はとりあえず20khzで発振して、ボリュームに応じてデューティー比を変えるだけで32bit CPU Cotrtex-M0をまったく活かしておりませんでした。

今回は、少し仕事をしてもらっています…とはいえ、8bitどころか4bitで十分なレベルなのですが。

■仕様■

出力電圧をボリュームで設定できるように。

■実装■

メインループでは設定電圧と現在の電圧を測定し、その差でパルス幅を設定します。設定電圧以上なら出力をオフにし、設定電圧より低ければその差に応じてパルス幅を決めます。差が大きければ大きいほどパルス幅を広くしてインダクタンスに貯める電力を増やします。

その他、100m秒ごとに電圧設定のためのボリュームを読みに行きます。

■ハード■

前回はMOSFETとSBDの耐圧が限界となって電圧を上げられませんでした。今回は、耐圧500vのMOSFETと1000vのダイオード、それに400vの電解コンデンサを使います。

ただ、一つ問題があって、高耐圧のMOSFETはゲートがオンになる電圧も高く、今回使った2SK3234の場合は約5v以上必要です。そのため3.3vのLPC1114では直接ドライブできないので、小さなMOSFETを一段追加しそれでゲートを駆動します。電源電圧も5v以上必要です。何かすごーい遠回りをしているような気もしますが、気にしないで作ります。

あとどのぐらいの出力かを示すLEDと、出力電圧を測定するための分圧抵抗などを追加しました。

なおMOSFETが1個余計に入ったので、出力の論理が反転しています。つまり、mbedから「1」を出力するとパワーMOSFETがoffになります。そのためにPWMへの出力では 1.0 - width としてデューティー比を反転させています。


■mbedのPWM■

当初はボリュームでPWM周波数を変更できるようにしていました。インダクタンスを使っているので、どのぐらいの周波数でパルスを出力するのが一番効率が良いのかをさぐるためです。

で、100m秒ごとにボリュームからanalog inで読み取った値をもとにpwm.periodの値をセットしたのですが…これを行うとPwmOutの値を0にしていても100mSごとに出力がon / offする、つまり約5hzの太いパルスが出てしまいます。

設定電圧を0にしていても約40vの電圧が出てMOSFETがヤケに熱いので、何だろうと思ったのですが…ともかく回路が壊れなくて何よりです。

もう一つ、LEDをPWMで駆動しているのですが、当初まったく点灯しませんでした。これは、PWMの周波数がデフォルトのまま(約20m秒=50hz)なのにそれよりも早い周期でPWMへの書き込みを実行していたためです。ledに書き込みをしているループは1m秒で1回回りますので、それより十分早い10khzを出力するよう変更したところ、無事点灯しました。

いやはや…。

■動かしてみて■

設定電圧を急速に上げるとLEDが明るく点灯し、電圧が上昇して設定電圧に近づくとすーっと暗くなっていきます。逆に急に下げてやるとLEDはしばらく消灯した後、設定電圧に近づくとすっと点灯します。だいたい狙い通りです。強烈なノイズ発生源の近くにあるのでanalog inの値はそうとうバラついているはずで、安定しなければ移動平均処理を加えようかと思っていたのですが、なしでも安定してます。

時間積分効果とでも言いましょうかw

なお、こういう制御(PD)の場合、設定電圧よりも少し低いところで安定します。今回はボリュームを使っているので気にならないですが、電圧を数値で設定する場合にはそのための補正が必要です。

昔、Skycamという製品のためにモーターぶんまわし系の制御をしていた時にはずいぶん苦労したものです…(遠い目

なお、現在、出力値と電圧差の関係は単純な比例ですが、より安定かつスムーズな制御を行うためには二次関数式で比例させることもできます。つまり電圧差が少ないときには少しだけパルスを出して、差が大きい時はドカッと出すわけです(何その小学生なみの表現)。その先にはPID制御などが…ってキリがないw

電源電圧5vと9vで試しましたが、どちらも200vまできっちり上がりました。一応設定限度を200vにしているんですが、波形を見る限りもうちょっと上げられそうです。消費電流は多いですねぇ…9v電源から100vまで上げた時で70mA前後です。冬の太陽だと手持ちの0.5w太陽電池では無理で、2-5wぐらいのセルでないと安定して動かすのは難しいでしょうねぇ。大きいと風の影響なども考えないといけないし…ああどんどん違う方向へ(笑)。

■ソース■

特に珍しいことはしていません。このソースはフリーで公開します。つまり、何にどう使ってもいいですが、責任は問いませんよライセンスです。


2015年9月26日土曜日

さっそく「スライドでアップグレード」がorz

まだ希望に満ちていたあのころ…
iPhone6s Plusが届いて小躍りしつつ5sから長い時間をかけてデータの移し替えが終わった喜びも束の間、噂の

「>スライドでアップグレード」

が出たきり何の操作もできなくなる状態がやってきましたorz

ここに対処方法がいろいろ書いてあるんですが、どれもiTunesがデバイスを認識してくれるのが前提。だいたい、パスワード忘れたわけじゃねぇよ、そこの画面までたどり着かないんだこの馬鹿野郎!と罵っていたら、終わりの方に「リカバリモードで復元する」って項目がありました。


「iTunes と同期したことがない場合や、iCloud で「iPhone を探す」を設定していない場合は、リカバリモードを使ってデバイスを復元する必要があります。この手順を実行すると、デバイスのデータとそのパスコードが消去されます。」とのことですが、明日まで待ってAppleStore行くよりマシ。

というわけで指示の通りに押しっぱなしにしていると「iTunesとつなげ画面」が出ました。何とかいけそうなので指示通り進めます。この画面になったまま戻らなくて不安ですが、とにかく待ちます。ピザなんか頼んでしまったので、食べながら待ちます。


上記リンクには「15分でタイムアウトするから、何回も2-3の手順を繰り返せって書いてあるのですが、むやみに繰り返しても無意味です。iTunesの右上にダウンロードアイコンが回っていますので、これをクリックしてみてください。2GB以上をダウンロードしているはずです。なので、これが終わってから(私の場合は4時間でした)もう一度、スリープボタンとホームボタンの両方をじーっと押してアップルマークが出て、そのあと消えて「iTunes→」の画面になるのを待ちます。そして、iTunesの画面で「復元」→「復元&アップデート」を選びます。「iPhoneソフトウェアの抽出中」などがiTunes上に表示され、数分後、空っぽで9.0.1になったiPhone6sがあなたの前に。

あとは、うんざりですけど、もう一度、同期したり設定したり、お好きなように。

帰宅してからここまで、えーと、6時間か…長かった。