MicroPython:Библиотеки/esp32: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
(не показано 12 промежуточных версий 1 участника)
Строка 19: Строка 19:
== Класс Partition – разделы flash-памяти ==
== Класс Partition – разделы flash-памяти ==


Этот класс предоставляет доступ к разделам flash-памяти устройства и содержит методы для беспроводных (over-the-air или OTA) обновлений.
Этот класс предоставляет доступ к разделам [[flash]]-памяти устройства и содержит методы для беспроводных ([[over-the-air]] или [[OTA]]) обновлений.


=== Конструктор ===
=== Конструктор ===


esp32.Partition(id) – создает объект, представляющий раздел. В аргументе id можно задать строку, обозначающую метку раздела, который надо извлечь, или одну из следующих констант: BOOT или RUNNING.
* [[MicroPython:Библиотеки/esp32/Класс Partition/esp32.Partition()|esp32.Partition(id)]]


=== Методы ===
=== Методы ===


• Метод класса Partition.find(type=TYPE_APP, subtype=255, label=None) – находит раздел при помощи типа (type), подтипа (subtype) и метки (label). Возвращает (возможно, пустой) список объектов Partition. Примечание: subtype=0xff соответствует всем подтипам, а label=None соответствует всем меткам.
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.find()|Partition.find(type=TYPE_APP, subtype=255, label=None)]]
Partition.info() – возвращает 6-элементный кортеж: (type, subtype, addr, size, label, encrypted).
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.info()|Partition.info()]]
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) – в этих методах реализованы простой и [http://docs.micropython.org/en/latest/library/uos.html#block-device-interface расширенный] блочные протоколы, определенные в [http://docs.micropython.org/en/latest/library/uos.html#uos.AbstractBlockDev классе uos.AbstractBlockDev].
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.readblocks()|Partition.readblocks(block_num, buf)]]
Partition.set_boot() – делает раздел разделом загрузки.
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.readblocks()|Partition.readblocks(block_num, buf, offset)]]
Partition.get_next_update() – возвращает раздел, который будет обновлен следующим (соответственно, возвращает новый объект Partition). Обычно используется как Partition(Partition.RUNNING).get_next_update(), что вернет раздел, который будет обновлен следующим (с учетом того, что запущен в данный момент).
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.writeblocks()|Partition.writeblocks(block_num, buf)]]
• Метод класса Partition.mark_app_valid_cancel_rollback() – сигнализирует о том, что текущая загрузка прошла успешно. Вызов этого метода требуется при первой загрузке нового раздела, чтобы избежать автоматического отката во время следующей загрузки. Этот метод при помощи CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE использует функцию «отката приложения» (app rollback) ESP-IDF, и если этот метод будет вызван на прошивке, у которой этой функции нет, это выдаст ошибку OSError(-261). Этот метод можно вызывать при каждой загрузке, и не имеет значения, была ли эта прошивка загружена при помощи esptool или нет.
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.writeblocks()|Partition.writeblocks(block_num, buf, offset)]]
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.ioctl()|Partition.ioctl(cmd, arg)]]
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.set_boot()|Partition.set_boot()]]
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.get_next_update()|Partition.get_next_update()]]
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.mark_app_valid_cancel_rollback()|Partition.mark_app_valid_cancel_rollback()]]


=== Константы ===
=== Константы ===


Partition.BOOT, Partition.RUNNING – используются в конструкторе Partition, чтобы вызвать разделы разных типов: BOOT – это раздел, который будет загружен при следующем сбросе, а RUNNING – это раздел, запущенный в данный момент.
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.BOOT|Partition.BOOT]]
Partition.TYPE_APP, Partition.TYPE_DATA – используются в методе Partition.find(), чтобы задать тип раздела: APP – это загружаемые прошивочные разделы (обычно имеют метки factory, ota_0, ota_1), а DATA – это другие разделы (например, nvs, otadata, phy_init, vfs).
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.RUNNING|Partition.RUNNING]]
esp32.HEAP_DATA, esp32.HEAP_EXEC – используются в idf_heap_info().
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.TYPE_APP|Partition.TYPE_APP]]
* [[MicroPython:Библиотеки/esp32/Класс Partition/Partition.TYPE_DATA|Partition.TYPE_DATA]]
* [[MicroPython:Библиотеки/esp32/Класс Partition/esp32.HEAP_DATA|esp32.HEAP_DATA]]
* [[MicroPython:Библиотеки/esp32/Класс Partition/esp32.HEAP_EXEC|esp32.HEAP_EXEC]]


== Модуль RMT ==
== Модуль RMT ==


Модуль RMT (от «remote control», т.е. «дистанционное управление»), использующийся исключительно для ESP32, изначально был создан для отправки и получения инфракрасных сигналов дистанционного управления. Но благодаря гибкой структуре и генерированию импульсов высокой точности (вплоть до 12.5 нс) его также можно использовать для передачи и получения многих других типов цифровых сигналов:
Модуль ''RMT'' (от ''«remote control»'', т.е. ''«дистанционное управление»''), использующийся исключительно для [[ESP32]], изначально был создан для отправки и получения инфракрасных сигналов дистанционного управления. Но благодаря гибкой структуре и генерированию импульсов высокой точности (вплоть ''до [[12.5 нс]]'') его также можно использовать для передачи и получения многих других типов цифровых сигналов:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
import esp32
import esp32
from machine import Pin
from machine import Pin
Строка 62: Строка 69:
</syntaxhighlight>
</syntaxhighlight>


Входящая частота модуля RMT составляет 80 МГц (возможно, в будущем ее можно будет менять, но сейчас она фиксированная). Значение в clock_div – это делитель входной частоты, который задает разрешение RMT-канала. Число, заданное в write_pulses, умножается на разрешение – результат задает, какими будут импульсы.
Входящая частота модуля ''RMT'' составляет ''80 МГц'' (возможно, в будущем ее можно будет менять, но сейчас она фиксированная). Значение в ''clock_div'' – это делитель входной частоты, который задает разрешение ''RMT-канала''. Число, заданное в ''write_pulses'', умножается на разрешение – результат задает, какими будут импульсы.
Значение в clock_div – это 8-битный делитель (0-255), и каждый импульс можно задать, умножив разрешение, полученное с помощью делителя, на 15-битное число (0-32,768). Всего каналов восемь (0-7), и у каждого из них может быть свой делитель частоты.
 
Чтобы активировать у ESP32 функцию несущей частоты, задайте в carrier_freq что-то вроде «38000» – это стандартная несущая ИК-частота.
Значение в ''clock_div'' – это ''8''-битный делитель (''0-255''), и каждый импульс можно задать, умножив разрешение, полученное с помощью делителя, на ''15''-битное число (''0-32,768''). Всего каналов восемь (''0-7''), и у каждого из них может быть свой делитель частоты.
Итак, в примере выше частота 80 МГц делится на 8. В результате получается разрешение (1/(80МГц/8)) 100 нс. Поскольку начальный уровень (start) – это «0», и с каждым новым «тиком» сигнал переключается, получается битовый поток 0101 с сигналами продолжительностью 100 нс, 2000 нс, 200 нс, 4000 нс.
 
Чтобы активировать у [[ESP32]] функцию несущей частоты, задайте в ''carrier_freq'' что-то вроде ''«38000»'' – это стандартная несущая ''ИК-частота''.
 
Итак, в примере выше частота ''80 МГц'' делится на ''8''. В результате получается разрешение (''1/(80МГц/8)'') ''100 нс''. Поскольку начальный уровень (''start'') – это ''«0»'', и с каждым новым «тиком» сигнал переключается, получается битовый поток ''0101'' с сигналами продолжительностью ''100 нс'', ''2000 нс'', ''200 нс'', ''4000 нс''.
 
Более подробно читайте в [https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/rmt.html документации к модулю RMT для ESP-IDF от Espressif].
Более подробно читайте в [https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/rmt.html документации к модулю RMT для ESP-IDF от Espressif].
Внимание! В реализации модуля RMT в MicroPython нет некоторых функций оригинала (самая заметная из которых – это получение импульсов). Рассматривайте RMT как бета-инструмент, интерфейс которого в будущем может поменяться.
 
{{Блок/Инфо4
|1=Внимание
|2=В реализации модуля ''RMT'' в [[MicroPython]] нет некоторых функций оригинала (самая заметная из которых – это получение импульсов). Рассматривайте ''RMT'' как бета-инструмент, интерфейс которого в будущем может поменяться.}}


=== Конструктор ===
=== Конструктор ===


esp32.RMT(channel, *, pin=None, clock_div=8, carrier_freq=0, carrier_duty_percent=50) – этот класс предоставляет доступ к одному из восьми RMT-каналов. Аргумент channel нужен обязательно – в нем задается, какой именно RMT-канал (0-7) нужно настроить. Аргумент pin тоже обязателен – в нем задается, какой именно контакт нужно привязать к RMT-каналу. Значение в clock_div – это 8-битный делитель входящей частоты (80 МГц), позволяющий задать разрешение RMT-канала. Аргумент carrier_freq используется, чтобы активировать функцию несущей частоты и задать ее частоту; значение по умолчанию – «0» (не включена). Чтобы включить ее, задайте в этом аргументе положительное целое число. Значение по умолчанию в аргументе carrier_duty_percent – «50».
* [[MicroPython:Библиотеки/esp32/RMT/esp32.RMT()|esp32.RMT(channel, *, pin=None, clock_div=8, carrier_freq=0, carrier_duty_percent=50)]]


=== Методы ===
=== Методы ===


RMT.source_freq() – возвращает исходную тактовую частоту. В данный момент поменять ее нельзя, поэтому этот метод будет всегда возвращать 80 МГц.
* [[MicroPython:Библиотеки/esp32/RMT/RMT.source_freq()|RMT.source_freq()]]
RMT.clock_div() – возвращает делитель частоты. Разрешение канала рассчитывается с помощью формулы 1 / (source_freq / clock_div).
* [[MicroPython:Библиотеки/esp32/RMT/RMT.clock_div()|RMT.clock_div()]]
RMT.wait_done(timeout=0) – возвращает True, если канал в данный момент передает поток импульсов, запущенный с помощью вызова RMT.write_pulses().
* [[MicroPython:Библиотеки/esp32/RMT/RMT.wait_done()|RMT.wait_done(timeout=0)]]
Если задать аргумент timeout (единица измерения здесь – это число, рассчитанное с помощью source_freq / clock_div), метод подождет период времени, заданный в этом аргументе, или пока передача импульсов не будет завершена, и вернет False, если канал продолжает передачу импульсов. Если на канале при помощи RMT.loop() включена повторяющаяся передача импульсов, а поток импульсов был уже запущен, этот метод всегда будет (ждать и) возвращать False.
* [[MicroPython:Библиотеки/esp32/RMT/RMT.loop()|RMT.loop(enable_loop)]]
RMT.loop(enable_loop) – включает и выключает повторяющуюся передачу импульсов на канале. В аргументе enable_loop задается булево значение, и если задать в нем True, это включит повторяющуюся передачу импульсов при следующем вызове RMT.write_pulses(). Если вызвать этот метод со значением False во время повторяющейся передачи импульсов, то текущая группа символов будет передана, после чего их передача будет остановлена.
* [[MicroPython:Библиотеки/esp32/RMT/RMT.write_pulses()|RMT.write_pulses(pulses, start)]]
RMT.write_pulses(pulses, start) – запускает отправку импульсов pulses (поток импульсов задается с помощью списка или кортежа). Длина каждого импульса задается умножением на разрешение канала (1 / (source_freq / clock_div)). В аргументе start задается, будет ли поток начинаться на нуле или единице.
Если на этом канале в данный момент уже ведется отправка потока импульсов, запуск этого метода будет заблокирован, пока этот поток не завершится, после чего начнется отправка потока в pulses.
Если включена повторяющаяся передача импульсов с помощью RMT.loop(), поток импульсов будет повторяться бесконечно. Последующий вызов RMT.write_pulses() остановит предыдущий поток (но перед этим подождет, пока не будет отправлена последняя группа импульсов), а затем начнет новый поток.


== ULP-сопроцессор ==
== ULP-сопроцессор ==


Класс esp32.ULP – этот класс предоставляет доступ к ULP-сопроцессору.
* [[MicroPython:Библиотеки/esp32/Класс ULP|Класс ULP]]
ULP.set_wakeup_period(period_index, period_us) – задает период пробуждения.
* [[MicroPython:Библиотеки/esp32/Класс ULP/ULP.set_wakeup_period()|ULP.set_wakeup_period(period_index, period_us)]]
ULP.load_binary(load_addr, program_binary) – загружает program_binary в ULP-процессор на заданный адрес load_addr.
* [[MicroPython:Библиотеки/esp32/Класс ULP/ULP.load_binary()|ULP.load_binary(load_addr, program_binary)]]
ULP.run(entry_point) – запускает ULP-сопроцессор на заданной entry_point.
* [[MicroPython:Библиотеки/esp32/Класс ULP/ULP.run()|ULP.run(entry_point)]]


=== Константы ===
=== Константы ===


esp32.WAKEUP_ALL_LOW, esp32.WAKEUP_ANY_HIGH – задают логический уровень, на котором будет происходить выход из режима сна.
* [[MicroPython:Библиотеки/esp32/Класс ULP/esp32.WAKEUP_ALL_LOW|esp32.WAKEUP_ALL_LOW]]
 
* [[MicroPython:Библиотеки/esp32/Класс ULP/esp32.WAKEUP_ANY_HIGH|esp32.WAKEUP_ANY_HIGH]]
 
 
 
 
 
 
<syntaxhighlight lang="python" enclose="div">


=См.также=
=См.также=

Текущая версия от 18:13, 14 мая 2023

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Модуль esp32 – функционал ESP32[1]

Модуль esp32 содержит функции и классы, предназначенные исключительно для работы с микроконтроллерами ESP32.

Функции

Класс Partition – разделы flash-памяти

Этот класс предоставляет доступ к разделам flash-памяти устройства и содержит методы для беспроводных (over-the-air или OTA) обновлений.

Конструктор

Методы

Константы

Модуль RMT

Модуль RMT (от «remote control», т.е. «дистанционное управление»), использующийся исключительно для ESP32, изначально был создан для отправки и получения инфракрасных сигналов дистанционного управления. Но благодаря гибкой структуре и генерированию импульсов высокой точности (вплоть до 12.5 нс) его также можно использовать для передачи и получения многих других типов цифровых сигналов:

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)

# разрешение канала – 100 нс (1/(source_freq/clock_div)):
r.write_pulses((1, 20, 2, 40), start=0)  # отправьте «0» для 100 нс,
                                         # «1» для 2000 нс,
                                         # «0» для 200 нс,
                                         # «1» для 4000 нс

Входящая частота модуля RMT составляет 80 МГц (возможно, в будущем ее можно будет менять, но сейчас она фиксированная). Значение в clock_div – это делитель входной частоты, который задает разрешение RMT-канала. Число, заданное в write_pulses, умножается на разрешение – результат задает, какими будут импульсы.

Значение в clock_div – это 8-битный делитель (0-255), и каждый импульс можно задать, умножив разрешение, полученное с помощью делителя, на 15-битное число (0-32,768). Всего каналов восемь (0-7), и у каждого из них может быть свой делитель частоты.

Чтобы активировать у ESP32 функцию несущей частоты, задайте в carrier_freq что-то вроде «38000» – это стандартная несущая ИК-частота.

Итак, в примере выше частота 80 МГц делится на 8. В результате получается разрешение (1/(80МГц/8)) 100 нс. Поскольку начальный уровень (start) – это «0», и с каждым новым «тиком» сигнал переключается, получается битовый поток 0101 с сигналами продолжительностью 100 нс, 2000 нс, 200 нс, 4000 нс.

Более подробно читайте в документации к модулю RMT для ESP-IDF от Espressif.

Внимание

В реализации модуля RMT в MicroPython нет некоторых функций оригинала (самая заметная из которых – это получение импульсов). Рассматривайте RMT как бета-инструмент, интерфейс которого в будущем может поменяться.

Конструктор

Методы

ULP-сопроцессор

Константы

См.также

Внешние ссылки