Posted at

MicroPython on ESP8266

More than 1 year has passed since last update.


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を使ってなんかするつもり。

それにしてももっと楽にファイルを作成する方法はないものか……