Освой MicroPython играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Мигаем светодиодом
Кнопки
Ориентация экрана
Питание
Задействуем выводы платы
Графика: Падающие блоки
Акселерометр: Гоняем шарик внутри прямоугольника
Настраиваем редактор Mu
Устройство M5Stick-C - является младшей моделью M5Stack, основанная на микроконтроллере ESP32-PICO Mini.
Покупал у производителя на AliExpress
На обратной стороне наклеена картинка.
Интересные особенности устройства.
Прошиваем программой M5Burner.
Дальше пишем программы, как обычно для M5Stack. Чтобы работать в десктопной версию UIFlow-Desktop-IDE, нужно выбрать USB-режим, на который можно переключиться нажатием двух боковых кнопок.
Пробую написать первую программу на MicroPython с использованием Unicode-шрифта.
from m5stack import *
from m5ui import *
from uiflow import *
setScreenColor(0x111111)
label = M5TextBox(52, 19, "Мяу, заработало!", lcd.FONT_UNICODE,0xFFFFFF, rotate=90)
Часть примеров для M5Stack совместимо с M5Stick-C. Но могут быть и свои особенности. Например, у M5Stick-C есть встроенный светодиод.
Можем помигать им используя методы M5Led.on() и M5Led.off().
from m5stack import *
from m5ui import *
from uiflow import *
import time
setScreenColor(0x111111)
while True:
M5Led.on()
wait(1)
M5Led.off()
wait(1)
У M5Stick-C имеются три кнопки. Слева кнопка питания, к ней нет программного доступа. На лицевой части находится кнопка с надписью M5 - это кнопка A. Справа в верхней части боковой стороны находится кнопка B.
Перепишем предыдущий код мигания светодиодом, управляя им через кнопки.
from m5stack import *
from m5ui import *
from uiflow import *
setScreenColor(0xcd3e3e)
def buttonA_wasPressed():
# global params
M5Led.on()
pass
btnA.wasPressed(buttonA_wasPressed)
def buttonB_wasPressed():
# global params
M5Led.off()
pass
btnB.wasPressed(buttonB_wasPressed)
У экрана можно задать четыре вида ориентации через метод lcd.setRotation(), начиная с 0.
from m5stack import *
from m5ui import *
from uiflow import *
lcd.setRotation(2)
setScreenColor(0xcd3e3e)
title = M5Title(title="Title", x=3 , fgcolor=0xFFFFFF, bgcolor=0x0000FF)
Работа с питанием отличается от M5Stack. Здесь нужно вызывать другие функции.
from m5stack import *
from m5ui import *
from uiflow import *
import time
setScreenColor(0x111111)
label0 = M5TextBox(9, 18, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)
label1 = M5TextBox(7, 45, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)
while True:
label0.setText(str(axp.getChargeState())) # наличие питания False/True
label1.setText(str(axp.getTempInAXP192())) # Температура AXP192
# label1.setText(str(map_value((axp.getBatVoltage()), 3.7, 4.1, 0, 100))) # Заряд батареи в процентах
wait(1)
Другие функции.
axp.getBatVoltage() # получить вольтаж батареи
axp.getBatCurrent() # Get battery current
axp.getVinVoltage() # Get Vin voltage
axp.getVinCurrent() # Get Vin current
axp.getVBusVoltage() # Get VBus voltage
axp.getVBusCurrent() # Get VBus current
axp.setChargeCurrent(axp.CURRENT_190MA) # Set battery charge current to Set charging current
axp.setLDO2Volt(2.4) # Set LCD voltage to Set screen voltage 0-100
axp.powerOff() # Выключение
В среде UIFlow за выводы на устройстве отвечает модуль easyIO. Для опытов я вставил два провода в выводы GND и G26 и присоединил к ним внешний светодиод. Включаем через кнопку A, выключаем через кнопку B. Код сгенерировала среда разработки UIFlow.
from m5stack import *
from m5ui import *
from uiflow import *
from easyIO import *
setScreenColor(0x111111)
def buttonA_wasPressed():
# global params
digitalWrite(26, 1)
pass
btnA.wasPressed(buttonA_wasPressed)
def buttonB_wasPressed():
# global params
digitalWrite(26, 0)
pass
btnB.wasPressed(buttonB_wasPressed)
Затем решил обойтись без easyIO и задействовал модуль machine.
from m5stack import *
from m5ui import *
from uiflow import *
import machine
setScreenColor(0x111111)
def buttonA_wasPressed():
# global params
pinout = machine.Pin(26, machine.Pin.OUT)
pinout.value(1)
pass
btnA.wasPressed(buttonA_wasPressed)
def buttonB_wasPressed():
# global params
pinout = machine.Pin(26, machine.Pin.OUT)
pinout.value(0)
pass
btnB.wasPressed(buttonB_wasPressed)
Простой пример применения графики - в случайном месте наверху за пределами экрана формируется квадратный блок, который падает вниз. Данное действие происходит в бесконечном цикле, формируя эффект падающих снежинок (можете заменить прямоугольник на круг).
from m5stack import *
from m5ui import *
from uiflow import *
import time
import random
setScreenColor(0x111111)
rectangle = M5Rect(0, 0, 20, 20, 0xFFFFFF, 0xFFFFFF)
random_x = 0
i = 0
while True:
random_x = random.randint(0, 60)
for i in range(-20, 161):
rectangle.setPosition(random_x, i)
wait_ms(2)
Считываем показания акселерометра из класса imu и на основании полученных данных обновляем позицию шарика внутри прямоугольника.
from m5stack import *
from m5ui import *
from uiflow import *
import imu
import time
setScreenColor(0x111111)
myImu = imu.IMU()
circle = M5Circle(40, 148, 10, 0xFFFFFF, 0xFFFFFF)
rectangle = M5Rect(0, 0, 80, 160, 0x111111, 0xFFFFFF)
x = 40
y = 80
while True:
if (myImu.acceleration[0]) >= 0.1 and x > 14:
x = x - 2
circle.setPosition(x = x)
if (myImu.acceleration[0]) <= 0.1 and x < 66:
x = x + 2
circle.setPosition(x = x)
if (myImu.acceleration[1]) <= 0.1 and y > 14:
y = y -2
circle.setPosition(y = y)
if (myImu.acceleration[1]) >= 0.1 and y < 146:
y = y + 2
circle.setPosition(y = y)
wait_ms(1)
Если хочется работать не через UIFlow, а через редактор Mu, то возникает небольшая проблема. На данный момент версия 1.1.0alpha2 не распознаёт устройство M5Stick-C.
Но мы можем немного доработать редактор "напильником".
Перейдите в папку редактора C:\Users\%user\AppData\Local\Mu\pkgs\mu\modes и откройте файл esp.py. Найдите в файле блок valid_boards и добавьте ещё одну строку.
valid_boards = [
# VID , PID
(0x1A86, 0x7523), # HL-340
(0x10C4, 0xEA60), # CP210x
(0x0403, 0x6001), # CH552
(0x0403, 0x6015), # Sparkfun ESP32 VID, PID
]
Запустите редактор. На этот раз редактор увидит устройство, но по-прежнему не может загружать код. В нижней части редактора будет появляться сообщение об ошибке.
Дальше немного магии. Убедитесь, что курсор активен в нижней части и нажимайте комбинацию клавиш Ctrl+C. Если вы увидите строку Type "help()" for more information, то ваше устройство готово к работе. И вы можете работать, как с M5Stack.