esp32 --- EDS32 に固有の機能¶
esp32 モジュールは、ESP32 モジュールに固有の制御を目的とした関数とクラスが含まれています。
関数¶
-
esp32.wake_on_touch(wake)¶ タッチでデバイスをスリープから復帰させるかどうかを設定します。 wake はブール型でなければなりません。
-
esp32.wake_on_ext0(pin, level)¶ EXT0 がデバイスをスリープから復帰させる方法を設定します。 pin には
Noneあるいは有効な Pin オブジェクトを指定します。 level にはesp32.WAKEUP_ALL_LOWまたはesp32.WAKEUP_ANY_HIGHを指定する必要があります。
-
esp32.wake_on_ext1(pins, level)¶ EXT1 がデバイスをスリープから復帰させる方法を設定します。 pin には
Noneあるいは有効な Pin オブジェクトのタプル/リストを指定します。 level にはesp32.WAKEUP_ALL_LOWまたはesp32.WAKEUP_ANY_HIGHを指定する必要があります。
-
esp32.raw_temperature()¶ 内部温度センサーの素の値を読み、整数を返します。
-
esp32.hall_sensor()¶ 内部ホールセンサーの素の値を読み、整数を返します。
-
esp32.idf_heap_info(capabilities)¶ ESP-IDF ヒープメモリ領域の情報を返します。MicroPython はヒープメモリ領域の1つを使っており、他は ESP-IDF がネットワークバッファなどのデータ領域として使っています。この情報は特に ESP-IDF とネットワークスタックで利用可能なメモリ量を把握するのに役立ちます。また、アロケーションの失敗により ESP-IDF の操作が失敗した場合の状況を知ることができるかもしれません。返される情報は Python のアロケーション失敗のトラブルシューティングには役に立ちませんので、代わりに
micropython.mem_info()を使ってください。capabilities パラメータは ESP-IDF の MALLOC_CAP_XXX の値に相当しますが、最も有用な2つの値は esp32 モジュールに予め定義されています。
esp32.HEAP_DATAはデータヒープ領域用であり`esp32.HEAP_EXEC` はネイティブコードエミッタで使用される実行可能領域用です。戻り値は4項目タプルのリストで、4項目タプルのそれぞれが1つのヒープに対応しています。タプルの各項目は、合計バイト数、空きバイト数、最大空きブロック数、時間経過にともなう最小空きブロック数を意味します。
ブート後の例:
>>> import esp32; esp32.idf_heap_info(esp32.HEAP_DATA) [(240, 0, 0, 0), (7288, 0, 0, 0), (16648, 4, 4, 4), (79912, 35712, 35512, 35108), (15072, 15036, 15036, 15036), (113840, 0, 0, 0)]
フラッシュのパーティション¶
このクラスは、デバイスのフラッシュメモリ内のパーティションへのアクセスを提供します。加えて、over-the-air (OTA) 更新を可能にするメソッドもあります。
-
class
esp32.Partition(id)¶ パーティションを表すオブジェクトを作成します。 id は取得するパーティションのラベルである文字列、または定数 BOOT または RUNNING のいずれかです。
-
classmethod
Partition.find(type=TYPE_APP, subtype=0xff, label=None)¶ type, subtype, label で指定したパーティションを見つけます。戻り値は Partition オブジェクトのリストです(空の場合もあります)。注記:
subtype=0xff任意のサブタイプにマッチ、label=Noneは任意のラベルにマッチします。
-
Partition.info()¶ (type, subtype, addr, size, label, encrypted)の6項目のタプルを返します。
-
Partition.readblocks(block_num, buf)¶ -
Partition.readblocks(block_num, buf, offset)
-
Partition.writeblocks(block_num, buf)¶ -
Partition.writeblocks(block_num, buf, offset)
-
Partition.ioctl(cmd, arg)¶ これらのメソッドは
uos.AbstractBlockDevによって定義されたシンプルで:ref:extended ブロックプロトコルを実装します。
-
Partition.set_boot()¶ パーティションをブートパーティションとして設定します。
-
Partition.get_next_update()¶ このパーティションの次の更新パーティションを取得し、新しいパーティションオブジェクトを返します。よく使うのは
Partition(Partition.RUNNING).get_next_update()で、これは現在更新中のパーティションの次のパーティションを返します。
-
classmethod
Partition.mark_app_valid_cancel_rollback()¶ 現在のブートが成功したことを示します。次のブート時の自動ロールバックを避けるために、新しいパーティションの最初のブート時に
mark_app_valid_cancel_rollbackを呼び出す必要があります。これは ESP-IDF の "app rollback" 機能を "CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE" 指定で使っているので、この機能が有効になっていないファームウェアで呼び出すと "OSError(-261)" が発生します。mark_app_valid_cancel_rollbackはブートのたびに呼び出しても問題なく、esptool を使ってロードしたファームウェアをブートする場合は呼び出す必要ありません。
定数¶
-
Partition.BOOT¶ -
Partition.RUNNING¶ Partitionコンストラクタで取得するパーティションを指定するために使います:BOOTは次のリセット時に起動されるパーティションで、RUNNINGは現在実行中のパーティションです。
-
Partition.TYPE_APP¶ -
Partition.TYPE_DATA¶ Used in
Partition.findto specify the partition type:APPis for bootable firmware partitions (typically labelledfactory,ota_0,ota_1), andDATAis for other partitions, e.g.nvs,otadata,phy_init,vfs.
-
esp32.HEAP_DATA¶ -
esp32.HEAP_EXEC¶ idf_heap_infoで使います。
RMT¶
ESP32 に固有の RMT (リモートコントロール)モジュールは、もともと赤外線リモートコントロール信号を送受信するために設計されました。ただし、柔軟な設計と非常に正確な(12.5ns程度の)パルス生成により、他の多くのタイプのデジタル信号の送受信にも使用できます:
import esp32
from machine import Pin
r = esp32.RMT(0, pin=Pin(18), clock_div=8)
r # RMT(channel=0, pin=18, source_freq=80000000, clock_div=8)
# キャリア周波数を指定する場合
r = esp32.RMT(0, pin=Pin(18), clock_div=8, carrier_freq=38000)
r # RMT(channel=0, pin=18, source_freq=80000000, clock_div=8, carrier_freq=38000, carrier_duty_percent=50)
# チャンネルの分解能は 100ns (1/(source_freq/clock_div)).
r.write_pulses((1, 20, 2, 40), start=0) # 0 を 100ns, 1 を 2000ns, 0 を 200ns, 1 を 4000ns 送信
RMT モジュールへの入力は 80MHz クロックです(将来的には入力クロックを設定できる可能性もありますが、現時点では固定です)。RMT チャネルの分解能は、クロック入力を clock_div で除算することにより決まります。write_pulses で指定した数値については、分解能を乗算してパルスが決まります。
clock_div は8ビット(0-255)の分周器で、各パルスは、分解能に15ビット(0-32,768)の数値を乗算することで定義できます。8つのチャネル(0-7)があり、それぞれ異なるクロック分周器を使えます。
esp32 ハードウェアのキャリア周波数の機能を有効にするには、 carrier_freq を典型的な IR キャリア周波数である 38000 などとします。
上記の例では80MHzクロックを8で除算しています。したがって分解能は (1/(80Mhz/8)) で 100ns になります。開始レベルは 0 であり、各数値でレベルが切り替わるので、ビットストリームは 0101 で各ビットについて [100ns, 2000ns, 100ns, 4000ns] の持続時間を有します。
詳細については ESP-IDF RMT documentation. を参照してください。
警告
現在の MicroPython RMT 実装にはいくつかの機能がありませんが、最も顕著なのは受信パルスです。RMT は ベータ機能 と見なすべきであり、インターフェースは将来変更する可能性があります。
-
class
esp32.RMT(channel, *, pin=None, clock_div=8, carrier_freq=0, carrier_duty_percent=50)¶ このクラスは、8つのRMTチャネルの1つへのアクセスを提供します。 channel は必須であり、どの RMT チャネル(0-7)を使うのかを識別します。 pin も必須であり、RMTチャネルにバインドするピンを設定します。 clock_div はソースクロック(80MHz)を分割する8ビットのクロック分周器であり、RMTチャネルの分解能を指定できます。 carrier_freq はキャリア機能を有効にし、その周波数を指定するために使います。有効にするには正の整数を指定してください。 carrier_duty_percent のデフォルト値は50です。
-
RMT.source_freq()¶ ソースクロック周波数を返します。現在のところソースクロックは設定できないため、常に 80MHz が返されます。
-
RMT.clock_div()¶ クロック分周器を返します。チャネルの分解能は
1 / (source_freq / clock_div)であることに注意してください。
-
RMT.wait_done(timeout=0)¶ RMT.write_pulsesを呼び出して開始したパルスのストリームをチャネルが転送中であればTrueを返します。タイムアウト(
source_freq / clock_divのティックで定義)が指定されている場合、このメソッドはタイムアウトになるか転送が完了するまで待機し、チャンネルがまだ転送中であればFalseを返します。RMT.loopでループが有効になっていて、ストリームを開始している場合、このメソッドは常に(待機して)Falseを返します。
-
RMT.loop(enable_loop)¶ チャネルのループを設定します。 enable_loop は bool 型で、
Trueにすると、RMT.write_pulsesの 次の 呼び出しでループを有効にします。ループ中のストリームの転送中にFalseで呼び出された場合、転送が停止する前にパルスの現在のセットを完了します。
-
RMT.write_pulses(pulses, start)¶ パルスの送信を開始します。パルスのストリーム定義するリストまたはタプルを指定します。各パルスの長さは、チャネルの分機能
(1 / (source_freq / clock_div))を乗算した値によって定義されます。 start はストリームが 0 で始まるか 1 で始まるかを定義します。ストリームが転送中である場合、このメソッドは、 パルス の転送を開始する前に、そのストリームの転送が終了するまでブロックします。
RMT.loopでループが有効になっている場合、パルスのストリームは無限に繰り返されます。そこにRMT.write_pulsesを呼び出すと、前のストリームを終了させてから(最後のパルスが転送されるまでブロックします)、次のストリームを開始します。