Upgrade to Pro — share decks privately, control downloads, hide ads and more …

実験から量産までMicroPythonで動く! IoTセンサー Degu(デグー) を作った話

実験から量産までMicroPythonで動く! IoTセンサー Degu(デグー) を作った話

PyCon mini Sapporo 2019
@keimei

Hiroaki OHSAWA@keimei

May 11, 2019
Tweet

More Decks by Hiroaki OHSAWA@keimei

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. 賢いセンサーデバイスっぽい 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
  4. 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
  5. 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
  6. 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
  7. ハードウェアスペック CPU : ARM Cortex-M4 64MHz RAM: 256KB, ROM:1MB (内ファームウェア440KB)

    これだけのスペックで実現できます FATファイルシステム、USB Mass Storage IP, UDP, CoAP, DTLS マルチプロセスなRTOS(Zephyr) MicroPython OpenThread(無線メッシュ制御).... 23
  8. 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
  9. ファームウェアの構成 MicroPython ユーザースクリプト Zephyr OS OpenThread 通信ミドルウェア Zephyr Linux Founda

    onのRTOSプロジェクト OpenThread Google傘下のNestが公開しているオープンなメッシュ通信実装 下回りはIEEE802.15.4(Zigbeeと一緒) 35
  10. #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
  11. 44