電子工作入門日記 ESP-WROOM-02に書き込めない!

とりあえず、ArduinoでのBME280の試験はブログに書くほどのこともなく完了し、本丸であるESP-WROOM-02とBME280との連携を確認しています。
それで、まずはESP-WROOM-02とお友達になりたいので、適当なスケッチを描いて書き込んで遊んでみようと思いました。
ここで、大ハマり。かきこめる時と書き込めない時がある。
書き込めない時は以下のログが出ました。

Arduino:1.8.3 (Mac OS X), ボード:"Generic ESP8266 Module, 160 MHz, 80MHz, QIO, 115200, 4M (3M SPIFFS), nodemcu, Disabled, All"

Archiving built core (caching) in: /var/folders/pj/_b76f5vs3zx9rq5lfg068xkm0000gn/T/arduino_cache_164851/core/core_esp8266_esp8266_generic_CpuFrequency_160,FlashFreq_80,FlashMode_qio,UploadSpeed_115200,FlashSize_4M3M,ResetMethod_nodemcu,Debug_Disabled,DebugLevel_all______8886ee52af8abeec90f379cbde8a6821.a
最大1044464バイトのフラッシュメモリのうち、スケッチが230621バイト(22%)を使っています。
最大81920バイトのRAMのうち、グローバル変数が32212バイト(39%)を使っていて、ローカル変数で49708バイト使うことができます。
warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
error: espcomm_upload_mem failed

これで、数日悩み諦めかけた時、ふと気がつきました。
今の構成はUSB Serial変換モジュールとして「FT232RL」を使い、それを経由してESP-WROOM-02と通信しています。電源は後々のことを考えて電池ボックスからDCDCコンバータを経由して3.3Vを供給しています。
電源は電池ボックスからとってるからFT232RLはRX,TXだけ繋がってればいいよね。通信内容も見えてるし、と思っていました。
でも、違ったんですね。FT232RLもGRDを取らないとダメだったみたい。
GRDをとるようにしたら、すんなり書き込めました。
初心者の変な思い込みが問題となるいい例だと思いました。

電子工作入門日記 序章

電子工作始めます。

きっかけ

数年前に導入した屋外、屋内の環境センサーがとうとう壊れてしまいました。
新しいのを買おうと考えましたがいいのがない。
そういえば、最近ArduinoとかRaspberry Piとか流行ってるよね。IoTだよね!ということで、自分で作ることに決めました。

初心者丸出し

そもそもRaspberry PiとArduinoの違いがよくわかっていなかった。
わかったことはRaspberry PiはPCであるということ。一方ArduinoはマイコンでありOSは動いていないということです。
次に、回路について。なんとなくプラスとマイナスがあって、ぐるっと回ってなければいけないということは知っていた。
触ってみて、デジタルなモジュールはピンに電圧がかかっているか、グランドなのかということが重要だってことです。考えてみればデジタルな世界は0か1かってことです。

構想

さて、今回の目的は屋外、屋内に環境センサーをつけてデータをとってリビングで表示させることです。
いろいろ調べて、それぞれどのようなモジュールが必要かを検討しました。
検討した結果がこちら。

環境センサー
-BME280

通信モジュール
-ESP-WROOM-02

当初は、屋外用としてArduinoにBME280とZigBeeという短距離無線通信モジュールをつける、屋内ではRaspberry PiにBME280,ZigBeeと液晶モジュールをつけて、Raspberry Pi親機構想を考えたのですが、いくつか問題点があって変えました。
問題点は以下。

  • ZigBeeモジュールが高い!
  • 液晶モジュールが高い!
  • ESP-WROOM-02は安くてwifiが使えて、BME280のデータも扱える

まあ、予算的な話ですわ。
結局最終的な構成は以下のとおり。

屋外用、屋内用
-ESP-WROOM-02
-BME280
-電池ボックス

屋内、屋外両方とも上記構成にして、一旦データをネットに上げて、それをリビングの適当なブラウザで見ることにしました。

さてさて、上記構想が実現されるかどうかは、これからのお楽しみ。

つ づ く(おんな城主直虎風に)

snmpttのベストプラクティスを探る

snmpttが不満

zabbixでSNMP Trapを受信する際に使うsnmpttですが、以前から使い勝手がいまいちだと思っていました。
どこがいまいちかというと、Trapの内容がナマなところ。
もちろんsnmpttconvertmibを使って、trapのOIDによってメッセージを変えることもできましたが、それよりもmibファイルをロードして勝手に読みやすくなってほしい欲求がずっとありました。
あと、SNMP TrapはTrapのOIDのほかに、Trapの引数でもOIDが付いてくることが多々あり、snmpttconvertmibではそこがカバーされないところもいまいちでした。
そこで、ちょっと時間を作ってsnmptt.confのオプションを探りベストプラクティスを考えてみました。

zabbixでsnmpttの使い方をググるとよく出てくるのが以下の設定です。

EVENT general .* “General event” Normal 
FORMAT ZBXTRAP $aA $ar

上記はzabbix2.2のドキュメントで記載されている設定です。
Event行で全てのトラップを設定で受ける設定をして、その時の出力フォーマットは

ZBXTRAP 送信元IPアドレス 送信元IPアドレス

です。
僕はこれのFORMAT行の末尾に$*をつけて、SNMP Trapの引数をすべて出力するようにして使っていました。
そして、mibファイルが入手できた場合はsnmpttconvertmibを使って、confファイルを作って読み込んでいました。
これでも一応は使えているのですが、冒頭に書いたような不満がありました。

見つけたベストプラクティス!?

それで、snmpttのウェブサイトをみて、snmptt.confの変数を眺めてみたところ、おあつらえ向きの変数を見つけました。
それが、これ。
$O: OIDのシンボル名の表示
$o: OIDの表示
$+*: 全ての引数をNAME:VALUEの形式で表示

これさえあれば、わざわざsnmpttconvertmibをしなくても、ほしい情報が手に入るのではないでしょうか。
最終的にはsnmptt.confは以下のようにしました。

EVENT general .* "General event" Normal
FORMAT ZBXTRAP $aA $O($o) $+*

こうすることによってmibファイルがロードされているものは、メールにTrapのシンボル名が記載され、Trapの引数のOIDもシンボルで表示されて、その値も表示されます。

サンプルがこちら。

# snmptrap -v 2c -c public localhost '' .1.3.6.1.4.1.42.2.175.103.2.0.91 1.3.6.1.4.1.42.2.175.103.2.1.2 s ABCDE 1.3.6.1.4.1.42.2.175.103.2.1.29 s hostname

# tail /var/log/snmptt/snmptt.log
17/05/26 .1.3.6.1.4.1.42.2.175.103.2.0.91 Normal "General event" localhost - sunHwTrapHeartbeat[.1.3.6.1.4.1.42.2.175.103.2.0.91] sunHwTrapComponentName:ABCDE sunHwTrapHostname:hostname

もちろん、特定のOIDはCategoryやServerityを変えたい場合には、EVENT行でOIDを指定すればよいと思います。

この設定いかがでしょうか!?