MicroPython

ESP8266 port

更新記録:2016-10-17 v1.8.5 で動作確認

https://www.kickstarter.com/projects/214379695/micropython-on-the-esp8266-beautifully-easy-iot

Adafruit の解説とビデオ

esp8266-20161017-v1.8.5.bin をダウンロード。

入手したもの:スイッチサイエンス ESPr One(Arduino Uno同一形状 ESP-WROOM-02開発ボード)

IDE からスケッチの書き込みはいちおう確認

MicroPython on the ESP8266

http://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/intro.html#deploying-the-firmware

これを入れたときに技適がどうなるかはよくわからないので、自己責任でお願いします。

いつもの MacPorts 環境にまず esptool を入れる

https://github.com/themadinventor/esptool/

esptool は Python 3.x 未対応らしい。

$ sudo python2 -m pip install esptool

$ which esptool.py
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/esptool.py

ESPr One を USB で Mac に接続。

シリアルポート確認は ls /dev/cu* で可能。

$ esptool.py -p /dev/cu.usbserial-DN01J32J flash_id
esptool.py v1.1
Connecting...
Manufacturer: a1
Device: 4016

$ esptool.py -p /dev/cu.usbserial-DN01J32J chip_id
esptool.py v1.1
Connecting...
Chip ID: 0x00082ed6

$ esptool.py -p /dev/cu.usbserial-DN01J32J read_mac
esptool.py v1.1
Connecting...
MAC: 5c:cf:7f:08:2e:d6

繋がっているようだ。

$ esptool.py -p /dev/cu.usbserial-DN01J32J --baud 460800 write_flash --flash_size=8m 0 esp8266-20161017-v1.8.5.bin

esptool.py v1.1
Connecting...
Running Cesanta flasher stub...
Flash params set to 0x0020
Writing 565248 @ 0x0... 565248 (100 %)
Wrote 565248 bytes at 0x0 in 14.7 seconds (307.6 kbit/s)...
Leaving...

終わった。

Arduino IDE のシリアルモニタで

  • 自動スクロール
  • 改行 CRおよびLF
  • 115200 bps
>>> a = 'hello'
>>> a[-1]
'o'
>>> 

動いた!!

チュートリアルによるとすでに WiFi が有効になっているらしい:

WebREPL daemon started on ws://192.168.4.1:8266
Started webrepl in setup mode
could not open file 'main.py' for reading

MicroPython v1.8.4-10-gbc28ac8 on 2016-09-09; ESP module with ESP8266
Type "help()" for more information.

>>> help()
Welcome to MicroPython!

For online docs please visit http://docs.micropython.org/en/latest/esp8266/ .
For diagnostic information to include in bug reports execute 'import port_diag'.

Basic WiFi configuration:

import network
sta_if = network.WLAN(network.STA_IF); sta_if.active(True)
sta_if.scan()                             # Scan for available access points
sta_if.connect("<AP_name>", "<password>") # Connect to an AP
sta_if.isconnected()                      # Check for successful connection
# Change name/password of ESP8266's AP:
ap_if = network.WLAN(network.AP_IF)
ap_if.config(essid="<AP_NAME>", authmode=network.AUTH_WPA_WPA2_PSK, password="<password>")

Control commands:
  CTRL-A        -- on a blank line, enter raw REPL mode
  CTRL-B        -- on a blank line, enter normal REPL mode
  CTRL-C        -- interrupt a running program
  CTRL-D        -- on a blank line, do a soft reset of the board
  CTRL-E        -- on a blank line, enter paste mode

For further help on a specific object, type help(obj)

>>> import esp
>>> esp.check_fw()
size: 562812
md5: d7157c7b8c04bc252192de49358543fb
True


>>> import port_diag
FlashROM:
Flash ID: 1640a1 (Vendor: a1 Device: 4016)
Flash bootloader data:
Byte @2: 00
Byte @3: 40 (Flash size: 4MB Flash freq: 40MHZ)
Firmware checksum:
size: 562812
md5: d7157c7b8c04bc252192de49358543fb
True

Networking:
STA ifconfig: ('0.0.0.0', '0.0.0.0', '0.0.0.0', '208.67.222.222')
AP ifconfig: ('192.168.4.1', '255.255.255.0', '192.168.4.1', '208.67.222.222')
Free WiFi driver buffers of type:
0: 8
1: 0
2: 8
3: 4
4: 7
lwIP PCBs:
Active PCB states:
Listen PCB states:
Local port 8266, foreign port 20480 snd_nxt 258 rcv_nxt 1073707032 State: LISTEN
TIME-WAIT PCB states:

screen & picocom

Auduino IDE シリアルモニタを使わなくても以下でアクセスできる:

$ screen /dev/cu.usbserial-DN01J32J 115200
$ sudo port install picocom

$ which picocom
/opt/local/bin/picocom

$ picocom --baud 115200 /dev/cu.usbserial-DN01J32J

picocom を終了するには Ctrl+A Ctrl+X

https://linux.die.net/man/8/picocom

Raspbian で作業する

Raspberry Pi 3 の USB ポートに ESPr One をつなぐ。

$ sudo apt-get install picocom
$ sudo python2 -m pip install esptool
$ esptool.py -p /dev/ttyUSB0 --baud 460800 write_flash --flash_size=8m 0 esp8266-20161030-v1.8.5-82-ge429daa.bin
$ picocom --baud 115200 /dev/ttyUSB0

LED1 の点滅

>>> import machine
>>> pin14 = machine.Pin(14, machine.Pin.OUT)
>>> pin14.value(1) # 点灯
>>> pin14.value(0) # 消灯

https://www.switch-science.com/catalog/2620/ に「LED1 本ボードではデジタル14番ピン」と書いてある。

PWM でだんだん明るくなる:

>>> pwm14 = machine.PWM(pin14)
>>> pwm14.freq(500)
>>> import time
>>> for i in range(1024):
...     time.sleep(0.01)
...     pwm14.duty(i)

スイッチで割り込み

「モード切替ボタン(MODE):ボタンを押している間はGPIO0がLOW」と書かれているのでやってみる:

>>> def callback(p):
...     print('pin change', p)
...     
>>> pin0 = machine.Pin(0, machine.Pin.IN)
>>> pin0.irq(trigger=machine.Pin.IRQ_FALLING, handler=callback)
<IRQ>

MODE ボタンを押すと:

>>> pin change Pin(0)

RTCなど

CPU クロック

>>> machine.freq()
80000000

リアルタイムクロック(あるのか。。)

>>> rtc = machine.RTC()
>>> rtc.datetime()
(2000, 1, 1, 5, 0, 38, 16, 87)
>>> rtc.datetime()
(2000, 1, 1, 5, 0, 38, 35, 869)
>>> rtc.datetime()
(2000, 1, 1, 5, 0, 38, 47, 423)

ファイルシステム

チュートリアルと順番が逆になったけどファイルシステム:

>>> import os
>>> os.listdir()
['boot.py']

WebREPL

シリアル接続のターミナルで WebREPL を初期化すると、以後の作業は WebREPL だけで可能になる。

作業環境の WiFi ルーターにクライアントとして繋がるようにしておく。 そしてデフォルトの AP モードの接続を止めてやる。

>>> import network                                                                                                             
>>> sta_if = network.WLAN(network.STA_IF)                                                                                      
>>> sta_if.active()                                                                                                            
True                                                                                                                           
>>> sta_if.ifconfig()                                                                                                          
('192.168.1.27', '255.255.255.0', '192.168.1.1', '192.168.1.1')                                                                

>>> ap_if = network.WLAN(network.AP_IF)                                                                                        
>>> ap_if.active(False)                                                                                                             
>>> ap_if.active()                                                                                                             
False                                                                                                                          

ここでは 192.168.1.27 でルーターに繋がったこととする。

それから、ここに書いてあるとおりにやる。

https://learn.adafruit.com/micropython-basics-esp8266-webrepl/access-webrepl

https://github.com/micropython/webrepl/archive/master.zip

MicroPython v1.8.5-10-g0e69e6b on 2016-10-17; ESP module with ESP8266
Type "help()" for more information.
>>> import webrepl
>>> webrepl.start()
WebREPL daemon started on ws://192.168.4.1:8266
WebREPL daemon started on ws://192.168.1.27:8266
Started webrepl in normal mode
>>> 

webrepl.html を Firefox で開く。

ページ内のアドレス欄に

ws://192.168.1.27:8266/

と書いて [connect] ボタンを押すと接続できて、下記のようになる:

Welcome to MicroPython!                                                                                                                            
Welcome to MicroPython WebREPL!                                                                                                                    
                                                                                                                                                   
This is the first time you connect to WebREPL, so please set a password                                                                            
to use for the following WebREPL sessions. Once you enter the password                                                                             
twice, your board will reboot with WebREPL running in active mode. On                                                                              
some boards, you may need to press reset button or reconnect power.                                                                                
                                                                                                                                                   
New password: ******                                                                                                                               
Confirm password: ******                                                                                                                           
Password successfully set, restarting...                                                                                                           
Disconnected         

ここで設定するパスワードは以後の作業でずっと必要になる。

パスワードを2回入力すると接続が切れる。

シリアルのターミナルが下記のようになる:

WebREPL daemon started on ws://0.0.0.0:8266
Started webrepl in normal mode
could not open file 'main.py' for reading

MicroPython v1.8.4-10-gbc28ac8 on 2016-09-09; ESP module with ESP8266
Type "help()" for more information.
>>> 

もういちど WebREPL で [connect] を押すと:

シリアルターミナル

WebREPL connection from: ('192.168.1.4', 53893)

WebREPL 側

Welcome to MicroPython!                                                                                                                            
Password:   
WebREPL connected                                                                                                                                  
>>>          

ここで USB ケーブルを Mac から抜いて、ただの電源アダプタにつないでやる。

するとさきほど設定した情報で WiFi ルーターに再接続されるので、Mac から WebREPL に再接続できる。

darwin (Mac) port

Mac のネイティブ実行ファイルとしてビルドする:

$ git clone https://github.com/micropython/micropython.git
$ cd micropython/
$ git submodule update --init
$ cd unix
$ make axtls
$ make
$ ./micropython
MicroPython v1.8.4-120-g99d62c4 on 2016-10-04; darwin version
Use Ctrl-D to exit, Ctrl-E for paste mode
>>> list(5 * x + y for x in range(10) for y in [4, 2, 1])
[4, 2, 1, 9, 7, 6, 14, 12, 11, 19, 17, 16, 24, 22, 21, 29, 27, 26, 34, 32, 31, 39, 37, 36, 44, 42, 41, 49, 47, 46]
>>> 

Ubuntu x64 port

since 2016-12-07

Ubuntu on Windows で検証。

https://github.com/micropython/micropython/issues/1991

http://forum.micropython.org/viewtopic.php?t=517

$ sudo apt-get install pkg-config libffi-dev
$ cd unix
$ make axtls
$ make
$ ./micropython
MicroPython v1.8.5-279-g080a78b on 2016-12-07; linux version
Use Ctrl-D to exit, Ctrl-E for paste mode
>>>

micropython.txt · 最終更新: 2016/12/10 11:46 by Takuya Nishimoto
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0