34
電電電電電電電電 Python MicroPython on the ESP8266 2016 電 11 電 12 電 PyCon mini Hiroshima 2016 + IoTLT 電電 電電電 西 @24motz / [email protected] 1

161112 pyconhiro-nishimoto-v2

Embed Size (px)

Citation preview

電子工作のための PythonMicroPython on the ESP8266

2016 年 11 月 12 日

PyCon mini Hiroshima 2016 + IoTLT 広島

西本卓也 @24motz / [email protected]

1

光線銃ゲーム!• 銃(ライト)を当てて開始• チャンスは 5 回• カウントダウン( 5 〜 10 秒)• 敵がきた!

• 音:ピーピーピー• 体をそらして、銃を撃って

• 補給カプセルが届いた!• 音:プー• 体を近づけて、銃を撃たないで

• https://github.com/nishimotz/micropython_demo

2

ESPr One (ESP-WROOM-02)温度センサー明るさセンサー超音波距離センサー圧電ブザー白黒モニター (128x64)

軽量スクリプト言語• NodeMcu (eLua + node.js の影響 )• mruby/c (ruby on PSoC5)• IchigoJam ( 低価格 BASIC パソコン )• MicroPython (Python3 を軽量化 )

3

むかしの PC 、いまのマイコン

4

• NEC TK-80 (1976 年 ) 8bit 2MHz• NEC PC-9801RA (1989 年 ) 32bit 16MHz• Arduino (2005 年 -) 8bit 16MHz• PC とマイコン : 経験の拡大• 適材適所、違い、本質

Python で PC からマイコンまで• iPhone / iPad• Pythonista for iOS

• PC / サーバー / データサイエンス / Deep Learning• Windows, Mac, Linux

5

Google Cloud Vision API

6

Raspberry Pi• 教育用コンピューター• 2012 年 英国の非営利組織• 2016 年 9 月 1000 万台突破• Linux (Raspbian) → Scratch, Mathematica, Python

7

超音波距離センサー• 出した音が反射して返るまでの時間• 音の速さをかけて 2 で割ると距離

8

Python で汎用入出力

9

import time, RPi.GPIO as GPIOGPIO.setup(TRIG,GPIO.OUT) GPIO.setup(ECHO,GPIO.IN)

GPIO.output(TRIG, GPIO.HIGH) time.sleep(0.00001)GPIO.output(TRIG, GPIO.LOW)

while GPIO.input(ECHO) == GPIO.LOW: off_time = time.time()while GPIO.input(ECHO) == GPIO.HIGH: on_time = time.time()

スマートフォンの技術

10

• Raspberry Pi 3 Model B• 1.2GHz 64-bit 4core ARMv8 CPU (Broadcom)• 1GB RAM• MicroSD スロット• WiFi / Bluetooth / Ethernet• HDMI / USB / Audio• GPIO• DSI

• ソフトウェア開発• PC やサーバーと同じ

フィジカルコンピューティング

11

• Arduino• ワンボードマイコン• 2005 年 イタリア 教育現場から

• オープン• 互換機• 拡張シールド

• 無料の開発環境• Windows/Mac 対応• C++ 風のプログラミング言語• PC と USB で接続できる

Arduino Uno• CPU: AVR ATmega328P• むかしの PC の性能

• フラッシュメモリ : 32KB• 1GB(RasPi3) の約 32 分の 1

• クロック周波数 : 16MHz• 1.2GHz(RasPi3) の約 75 分の 1

• 消費電力は少ない• 電池寿命、熱対策など有利

• スイッチオンで書き込んだプログラムだけ「走る」• 特別なプログラミング環境• ネットワーク機能の不足

12

Espressif ESP8266

13

• 中国製 低価格 WiFi モジュール• マイコンに通信機能を• Arduino に接続

• シリアル接続 + AT コマンド• 中身が解析された• Arduino Uno より高性能 (80MHz)• gcc でソフトウェアが開発可能• オープンソース SDK• 公式 SDK

• ESP8266 自身が Arduino IDE の対象に

ESP-WROOM-02

• 日本の工事設計認証 ( 技適 ) 取得14

ESPr Developer( ESP-WROOM-02開発ボード)ESPr One( Arduino Uno 同一形状 ESP-WROOM-02 開発ボード)ESP-WROOM-02

USB シリアル変換、 MicroUSB 、電源回路ユーザースイッチ、ユーザー LED

ESP-WROOM-02開発ボードを Arduino IDEで開発する方法

15

ESPr One の青い LED を点滅

16

void setup() { pinMode(14,OUTPUT); digitalWrite(14,HIGH); delay(1000); digitalWrite(14,LOW); delay(1000); digitalWrite(14,HIGH); delay(1000); digitalWrite(14,LOW);}void loop() {}

• PC から MicroUSB で電源と通信• GPIO14 が青い LED• Reset Method = nodemcu 書込モード切替不要

Arduino IDE と Python• Arduino IDE• 書き換えるたびにコンパイルして転送• WiFi にたどり着くまでが長そう

• Python• 入力してすぐに実行

• REPL : Read-Eval-Print Loop• ソースをコピーして実行

• 従来の Python• 少ないメモリと遅い CPU では動かない• OS が必要( Raspberry Pi は Linux が動作)

17

MicroPython by Damien George

18https://www.youtube.com/watch?v=EvGhPmPPzko

MicroPython の動く環境

19

2013 年 PyBoard 2016 年 ESP8266

STM32F4DISCOVERY (ARM Cortex-M4)

GitHub で公開Unix 移植版各種マイコンへの移植走る無線ルーター( PyCon JP 2016 LT )

esptool によるインストールhttps://micropython.org/download/→ esp8266-20161017-v1.8.5.bin$ sudo python2 -m pip install esptool$ esptool.py -p /dev/cu.usbserial-DN01J32J --baud 460800 write_flash --flash_size=8m 0 esp8266-20161017-v1.8.5.bin

Mac or Linux (Raspberry Pi)

20

シリアル接続(ターミナル)$ sudo port install picocom$ picocom --baud 115200 /dev/cu.usbserial-DN01J32JCtrl-A Ctrl-Z で終了$ screen /dev/cu.usbserial-DN01J32J 115200

Windows は TeraTerm など

21

Hello MicroPythonTerminal ready

>>> print('Hello MicroPython')Hello MicroPython

22

ペーストモード Ctrl-E / Ctrl-Dimport machinepin14 = machine.Pin(14, machine.Pin.OUT)pin14.value(1)

paste mode; Ctrl-C to cancel, Ctrl-D to finish=== import machine=== pin14 = machine.Pin(14, machine.Pin.OUT)=== pin14.value(1)=== >>>

23

Copy

Paste

Ctrl+D

Ctrl+E

ペーストモードでない場合>>> if True:... print('hello')... hello>>>

CPython の対話モードとは違う挙動

ipython とだいたい同じ

24

ブロックで自動的にインデントBackspace Enter でブロック終了

コード補完と履歴>>> p[tab]>>> pin14. [tab]>>> pin14.init value low highirq IN OUT OPEN_DRAINPULL_UP IRQ_RISING IRQ_FALLING>>> pin14.low()>>> pin14.high() → 上矢印キーで pin14.low() 呼び出し

25

WiFi AP を有効化import networksta_if = network.WLAN(network.STA_IF) # stationsta_if.active(False)ap_if = network.WLAN(network.AP_IF) # access pointap_if.active(True)ap_if.ifconfig()

('192.168.4.1', '255.255.255.0', '192.168.4.1', '192.168.1.1')

26

AP に Mac をつないでみるSSID : MicroPython-xxxxxx Password : micropythoN$ ping 192.168.4.1PING 192.168.4.1 (192.168.4.1): 56 data bytes64 bytes from 192.168.4.1: icmp_seq=0 ttl=255 time=0.872 ms64 bytes from 192.168.4.1: icmp_seq=1 ttl=255 time=117.740 ms

27

ESP8266

Mac無線ルーター

APSTA

ESP8266 の STA と AP• 同時に使えるが Mac からは ESP8266 だけ見える

2828

インターネットESP8266

Mac無線ルーター

APSTA

STA だけを有効化

2929

インターネットESP8266

Mac

無線ルーターAPSTA

サーバー

30

def server():

ブラウザから確認

31

>>> server()listening on ('0.0.0.0', 80)client connected from ('192.168.4.2', 60403)

Ctrl-C で停止Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 9, in serverKeyboardInterrupt:

独自のファイルシステム>>> import os>>> os.__name__ uname urandom duptermdupterm_notify VfsFat listdir mkdirrmdir chdir getcwd removerename stat statvfs umount>>> os.listdir()['boot.py', 'port_config.py', 'led.py', 'httpd.py', 'ssd1306.py']

32

boot.py と main.py は起動時に実行

WebREPL• webrepl.html を入手してブラウザで実行• ファイルのアップロード、ダウンロード

33

まとめ : MicroPython & ESPr One• 言語としては同じ Python• デジタル入出力のデバイスを扱うライブラリ

• ターミナル、エディタ、ブラウザで開発• 開発にも運用にも役立つWiFi

• ESPr One• MicroUSBケーブル、モバイルバッテリーがあれば• LED 点滅( L チカ)→パーツで拡張• ブレッドボードでプロトタイピング

• Python の始め方のひとつに34