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時間か…長かった。

2015年9月25日金曜日

ブレッドボードも消耗品、なの?

こんなにあるのに何故すぎ消えるのか…ルパン三世じゃあるまいし

ブレッドボードは実験が終わったら再利用できるので、そんなに買わなくても。

…はい、そう思っていた時期が私にもありました。もう何だかだで30枚ぐらいは買っていると思うんですが…足りないんです。でも、作りかけ収納箱を見ても、ブレッドボードはそんなに多くない。

まるで水が砂に吸い込まれるように消えて行く…。

種島先輩と休眠中のRPi2を従えるBBB


まぁよく見ると、普通に実運用しているブレッドボードが眼の隅に転がっていたりするんですけどね。そういうのはユニバーサルボードに移すかプリント基板発注しなきゃと思うんですが、なかなか…。

ただ、ブレッドボードがないと、あれを試したいこれを作りたい、と思った時に腰が重くなってしまうのは間違いありません。

というわけで、また5枚買いました。ジャンプワイヤも高いヤツを各色ごっそり買いました(でも青は買いません…老眼で黒と区別がつかねえんだよ)。

これでしばらくは大丈夫だろう…と思いたい。

関係ないけどiPhone6s Plus届きました。でかい…早くも後悔気味orz

2015年9月23日水曜日

まさにボトルネック

ADCとD級アンプの間の分圧抵抗をどこに入れよう…w

信号処理もどきを作ったのに、ADCがないので音を出して結果を確かめることができません。部品ぐらい買いに行けばいいんですが、膝を壊していて連休中はあまりでかけないで休むというコンセプトを忠実に守っているため、秋月にいや秋葉原にいけません。

せっかくMSP432P401Rで補聴器の着手できるめどが立ったのに…と思いつつ部品沼を整理していたら、一個だけMCP4725/DCコンバータが出てきました! 在庫リストにも記載されていないので、思いつきで買ってそのまま忘れていたのでしょうw

ということで、出力側の部品が揃いました。

秋月秋月秋月

ということで、まず今まで使ったことのないMCP4725を使ってみます。癖のないI2C仕様で割とすんなりつながった…のですが、何だか動作が不安定です。I2CのSDA線にオシロをつなぐとフリーズしてしまいます。基板裏のプルアップ用ジャンパは問題ないですし、オシロの入力インピーダンスはかなり高いので何か影響を及ぼすとは考えにくいのですが…ともかく、フリーズしていないことをLチカで確認することにして、だましだまし動かしてみます。

そして次に素の状態でMCP4725にどのぐらいの速度でデータを流してみようとして問題発覚。Energia/MSP432はI2Cの速度を切り替えられない。Arduinoだとライブラリのヘッダをちょっと書き換えれば400Khzまでは動くんですが、同じような箇所がMSP432版のドライバライブラリなどには見つかりません。i2c.cなんてソースに

    ASSERT(
            (EUSCI_B_I2C_SET_DATA_RATE_400KBPS == config->dataRate)
            || (EUSCI_B_I2C_SET_DATA_RATE_100KBPS == config->dataRate));

という記述はあるのですが、これを呼び出している側が見つからず、configもdefineも見つからず…。

しかたがないので、100khzで動かしてみましたが、1ワードの送信に3バイト必要+様々なオーバーヘッドで、毎秒約4000回≒2khzがやっと、という有様です。電話を遙かに下回り糸電話レベルの帯域orz

うーん、せめてI2cが400kで動けば16khzで出力できるので帯域は十分なのですが。

Energiaなんかで楽していないで、CMSIS使えってことですかね…ああ面倒くさい…。まぁ電子工作再開したばかりこのにLPC810にI2Cで液晶つないだりしてたので、できないわけじゃないんですけども…API調べたりするのが唯々面倒。