MicroPython on ESP8266
Amica製NodeMCUでMicroPythonを使ってみたので、使い方や躓いたところのメモ。
ホスト環境
OS: elementaryOS Loki
GettingStart
事前準備
NodeMCUにはUSB TypeB端子が付属している。
これでホストと接続できるが、接続にはCP210xドライバ(cp210x.ko)が必要。
(中国製の偽物の場合、ch34xとかいうものが必要になるらしい)
Linuxなら(おそらく)既に入っているはずだが、必要なら、ここで落とす。
micropython書き込みのための準備
- micropythonのESP8266用ファームウェアをダウンロード
- https://micropython.org/download の Firmware for ESP8266 boardsからダウンロードできる
- ここでは、
esp8266-20171101-v1.9.3.bin
をダウンロードした
- 書き込み用のツール esptool をインストール
sudo -H pip esptool.py
書き込む
USBでNodeMCUとホストを接続したら、以下の手順でmicropythonを書き込む。
- dmesgでNodeMCUがどのデバイスファイルに割り当てられたか確認する(だいたい
/dev/ttyUSB0
とかになってる) - まずはフラッシュの内容を消去
sudo esptool.py --port /dev/ttyUSB0 erase_flash
- 次に事前にダウンロードしたファームウェアをインストール
sudo esptool.py --port /dev/ttyUSB0 --baud 9600 write_flash --flash_size=detect -fm dio 0 esp8266-20171101-v1.9.3.bin
触ってみる
- NodeMCUのmicropython対話型実行環境に接続する
sudo screen -R NodeMCU /dev/ttyUSB0
- Lチカしてみる。machineモジュールでGPIOなどを操作することが可能。
ピン2はオンボードのLED
import machine
import time
pin = machine.Pin(2, machine.Pin.OUT)
for i in range(10):
pin.value(0)
time.sleep(0.1)
pin.value(1)
time.sleep(0.1)
自作モジュールを作ってみる
Lチカのモジュールを作ってみる。
LED.py
というファイルを作成し、その中にLチカのプログラムを記述する。
f = open('LED.py', 'w')
f.write("""
import machine
import time
class LED(object):
def __init__(self,pinNum, direction):
self.pin = machine.Pin( pinNum, direction)
def Blink(self, repeatTime, sleepTime):
for i in range(repeatTime):
self.pin.value(0)
time.sleep(sleepTime)
self.pin.value(1)
time.sleep(sleepTime)
def Notice(self):
self.Blink(3, 0.1)
def Alert(self):
self.Blink(3, 0.05)
""")
f.close()
メインループの作成
micropythonにはboot.pyとmain.pyの2つの特別なファイルがある。
boot.py → main.pyという順に実行される。
Arduinoで言うところのsetup()
がboot.py。loop()
がmain.py。
今回はmain.pyを記述していく。
ファイルシステム
import os
os.listdir()
で中身を確認出来る。
os.mkdir('hogehoge')
でディレクトリ作成。
os.rmdir('hogehoge')
でディレクトリ削除
main.pyの編集
main.pyが既にある場合、Errno 13が出てアクセスできないので一度削除する。
os.rmdir('main.py')
os.listdir()
出力結果: ['boot.py', 'LED.py']
あとはLED.pyのときと同じ。
f = open('main.py', 'w')
f.write("""
import machine
from LED import LED
import time
timeLED = LED(2, machine.Pin.OUT)
hourCount = 1
minCount = 1
while True:
if hourCount == (60 * 60):
timeLED.Notice()
hourCount = 1
minCount = 1
elif minCount == 60:
timeLED.Alert()
minCount = 1
else:
timeLED.Blink(1,0.1)
hourCount += 1
minCount += 1
time.sleep(1)
""")
f.close()
このあと、Ctrl+Dでリセット。
次はWifiを使ってなんかするつもり。
それにしてももっと楽にファイルを作成する方法はないものか……