ESP8266 用クイックリファレンス¶
Adafruit Feather HUZZAH board (画像出所: Adafruit)
以下は、ESP8266 ベースのボードのためのクイックリファレンスです。このボードを初めて使う場合は、まず次のセクションを読むことを勧めます。
MicroPython のインストール¶
チュートリアルの章: ESP8266 での MicroPython の始め方 を参照してください。そこにはトラブルシューティングについても記載されています。
ボードの一般的な制御¶
MicroPython REPL は、ボーレート 115200 の UART0 (GPIO1 = TX、GPIO3 = RX)で利用できます。タブ補完は、オブジェクトにどのようなメソッドがあるかを調べるのに便利です。貼り付けモード(ctrl-E)は、大きめの Pythonコードを REPL に貼り付けるのに便利です。
machine
モジュール:
import machine
machine.freq() # CPU の現在の周波数を取得
machine.freq(160000000) # CPU の周波数を 160 MHz に設定
esp
モジュール:
import esp
esp.osdebug(None) # ベンダ O/S デバッグメッセージをオフにする
esp.osdebug(0) # ベンダ O/S デバッグメッセージを UART(0) にリダイレクト
ネットワーキング¶
network
モジュール:
import network
wlan = network.WLAN(network.STA_IF) # ステーションインタフェースを作成
wlan.active(True) # インタフェースをアクティブ化
wlan.scan() # アクセスポイントをスキャン
wlan.isconnected() # ステーションが AP に繋がったかをチェック
wlan.connect('ssid', 'key') # AP に接続
wlan.config('mac') # インタフェースの MAC アドレスを取得
wlan.ipconfig('addr4') # インタフェースの IPv4 アドレスを取得
ap = network.WLAN(network.AP_IF) # アクセスポイントインタフェースを作成
ap.active(True) # インタフェースをアクティブ化
ap.config(ssid='ESP-AP') # アクセスポイントの SSID を設定
ローカルの WiFi ネットワークに接続するには、次の関数を流用してください:
def do_connect():
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('ssid', 'key')
while not wlan.isconnected():
pass
print('network config:', wlan.ipconfig('addr4'))
ネットワークが確立されると socket
モジュールを使って、通常どおり TCP/UDP ソケットを作成して使用できます。
遅延とタイミング¶
time
モジュールを使います:
import time
time.sleep(1) # 1秒間、一時停止する
time.sleep_ms(500) # 500ミリ秒間、一時停止する
time.sleep_us(10) # 10マイクロ秒間、一時停止する
start = time.ticks_ms() # ミリ秒カウンター値を取得
delta = time.ticks_diff(time.ticks_ms(), start) # 時差を計算
タイマー¶
仮想(RTOSベース)タイマーがサポートされています。 machine.Timer クラスを ID -1 で使ってください。
from machine import Timer
tim = Timer(-1)
tim.init(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(1))
tim.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(2))
period の単位はミリ秒です。
ピンと GPIO¶
machine.Pin クラスを使います:
from machine import Pin
p0 = Pin(0, Pin.OUT) # GPIO0 の出力ピンを作成
p0.on() # ピンを "on" (high) レベルに設定
p0.off() # ピンを "off" (low) レベルに設定
p0.value(1) # ピンを on/high に設定
p2 = Pin(2, Pin.IN) # GPIO2 の入力ピンを作成
print(p2.value()) # 値 0 または 1 を取得
p4 = Pin(4, Pin.IN, Pin.PULL_UP) # 内部プルアップ抵抗を有効化
p5 = Pin(5, Pin.OUT, value=1) # 作成時にピンを high に設定
使用可能なピンは、ESP8266 チップの実際の GPIO ピン番号に対応する 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16 です。多くのエンドユーザ用ボードは、独自のピン番号(例:D0, D1, ...)を使っています。MicroPython は様々な ESP8266 ボード/モジュールをサポートするため、最小の公分母として物理ピン番号を採用します。ボードの論理ピンと物理ピンとのマッピングについては、各ボードのマニュアルを参照してください。
Pin(1) と Pin(3) はそれぞれ REPL の UART で使っている TX と RX です。また、Pin(16) は特殊なピンであり(ディープスリープモードからのウェイクアップに使われます)、Neopixel のような高レベルのクラスでは使えません。
ピンを反転させるのに使える、高レベルの抽象化インタフェース machine.Signal があります。 負論理(active-low)の LED でも on()
や value(1)
で点灯できるので便利です。
UART (シリアルバス)¶
machine.UART を参照
from machine import UART
uart = UART(0, baudrate=9600)
uart.write('hello')
uart.read(5) # 5バイトまで読み込む
2つの UART があります。UART0 はピン1 (TX)とピン3 (RX) を使います。UART0 は双方向であり、デフォルトでは REPL で使用されます。UART1 はピン2 (TX) とピン8 (RX)を使いますが、ピン8はフラッシュチップの接続に使うため、UART1 は TX のみです
UART0 を REPL にアタッチしている場合、UART(0) に入ってくるすべての文字は標準入力に直行するので、uart.read() は常に None を返します。UART(0) を REPL で使っているときに、UART(0) から文字を読み取る必要がある場合は、sys.stdin.read() を使ってください(または一旦デタッチして、uart.read() で読み取ってから、REPL に再アタッチしてください)。デタッチすると、UART(0) は他の目的に使えるようになります。
(ハードリセットまたはソフトリセットでの) REPL の起動時に、どの dupterm スロットにもオブジェクトがない場合は、UART(0) に自動的にアタッチします。これが失敗する場合、REPL のないボードを回復する唯一の手段は、完全に消去してフラッシュすることです(REPL を アタッチするデフォルトの boot.py も再インストールすることになります)。
UART0 から REPL をデタッチするには次のようにします:
import os
os.dupterm(None, 1)
REPL にはデフォルトでアタッチします。デタッチした REPL を再アタッチするには次のようにします:
import os, machine
uart = machine.UART(0, 115200)
os.dupterm(uart, 1)
PWM (パルス幅変調)¶
Pin(16) を除くすべてのピンで PWM を有効化できます。すべてのチャンネルに1つの周波数があり、範囲は 1〜1000 (単位は Hz)です。デューティ比は 0〜1023 です。
machine.PWM
クラスを使います:
from machine import Pin, PWM
pwm0 = PWM(Pin(0)) # ピンから PWM オブジェクトを作成
pwm0.freq() # 現在の周波数を取得
pwm0.freq(1000) # 周波数を設定
pwm0.duty() # 現在のデューティ比を取得
pwm0.duty(200) # デューティ比を設定
pwm0.deinit() # PWM を無効化
pwm2 = PWM(Pin(2), freq=500, duty=512) # 作成と設定を一度に実行
ADC (アナログ/デジタル変換)¶
ADC は専用ピンで利用できます。ADC ピンの入力電圧は 0v と 1.0v の間でなければならないことに注意してください。
machine.ADC クラスを使います:
from machine import ADC
adc = ADC(0) # ADC ピンの ADC オブジェクトを作成
adc.read() # 0-1024 の間の値を読込み
ソフトウェア SPI バス¶
SPI ドライバーは2つあります。1つはソフトウェアで実装され(ビットバンギング)、すべてのピンで動作し、 machine.SoftSPI クラスを介してアクセスします:
from machine import Pin, SoftSPI
# 与えたピンから SPI バスを構築
# 極性 polarity は SCK のアイドル状態
# phase=0 は SCK の第1エッジでサンプルを意味、chase=1 は第2を意味
spi = SoftSPI(baudrate=100000, polarity=1, phase=0, sck=Pin(0), mosi=Pin(2), miso=Pin(4))
spi.init(baudrate=200000) # ボーレートを設定
spi.read(10) # MISO で 10 バイト読込み
spi.read(10, 0xff) # 10 バイト読込み、その間 MOSI に 0xff を出力
buf = bytearray(50) # バッファを作成
spi.readinto(buf) # 与えたバッファに読込み(この場合は 50 バイト)
spi.readinto(buf, 0xff) # 与えたバッファに読込み、MOSI に 0xff を出力
spi.write(b'12345') # MOSI に 5 バイト書込み
buf = bytearray(4) # バッファを作成
spi.write_readinto(b'1234', buf) # MOSI に書き込み、MISO からバッファに読み込み
spi.write_readinto(buf, buf) # MOSI に buf を書き込み、MISO から buf に読み込み
ハードウェア SPI バス¶
ハードウェア SPI は高速(最大80Mhz)ですが、 MISO
が GPIO12、 MOSI
が GPIO13、 SCK
が GPIO14 のピンでのみ動作します。上記のビットバンギング SPI クラスと同じメソッドを持っていますが、コンストラクタと init のピンパラメータは固定されています。
from machine import Pin, SPI
hspi = SPI(1, baudrate=80000000, polarity=0, phase=0)
(SPI(0)
は FlashROM 用に使われるため、ユーザは利用できません。)
I2C バス¶
I2C ドライバーはソフトウェアで実装され、すべてのピンで動作し、machine.I2C クラスを介してアクセスします(このクラスは machine.SoftI2C の別名です):
from machine import Pin, I2C
# I2C バスを構築
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)
i2c.readfrom(0x3a, 4) # アドレス 0x3a のペリフェラルデバイスから 4 バイト読込み
i2c.writeto(0x3a, '12') # アドレス 0x3a のペリフェラルデバイスに '12' を書込み
buf = bytearray(10) # 10バイトのバッファを作成
i2c.writeto(0x3a, buf) # 与えたバッファをペリフェラルに書込み
リアルタイムクロック (RTC)¶
machine.RTC を参照:
from machine import RTC
rtc = RTC()
rtc.datetime((2017, 8, 23, 1, 12, 48, 0, 0)) # 指定の日時を設定
rtc.datetime() # 日時を取得
# ntp で時刻同期するには wifi への接続が必要
import ntptime
ntptime.settime() # リモートサーバからの日時を rtc に設定
rtc.datetime() # 日時を UTC で取得
注釈
すべてのメソッドが実装されているわけではありません: RTC.now()
, RTC.irq(handler=*)
(カスタムハンドラを利用), RTC.init()
, RTC.deinit()
は現在サポートしていmせん。
WDT (ウォッチドッグタイマー)¶
machine.WDT を参照:
from machine import WDT
# WDT を有効化
wdt = WDT()
wdt.feed()
ディープスリープモード¶
GPIO16 をリセットピン(HUZZAH| では RST)に接続してください。そのようにしておくと、次のコードで、スリープ、起床、リセット原因のチェックが行えます:
import machine
# デバイスを起こすための RTC.ALARM0 を設定
rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
# ディープスリープから起こされたかをチェック
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
print('woke from a deep sleep')
# 10秒後に RTC.ALARM0 を発火して、デバイスを起こすよう設定
rtc.alarm(rtc.ALARM0, 10000)
# ディープスリープに入る
machine.deepsleep()
OneWire ドライバー¶
OneWire ドライバーはソフトウェアで実装され、すべてのピンで動作します:
from machine import Pin
import onewire
ow = onewire.OneWire(Pin(12)) # GPIO12 で OneWire バスを作成
ow.scan() # バス上のデバイスリストをスキャン
ow.reset() # バスをリセット
ow.readbyte() # 1バイト読込み
ow.writebyte(0x12) # バスに1バイト書込み
ow.write('123') # バスに複数バイト書込み
ow.select_rom(b'12345678') # ROM コードで指定したデバイスを選択
DS18S20 と DS18B20 デバイス用の特定のドライバーがあります:
import time, ds18x20
ds = ds18x20.DS18X20(ow)
roms = ds.scan()
ds.convert_temp()
time.sleep_ms(750)
for rom in roms:
print(ds.read_temp(rom))
4.7k のプルアップ抵抗をデータラインに接続してください。convert_temp()
メソッドは、温度をサンプリングするたびに呼び出す必要があることに注意してください。
NeoPixel ドライバー¶
neopixel
モジュールを使います:
from machine import Pin
from neopixel import NeoPixel
pin = Pin(0, Pin.OUT) # NeoPixel 駆動のための GPIO0 を出力に設定
np = NeoPixel(pin, 8) # 8ピクセル用の NeoPixel ドライバーを GPIO0 で作成
np[0] = (255, 255, 255) # 第1ピクセルを白に設定
np.write() # 全ピクセルにデータ書込み
r, g, b = np[0] # 第1ピクセルの色を取得
警告
デフォルトで NeoPixel
はより一般的な 800kHz ユニットを制御するよう設定されています。 NeoPixel
オブジェクトを構築する際に timing=0
を渡すことで、他の(たいていは 400kHz)デバイスを制御する別のタイミングを使えます。
NeoPixel の低レベル駆動については machine.bitstream
を参照してください。
APA102 ドライバー¶
apa102
モジュールを使います:
from machine import Pin
from apa102 import APA102
clock = Pin(14, Pin.OUT) # クロック駆動のための GPIO14 を出力に設定
data = Pin(13, Pin.OUT) # データ駆動のための GPIO13 を出力に設定
apa = APA102(clock, data, 8) # 8ピクセル用の APA102 ドライバーを clock と data ピンで作成
apa[0] = (255, 255, 255, 31) # 第1ピクセルを輝度 31 の白に設定
apa.write() # 全ピクセルにデータ書込み
r, g, b, brightness = apa[0] # 第1ピクセルの色を取得
APA102 の低レベル駆動もあります:
import esp
esp.apa102_write(clock_pin, data_pin, rgbi_buf)
DHT ドライバー¶
DHT ドライバーはソフトウェアで実装され、すべてのピンで動作します:
import dht
import machine
d = dht.DHT11(machine.Pin(4))
d.measure()
d.temperature() # 例: 23 (°C)
d.humidity() # 例: 41 (% RH)
d = dht.DHT22(machine.Pin(4))
d.measure()
d.temperature() # 例: 23.6 (°C)
d.humidity() # 例: 41.3 (% RH)
SSD1306 ドライバー¶
SSD1306 モノクロ有機ELディスプレイ用ドライバーです。チュートリアル SSD1306 OLED ディスプレイの使い方 を参照してください。
from machine import Pin, I2C
import ssd1306
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)
display = ssd1306.SSD1306_I2C(128, 64, i2c)
display.text('Hello World', 0, 0, 1)
display.show()
WebREPL (Web ベースの対話プロンプト)¶
WebREPL (Web ブラウザ経由でアクセス可能な REPL)は、ESP8266 ポートで使用可能な実験的な機能です。Web クライアントを https://github.com/micropython/webrepl (http://micropython.org/webrepl で入手可能なホストバージョン)からダウンロードしてきて、次のコマンドを実行して設定してください:
import webrepl_setup
画面の指示にしたがいます。再起動後、接続可能になります。起動時に自動起動を無効にした場合は、次のコマンドを使用してデーモンを実行することができます:
import webrepl
webrepl.start()
WebREPL を使用するためにサポートされている方法は、ESP8266 アクセスポイントに接続することですが、デーモンがアクティブな場合は STA インタフェースでも起動できます。ルータが設定され正しく動作する場合、通常のインターネットアクセスポイントに接続していれば WebREPL が使えるでしょう(問題が発生した場合は ESP8266 AP 接続メソッドを使ってください)。
ターミナル/コマンドプロンプトでできることの他に、WebREPL にはファイル転送(アップロードとダウンロードの両方)の機能も用意しています。Webクライアントには、対応する機能のボタンがあります。また、上記のリポジトリのコマンドラインクライアント``webrepl_cli.py`` を使うこともできます。
ファイルを ESP8266 に転送するための、コミュニティでサポートされている他の代替方法については、MicroPython フォーラムを参照してください。