Slide 1

Slide 1 text

実験から量産までMicroPythonで動く! IoTセンサー Degu(デグー) を作った話 PyCon mini SAPPORO 2019 powered by Degu Project h ps://open-degu.com 1

Slide 2

Slide 2 text

ABOUT MYSELF 大澤啓明 (おおさわ ひろあき) / @keimei 株式会社アットマークテクノ -ソフトウェアエンジニア:2012- Langages: C, Python,JS,Shell Script Fun! : Linux Kernel, Zephyr OS, 3D Prin ng/Modeling h p://github.com/ohsawa 2

Slide 3

Slide 3 text

もくじ Degu(デグー)の紹介 センサーからクラウドまでデータを届ける仕組み AWSでの利用例 MicroPythonをポーティングする話 3

Slide 4

Slide 4 text

オープンソースプロジェクト 4

Slide 5

Slide 5 text

Degu デグー ? 齧歯目ヤママアラシ亜目デグー科 Octodon degus 集団行動する 鳴き声でコミュニケーションする 賢くて人になつく Osmák degu.jpg” by Trustseal is licensed under CC BY-SA 4.0 h ps://commons.wikimedia.org/wiki/File:Osm%C3%A1k_degu.jpg 5

Slide 6

Slide 6 text

賢いセンサーデバイスっぽい Osmák degu.jpg” by Trustseal is licensed under CC BY-SA 4.0 h ps://commons.wikimedia.org/wiki/File:Osm%C3%A1k_degu.jpg 6

Slide 7

Slide 7 text

Degu ベースボード 7

Slide 8

Slide 8 text

Degu ベースボード + センサー 8

Slide 9

Slide 9 text

Deguが実現するネットワーク 9

Slide 10

Slide 10 text

広域通信可能なメッシュネットワーク規格 Thread®を採用 省電力 長距離通信も数でカバー メッシュは自動構築 ベースは実績あるIEEE802.15.4 10

Slide 11

Slide 11 text

ファームウェアも回路図も全部オープン 回路図: h ps://github.com/open-degu/hardware ファームウェア: h ps://github.com/open-degu/degu 11

Slide 12

Slide 12 text

それ PyConと何の関係あるの? 12

Slide 13

Slide 13 text

MicroPython対応 PCと繋ぐとUSBメモリとして認識(FAT12) main.py を保存すると自動実行 main.py が無ければUSBコンソールでインタプリタも使える path = 'thing/' + zcoap.eui64() reported = {'state':{'reported':{}}} addr = zcoap.gw_addr() port = 5683 cli = zcoap.client((addr, port)) while True: reported['state']['reported']['message'] = 'OK' cli.request_post(path, ujson.dumps(reported)) time.sleep(5) cli.close() 13

Slide 14

Slide 14 text

MicroPython Python3系の組込み向け実装 h ps://micropython.org/ このあたりが話題? 14

Slide 15

Slide 15 text

SampleCode (明るさセンサー) 前半:ADCからのデータ取得 from machine import ADC import zcoap import time import ujson def light_sensor(): ADC_REF = 0.6 ADC_RESOLUTION=4096 ain = ADC(0) raw = ain.read() v = (raw / ADC_RESOLUTION) * ADC_REF * 6 return v 15

Slide 16

Slide 16 text

SampleCode(明るさセンサー) 後半:データ送信 if __name__ == '__main__': path = 'thing/' + zcoap.eui64() reported = {'state':{'reported':{}}} addr = zcoap.gw_addr() port = 5683 cli = zcoap.client((addr, port)) while True: light = round(light_sensor(), 2) reported['state']['reported']['light'] = light cli.request_post(path, ujson.dumps(reported)) time.sleep(1) cli.close() 16

Slide 17

Slide 17 text

Grove センサー対応 seeed studioが開発、 販売しているセンサーモジュール(200種類以上!) 17

Slide 18

Slide 18 text

スターターキットも販売中 h ps://open-degu.com/products.html#purchase 18

Slide 19

Slide 19 text

カンタン接続 センサーに付属のケーブルで差し込むだけで接続完了 19

Slide 20

Slide 20 text

対応するセンサーの例 これ、ぜんぶPythonで読めちゃいます。 温度、湿度、気圧 3軸加速度、ジャイロ 煙、ガス(CO2, 硫化物), アルコール カラーセンサー 光センサー 感圧センサー 角度(ボリュームつまみ) 20

Slide 21

Slide 21 text

対応するセンサーの例 ... 電流 リレー(AC250Vをスイッチ) 振動センサー etc.. ブザー 汎用ネジ止めターミナル(アナログ、デジタル) 21

Slide 22

Slide 22 text

そのまま使えるサンプルコード main.pyとしてそのまま配置できます。 h ps://github.com/open-degu/micropython-sampple 22

Slide 23

Slide 23 text

ハードウェアスペック CPU : ARM Cortex-M4 64MHz RAM: 256KB, ROM:1MB (内ファームウェア440KB) これだけのスペックで実現できます FATファイルシステム、USB Mass Storage IP, UDP, CoAP, DTLS マルチプロセスなRTOS(Zephyr) MicroPython OpenThread(無線メッシュ制御).... 23

Slide 24

Slide 24 text

クラウドとの接続の手順 ゲートウェイにAWSのアカウントのIAMを書いて QRコードを撮るだけ h ps://open-degu.github.io/user_manual 24

Slide 25

Slide 25 text

登録後の使い方 25

Slide 26

Slide 26 text

AWS IoT ルールの追加 26

Slide 27

Slide 27 text

AWS IoT ルールの追加 27

Slide 28

Slide 28 text

AWSの表示と設定 28

Slide 29

Slide 29 text

AWS IoTへのルール設定 SELECT state.reported.battery as battery, state.reported.temp as temp,state.reported.pres as pres, state.reported.humid as humid, timestamp() as time FROM "$aws/things/degu-barometer2/shadow/update" MQTT経由でPublishされた下のJSONをSQLライクな構文でフィル タできる { "reported": { "message": "OK", "battery": 4.742719 } } 29

Slide 30

Slide 30 text

AWS IoTへのアクション設定 30

Slide 31

Slide 31 text

Elas cSearch->Kibanaでの表示 31

Slide 32

Slide 32 text

デモの様子 32

Slide 33

Slide 33 text

照度とライトの連携 33

Slide 34

Slide 34 text

気圧と温度の可視化 34

Slide 35

Slide 35 text

ファームウェアの構成 MicroPython ユーザースクリプト Zephyr OS OpenThread 通信ミドルウェア Zephyr Linux Founda onのRTOSプロジェクト OpenThread Google傘下のNestが公開しているオープンなメッシュ通信実装 下回りはIEEE802.15.4(Zigbeeと一緒) 35

Slide 36

Slide 36 text

MicroPython Project 「Zephyr OSに対応しています!」 Zephyr Project 「OpenThreadの通信に対応しています!」 36

Slide 37

Slide 37 text

MicroPython Project 「Zephyr OSに対応しています!」 Zephyr Project 「OpenThreadの通信に対応しています!」 Degu 「...あれ?3つくっつけるんですか?」 37

Slide 38

Slide 38 text

やること Zephyrのビルドシステムとの戦い Autotoolsの依存関係の調整 無駄な機能の削除(サイズ削減) 足りない機能の追加 MicroPythonのクラスモジュールを追加して ハードウェアにアクセスできるようにする 38

Slide 39

Slide 39 text

#import ADC するのために‥ まだまだ.. const mp_obj_type_t machine_adc_type = { { &mp_type_type }, .name = MP_QSTR_ADC, .print = machine_adc_print, .make_new = machine_adc_make_new, .locals_dict = (mp_obj_t)&machine_adc_locals_dict, }; mp_obj_t machine_adc_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { ... RAISE_ERRNO(adc_channel_setup(self->dev, self->cfg)); return (mp_obj_t)self; } 39

Slide 40

Slide 40 text

こちらでやっておきました。 40

Slide 41

Slide 41 text

これだけで電圧が測定できます。 from machine import ADC ain = ADC(0) 41

Slide 42

Slide 42 text

まとめ なぜセンサープラットフォームを作ったのか 相性問題や量産調達、クラウドまで動作確認するのは大変 自由なスクリプティングと小さなデバイス 簡単にコードを書いてほしいのでMicroPythonを選択= クラウドプラットフォームへの対応 AWS IoT Coreに標準対応 (Azure IoT Hub対応予定) 42

Slide 43

Slide 43 text

有り難うございました! 43

Slide 44

Slide 44 text

44