MicroPython:Библиотеки/esp32
Модуль esp32 – функционал ESP32[1]
Модуль esp32 содержит функции и классы, предназначенные исключительно для работы с микроконтроллерами ESP32.
Функции
- esp32.wake_on_touch(wake)
- esp32.wake_on_ext0(pin, level)
- esp32.wake_on_ext1(pins, level)
- esp32.raw_temperature()
- esp32.hall_sensor()
- esp32.idf_heap_info(capabilities)
Класс Partition – разделы flash-памяти
Этот класс предоставляет доступ к разделам flash-памяти устройства и содержит методы для беспроводных (over-the-air или OTA) обновлений.
Конструктор
Методы
- Partition.find(type=TYPE_APP, subtype=255, label=None)
- 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)
- Partition.set_boot()
- Partition.get_next_update()
- Partition.mark_app_valid_cancel_rollback()
Константы
- Partition.BOOT
- Partition.RUNNING
- Partition.TYPE_APP
- Partition.TYPE_DATA
- esp32.HEAP_DATA
- esp32.HEAP_EXEC
Модуль 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 как бета-инструмент, интерфейс которого в будущем может поменяться. |
Конструктор
Методы
- RMT.source_freq()
- RMT.clock_div()
- RMT.wait_done(timeout=0)
- RMT.loop(enable_loop)
- RMT.write_pulses(pulses, start)
• RMT.source_freq() – возвращает исходную тактовую частоту. В данный момент поменять ее нельзя, поэтому этот метод будет всегда возвращать 80 МГц.
• RMT.clock_div() – возвращает делитель частоты. Разрешение канала рассчитывается с помощью формулы 1 / (source_freq / clock_div).
• RMT.wait_done(timeout=0) – возвращает True, если канал в данный момент передает поток импульсов, запущенный с помощью вызова RMT.write_pulses().
Если задать аргумент timeout (единица измерения здесь – это число, рассчитанное с помощью source_freq / clock_div), метод подождет период времени, заданный в этом аргументе, или пока передача импульсов не будет завершена, и вернет False, если канал продолжает передачу импульсов. Если на канале при помощи RMT.loop() включена повторяющаяся передача импульсов, а поток импульсов был уже запущен, этот метод всегда будет (ждать и) возвращать False.
• RMT.loop(enable_loop) – включает и выключает повторяющуюся передачу импульсов на канале. В аргументе enable_loop задается булево значение, и если задать в нем True, это включит повторяющуюся передачу импульсов при следующем вызове RMT.write_pulses(). Если вызвать этот метод со значением False во время повторяющейся передачи импульсов, то текущая группа символов будет передана, после чего их передача будет остановлена.
• RMT.write_pulses(pulses, start) – запускает отправку импульсов pulses (поток импульсов задается с помощью списка или кортежа). Длина каждого импульса задается умножением на разрешение канала (1 / (source_freq / clock_div)). В аргументе start задается, будет ли поток начинаться на нуле или единице.
Если на этом канале в данный момент уже ведется отправка потока импульсов, запуск этого метода будет заблокирован, пока этот поток не завершится, после чего начнется отправка потока в pulses.
Если включена повторяющаяся передача импульсов с помощью RMT.loop(), поток импульсов будет повторяться бесконечно. Последующий вызов RMT.write_pulses() остановит предыдущий поток (но перед этим подождет, пока не будет отправлена последняя группа импульсов), а затем начнет новый поток.
ULP-сопроцессор
• Класс esp32.ULP – этот класс предоставляет доступ к ULP-сопроцессору. • ULP.set_wakeup_period(period_index, period_us) – задает период пробуждения. • ULP.load_binary(load_addr, program_binary) – загружает program_binary в ULP-процессор на заданный адрес load_addr. • ULP.run(entry_point) – запускает ULP-сопроцессор на заданной entry_point.
Константы
• esp32.WAKEUP_ALL_LOW, esp32.WAKEUP_ANY_HIGH – задают логический уровень, на котором будет происходить выход из режима сна.
<syntaxhighlight lang="python" enclose="div">