ラベル hdc1000 の投稿を表示しています。 すべての投稿を表示
ラベル hdc1000 の投稿を表示しています。 すべての投稿を表示

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年8月7日金曜日

Arduino nanoとMPL115A2




久しぶりの電子工作です。以前から作らなきゃ作らなきゃと思っていた、室外の気象状況把握デバイスにようやく着手しました。気温気圧湿度。

■追記■

HDC1000、MPL115A2、どちらも動きました。下記「失敗編」では気圧がエラいことばらついていて、MPL115A2やArduinoを交換したり大騒ぎしていたのですが、結果としてMPL115A2のCAP端子につないでいたコンデンサの不良でした。20年もののタンタルが劣化していたのでしょうか。ただ、気圧測定値はかなりバラつきます。もともとこのチップの精度は1kpa以下とのことなので仕様の範囲内ではありますが…このチップ、何に使うモノなんでしょう。この精度だと高度計や晴雨計には使えないですよね。
Temperature = 29.24 degree, Humidity = 57.06%, Pressure = 1005 kPa
Temperature = 29.23 degree, Humidity = 57.06%, Pressure = 1004 kPa
Temperature = 29.20 degree, Humidity = 57.15%, Pressure = 1005 kPa
Temperature = 29.17 degree, Humidity = 57.15%, Pressure = 1003 kPa
Temperature = 29.13 degree, Humidity = 57.15%, Pressure = 1004 kPa
Temperature = 29.13 degree, Humidity = 57.06%, Pressure = 1004 kPa
Temperature = 29.16 degree, Humidity = 57.06%, Pressure = 1004 kPa
Temperature = 29.16 degree, Humidity = 57.06%, Pressure = 1003 kPa
Temperature = 29.16 degree, Humidity = 57.06%, Pressure = 1006 kPa
Temperature = 29.16 degree, Humidity = 57.06%, Pressure = 1004 kPa
Temperature = 29.12 degree, Humidity = 57.06%, Pressure = 1006 kPa
Temperature = 29.13 degree, Humidity = 57.06%, Pressure = 1006 kPa
Temperature = 29.08 degree, Humidity = 57.15%, Pressure = 1004 kPa
Temperature = 29.08 degree, Humidity = 57.15%, Pressure = 1006 kPa
Temperature = 29.07 degree, Humidity = 57.25%, Pressure = 1003 kPa
Temperature = 29.10 degree, Humidity = 57.25%, Pressure = 1004 kPa
Temperature = 29.13 degree, Humidity = 57.25%, Pressure = 1004 kPa
Temperature = 29.13 degree, Humidity = 57.25%, Pressure = 1004 kPa
Temperature = 29.14 degree, Humidity = 57.25%, Pressure = 1006 kPa
Temperature = 29.14 degree, Humidity = 57.25%, Pressure = 1004 kPa
Temperature = 29.19 degree, Humidity = 57.25%, Pressure = 1004 kPa
ともあれ動いてなにより。

■失敗編■

気温湿度はHDC1000、気圧はMPL115A2。どっちもArduino用のライブラリが公開されているので、さくっと作ってみる。と。
Temperature = 28.98 degree, Humidity = 48.95%, Pressure = 960.98
Temperature = 29.02 degree, Humidity = 48.97%, Pressure = 1023.90
Temperature = 28.97 degree, Humidity = 48.85%, Pressure = 986.27
Temperature = 28.97 degree, Humidity = 48.85%, Pressure = 1017.61
Temperature = 28.93 degree, Humidity = 48.85%, Pressure = 1029.64
Temperature = 28.94 degree, Humidity = 48.85%, Pressure = 957.95
Temperature = 28.96 degree, Humidity = 48.85%, Pressure = 957.45
Temperature = 29.04 degree, Humidity = 48.88%, Pressure = 1010.54
Temperature = 28.94 degree, Humidity = 48.85%, Pressure = 952.30
Temperature = 28.96 degree, Humidity = 48.75%, Pressure = 984.23
Temperature = 28.93 degree, Humidity = 48.75%, Pressure = 984.98
Temperature = 28.97 degree, Humidity = 48.66%, Pressure = 987.49
Temperature = 28.98 degree, Humidity = 48.66%, Pressure = 990.82
Temperature = 29.01 degree, Humidity = 48.68%, Pressure = 943.27
Temperature = 28.98 degree, Humidity = 48.56%, Pressure = 986.27
Temperature = 28.93 degree, Humidity = 48.46%, Pressure = 1027.91
Temperature = 28.98 degree, Humidity = 48.46%, Pressure = 959.57
Temperature = 29.01 degree, Humidity = 48.49%, Pressure = 954.06
Temperature = 29.05 degree, Humidity = 48.49%, Pressure = 943.93
Temperature = 29.01 degree, Humidity = 48.49%, Pressure = 970.07
Temperature = 29.05 degree, Humidity = 48.49%, Pressure = 1007.75
Temperature = 29.08 degree, Humidity = 48.39%, Pressure = 1056.10
Temperature = 29.08 degree, Humidity = 48.49%, Pressure = 1000.93
Temperature = 29.05 degree, Humidity = 48.39%, Pressure = 949.96
HDC1000からの気温湿度はともかく、なんすかこの巨大台風と異常高気圧orz Adafruitのライブラリとサンプルで試しても似たような状況。ってか温度も酷い。
Hello!
Getting barometric pressHello!
Getting barometric pressure ...
Pressure (kPa): 101.8867 kPa
Temp (*C): 38.6 *C
Pressure (kPa): 123.9470 kPa
Temp (*C): 61.6 *C
Pressure (kPa): 102.9643 kPa
Temp (*C): 41.3 *C
Pressure (kPa): 122.3504 kPa
Temp (*C): 29.7 *C
Pressure (kPa): 128.0168 kPa
Temp (*C): 30.0 *C
Pressure (kPa): 106.1308 kPa
Temp (*C): 38.6 *C
Pressure (kPa): 96.2912 kPa
Temp (*C): 40.9 *C
Pressure (kPa): 96.4242 kPa
Temp (*C): 38.6 *C
Pressure (kPa): 95.8312 kPa
気圧の計算には同センサーが内蔵している温度センサの値を使っている。温度がダメでそれに引っ張られているのか、どっちもダメなのか。HDC1000の温度値を使って計算しなおす方向にしましょうかorz

ところで出勤前にこれやってるんですが…趣味でストレス貯めてどうする俺orz

とりあえず電源にパスコン追加したり、地道なところからやってみますかね。センサー破損の可能性も皆無ではないけど、それは部品沼が(ry

追記:
パスコン追加して、あと、RSTが5Vにつながっているという大ポカが発覚したものの、代わりありませんでした。さらに、HDC1000を外しプルアップ抵抗をつけてArduinoと直結してもダメでした。センサー故障ですね…5Vつないで壊した可能性も高いですがorz

追記の追記:
その後、新品をつないでみましたが、結果は同じでした。うーん。