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(わりとマトモになってしまった…)

自分

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

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

nRF52を使ってみる

NordicさんからnRF52シリーズの発表があった。Cortex M4とBluetooth、NFCも使えるというヤバめなスペックなのが、またヤバイ。

nRF51832の機能一覧でこれは!?って思ったのがこのへん
– 32bit ARM Cortex-M4F 64MHz, 512kB flash/64kB RAM
– Bluetooth/NFC Tag 両方搭載
– AES HW encryption, Thread safe and run-time protected
アプリケーション例で色々と書いてあるけど、何となく…何でも動くんじゃないかなーって気が…何気にこれは良いねって思うのがAESのHW処理。暗号化をHWでやってくれるというのが、これわりと熱いと思われ。

実際のサイズはこんな感じ。

思わずお米を横に置いてみちゃったよw このサイズでスペックはモリモリでスゴス。

んで既にモノはnRF52 Preview DKがゲットできる。Arduinoのシールドが上にポチっと置ける。

現物は…

nRF52 Preview DKの内容物一覧

DKの裏面はこんな感じ

何となく楽しくなってきて、シールドをつけてみた。MP3プレーヤーシールドを載せてみたら…

NSX-1用のeVY1シールドも載せてみた

バッチリシールドも載りますな。

んで…モノがあるからには、実際にプログラムをブチ込んで動かしたくなるもので(w
SDK周辺が丸っとここで公開されている。そして大体の手順もInfo Centerで公開されているとおり。開発環境はKeilが便利だと思われ。全体的にビルド&インストールしておいた方が良いかなと思ったのが。

Keil 5
nRFgo Studio-Win64
nRF5x-Tools
nRF5x-MDK-Keil4

とりあえず、この辺をダウンロードしてきてインストールしておく。んで、追加でこの子もダウンロード。

nRF5x-MDK-Pack

Keilを起動したら、このPack Installerをポチル。

そして、[File]->[Import..]から

さっきダウンロードしてきたnRF5x-MDK-Packを選択したらOK

次はnRF52 SDK&サンプルのソースコード類をダウンロードしてくる。
nRF52 SDKはここからダウンロード。versionが0.9.0というのがホヤホヤ感がある。ダウンロードしてきたらzipを展開してOK。examples配下に大量のサンプルがあるから、それを参考にすれば大抵は何でもイケる気がする。あとの手順はInfo CenterのnRF52 Series、Test your setup with Blinky -> Running a first exampleにある通り。

examples\peripheral\blinky\pca10036\blank\arm5_no_packs\blinky_blank_pca10036.uvprojx
をクリックしてKeilを起動。

あ、nRF52 Preview DKをPCにUSBで接続しておくのを忘れずに…んで、Rebuildを実行

そして、Donwloadで書き込まれる。

すると、nRF52 Preview のLED1, LED2, LED3, LED4がクルクルまわって光るのが分かると思われ。Keil自体のプログラムはCだけど、たぶんあれかな…サンプルも大量にあるしノリで全体的に書けると思う。やっぱりあれね、センサーつなげてBLEでスマホから使ってヒャッハー!!と、やっぱりAESを動かしてみようかなと。Info Centerの資料を見ると、AESは128 bit/ECB block対応とのことで、これがハードウェア処理でサクッと出来るのはかなり熱いと思われ。プログラムでAESを入れてCPU処理する部分がお任せできるというのは、素敵すぎる。

初入院

蜂窩織炎という物で入院していた。
「何か病院で面白い事でもあるんだろうか!?」
初の入院で、病院という未知の空間に期待も膨らんだけど、結論としては「暇」この1文字に尽きる。

経過はこんな感じ。

  • なんとなく右足がかゆいと思って軽く引っ掻く。これが直接の原因らしい。
  • 5/11日、「右足が痛い気がする…」寝れば治るだろ&大丈夫と思って寝る。
  • 5/12日、右足が足首以下から腫れて歩けず。左足1本の”ケンケン”、右足のかかとを軸に数十センチずつ移動するといった方法を編み出したり、最終的にはタクシーを駆使して病院に行く。かなりキツかった&泣きそうな痛みで凹む。”蜂窩織炎”と言われ、抗生物質を貰った。
  • 5/13日、朝起きたら膝下まで真っ赤っかで、さらに悪化。太ももの方まで赤みが侵入してきていて、右足がポンコツ状態に。痛みはハンパない。「蜂窩織炎+リンパ浮腫」というダブルパンチに悪化(w)。明日から即入院の指示。経口は痛み止め、点滴経由で直接体に抗生物質(セファゾリンを2g)の投与に。
  • 本当は5/14-20までMaker Faire Bay Area 2015で米国に渡航予定だったのが、見事に全部消え去った。ドクターに行ったら「絶対に飛行機には私だったら乗せない」「飛行機の中で何かあっても手遅れ。」「もし運良く米国についても、即入院は間違いない」という言葉でようやく諦めた。フライト&ホテルのキャンセルが直前なだけに、こっちも痛かった。
  • 5/14-20日、入院。朝晩セファゾリンの投与とアイシング・足の挙上の対応。最初は松葉杖だったけど、移動が激痛過ぎて車椅子を使うことに。最後の2日間はまた松葉杖に。
  • 退院の条件は「これから1週間あんまり歩かないで、出来るだけ足の挙上、アイシングを続ける」という事だった。毎日、レボフロキサシンを500mg経口で摂取。経過観察で病院に行くことに。よっぽど酷かったようで、治るのに2週間くらい必要とのこと。(イマココ)

症状はシンプルだった「腫れて、痛い」右足の激痛がなければ、熱があるものの他は正常な感じ。ただ、皮膚を触るだけでも発生する痛みに加えて、少しの移動が痛みを誘発する。例えば足を上げていてから下げると、足に流れる血流が変わるんだけど、それだけで激しい痛みが襲ってくる。これが割と泣ける(w

「移動ですよー」という時の移動、トイレ・シャワーの移動でベットから車椅子とかに移動しようと思うだけで、息が止まるよーな痛みが(w

これは相棒だった車椅子。こういう補助が無いと、足を曲げたり、体重をかけるとそのまま倒れる感じ。気合いで左足1本のケンケンで途中でコケたり(本当はダメ)、看護師さんに倒れこんだりした。あまりの痛みで笑いが止まらなかった。

自分の足の経緯を写真で撮ってはいるけど、ゲロ&気持ち悪くて見せられたもんじゃない感じ。「人間の足って、こんなドス赤黒くなっちゃうものなのねー」と我ながらびっくりした。

車椅子と松葉杖を使った実体験と改善点(改造)したら面白いと思うのは次の通り。

■車椅子

  • 1日も使えば前後左右・回転動作などはすぐ慣れる。
  • 看護師さんとかに後ろから押されると楽。ただ自分で移動したいからちょっとイヤな気もしてくる。
  • 後進する時、ドアから出る時が一番気を使う。左右の確認、後ろの確認とか。サイドミラー・バックミラー(またはセンサー)が欲しい。
  • ライト機能で光があればちょっと嬉しい。暗い所とかね。タバコを吸えるのが外で、夜は暗いから光が欲しかった。
  • 車椅子からベッドに変形(その逆も)があれば、割と便利な気がする。
  • 高さを自動で変えられたらベッドの移動もめっちゃ楽なのに。ベット側の高低は変えられる。車椅子の高低も自動で変えられても良い気がする。
  • モーター付いて自動で動くのは、やっぱアリかなー。
  • 傾斜になっている所を移動しようとすると、重心のズレから後ろ向きにコケそうになったりした。自分で重心移動できる人なら何とかなるけど、できない人は厳しいね。このバランスの制御がムチャクチャ欲しかった。
  • センサーが前後左右について、ぶつかりそうになったらブレーキくらいの簡単な機能でも嬉しい。
  • 車椅子の座る部分の裏にバッテリーやらセンサ・コントローラを置けそうだし、やろうと思えば改造はできそう。

■松葉杖

  • 左右のバランスを取るのにコツが必要だった。
  • 二の腕の筋肉が鍛えられる。筋肉痛にもなった。
  • 移動で右足が前後に振られる時の痛みが泣けた。「接地しなくてもOK」という点はクリアしているんだけど。
  • 手のグリップの所が濡れると滑りやすく、お手洗い後とか手に汗かいた時はドキドキする。滑らない素材は無いのかしら。
  • 松葉杖を動かす時、音が鳴ったらちょっと良いかも。バランスに応じてでもね。
  • コケそうになって、足を誤って着いたら激痛で泣きそうになった。これをうまく補助できれば。
  • 手元のグリップにスイッチを仕掛けて、音・光らせられたら良いかも。
  • まさに硬い棒で体を支える感じで、この筐体部分にスプリングを入れたら、歩行の時の緩衝になって腕と脇にかかる負荷、接地する時の動作が軽減されるのでは?と(論文もあった)。
  • 少しデザインを変えると、脇や二の腕にかかる負荷を軽減できそうな感じがした。この辺は作り次第な感じも。

ざっとこんな感じかな。シンプルな構造だけに手を入れる余地は色々とありそうな気もした。

Typing Board


Arduino Mega, Solenoidx38

キーボードのタイピングを行うTyping Boardという物を作った。よく見たりするロボットアームでのキーボード入力に比べて、ソレノイドを使うことで(ソレノイドブラスター)、高速に入力することが出来て人間の動きと同じように高速にタイピングすることができる。今のところ基本キーの1-10、a-z、エンターとスペースに対応している。ソレノイドの単価が割と高いのもあって、基本的なキーだけ用意した。シフトキーを押しながらの入力や、複数キーを使ったOS独自のコマンドをタイプするのも、このTyping Boardの仕組みを使えば簡単に実現する事ができる。

人が入力したキーに合わせてリアルタイムでタイプをしたり、入力するキーを一度に出力してタイプさせることもできる。また、BluetoothやZigbeeのモジュールを使うことでリモートタイピングも可能かな。

作ってみて分かったのが、メインで使っているキーボード(Macbook air)に”クセ”が付いていて、打刻するキー毎に少しづつ打刻圧を調整するための高さ、ストロークの時間長の調整が必要だった。あと、打刻するポイントによってストローク音が異なることから、打刻音でリズムと音が作れる。
実際の動きは動画をどうぞ。

ThinkpadとMacbook Airのキーボード入力の同期

キーボードに設置した時の裏側

ソレノイドブラスターの配置

超会議2015、ギガヘボコン出てきた

ニコニコ超会議2015の企画でギガヘボコンがある、ということでエントリーしたのが1ヶ月ほど前。先着順で遅かったせいか、最初は入れなかったのだけど…キャンセルが出て繰り上げ出場できることに!!

自分のマシンはハンガーロボで、1回戦の初戦になった自分の対戦は「おにぎり vs ハンガー」という生活感がある異種格闘技戦に。

ギガヘボコンは「・ロボットの幅/奥行き/高さのいずれかが100cm以上あること。・ロボットの身長が50cm以上あること」という条件を満たしたロボット同士の相撲。”技術力の低い人限定 巨大ロボットバトル(通称:ギガヘボコン)”というタイトル通り、高度な技術を使わない巨大ロボット同士の戦いが…実際の出場ロボ達はこんな感じ。

準備している時は…

ロボが大量にあるとこれから戦うロボには全く見えない上に、冷静に見てみると”ゴミ置き場”か”何かの資材置き場”な感が漂ってくる。横のブースには凄いロボがある状態で、”Giga”ヘボコン達の戦闘力がどれくらいなのか、興味津々な感じに。

こっちはまともな夢のロボ。

自分は当初の案だと、”風船の空気圧で動くロボ”を考えたものの、実験してみたら全くビクとも動かない。というか風船の大きさでレギュレーションを回避するという、ヘボコンの「妥協と割り切り」なロボの趣旨に合いそうな姑息な戦法だったのだけど。ハンガーにロボットを吊るしてモーション作って動かしたら?とnoritsuna氏に言われ、手持ちのロボを吊るして動かしたらカッコイイかも…と思ったりして出来たのがハンガーさん。「妥協と割り切り」をキーワードに若干違う方向性に。

アイリスオーヤマのパイプハンガー(1,700円)を駆動部に、DCモーターを足としてつけて、ボクシングファイター(1,700円)を吊るして戦わせることに。目の前の的をポコポコパンチで蹴散らしてくれるはず。駆動部は元から付いていたキャスターにモータをつけて動かせるよーにしただけで、もう十分な感じ。実際の対戦だと、ロボットのポコポコパンチが宙を切ってしまい、どうやら作戦にミスがあったようだ。

何気に工夫を入れようと、赤外線センサーとArduino、DCモータドライバをつけて距離に応じて向かっていくというのも実際にやってみたりBluetoothとか無線というのも考えた訳だど、ムチャクチャ人混みの中だと経験的に無線は使えないからNGに。ただ、それらを実装すると、自分が移動しなくても、向こう(ハンガー)が服を持ってきてくれるという”リモートで動く夢のハンガー”ができる。

他のロボ達の戦いは…

動力がちびっ子が乗る車

pじゃなくqと、木魚

テ◯ガと網

ベイ◯ックスと玉

いろんな意味でカオスな感じ。試合が終わってヘボロボが勢ぞろい。まさにカオスな感じ。ちなみに、右にあるのぼりの赤いのもロボ(というかのぼり)。

みなさん、キレッキレのヘボさですげー面白かった。

将棋の読み

電王戦Finalが終わって数日経って、ふと将棋の「読み」ついて書きたくなった。

自分は下手の横好きでたまに将棋を指しているわけだけど、むかし「将棋に向かって座ってじっとしていて何考えてんの?」と聞かれたことが。確かに大会とか、TVで見ると将棋の盤面に向かってじっと座って、1手指すのに数分とか考えたりして「何考えてんの?」と思うのも無理ない気もする。

じっと座って考えている時は「読み」というのをしていて、たとえば、自分がこう指したら、相手はこう指してきて、さらに自分は…という事を延々と考えている。自分と相手の立場に立って、こういう順で指したら自分の方が良くなるか?をひたすら考える。PCが強いのは、計算量が膨大に使えてしかも電力の続く限り疲れを知らない。さらに感情的になる事も無いし(もちろん、指している時は、”えいやっ!!”とか、ここは引けないという事もある)。

計算量というのは、例えば以下の盤面。

これは自分が昔指して覚えているので、先手(盤の下)が自分で、後手(盤の上)は元奨励会のとある人のもの。自分は慣れない戦略を取ったせいで、陣形もバラバラでノーガード的な雰囲気もしてくる。けど、そんなに悪くは無いかな…とは思っていた。印象に残った棋譜はずっと覚えていたりする(大抵の段位者とかなら、勝負が終わったあと最初から再生して並べたり、目隠し将棋とかは出来ると思う)。

ここは後手の番で、動かす事ができる駒は持ち駒も入れて84通りもある。PC将棋でも平均して1回あたり80個の選択枝があるみたいで、例えば100手で勝負が決まるとすると、80x80x80…で約91桁分(100log80から)の計算量が必要になる。さすがにPCでも全部は読みきれないから、「枝切り」というので途中で読みを打ち切って、それ以上は読まないという実装をしている事も多い。
直近の5手だけ読むにしても、80x80x80x80x80 = 3,276,800,000でざっと32億通りかな。この中のほんの数個が良い手で、あとの32億手は悪手になる。選択肢だけから考えると、何本も並んだ針の穴を通すような”作業=読み”が必要になる。

ただ、人間の場合は「さすがに、その順は無いだろ…」といった手を最初から考えない事で、そんな数十億もの手を一気に省略することができる。
例えば上記の局面から、自分は△2七飛と指してくるだろうと考えていたし、実際そう指してきた。一見すると、次に△2六飛成りでなんとなくまずい、防げないかも…という気もしてくるけど、▲6五桂からの逆襲で△2七飛を空振りさせる事ができると読んでいた。

実際は、△2七飛▲4九飛△4五歩▲6五桂△同銀▲4五飛△8八角成▲同玉△3二角と9手ほど進んで、次の局面に。

ここで、次に▲4三歩とか▲4六飛▲1八角から飛車を取りにいく順や、▲2二角とかが見えて「これはまだまだ戦えるかも」と判断していた。この「この局面で自分の方が良いか悪いか?」という判断(大局観と言ったり)をしながら、1つづつ読んでいく事になる。その読んでいる間は頭だけ動いている状態で、すごく集中していると音は聞こえないし、数分考えていても感覚的には”ほんの一瞬”にしか感じられないような事がままある。自分がこう指したら、相手はこうかなー、「うーん、次はどう指すか、こっちの分岐はどうかしら?いや、ちょっと前に戻ってこの形だとどうかな。何か変だな…ちょっと違う手も考えてみるか…etc」という事を延々と。

実際この後は、▲4六飛△5四桂▲4五飛△2六飛成▲4四角△2四飛▲6二歩△5一金右▲4三歩△6六歩▲6五飛△6七歩成…と進んでいった。自陣の乱れっぷりと、少し破られたら即負けみたいなこの緊張感が堪らなく心地良かった。

将棋の最初の盤面はこんな感じでお互い同じ状態で始まる。

読みと判断(大局観)で優った方が勝つわけだけど、読みはまるで自分と相手との対話のようで、「この人だったらこうかな…」とか思いながら、1手づつ話しているような。勝負が終わって感想戦でお互い話してみると、「なるほどね」と思うことも多々ある。あと、鋭い着手だったり、やたら攻撃的だったり守りが堅かったり…性格なのか考えが盤面に出てきて本当に面白い。

5V Solenoid with Arduino

前にエントリでSparkfunの5Vソレノイドが安い&5Vで動くと書いたけど、他にトランジスタとかも使うわけで、安くて手頃なのが無いかしら…と何個か使ってみて良い感じの組合せを自分のメモとしても書いておく。

– 使うもの
Sparkfun 5V solenoid (650円)
整流用ショットキーダイオード(130円/10個)
NPNトランジスタ(100円/20個)
5.6K抵抗(100円/100個)
5Vでそんなに強くないけど使いどころかな。

– 配置はこんな感じ

– スケッチ

void setup(){
  pinMode(2, OUTPUT);
}

void loop(){
  digitalWrite(2, LOW);
  delay(1000);
  digitalWrite(2, HIGH);
  delay(100);
}

大量に並べてみると…

SparkでMQTT

よくIoTでMQTTとかってあるけど、実際にどんな感じで使うのか?という事で…自分がよくやる環境について書いておく。

– 環境
サーバ : Ubuntu 14.10
端末 : Spark

– SparkのLEDをMQTTでチカチカさせてみよう

まず最初にSparkのLEDを光らせる。
1. mosquittoをUbuntuにインストール
サーバにMQTTサーバであるmosquittoをサクっとインストール。

apt-get install mosquitto mosquitto-clients

2. SparkでMQTTを使う
まずはMQTTのライブラリを探す。ライブラリのタグからMQTTと入力すると出て来る。

ライブラリの”MQTTTEST.INO”を選択して”USE THIS EXAMPLE”をクリック。そして、以下の”server_name”の所にさっき立てたMQTTサーバのIPかドメインを設定する。

# MQTT client("server_name", 1883, callback);
# IPの場合
byte server[] = { 157,XXX,XXX,XXX };
MQTT client(server, 1883, callback);

# ドメインの場合
MQTT client("www.hogehoge.com", 1883, callback);

3. LEDを光らせてみる
サーバ上でコマンドを実行すると、SparkのLEDが変わる。

mosquitto_pub -h localhost -t inTopic -m RED
mosquitto_pub -h localhost -t inTopic -m BLUE
mosquitto_pub -h localhost -t inTopic -m GREEN
mosquitto_pub -h localhost -t inTopic -m OTHER

Spark側でSubscribeしている”inTopic”に向けてメッセージを投げている。サーバ側でoutTopicを見ていると起動時に”hello world”が流れてくると思われ。

– もちょっと面白く使いたい
JavaScriptからWebSocketでMQTTを直撃で叩きたいという気持ちになると思われ。まぁ、これもサクっと簡単に出来る。よくあるlighttpd+mod_websocketでサクットやる。

1. mod_websocketを動かす
とりあえずサクっと動かすって事で、lighttpd+mod_websocketをシングルで動かす。

apt-get install gcc make libpcre3-dev zlib1g-dev libbz2-dev automake libtool openssl libssl-dev unzip g++ libev-dev libev4 pkg-config
git clone git://github.com/nori0428/mod_websocket.git
cd mod_websocket/
./bootstrap
sh ./makesample.sh
cd sample
./sbin/lighttpd -f ./etc/lighttpd.conf

2. Webサーバ上でPahoを動かす
PahoはEcilpseで提供されているMQTTのライブラリでJSの他にも色々あったりする。最初に使ってみる物としては多いと思われ。

wget http://ftp.pgpi.org/pub/eclipse/paho/1.0/paho.javascript-1.0.1.zip
unzip paho.javascript-1.0.1.zip
cd paho.javascript-1.0.1/

# 以下のHTMLをindex.htmlとか適当に追加
# Paho.MQTT.Clientの所でIPを自分のサーバに向ける
<html>
<head>
<script type="text/javascript" src="mqttws31.js"></script>
<script type="text/javascript">
var client;
var form = document.getElementById("tutorial");
function doConnect() {
    client = new Paho.MQTT.Client("IP Address", 8080, "ClientId");
    client.onConnect = onConnect;
    client.onMessageArrived = onMessageArrived;
    client.onConnectionLost = onConnectionLost;
    client.connect({onSuccess:onConnect});
}

function doSubscribe()
    client.subscribe("/outTopic");
}

function doSend() {
    ledcolor = ["RED", "BLUE", "GREEN"];
    message = new Paho.MQTT.Message(ledcolor[Math.floor(Math.random() * 3)]);
    message.destinationName = "/inTopic";
    client.send(message);
}

function doDisconnect() {
    client.disconnect();
}

function onConnect() {
    var form = document.getElementById("example");
    form.connected.checked= true;
}

function onConnectionLost(responseObject) {
    var form = document.getElementById("example");
    form.connected.checked= false;
    if (responseObject.errorCode !== 0)
    alert(client.clientId+"\n"+responseObject.errorCode);
}

function onMessageArrived(message) {
    var form = document.getElementById("example");
    form.receiveMsg.value = message.payloadString;
}

</script>
</head>
<body>
<h1>MQTT Messaging.</h1>
<form id="example">
<fieldset>
<legend id="Connect" > Connect </legend>
Make a connection to the MQTT
<br>
<input type="button" value="Connect" onClick="doConnect(this.form)" name="Connect"/>
<input type="checkbox" name="connected" disabled="disabled"/>
</fieldset>

<fieldset>
<legend id="Subscribe" > Subscribe </legend>
Make a subscription to topic "/outTopic".
<br> <input type="button" value="Subscribe" onClick="doSubscribe(this.form)"/>
</fieldset>

<fieldset>
<legend id="Send" > Send </legend>
LED show/down.
<br>
<input type="button" value="Send" onClick="doSend(this.form)"/>
</fieldset>

<fieldset>
<legend id="Receive" > Receive </legend>
Publish touch value.
<textarea name="receiveMsg" rows="1" cols="40" disabled="disabled"></textarea>
</fieldset>

<fieldset>
<legend id="Disconnect" > Disconnect </legend>
Now disconnect this client from the server.
<br> <input type="button" value="Disconnect" onClick="doDisconnect()"/>
</fieldset>
</form>
</body>
</html>

んでページを見てみるとこんな感じに。Connectして接続してMQTTのPub/SubがJS経由でサクっと出来る。