Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

【イベントレポ】センサエキスポジャパン2016


10月27日~29日に東京ビッグサイトで実施されたセンサエキスポジャパン2016に行ってきました。
食品系や土木系の技術展示も併催されており、今日は中日という事もあってか、客層が混沌としていたのが印象的でした。

実際のところ

サーボの異音から交換時期推定



木材を混ぜ込んだプラ

間伐材を半分ほど混ぜ込んだプラ素材とのこと。
通常、プラがくっつかない接着剤もくっつくそうです。


昔懐かしい荷台つき三輪自動車がEVに

もとはインドで出ていた三輪自動車を川崎の会社が日本のEVとして再生。
月産5台で30台弱が市場に出ているそうです。


LoRaモジュール

割かし新しい通信規格です。
変調方式を変えることで出力を上げずに通信距離を伸ばすことができます。

物理型エナジーハーベスト


荷物持ち上げバキューム


協業ロボット

協業型のロボットです。
自動車1台分のお値段ですが、その分高性能。
学習機能や非常停止ボタンなんかも。

ボタン電池駆動リモート温度計

802.15.4をベースにボタン電池駆動のネットワークを実現。
100個繋がるそうです。

cURLでincludeオプションをつけるとレスポンスヘッダを見ることができる

cURLでレスポンスヘッダを表示する場合、includeオプションを付けてやります。

実際のところ

前回の記事でJSONを吐き出すパートを作りました。
includeオプションをつけて表示すると、この通り

$ curl --include http://localhost:8080/api/status
HTTP/1.0 200 OK
Date: Tue, 27 Sep 2016 15:03:09 GMT
Server: WSGIServer/0.2 CPython/3.4.3
Content-Length: 50
Content-Type: application/json

{"status": "online", "time": "09-28_00:03:09_JST"}

通常のHTMLなら、こんな感じ

$ curl --include http://localhost:8080/time
HTTP/1.0 200 OK
Date: Tue, 27 Sep 2016 15:03:25 GMT
Server: WSGIServer/0.2 CPython/3.4.3
Content-Length: 148
Content-Type: text/html; charset=UTF-8


<h1>jade sample</h1>
<p>var : <p>09-28_00:03:25_JST</p></p>
<p>Jade is outdated.  Use Pug! </p>
<li>https://pugjs.org/api/getting-started.html</li>

レスポンスコード等、一部情報だけみたい場合

shuzo-kino.hateblo.jp

参考もと

bottleでJSONを返す

python版sinatraな軽量WEBフレームワークbottle - Bye Bye Mooreの続き。

bottleでJSONをゲットしたい場合……何も考えずに辞書型を放り込むと"Content-Type: application/json"で返してくれます。

実際のところ

文字と現在時刻を返したい場合、以下のようにします。

from bottle import get, run, template
from time import strftime

@get('/api/status')
def api_status():
    return {'status':'online', 'time': strftime('%m-%d_%H:%M:%S_%Z')}

run(host='localhost', port=8080)

試しにcurlでチェック

$ curl http://localhost:8080/api/status
{"status": "online", "time": "09-27_23:42:23_JST"}

オフにしたいとき

とはいえ、この挙動だと困る事もあるでしょう。
bottleの設定で変更できます。

bottle.default_app().autojson = false

FlashAir内蔵Luaを使ってWEBブラウザからLEDをチカチカさせる

FlashAirにはLuaという軽量言語が内蔵されています。
RubyPythonのような文字列、配列を軽く操作できる便利関数が揃っています。
それに加えて、極めて高速。
どれほどかと言えば、ゲームエンジンの開発初期段階でパラメータ調整なんかに使われる程。
フットプリントも軽いのでSDカードのような非力な実行環境でもサクサク動きます。

FlashAirではデフォからos系の機能を削り、代わりにWEBやSDカードIOまわりを強化した独自パターンのものを採用しています。
今回はこの独自Luaを使ってLチカさせる方法を考えてみます。

実際のところ

作業環境

  • FlashAir W-03 32Gbyte
  • OS X Yosemite(10.10)

部材

初期設定

まずは設定。
SDカードをスロットに

$ nano /Volumes/NO\ NAME/SD_WLAN/CONFIG 

キモは

  • APPNAME
  • IFMODE

です。
前の記事で紹介したツールを使うと、これら値の設定は空白で出てませんでした。

最終的に私のは、こんな感じに

[Vendor]

CIPATH=/DCIM/100__TSB/FA000001.JPG
VERSION=FA9CAW3AW3.00.00
CID=02544d535733324731ea8ec97900f701
PRODUCT=FlashAir
VENDOR=TOSHIBA
APPMODE=5
APPAUTOTIME=300000
DNSMODE=1
APPNAME=flashair
APPSSID=YOURSSID
APPNETWORKKEY=*********
LOCK=1
WEBDAV=1
TIMEZONE=36
IFMODE=1

index.html

設定が終わったら、いよいよファイルです。
場所は"/Volumes/NO\ NAME/index.index"のように、SDカード直下でよいです。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Test</title>
  </head>
  <body>
    <form action="index.lua" method="GET">
      <button type="submit" name="light" value="on">ON</button>
      <button type="submit" name="light" value="off">OFF</button>
    </form>
  </body>
</html>

index.lua

-- /Volumes/NO\ NAME/index.lua

print[[
HTTP/1.1 303 See Other
Location: index.html

]]
local arg = ...
local light = arg:match("light=(%a+)")
local LED_PIN = 0x01 -- CMD

if light == "on" then
  fa.pio(LED_PIN, 0x01)
  print "ON"
else
  fa.pio(LED_PIN, 0x00)
  print "OFF"
end

配線

電源はUSBシリアル変換器の5Vから、信号はSDIから出力。

動作確認

http://flashair.local/index.htmlを見ると、ブラウザに簡単なボタンが二個表示されている筈です。
indexはsubmitからluaスクリプトを呼び出しています。
呼び出されたluaは303を返すので、そのままindex.htmlに返します。
が、バックでは動いているのでLEDがボタン通りに動きます。

FlashAirの設定ツールを使う

FlashAirにはWIn/OS X用のGUI形式の設定ツールが用意されています。
直接設定ファイル書き換えもできるのですが、楽な方がいいですよね。

実際のところ

導入

下記サイトからツールをダウンロード。
私はMacBookProなので、OS X用のdmgです。
www.toshiba.co.jp
起動すると二つのアプリがあります。
FlashAirをSDカードスロットに差し込んだ状態で右側のFlashAirがあるアイコンの方をクリック。
f:id:shuzo_kino:20160925234604p:plain
完全に新規な状態で読み込むと、当然デフォ値なので初期化プロセスで環境を
まずはネットワーク設定。接続先のWiFiの情報を書き込みます。
f:id:shuzo_kino:20160925234644p:plain
疎通の確認。
f:id:shuzo_kino:20160925234651p:plain

一旦引っこ抜いて、電源付きのガジェットに接続。
普通はカメラ、僕らだと電源付きのSDカードリーダ子機でしょうか?
全ての設定が終わると、以降ローカルネットワーク内でSDカードに保存されたデータが確認できます。
f:id:shuzo_kino:20160925234700p:plain


一連の設定が終わると、次回以降はこんな感じの画面が出てきます
f:id:shuzo_kino:20160925235846p:plain

その後の展開

たとえばRasbianを書き込んでいる場合、リモートでRasbianの中身を書き換えたりリブートできたりするみたいです。
flashair-developers.com

pythonで使えるORMapper「peewee」

今回はpythonで使えるORMapperの「peewee」を試してみます。

実際のところ

今回は既存のDBを流用するパターン。

from peewee import *
from playhouse.sqlite_ext import SqliteExtData

db = SqliteExtDatabase('blogtest.sqlite')
db.connect()

で、このpeeweeは利用のため自前でちゃんとクラスを設定してあげる必要が

class BaseModel(Model):
  class Meta:
    database = db

class Blog(BaseModel):
  body = TextField()
  date = DateTimeField(default=datetime.datetime.now)

Blog.select().order_by(Blog.body).count()
#>> 6
from datetime import date

newblog.save()
#>> 1

Blog.select().order_by(Blog.body).count()
#>> 7