ESP-WROOM-02使ってみる

ESP-WROOM-02ことESP8266を使ってみる…ようやくギテキが通って日本でもESP8266が使えるようになった。ESP8266ってなーに?というと…この子すね。

pic1

ESP-WROOM-02 ザックリ的な感じだと、WiFi(2.4GHz)が使えて、低消費電力、32bit MPU付きで4Mbyteのフラッシュが付いている。NWとCPUとちょっとしたストレージ付きの極小PCといった感じで使える。実際、海の向こうだとこの子の上で、

Arduino-compatible IDE with ESP8266 support: Arduino IDEが使える!!
NodeMCU : Luaが動く!!
MicroPython : そのまんまPython動く

とか動いていて盛んに使われている。LuaについてはNodeMCUを動かしてみたけど便利でビビる。さらに、ちょっと自分も関わっているW3CのWeb of Things Communityで開発がされているWoT Framework(NodeJSで動く)のターゲットの一つとしてESP8266がある。 -> Web of Things Framework for ESP8266(忙しくて全く手を付けられていない…MFT 2015が終わったら始めよう。けど一応、Spark/PhotonではMQTT/CoAPの実装はやったよ…)

このESP8266が日本でもついに使えるように!!キタコレ!!
何で注目されているかというと、安い!!とにかく安い!!これに尽きるwwww 安いのに、WiFiにつなげてAP化も出来るし、プログラムも直接書けてめっちゃ便利、というのがウケていると思われ。いや、便利と思うよ、ほんと。

Arduinoとか端末のNWに繋げるも良し、直接Lua/Python/Arduino IDEで開発するも良し、何でもアリっすね。ってことで、使ってみる手順を。

■ 使うもの
ESP-WROOM-02
FT232RL搭載小型USB-シリアルアダプタ 3.3V
10kΩの抵抗(プルアップ/プルダウン用)

このFT232RL 3.3Vは手持ちの、2,3年前に買ったやつw
他の動作記事だと、別のシリアル/USBだとアンペアが足りない…とかって見たりしたけど、この子は300mAも使えてサクっと動かせられる(注記: 実測値で300mAが取れていたのでサクッと使っています)。ちなみに、Arduino Pro mini/Rasperry Piのシリアルとかでもこの子は使えて、ずっと重宝している。

■ 使い方
ざっくりな流れは、めちゃ簡単
1) ブレッドボードに挿して結線
2) ターミナルから接続

■ 繋いだ感じ

Androidにテザリングで接続、さらにルータ化して他のPC/iPhoneからも普通に接続できた。よく展示とかでテザリングしてデモとか使う人が多いと思うけど、実際サクっと出来て何かちょっぴり感動w

ピンの結線はこんな感じ。

ESP  :  Serial
3.3V -> 3.3V
GND  -> GND
EN   -> Pull Up
IO15 -> Pull Down
IO2  -> Pull Up
IO0  -> Pull Up (Firm書き込み時はPull Down)
TXD  -> RX
RXD  -> TX

スイッチサイエンスさんの所にある、Hardware User Guide, WiFi Module Datasheetにある通り、UART Download Mode、Flash Boot Mode をIO0で使い分ける感じ。

■ まずはファームアップ!!
これ必要。覚えていた方が間違いなく後で幸せになれる。間違ってESPに謎の書き込みをしたり、何かおかしくなった時にサクっと復旧できる。間違ってオイラ、全然違うファームを書いて一瞬ビビったけどサクっと復旧できた。

ダウンロードしてくるもの。
firmware はここから
書き込みツーツはここから
どちらもEspressifのフォーラムから。

どちらも展開したら、下準備でIO0をプルダウンしてPCに接続する。そして書き込みツールを起動したら、こんな感じに設定を。

使うものは、blank.bin, boot_v1.4(b1).bin, user1.1024.new.2.bin, esp_init_data_default.bin でADDRの値は間違えないように。自分は最新版のSDKを使った。あと、Crystal Freq, SPI SPEED、 SPI MODE, FLASH SIZE もちゃんと設定したら、”Download Panel1″にある”START”ボタンをクリックするとファームが書き込まれる。

書き込まれた後は、IO0を元に戻しておく事を忘れずに…

■ WiFiに接続する!!
Arduino IDEのシリアルから使うも良し、好きなターミナルから使うも良し…とりあえず、こんな感じ。

ここでは、Androidのテザリング(SSID: hirotakaster, PASS: 1234567890)に接続して、さらに自身をWiFiのAP(SSID: hirosuke: PASS: 1234567890)にしている。使うATコマンドは、この絵の遷移が非常に分かりやすい。クライアント・サーバ・TCP/UDPの使い方…etc この遷移で叩けばOK。この絵を書いた人に感謝!!

# 動作モード
AT+CWMODE=[1:station, 2:AP, 3:両方]

# APとして起動する時に必要
AT+CWSAP="SSID","PASS","CHL","ENC"(ENC:0 Open, 1 WEP, 2 WPA_PSK, 3 WPA2_PSK, 4 WPA_WPA2_PSK)

# WiFiに接続する時に使う
AT+CWJAP="SSID","PASS"

# IPのリストを表示
AT+CIFSR

ちなみに、esp_iot_sdk を見ると単体で開発するsample, ドキュメントもわりと良い感じに整理されている。ググるとArduino、Lua、Python化の方法がザクザク出て来る。まぁ、失敗してもファームを書いて復旧もサクっと出来るから、これはかなり遊べる。というか開発しなきゃならんのだけど。
あと少し思うのが…もう何かこういうので直接プログラム動かせたり、ハードのソフト化が凄いなーって普通に思っちゃうよ。

Photon

いつだったか…完全に忘れた頃にpre-orderしておいたParticle Photonが届いた。

これで$19というのはpre-orderした時は驚異的な値段で、前バージョンのSpark Coreも含めて先達感があるんだけど、今はこの手の小さい端末はやたらとあるし、既見感は否めない…
ただ、Web上でビルドしてコードを流し込めるお手軽感、Android/iPhoneのアプリが最初からあったりするのは便利な感じ。

まずは外身の箱。

開けるとブツ一覧

one centとのサイズ比較

Spark Core(白いやつ)とPhoton比較

まず届いたら最新のfirmwareに上げる事を本当にオススメ。いやー、安定させるまで色々とあった。
自分はMacがメインで、入れておいた方が良いと思うのが particle-cli, brew, dfu-util, openssl。既にbrew周りを入れていたら、必ずbrew update/upgradeはしておいた方が良い。特にopensslは少し古いバージョンだと、次に行う証明書の差し替え時にコケて動かない事が発生して、わりと悩ましかった。

まず喰らったのが、端末登録が出来ない…これは泣けた。最新のファームにしても全く効果無し。端末登録が出来ないとGUIでプログラムをサクっと流し込めるという利点が無くなって、photonを使う意味が無くなる。コミュでもスレが上がっている通り、わりと高い頻度で発生する。自分が行った解決方法はこちら
証明書を再作成してサーバに再登録するという方法で。この時にOpenSSLのバージョンが少し古いとエラーで登録出来なくなるから、事前にbrew update/upgradeかましておく。あとは以下の通り。

wget https://s3.amazonaws.com/spark-website/cloud_public.der
dfu-util -d 2b04:d006 -a 1 -s 2082 -D cloud_public.der
particle identify   # これで device_id を控えておく
particle keys doctor [device_id]

次にハマったのが…UDPがヤバい。これも端末依存なのか、コミュでUDPが受信できないってスレが上がっている。これはfirmwareのgitにissueで上がっていて、修正版のパッチがあって上手く動いた。多分、そのうちファームアップで対応されると思われ。今はpre-orderで速攻ゲットした人柱版だと思っているから、まぁ今は仕方ないかな…そのうち多分、治るんじゃないかなー

んで、Spark Core/Photon向けにCoAPのライブラリを作ってアップ/contributeした。これでCore/PhotonともにMQTT/CoAPのどちらもサクッと使える環境に。一応、microcoap/libcoapの両方で動作確認、サーバ、クライアント共にしているから基本的な所は大丈夫と思われ。以下、サンプルコード。

#include "coap/coap.h"

// サーバとしてエンドポイント light のコールバック
void callback_light(CoapPacket &packet, IPAddress ip, int port);

// クライアントとして動作する時の共通コールバック
void callback_response(CoapPacket &packet, IPAddress ip, int port);

Coap coap;

// light コールバックの実装部。受信したCoAPパケと、送信元クライアントip/portが貰える。
void callback_light(CoapPacket &packet, IPAddress ip, int port) {
    Serial.println("[Light]");
    
    // サーバとしてのレスポンス
    coap.sendResponse(ip, port, packet.messageid, (uint8_t *)"1", 1);
}

// クライアントの共通コールバック実装部。受信したCoAPパケと、通信したサーバのip/portが貰える。
void callback_response(CoapPacket &packet, IPAddress ip, int port) {
    Serial.println("[Coap Response got]");

    char p[packet.payloadlen + 1];
    memcpy(p, packet.payload, packet.payloadlen);
    p[packet.payloadlen] = NULL;

    Serial.println(p);
}

void setup() {
    Serial.begin(9600);

    // サーバとして動作する時のコールバック
    // 例みたいく、複数のコールバックを追加して定義できる
    // exp) coap.server(callback_switch, "switch");
    //      coap.server(callback_env, "env/temp");
    //      coap.server(callback_env, "env/humidity");
    coap.server(callback_light, "light");

    // クライアントとして動作する時の共通コールバックを追加
    coap.response(callback_response);

    // サーバ・クライアントとして起動
    coap.start();
}

void loop() {
    // CoAPサーバに向かってgetリクエストを送信
    // putリクエストはこんな感じで。
    // int msgid = coap.put(IPAddress(10, 0, 0, 1), 5683, "light", "1", 1);
    // msgidはCoAPのrequest/responseで利用するmessage id。これがあれば再送もOK。
    int msgid = coap.get(IPAddress(10, 0, 0, 1), 5683, "light");

    delay(1000);

    // コールバックのループが走るloop
    coap.loop();
}

Arduino向けのCoAPライブラリはあって参考にしてみたけど、「これって…プロトコルの仕様分からないと使えないんぢゃね?」って感じで、どれもこれもヒトクセあったりして、同じくcontributeしているMQTTと同じような簡単なノリで使えるようにしてみた。Arduino向けのCoAPライブラリも、このノリで作ってアップしようかしら…

Spark Core/Photonともにpub/subでCoAPを使って参照できるぜ!!っては書いてはあるものの、Spark Protocolの皮を被って使うのが面倒だと思うから、サクッと簡単に使うならこっちの方が良いと思われ。クライアントだけじゃなく、CoAPサーバとしての特定URLのコールバックも出来るから、CoAPの思想の一つでもある端末間のNWによる制御もCoAPを使って出来る。
とりあえず、MQTT/CoAPの両方対応ってことで、あとは使われてbug fixed追加機能は気が向いたら…って感じで。

DeepDream環境 Caffe構築

GoogleのDeepDreamがGitで公開されて、キモィ絵を生成できるということで…触ってみるよねw
ローカルPC上でCUDA使ってDeap LearningのCaffeを構築するのもだけど、サーバ上のPC駆動で構築しておけば、例えばVPS(KVM)で適当にサーバ借りてサクッとscreenかまして動かしておけば、結果が出ているというわけで。自分のPCに特に負荷を与えずに放置プレイで動かせる。

って感じの環境で動かす場合の方法を。

– サーバ : Ubuntu 15.04
– VPS : CPU x3/MEM 2Gbyte

# まずはscreenしとく。以下、コピペでOK。
screen

# Caffeの構築
sudo apt-get install nvidia-cuda-toolkit libatlas-base-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler git
git clone https://github.com/BVLC/caffe.git
cd caffe
cp Makefile.config.example Makefile.config

# Makefile.config の編集。viとかで以下、変更部分。
# CUDA_DIRの/usr/local/cudaをコメントにして/usrを有効にする
# CUDA_DIR := /usr/local/cuda
CUDA_DIR := /usr
CPU_ONLY := 1
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/lib/x86_64-linux-gnu/hdf5/serial/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial/lib

# ビルドする
make
make test
make runtest

# Python環境
sudo apt-get install python-pip python-dev python-numpy python-skimage
cd python
for req in $(cat requirements.txt); do sudo pip install $req; done
cd ..
make pycaffe
export PYTHONPATH=~/caffe/python/:$PYTHONPATH
# PYTHONPATHは.bash_profileとかrcあたりに書いておけば後々幸せになる

# DeepDreamを動かす下準備
cd model/bvlc_googlenet
wget http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel
cd 
git clone https://github.com/google/deepdream
cd deepdream
mkdir frames

# iPython Notebook で動かしてもOKだけど、ソース部分をそのまま実行でもOK
# ソース部分は抜き出して、動くようにした。wgetして叩けばOK
wget https://www.hirotakaster.com/download/dd.py
python dd.py

# deepdream/frames ディレクトリ内に0000.jpg - 0099.jpg まで絵が生成される。
# 実行したらscreenから抜けて放置しとけば生成されている。
# CPUはシングルタスクで動くから良いものの、メモリは1.6Gbyte程度、この子だけで消費する。

真っ白い(RGB:255,255,255)を与えた場合

Google Logo(わりとマトモになってしまった…)

自分

ネットから拾ってきたジバ

ネットから拾ってきたピカー