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

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

Шкодим

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

M5Stick-C

Мигаем светодиодом
Кнопки
Ориентация экрана
Питание
Задействуем выводы платы
Графика: Падающие блоки
Акселерометр: Гоняем шарик внутри прямоугольника
Настраиваем редактор Mu

Устройство M5Stick-C - является младшей моделью M5Stack, основанная на микроконтроллере ESP32-PICO Mini.

M5Stick-C

Покупал у производителя на AliExpress

На обратной стороне наклеена картинка.

M5Stick-C

Интересные особенности устройства.

  • На базе ESP32 (240MHz dual core, 600 DMIPS, 520KB SRAM, Wi-Fi, dual mode Bluetooth)
  • Флеш-память: 4Мб
  • Встроенный IMU, шесть осей (MPU6886)
  • Красный светодиод
  • Инфракрасный передатчик
  • Микрофон (SPM1423)
  • LCD-экран (0.96 дюймов, 80*160, цветной TFT, ST7735S)
  • USB Type-C
  • Порт GROVE (I2C+I/0+UART)
  • Размеры: 48.2 x 25.5 x 13.7mm
  • Вес: 14г

Прошиваем программой M5Burner.

M5Stick-C

Дальше пишем программы, как обычно для M5Stack. Чтобы работать в десктопной версию UIFlow-Desktop-IDE, нужно выбрать USB-режим, на который можно переключиться нажатием двух боковых кнопок.

Пробую написать первую программу на MicroPython с использованием Unicode-шрифта.

M5Stick-C

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.

M5Stick-C

from m5stack import *
from m5ui import *
from uiflow import *

lcd.setRotation(2)

setScreenColor(0xcd3e3e)

title = M5Title(title="Title", x=3 , fgcolor=0xFFFFFF, bgcolor=0x0000FF)
M5Stick-C

Питание

Работа с питанием отличается от 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)
M5Stick-C LED

Графика: Падающие блоки

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


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)

Настраиваем редактор Mu

Если хочется работать не через UIFlow, а через редактор Mu, то возникает небольшая проблема. На данный момент версия 1.1.0alpha2 не распознаёт устройство M5Stick-C.

M5Stick-C Mu

Но мы можем немного доработать редактор "напильником".

Перейдите в папку редактора 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
]

Запустите редактор. На этот раз редактор увидит устройство, но по-прежнему не может загружать код. В нижней части редактора будет появляться сообщение об ошибке.

M5Stick-C Mu

Дальше немного магии. Убедитесь, что курсор активен в нижней части и нажимайте комбинацию клавиш Ctrl+C. Если вы увидите строку Type "help()" for more information, то ваше устройство готово к работе. И вы можете работать, как с M5Stack.

M5Stick-C Mu

Дополнительные материалы

Файл для Fritzing

Реклама