Освой MicroPython играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

MicroPython для ESP32

Модуль esp
Модуль esp32
Модули os и uos
Модуль machine
Модуль utime

Я проверял на устройстве M5Stack Fire.

Получить список всех модулей в режиме REPL:


help('modules')

Такой ответ я получил на M5Stack.


>>> help('modules')
MicroWebSrv/__init__                flow/protocol     modules/_goPlus   units/_env
MicroWebSrv/microWebSocket          framebuf          modules/_gps      units/_env2
MicroWebSrv/microWebSrv             gc                modules/_lego     units/_ext_io
MicroWebSrv/microWebTemplate        hardware/__init__ modules/_legoBoard                  units/_finger
__main__          hardware/button   modules/_lidarBot units/_gps
_boot             i2c_bus           modules/_lorawan  units/_ir
_flow             inisetup          modules/_m5bala   units/_joystick
_onewire          libs/__init__     modules/_plus     units/_light
_thread           libs/bmm150       modules/_pm25     units/_makey
_uasyncio         libs/bmp280       modules/_servo    units/_mlx90640
_webrepl          libs/config       modules/_stepMotor                  units/_ncir
apa106            libs/dht12        neopixel          units/_pahub
ble/Blynk/BlynkLib                  libs/easyIO       network           units/_pbhub
ble/Blynk/__init__                  libs/echo         ntptime           units/_pir
ble/Blynk/blynkBLE                  libs/imu          sys               units/_relay
ble/__init__      libs/m5mqtt       uarray            units/_rfid
ble/ble_advertising                 libs/mpu6050      ubinascii         units/_rgb
ble/ble_uart      libs/mstate       ubluetooth        units/_rgb_multi
ble/blynk         libs/numbers      ucollections      units/_servo
btree             libs/nvs          ucryptolib        units/_tof
builtins          libs/power        uctypes           units/_tracker
cmath             libs/sh200q       uerrno            units/_weight
deviceCfg         libs/speak        uhashlib          uos
display           libs/timeSchedule uhashlib          urandom
esp               libs/time_ex      uheapq            ure
esp32             libs/urequests    uiflow            uselect
espnow            m5stack           uio               usocket
face              m5uart            ujson             ussl
faces/_calc       m5ui              umqtt/__init__    ustruct
faces/_encode     machine           umqtt/robust      utils
faces/_finger     math              umqtt/simple      utime
faces/_gameboy    menu/__init__     unit              utimeq
faces/_joystick   menu/app          units/_accel      uwebsocket
faces/_keyboard   menu/cloud        units/_adc        uzlib
faces/_rfid       menu/setup        units/_angle      wav/chunk
flashbdev         menu/startup      units/_button     wav/wav_player
flow/__init__     menu/wifi         units/_cardKB     wav/wave
flow/adaptation   micropython       units/_color      wifiCfg
flow/flowDeinit   module            units/_dac        wifiWebCfg
flow/m5cloud      modules/_baseX    units/_dual_button
flow/m5ucloud     modules/_cellular units/_earth
Plus any modules on the filesystem

Узнать список всех функций в модуле можно следующим образом. Сначала импортируем нужный модуль, потом вызываем dir


import esp
dir(esp)

Ответ

['__class__', '__name__', 'LOG_DEBUG', 'LOG_ERROR', 'LOG_INFO', 'LOG_NONE', 'LOG_VERBOSE', 'LOG_WARNING', 'dht_readinto', 'flash_erase', 'flash_read', 'flash_size', 'flash_user_start', 'flash_write', 'gpio_matrix_in', 'gpio_matrix_out', 'neopixel_write', 'osdebug']

Импорт модуля, который находится внутри какой-то папки на примере wav/wave, происходит следующим образом.


#import wav/wave - так не работает

from wav import wave
from wav import * # или так

Модуль esp

Функции модуля

  • esp.flash_size()
  • esp.flash_user_start()
  • esp.flash_read(byte_offset, length_or_buffer)
  • esp.flash_write(byte_offset, bytes)
  • esp.flash_erase(sector_no)

import esp
from m5stack import lcd

lcd.setCursor(0, 0)
lcd.print(esp.flash_size())

Модуль esp32

Функции.

  • esp32.hall_sensor() - чтение встроенного датчика Холла
  • esp32.raw_temperature() - read the internal temperature of the MCU, in Farenheit
  • esp32.ULP() - access to the Ultra-Low-Power Co-processor

import esp32
from m5stack import lcd

lcd.clear()
lcd.setCursor(0, 0)

lcd.print(esp32.hall_sensor())
lcd.setCursor(0, 30)
lcd.print(esp32.raw_temperature())

Модули os и uos

Модуль os относится к "взрослому" Python, а модуль uos специально для MicroPython. Частично они совпадают и дублируют друг друга.

Узнаем информацию о диске (на примере диска '/flash' у M5Stack.


import os

def get_disk_stats():
    stats = os.statvfs('/flash')
    block_size = stats[0]
    total_blocks = stats[2]
    free_blocks = stats[3]
    stats = dict()
    stats['free'] = block_size * free_blocks
    stats['total'] = block_size * total_blocks
    stats['used'] = stats['total'] - stats['free']
    return stats

def format_size(val):
    val = int(val / 1024)               # convert bytes to KiB
    val = '{:,}'.format(val)            # add thousand separator
    val = '{0: >6} KiB'.format(val)     # right align amounts
    return val

def print_stats():
    stats = get_disk_stats()
    print('free space: ', format_size(stats['free']))
    print('used space: ', format_size(stats['used']))
    print('total space:', format_size(stats['total']))

print_stats()

С помощью uos.uname() можно получить информацию о системе и плате через tuple с пятью именами.


import uos

result = uos.uname()
print(result)

Ответ у M5Stack: (sysname='esp32', nodename='esp32', release='1.12.0', version='v1.12-559-g3191f2bb3-dirty on 2020-06-05', machine='M5Stack with ESP32').

Методы для работы с файлами не отличаются в Python и MicroPython. Можно посмотреть на примере M5Stack.

Модуль machine

Функций много. Часть из них.

  • machine.freq() - Returns CPU frequency in hertz
  • machine.reset()
  • machine.soft_reset()
  • machine.unique_id()

import machine
from m5stack import lcd

lcd.clear()
lcd.setCursor(0, 0)

lcd.print(machine.freq())

Программная перезагрузка платы.


import machine

machine.reset()

Также содержит классы (частично).

  • ADC – analog to digital conversion
  • DAC
  • I2C – a two-wire serial protocol
  • I2S
  • Modbus
  • Neopixel
  • Pin – управление выводами I/O
  • PWM - широтно-импульсная модуляция
  • SDCard – secure digital memory card
  • Signal – control and sense external I/O devices
  • SPI – a Serial Peripheral Interface bus protocol (master side)
  • Signal
  • Timer – control hardware timers
  • TouchPad
  • RTC – real time clock
  • WDT – watchdog timer
  • UART – duplex serial communication bus

Включаем светодиод, который присоединён к выводу 26.


import machine

pinout = machine.Pin(26, machine.Pin.OUT)
pinout.value(1) # или pinout.value(True)

Мигаем светодиодом (не проверил на M5Stack):


import machine
import utime

led = machine.Pin(26, machine.Pin.OUT)
led.on # ещё один способ включения светодиода

for i in range(10): # while True: # бесконечный цикл
    led.on()
    time.sleep(0.5)
    led.off()
    time.sleep(0.5)

Считываем данные, поступаемые на вывод 26.


import machine

pinin = machine.Pin(26, machine.Pin.IN)
val = pinin.value()

Выводим в последовательный порт текст через UART.


from machine import UART

#Create a serial port instance
uart1 = machine.UART(1, tx=1, rx=3)

#Initialize the serial port
uart1.init(115200, bits=8, parity=None, stop=1)

#Is there any content in the cache?
#uart1.any()

#Read the content in the buffer area
#uart1.read()

#Write content to the serial port
uart1.write('Hello Kitty')

Модуль utime

Модуль для операций, связанных с временем, задержкой, замерами длительности операций. Является младшей сестрой модуля Python time.

  • utime.localtime([secs])
  • utime.mktime()
  • utime.sleep(seconds)
  • utime.sleep_ms(ms)
  • utime.sleep_us(us)
  • utime.ticks_ms()
  • utime.ticks_us()
  • utime.ticks_cpu()
  • utime.ticks_add(ticks, delta)
  • utime.ticks_diff(ticks1, ticks2)
  • utime.time()

import utime

print('Counter:')
i = 1
while True:
    print(i)
    i += 1
    time.sleep(1.0)  # delay for 1 second.
Реклама