2015年12月27日

ESP-WROOM-02でYoを送るボタンを作ってみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
今年の夏からESP-WROOM-02で色々やっているけど、よく考えたら公開できるものを何も出してなかったので簡単なものを作ってみたり。

ボタンを押すとYoが飛ぶ、という単純明快なボタンです。
誰かにYoを送るも良し、自分のusernameを設定しておいて呼び鈴にするも良し。
Li-Poと充電回路を内蔵しているので、完全ワイヤレス動作も可能。


ESP-WROOM-02周りの回路はこんな感じ。(レギュレータとLi-Po充電回路は省略)

構成は、ESP-WROOM-02(写真の緑のボードはオリジナル)と
無接点プッシュスイッチ(コード付) (秋月電子通商)
リチウムイオン電池充電基板(1A) [CHR4056-MCU1A] (aitendo)
リチウムポリマー電池(3.7V/850mAh) (aitendo)

今回使った無接点プッシュスイッチはスイッチ自体に電源を入れてあげる必要がありますが、上記回路図には書いてません。
プッシュスイッチの代わりにリードスイッチやマイクロスイッチにするというのもOK。

ケースは3Dプリンターで出力。
こんな感じで収まります。(まだ裏蓋を作ってない...)


ソースコードはGithubに。
https://github.com/9SQ/esp8266-Yo-button

今回はWiFiClientSecureではなく、WiFiClientを使ってます。
本当はhttpsでPOSTすべきなのですが、まだWiFiClientSecureの動作が微妙で何故かレスポンスを受け取れなかったので、とりあえずhttpでPOSTしてます。
(通信経路が信頼できない場合は使わない方が良いですね)

仕組みとしては、単純にHTTP POSTするだけなので、宛先をYoから別のもの(IFTTTなど)に変更すれば、色々応用が利くはず...

2015年12月26日

Panasonic製ネットワークカメラのレンズ曇りを取る

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Panasonic製のネットワークカメラ BB-HCE481の修理依頼が来た時の記録。
故障と呼べるのかは謎だけど、前玉のレンズ内側が曇って映像が不鮮明というのが今回の修理理由。
前玉にアクセスするまで結構な手順があったので、今後のためにもメモとして残しておくことに。

1. 左右のプラスチックカバーを外す

片方は上下チルト用のステッピングモーター、もう片方は台座に入っている基板から来ているフレキが見えます。


2. 更に左右のプラスチックカバーを外す

1で外したカバーの下に隠れていたネジを外すと、片側にはチルト用ステッピングモーター制御基板、もう片側にはステッピングモーターとその軸からカメラ部横のギアに張ってあるベルトが登場。

3. カメラ部を分離

ステッピングモーターが見える側の軸はEリングで留められているので、マイナスドライバーなどを隙間に突っ込んで捻ると取れる。
もう片方はねじ止めされている基板を外し、同様にEリングを外すと上に持ち上がる。


4. カメラ部を分解

横のネジを全部外してギアを取ると、カメラ部の上側が外れる。
下側も同様に。
実は下記の写真は掃除後に組み立てるときに撮ったので、レンズが綺麗になってたりします...

5. 基板をレンズ部から外す

ネジで止まっている基板を順次外していきます。
左の写真はカメラ部のメインっぽい基板。
レンズと逆側についてる基板を外すと、イメージセンサーが登場。

下側にはレンズ部内に入っている中玉を動かすためのモーター制御ICが付いていました。

6. レンズ部へと続くケーブルを外す

これが面白いと思ったところ。
フレキが入っていってる謎の丸いプラスチックケース。
開けるとフレキがゼンマイ状になっていて、これのおかげで回転する部分と外側で通信が可能になっている訳です。

7. 金属板、フォーカス制御用のモーターを外す

ネジで止まっているので、見えているネジから外していくと分離可能。

8. レンズ部を分解

ついにレンズ部分に到達!
後ろから1枚づつ外していきます。
レンズを外すとシャッターが登場


全部外すとこんな感じ。

9. 前玉のお掃除

一眼レフとか用のレンズクリーニングキットで拭いていきます。
左はbefore、右がafter。

10. 逆の手順で組み立て

フレキとか切らないように注意しながら、組み立てていきます...
終わり。

まとめ

Panasonicのネットワークカメラ、とても良くできてます。

カメラとしてのスペックは、画素数は38万画素、光学21倍ズーム、F値1.6~3.6。
分解して分かったレンズ部の構成は、中玉が3枚、レンズ2枚を2つのモーターで前後に移動させることでフォーカス合わせを実現しているという感じ。
ちなみに、チルト部分はフォトリフレクタと羽で回転角の限界を見ているようで、バラして組み上げた時に角度がずれていても、初回起動時のイニシャライズ(頂点で位置合わせしている)でバッチリ初期位置に戻っていました。

これ、2006年製なので約10年前の製品でビジネス向けなのですが、当時は定価16万円くらいしたそうです。
外見はなんだか無骨なデザインですが、中身は技術の塊っていう感じ。
ビジネス向けの製品として売ってるので当然といえば当然ですが、とっても良くできている、これなら10万超えてても納得だな〜という感想。
#Pla**xとかの製品と比較したら大変失礼なレベルの完成度

最後に外から見た前玉の曇りbefore/afterの写真で終わりとします。


2015年12月8日

地震とか火山噴火情報を閲覧できるWebサイトを作った

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
作るのを思い立ってから半年くらい掛かった... (実質作業時間は短い)

地震火山詳報
http://evi.prioris.jp

地震と火山(桜島に限らない)に関する気象庁XML電文情報と、それに付随する情報を配信するWebサイトです。
これの立ち上げに伴い、桜島詳報を閉じました。
現時点では火山噴火情報は未実装ですが、統合するつもりで地震火山詳報とネーミングしたので、近々実装します。
と言っても、桜島詳報のコードをちょっと改造して合体させるだけなのですが、最近全国的に火山活動が落ち着いているのでモチベーションが...
実装しました!
12月12日より、噴火に関する火山観測報も追加しました。
桜島詳報では桜島の噴火・爆発のみを扱っていましたが、地震火山詳報では桜島以外の火山(阿蘇山など)の情報を配信されます。

発生した地震の詳細ページでは、震源と揺れを観測した地域の震度がGoogle Mapsライクな操作感で閲覧できます。
例 : 震源・震度情報(2015年12月4日 5時40分頃に発生した地震) - 地震火山詳報

震源や震度のアイコンをクリックすると、上記画像のように地名や座標が表示されます。
地図はOpenStreetMapを使っています。
あとレスポンシブ対応なのでスマホでもPCでも良い感じに閲覧可能です。

地震火山詳報は、地震に関する情報をTwitterとPushbulletでも配信しています。
(Pushbulletって何?っていう人は、EngadgetとかLifehackerの記事を読むといいです。)

Twitter : @Prioris_EVI
Pushbullet : #earthquake_jp

上記Pushbulletのチャンネルは、日本全国のすべての地震(震度1〜)をプッシュ通知で教えてくれるので若干鬱陶しいです。
(日本全国でこんな頻度で地震が起きてるんだ〜!っと認識するのには最高ですが)
というわけで、震度3以上の地震があった時だけプッシュ通知してくれるチャンネルもあります。

Pushbullet : #earthquake_int3over

桜島、阿蘇山の噴火・爆発時プッシュ通知はYoにて配信しています。

Yo : SAKURAJIMA (鹿児島県 桜島の噴火・爆発時に配信)
Yo : ASOSAN (熊本県 阿蘇山の噴火・爆発時に配信)

技術的な話


以下の記事の集大成みたいな感じです。

PostgreSQLとPostGISで国土数値情報(行政区域)を扱ってみる (2015/06)
PostGISで気象庁の細分区域&市町村等に対応する重心を求める (2015/06)
OpenLayers 3で気象庁発表の震度をマッピングする (2015/07)
OL3で扱える地図タイルをShapeから生成する (2015/12)

あと、ベースとして以下も。
桜島が噴火したYoの裏側 (2014/08)

上記の記事中にも書いていますが、気象庁XML電文から震度マップ(GeoJSON)を作るのに必要なデータやGeoJSON生成コードはオープンソースとして公開しています。

9SQ/jma-eqarea-centroid (気象庁が用いる地域区分の重心座標テーブル)
9SQ/jma-eqxml2geojson (気象庁XMLから上記テーブルを利用してGeoJSONを生成する)
9SQ/seismic-intensity-map (震度GeoJSONをOpenStreetMapにオーバーレイ表示する)

...以下詳細...

気象庁から送られてくる震源・震度に関する情報のXML電文には、発生時刻や地震の規模を表すマグニチュード、震源地の座標、津波に関するコメント、そして揺れを観測した地域の地域コードと地名、震度が含まれています。
このXML電文から、震源地の座標を地図にプロットするのは非常に簡単ですが、各地の震度を、その地域の中心となる場所にプロットするというのが結構面倒です。
というのも、気象庁は地域コードや地名のテーブルは公開していますが、その中心(厳密に言えば重心)座標は提供していません。
また、気象庁の区域割りはちょっと特殊で、例えば「石狩地方北部」みたいに、ある程度の市区町村をまとめていたりします。
そこで、まずこれらの区域の中心座標を求めよう、ということで...

1. PostgreSQLとPostGISで国土数値情報(行政区域)を扱ってみる (2015/06)
国土交通省から提供されている行政区域(群市区町村みたいな区域割り)のShapefileをPostgreSQLに読み込んで

2. PostGISで気象庁の細分区域&市町村等に対応する重心を求める (2015/06)
PostGISを使って気象庁が提供している区域とすり合わせて、重心を出力し、テーブルを作り

3. OpenLayers 3で気象庁発表の震度をマッピングする (2015/07)
作成した重心テーブルと気象庁XML電文からOpenLayersなどの地図システムで扱えるGeoJSON形式のデータを生成する

という流れで、震度を地図上のその地域の上に表示させることが出来ました。
ちなみに、表示される位置が中心ではなく重心なのは、地域の形が収まるバウンディングボックスから中心を求めてしまうと、突起やへこみ、極端に長細い岬が出ているような地形ではそれらに引っ張られて視覚的(感覚的?実際的?)な中心から外れてしまうからです。
重心をSQLを叩いてパッと計算(全国分計算するのには数分掛かりましたが)することができるのは、PostGIS最強としか言えません。

この生成した重心座標のテーブルは、上にもリンク張っていますが、GitHubに置いているので、これから気象庁による区域割りの地図上に何か情報を表示させるようなことをしたい方は使ってみてください。

裏側の話


昨年作った桜島の噴火情報配信サイト「桜島詳報」と若干設計が異なります。
以下は、桜島詳報とプッシュ通知システムの構成。


さらに詳しいスライド版はこちら

桜島詳報ではSubscriber自身に色々と他の処理もさせていました。
そして、詳細ページにアクセスする度にXML本体をパースしてサーバ側でページを組み立ていました。

今回のシステムでは、SubscriberはXMLの保存と、電文の種類別に行う動作を振り分けるBridgeに概要を渡すところまでさせています。
それと、概要とUUIDを一緒にMySQLへ入れていた処理を廃止して、XMLをJSONに変換してMongoDBに入れるようにしています。
(桜島詳報のシステムを合体させるために、元のXMLも一緒に保存しています)


今回のシステムでは電文が届く度にjsonが生成され、詳細ページにアクセスすると生成されたjsonを取得してクライアントサイドでページを組み立てていく仕組みです。

届いた電文が震源・震度情報の場合の処理は以下のとおり。


将来的にAPIとか公開するかもなぁーということで、複数のサーバに分けています。
(現時点では性能に余裕があるので1つのVPSの中に上記4つが詰まっている)
地震火山詳報は上記のEVIの部分になります。
今回新たにEDSという地震に関する情報を保存&提供するサーバと、AZMAPという日本の地図タイルを持っているサーバを作りました。

地震火山詳報の震源・震度情報一覧から任意の1ページを開くと、info.json(発生日時や最大震度、マグニチュードなどが入っている)、smallScalePoints.json(広域ポイント)、largeScalePoints.json(詳細ポイント)の3つがEDSからダウンロードされて、JavaScript(jQuery, OpenLayers3)で処理されます。

地震火山詳報のページ内では提供していませんが、情報を各種SNSに流す時に付属させるデータとして、震度マップをWebKitに描画させてキャプチャした画像も生成しています。
こんな画像がTwitterに震源・震度情報の概要と共に投稿されます。


似たような震源・各地の震度画像出力エンジンを作っている会社もありますが、こちらは普通のHTML/CSS/JSで記述されたWebページから画像を生成しているので、簡単に出力する画像のデザインが可能というわけです。

この画像地図は詳細ページの地図と違って、OpenStreetMapの地図タイルを使用していません。
国土交通省の国土数値情報(行政区分)Shapefileから地図タイルを生成して、使用しています。(この地図タイルを持っているのがAZMAPサーバ)

関連する話


これも公開していないのですが、気象庁XML電文が届く度にheadlineをJSONに変換して流しているWebSocketサーバも作って使っています。
これは、グローバルIPを持つサーバが無いと受け取れない気象庁XML電文を、どこでも受信できるように...という考えで立てているのですが、キャパシティがそんなに無いので(今のところ)自分用です。
これをRaspberry Piで受けとって64x16ドットのフルカラーLEDマトリクスに表示させたりしている話は、また改めて記事にしようと思います。

感想と告知


  • 自分の想像(妄想)を形にするものづくりは楽しい。生きている、生きていける理由。
  • Web系欲が満たされたので、またしばらく組み込み系に戻ります。
  • 3か月くらい前から、はぐれエンジニアになって実家療養中です。

2015年12月5日

OL3で扱える地図タイルをShapeから生成する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
OpenLayers3で扱える地図タイルを国土交通省 国土数値情報(行政区域)から生成する方法のメモ。
この方法で出力すればOpenLayers3以外(Leafletなど)でも利用可能です。

使用するのは

1. Shapefileからmbtilesを生成する


LearnOSMに詳しい手順が載っているので、おおまかな手順だけ。

1. TileMillを起動し、New projectから新しいプロジェクトを作成する
2. 適当なFilenameを入力し、Image formatを選択し、Addをクリック
この時、デフォルトの世界地図を利用しない(読み込むShapefile以外必要ない)場合は、Default dataのチェックを外す
3. Editor画面になったら、左下のLayersからAdd layerをクリック
4. Datasourceで読み込みたいShapefileを選択し、Save & Styleをクリック
5. Layerが追加されるので、適宜デザインを調整する(デザインはCartoCSSで記述可能)
6. 右上のExportからMBTilesを選択する
7. 書き出す範囲やズームレベルを以下のような形で選択し、Export
おおまかな容量がZoomの下に表示されるので、参考程度に。
(100GB+とかの場合、出力に結構な時間を要する&ファイルサイズが大きくなるので注意)

2. mbtilesから地図タイルを生成する


今回はTileMillで出力したjapan.mbtilesからjapan/tiles下に"Z/X/Y.png"の形で出力した。
git clone git://github.com/mapbox/mbutil.git
cd mbutil
python setup.py install
mb-util japan.mbtiles japan/tiles

tilesディレクト下の構造を保ったまま、適宜設置する。

3. OL3で開く


ol.min.jsなどを呼び出してあげてから、以下のような感じで。
var map = new ol.Map({
    target: 'map',
    renderer: 'canvas',
    layers: [
        new ol.layer.Tile({
          source: new ol.source.XYZ({
            url: '/tiles/{z}/{x}/{y}.png'
          })
        }),
        new ol.layer.Tile({
          source: new ol.source.TileWMS({
            attributions: [new ol.Attribution({
              html: "地図データ © 国土交通省 国土数値情報(行政区域)"
            })]
          })
        })
    ],
    view: new ol.View({
        //中心座標(仮指定)
        center: ol.proj.transform([134.15, 35.27], 'EPSG:4326', 'EPSG:3857'),
        zoom: 6
    })
});

(OpenLayers 3.11.2で動作確認済み)

WGS84あたりに測地系を揃えてあげれば、QGISなどで作ったShapefileも同じ手法で地図タイルにできるので、色々なデータをOL3で見ると面白い(かも)

2015年11月14日

Arduino core for ESP8266でHTTPSが叩けるようになっていた件

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
以前から使っている Arduino core for ESP8266 WiFi chip のStaging Version (ver. 1.6.5-1160-gef26c5f) でWiFiClientSecureが使えるようになっていました。

今まではWiFiClientではhttpしか叩けなかったのですが、これでhttpsなWebサーバにもアクセス可能です。
(以前の記事では、espconn_secure_connectを直接叩くことでhttpsなWebサーバにアクセスする方法を紹介していました)

多分、こんなコードでPOSTできるはず!
(現在やってるプロジェクトからhttpsPostの関数だけコピって持ってきたので、全体としては動作確認してませんが、関数自体は問題なく動くことを確認済み)

ちなみに、text=Hello ESP8266!とbat=現在のVCC電圧がPOSTされます。

もっとイケてるコードは examples/HTTPSRequest/HTTPSRequest.ino があるので、そちらを参考にしてください... (GitHubのAPIを叩いてJSONをパースしてる)
→ https://github.com/esp8266/Arduino/commit/2ff8aa08d478aceee39fe4147cb7fcc1eef263f1

以前の記事で、SSLライブラリを有効化して、直接ESP8266のAPIを叩くという方法でHTTPS通信した場合と同様、暗号種は以下の4種対応です。

  • TLS_RSA_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_RC4_128_SHA
  • TLS_RSA_WITH_RC4_128_MD5

WireSharkでパケット見た結果↓


ライブラリはlibsslではなく、axTLSという組み込み向けのSSLライブラリを使っています。

axTLS Embedded SSL

これに気づいたのも、おニュー環境のMacにArduino IDEとArduino core for ESP8266のStaging Versionを入れて、以前の記事の通りにplatform.txtの27行目に -lsslを追記しようとしていたら...


axTLSがリンクされていたので、まさか... と思いGitHubのIssuesを遡ってたら、WiFiClientSecureを追加したよ!みたいな会話があったという。

まだステージングなので色々変わるかもしれませんが、とりあえずこれでサクッとhttps使えますね。

2015年11月1日

3Dプリンターがやってきた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

3Dプリンターも値段がこなれてきた(と自分は思った)ので、試しに1台導入してみました。
XYZプリンティングのダヴィンチ Jr 1.0という機種。
Amazonでクーポン配ってたので、それを使って4万4300円でした。


段ボールから取り出して梱包材を外したら、特にネジを回したり何かを取り付けたりすることなく、上記くらいのものは出力できたので、ソフトウェア的にもこなれてきた感。
5年くらい前に20〜30万円くらいしてた3Dプリンターよりも精度が良くて、取り扱いが簡単なものが5万円以下で手に入るなら十分。


最初はちょっと固かったけどボルトとナットも綺麗に噛み合いました。

早速、何か作ろうということで、先日スイッチサイエンスPCBで発注した基板が収まるケースをFusion 360で設計して出力してみました。


3D CAD使うのは7年くらい前に高専ロボコン用のロボット設計でSolidWorksを触って以来なので、まだまだ慣れてないけどぼちぼちやっていく予定...

2015年8月28日

ESP8266のSSL clientについて

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ESP-WROOM-02でhttpsなAPIを叩こうとしたらハマったので、まとめておきます。

SDKは1.3.0 (Release date: Aug 08, 2015)を使用しています。
ドキュメントも、これ(esp_iot_sdk_v1.3.0_15_08_08.zip)に含まれている2C-ESP8266__SDK__Programming Guide__EN_v1.3.0.pdfを参照しました。

現状

8/28現在、Arduino core for ESP8266はSSL(TLS)でのclientに対応していない。
対応して欲しいという要望&対応したいねという話は出ている。

ESP8266のSDKとしては、SSLに対応している。
※ただし、制約あり(この下に書きます)

処理の流れ

公式によるサンプルコードがEspressifのフォーラムにあるので、それを見るとだいたい分かります。

以下も非常に参考になります。
DSAS開発者の部屋:ESP8266 モジュールの AT コマンドに SSL クライアント機能を追加する
ESP-WROOM-02で、IFTTTをhttps(SSL/TLS)で呼び出す例 - Qiita

大雑把な流れとしては...

//証明書ストアを用意
unsigned char *default_certificate;
unsigned int default_certificate_len = 0;
unsigned char *default_private_key;
unsigned int default_private_key_len = 0;

//espconn, _esp_tcpを定義

LOCAL struct espconn user_tcp_conn;
LOCAL struct _esp_tcp user_tcp;

//接続先のIPアドレスとポートを設定
user_tcp.remote_ip[0] = 192;
user_tcp.remote_ip[1] = 168;
user_tcp.remote_ip[2] = 1;
user_tcp.remote_ip[3] = 128;
user_tcp.remote_port = 443;

//自分のポートを設定
user_tcp.local_port = espconn_port();

//type, state等を設定
user_tcp_conn.proto.tcp = &user_tcp;
user_tcp_conn.type = ESPCONN_TCP;
user_tcp_conn.state = ESPCONN_NONE;

//接続時、再接続時、接続断時のコールバックを設定
espconn_regist_connectcb(&user_tcp_conn, user_tcp_connect_cb);
espconn_regist_reconcb(&user_tcp_conn, user_tcp_recon_cb);
espconn_regist_disconcb(&user_tcp_conn, user_tcp_discon_cb);

//SSLバッファサイズを設定
espconn_secure_set_size(ESPCONN_CLIENT,5120);

//接続する
espconn_secure_connect(&user_tcp_conn);

みたいな感じ?

user_tcp_connect_cb()関数の中でデータ送受信時のコールバックを設定してあげれば良いみたい。

void user_tcp_connect_cb() {
    espconn_regist_recvcb(pespconn, user_tcp_recv_cb);
    espconn_regist_sentcb(pespconn, user_tcp_sent_cb);
}

サーバからの応答は
void user_tcp_recv_cb(void *arg, char *pusrdata, unsigned short length)
のpusrdataに入ってくるので、これを出力するなり判定するなりすると良い。

SSLバッファサイズはデフォルト(espconn_secure_set_sizeを呼ばない場合)で2048バイトになっているので、SSLパケットが2048バイトを超えそうな時は適宜増やしてね、ということらしい。
最大8192バイトらしいけど、8192を設定したらメモリに乗り切れないっぽくて(確保できない?)、espconn_secure_connectの段階でこけました。
公式サンプルコードにあるように5120くらいが限界かな...?

使用できるプロトコル(バージョン)と暗号

たぶん、ここが一番重要で、メモリ周りとかは全然大丈夫だけどespconn_secure_connectした直後にuser_tcp_discon_cbが呼ばれる(接続断される)ような、とあるサービスのAPIサーバがあって、Wiresharkでパケットキャプチャしたら原因が分かりました。

こちらがESP8266からサーバに送信されたClient Hello。


バージョンはTLS 1.1で、Cipher Suitesは以下の4種。

  • TLS_RSA_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_RC4_128_SHA
  • TLS_RSA_WITH_RC4_128_MD5


TLS 1.1を拒否ってたり、上記暗号種での接続を拒否ってると


「お前の指定したバージョン、暗号種ではうちに繋げねーぞ」とHandshake Failureが返ってきてServer Helloしてくれない訳です。

HeartbleedとかPOODLEとか色々あった関係で、厳しめなところは繋がらないという感じかなぁ。

このマイコンの性能上、強度の高い暗号アルゴリズムは載せられないのでしょうが、IoT向けを前面に押し出してるからには、もうちょっと頑張ってほしい...

追記その後、Arduino core for ESP8266でWiFiClientSecureが追加され、httpsが叩けるようになりました。

2015年8月26日

ESP-WROOM-02でIoTデバイスっぽいものを作る(1)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

前回(ESP-WROOM-02を使ってみる)の続き。

サンプルを漁ってたらCaptive Portalを使ったものがあったので、早速この機能を使って何か作ることに。
Captive Portal = APに接続したら強制的にWebページ(普通は認証ページなど)を開かせる、公衆無線LANに良くあるアレです。
そして、
1. ESP-WROOM-02をアクセスポイントにできる
2. Captive Portalが使える
3. ESP-WROOM-02がクライアントになれる
ということは...
スマホだけで家のアクセスポイントへの接続設定が出来るIoTデバイスを作れる訳です。

想定
1. 利用者がIoTデバイスの電源を入れる
2. 取説に書いてある特定のSSIDのAPが出現するので、それにスマホで接続する
3. 設定ページが自動的に立ち上がる
4. 家に既設のAPを選択し、パスワードを入力して設定
5. 自動的に再起動して、今度はクライアントとして家のLANにぶら下がってくれる

こういう物が出来れば素敵... というわけで、まずは雛形として使えそうなものを作ってみました。

9SQ/esp8266-wifi-setup (GitHub)

Arduino core for ESP8266を使っているので、前回の記事でも書いたようにArduino IDEへのボード情報の設定が必要です。

実際のスマホでの設定画面はこんな感じ。


その時のシリアルモニタはこんな感じ。


動作としては、
1. EEPROMを読みに行って、設定が存在しない場合はSetup Modeになる
2. 一旦、STA modeで周辺のアクセスポイントを検索して保存
3. AP modeに切り替えて、設定されたSSIDでアクセスポイントを立てる
4. WebサーバとDNSサーバも立てる
5. 接続してきたクライアントはCaptive Portalで設定ページに飛ばす
6. 設定ページから入力されたSSIDとパスワードをURLデコード
7. EEPROMに書き込み
8. 再起動
9. EEPROMを読みに行って、設定されたSSIDのAPに接続する
10. 接続を確立したらWebサーバを立てる
という流れです。

・設定したSSIDのAPに接続できなかったら、再びSetup Modeになります。
・設定後にシリアルモニタに出力されるIPアドレスに接続するとWebサーバが立ち上がってますが、ここにアクセスすると接続設定のリセットが可能です。

あとは、これにセンサーなどを接続してあげれば、同一LAN内からブラウザで値を覗いたり、外部のサーバにデータを定期的に送るようなデバイスが作れると思います。

実はまだ手を入れるところ(接続確立後に何らかの問題で接続断したときの再接続処理など)が結構残っているので、ぼちぼち修正する予定...と並行して次回は実際に何か作ってみたものを載せようと思います。

2015年8月25日

ESP-WROOM-02を使ってみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

たいへん出遅れました!
今更ながらESP-WROOM-02をゲットできたので、先人の日本語による資料の恩恵を受けながら、サクッと使ってみます。

ちなみに、aitendoで買いました。2個パックが1100円(税別)。
秋月電子だとbreakout boardが売って無くてつらいのですが、aitendoだと1個120円で売ってます。
スイッチサイエンスだとモジュールが1個あたり864円、ピッチ変換が162円なので、たぶんネットで買える店の中ではaitendoが最安っぽいです。10個以上買うと秋月の方が安くなりますが。(2015年8月25日現在)
#スイッチサイエンスさんは学校とかで買いやすいので、研究などで買うときは使ってます。

aitendo
Wi-Fiモジュール(技適マック付き/2PCS) [ESP-WROOM-02P] 1100円(税別)
WiFiモジュール変換基板(A) [IFB1518-A] 120円(税別)
WiFiモジュール変換基板(B) [IFB1518-B] 120円(税別)

秋月電子通商
Wi-Fiモジュール ESP-WROOM-02 [ESP-WROOM-02] 550円(税込)

スイッチサイエンス
ESP-WROOM-02 Wi-Fiモジュール 864円(税込)
ESP-WROOM-02ピッチ変換済みモジュール《フル版》 ボードのみ 162円(税込)
ESP-WROOM-02ピッチ変換済みモジュール《シンプル版》 ボードのみ 162円(税込)

さて、注文して届いたモジュールをbreakout board(ピッチ変換基板)にハンダ付けします。
今回はaitendoの変換基板(A)と(B)を1個ずつ買ったので、どっちも付けて比較。
温調ハンダごてだと引きハンダで綺麗に付けやすい。


ブレッドボードに刺すときは2枚を跨がせるか、基板の下をジャンパワイヤーで配線すれば良し。


上の写真では、LED(GPIO4)と気圧センサーLPS25H(SDA=GPIO12, SCL=GPIO14)を接続しています。
ボタンの青がRST、黄色がGPIO0に繋がっているので、黄色を押しながら青を押すとUART Download Modeに入ります。

あとは、先人たちの資料を読みながら、今回はArduino IDEでプログラムを書いていきます。

ググれば色々出てきますが、この辺りが参考になりました。
「ESP-WROOM-02」をArduinoで開発 - おかゆ日和
ESP8266 - ESP-WROOM-02 の Arduino 環境で I2C 制御 - Qiita
ねむいさんのぶろぐ | 技適マーク付きESP8266モジュール ESP-WROOM-02 を使ってみる

LEDのON/OFFをブラウザから操作するのは、サンプルのESP8266WiFi → WiFiWebServerで実現できました。
気圧計は、通常のArduino向けに書かれたコードと、WiFiWebServerを組み合わせて簡単に作れます。

気圧計LPS25HをArduinoで読み取るコードは以下が使えると思います。
Arduinoで遊ぶページ | 大気圧・温度センサモジュールの実験

Raspberry Piで読み取るコードを以前Pythonで書いていたので、これも処理の流れの参考にできるかな。
9SQ/raspi_lps25h.py | Raspberry PiとLPS25Hで気圧取得

ちなみに、I2CはSCLをGPIO14にすればSDAはどのピンでも良いみたいです。
上記Qiita投稿ではSDAをGPIO4に繋げてるみたいですが、私はGPIO12でも動きました。
データシートではGPIO2がSDAになってるんですが、ここは起動時にプルアップしないといけないので、使わなくていいなら使わない方が楽。

GPIOについては、4, 5, 12, 13, 14, 16が使えるよーっという投稿をどこかで見かけた気がしますが、実際には0, 2, 15, 1(U0TXD), 3(U0RXD)も使えます。
ただし、これらのピンは起動時、プログラミング時に使用するピンなので使う際は工夫が必要です。

というわけで、そういうのを踏まえてESP-WROOM-02用のPINOUT DIAGRAMを作ってみました。

PDF版ダウンロード (893KB)

修正ポイントがあったら、記事へのコメントなどで教えてください。
ライセンスはCC0です。(いろんな所で使いやすいように)
著者表記・バックリンク不要ですが、してくれたらそれはそれで嬉しいのでお好みでどうぞ。
※PDFへの直リンクはダメです。

続き→ ESP-WROOM-02でIoTデバイスっぽいものを作る(1)
続き2→ ESP8266のSSL clientについて
続き3→ ESP-WROOM-02でYoを送るボタンを作ってみた