Maixduino

2021年2月 7日 (日)

MicroPython/CircuitPython Performance Test

2021/2/7

MicroPython CircuitPython Performace Test (v2)

MicroPython CircuitPython Performace Test (v2)

概要

MicroPython/CircuitPython Performance Test この記事は「 MicroPython Performance Test 」を見直して新たな結果を追加した第2版にあたる。

pyborad/STM32用MicroPythonスクリプト

PerformaceTest.py

# Peformace Test import pyb def performanceTest(): millis = pyb.millis endTime = millis() + 10000 count = 0 while millis() < endTime: count += 1 print("Count: ", count) performanceTest()

ESP32/ESP8266用MicroPythonスクリプト

PerformaceTestESP32.py

# Peformace Test for ESP32 from machine import RTC rtc = RTC() rtc.datetime((2020, 2, 9, 1, 12, 48, 0, 0)) # (year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]) def performanceTest(): secs = rtc.datetime()[6] endTime = secs + 10 count = 0 while rtc.datetime()[6] < endTime: count += 1 print("Count: ", count) performanceTest()

PC/BareMetal-RpiZeo/Linux-Rpizero/Maixduino用スクリプト

PerformanceRpiZero.py

# Peformace Test RpiZero import time def performanceTest(): msec = time.ticks_ms endTime = msec() + 10000 count = 0 while msec() < endTime: count += 1 print("Count: ", count) performanceTest()

CC3200用MicroPythonスクリプト

PerformanceTestCC3200.py

# Peformace Test for CC3200 from machine import RTC rtc = RTC(datetime=(2020, 2, 9, 10, 11, 0, 0, None)) def performanceTest(): secs = rtc.now()[5] endTime = secs + 10 count = 0 while rtc.now()[5] < endTime: count += 1 print("Count: ", count) performanceTest()

CircuitPython/Python3用スクリプト

performanceTestCPY.py

# Peformace Test CircuitPython from time import monotonic_ns def performanceTest(): endTime = monotonic_ns() + 10000000000 # 10 sec count = 0 while monotonic_ns() < endTime: count += 1 print("Count: ", count) performanceTest()

XIAO CircuitPython用スクリプト

PerformanceCircuitPython_XIAO.py

# Peformace Test XIAO CircuitPython from time import monotonic def performanceTest(): endTime = monotonic() + 10.0 # 10 sec count = 0 while monotonic() < endTime: count += 1 print("Count: ", count) performanceTest()

実行例

# pyboard/STM32の場合 $ ./pyboard.py --device /dev/ttyACM0 PerformanceTest.py Count: 2825625 # ESP32/ESP866の場合 $ ./pyboard.py --device /dev/ttyUSB0 PerformanceTestESP32.py Count: 39187

結果

ボード名 M/C/P Count
F767ZI M 5,676,566
F446RE M 2,825,625
F4Disco M 2,882,769
Maixduino M 2,218,879
Pico-MP M 1,507,516
F401RE M 1,362,752
L476RG M 1,089,347
PyPortal C 474,734
Grand-Central-M4-Express C 445,404
Feather-M4-Express C 438,444
Teensy4.0 C 432,413
Pico-CPY C 341,033
XIAO C 174,388
Circuit-Playground-Express C 121,800
ESP8266 M 64,049
ESP32 M 39,187
CC3200 M 5,529
BareMetal-RpiZero M 680,525
Linux-RpiZero P 6,370,022
PC(linux) P 161,265,687
micropython-Rpi4 M 16,117,283
python3-Rpi4 P 11,359,199


M/C/Pは、pythonの種類を表し、
M:MicroPython、
C:CircuitPython、
P:Python3
を表す。

コメント

・Pico-MPは、RPI_Picoボードの MicroPython、Pico-CPYは、RPI_PicoボードのCircuitPythonを意味する。

・BareMetal-RpiZeroは、RpiZeroでのBareMetalのmicropython、 Linux-RpiZeroは、linux上でのmicropython、 PC(Linux)は、PCのLinux上でのmicropythonを意味する。

・MaixduinoはMaixduinoのmicropythonであるMaixPyを意味する。

・Teensy4.0はTeensy4.0のCircuitPythonを意味する。

・python3-Rpi4は「python3 performanceCircuitPython.py」の数字、 micropython-Rpi4は「micropython performanceCircuitPython.py」の数字を意味する。

なお、PC(linux)のCPUは、「Intel® Core™ i7-3520M CPU @ 2.90GHz × 4 )」である。

・STM32系(F7xx/F4xx/L4xx)がESP32/ESP8266に比べてダントツに速いようだ。

・Linux-RpiZeroとBareMetal-RpiZeroの数字の違いはCPUキャッシュの有効/無効の差と思われる。

・CC3200は、他のMicroPythonボードに比べて極端に遅い結果だが、省電優先設計のせいだと思われる。

・Teensy4.0のCircuitPythonはmonotonic_ns()のオーバーヘッドが大きい気がする。

・XIAOとCircuit-Playground-Expressは、同じプロセッサATSAMD21(Cortex-M0+,48MHz)にもかかわらず、性能差が出ているのは実装の違いで、XIAOのほうは、floatで動いているのに対して、Circuit-Playground-Expressのほうは、long_intで動いていることによる差が出ていると考えている。

・Pico-MP,Pico-CPYはCortex-M0であるがクロックが他のM0より高いこと(最大133Mz)と浮動小数点ライブラリが最適化されていることでM4並みの性能が出ているようだ。MP,CPYの性能差は最適化が進んでいるかどうかの差と思われる。

参照情報

PicoボードにMicropython/CircuitPythonをインストールする

RaspberryPiのpython3でCircuitPythonのAPIを使用する

XIAOにCircuitPythonをインストールする

Circuit-Playground-ExpressにCircuitPythonをインストールする

Teensy4.0にCurcuitPythonをインストールする

BareMetalのMicropythonをRaspberryPi_Zeroにインストールしてみる

NUCLEO-F767ZIにMicropythonをインストールする(v2)
Nucleo-L476RGにMicroPythonをインストールする
Nucleo-F401REにMicroPythonをインストールする
STM32F4-Discovery」にMicroPythonをインストールする
NUCLEO-F446REにMicropythonをインストールする(v2)
NUCLEO F446RE MicroPython インストール方法

CC3200 MicroPython インストール

ESP32のMicroPythonのインストール方法
ESP-WROOM-02 MicroPython インストール方法

MicroPythonのツールとしてpyboad.pyを使う
The pyboard.py tool

ESP32-DevKitC ESP-WROOM-32開発ボード
MicroPython - Quick reference for the ESP32

ampyを用いたMicroPythonのファイル操作とプログラム実行

以上

続きを読む "MicroPython/CircuitPython Performance Test"

| | コメント (0)

2020年3月13日 (金)

Turtorial Examples for Maixduino-MicroPython(MaixPy)

2020/3/13

Turtorial Examples for Maixduino-MicroPython(MaixPy)

Maixduino

Sipeed_Maixduino_Specifications_EN_V1.0.pdf
Maixduino-4.30(schematic).pdf
maixduino_pins.png
K210 Dataseet

tools

ampy

pip install adafruit-ampy export AMPY_PORT=/dev/ttyUSB0 export AMPY_BAUD=115200 export AMPY_DELAY=0.5

rshell

sudo pip3 install rshell export RSHELL_PORT=/dev/ttyUSB0

Maixduino pinout

MaixPyで利用するピン番号は、左側のK210モジュールのピン番号になる。
(例)
Blinkにはシリアルに付いているLED(TX-K201)を利用しているが、 プログラムに使用するピン番号はD1(TX)ではなく、5(IO05)になる。 ちなみに、プログラムでboard_info.ISP_TXとすると5を返す。

1. Digital I/O (1)

K210 Pin Name Arduino Pin Name
IO30 SCL
IO31 SDA
IO03 D13
IO10 D12
IO11 D11
IO12 D10
IO13 D09
IO14 D08

2. Digital I/O (2)

K210 Pin Name Arduino Pin Name
IO15 D07
IO32 D06
IO24 D05
IO23 D04
IO22 D03
IO21 D02
IO05 D01(TX)
IO04 D00(RX)

3. Analog In

ESP32 Pin Name Arduino Pin Name
ESP32_33 A05
ESP32_32 A04
ESP32_35 A03
ESP32_34 A02
ESP32_39 A01
ESP32_36 A00

(ADCはESP32のものを使っている)

Maixduinoのボード情報

REPLで以下のようにボード情報を知ることができる:

>>> from board import board_info # 以下、ArduinoのD0-D13ピンに対応したK210のピン番号が表示される #(上の表の情報と同じ) >>> board_info.D [4, 5, 21, 22, 23, 24, 32, 15, 14, 13, 12, 11, 10, 3]

たとえばD05はIO24に対応するので board_info.D[5] は、24になる。

import utime from Maix import GPIO from fpioa_manager import fm from board import board_info fm.register(board_info.D[1], fm.fpioa.GPIO0) led_r=GPIO(GPIO.GPIO0,GPIO.OUT) while True: led_r.value(0) utime.sleep_ms(100) led_r.value(1) utime.sleep_ms(100)

シリアルポートのLED(TX-K201)を利用しているので、実行後、ホストと通信できない状態になる。通信再開したい場合、Ctrl-C,Ctrl-Dを押してボートをリブートする。

GPIO

Digtal In

from utime import sleep fm.register(board_info.BOOT_KEY,fm.fpioa.GPIOHS0) bootBtn = GPIO(GPIO.GPIOHS0,GPIO.IN,GPIO.PULL_UP) while True: print(bootBtn.value()) sleep(0.1)

Digtal Out

import utime from Maix import GPIO from fpioa_manager import fm from board import board_info # Map GPIO0 to D2 fm.register(board_info.D[2],fm.fpioa.GPIO0) led=GPIO(GPIO.GPIO0,GPIO.OUT) while True: led.value(0) utime.sleep_ms(100) led.value(1) utime.sleep_ms(100) fm.unregister(board_info.D[2],fm.fpioa.GPIO0)

Digtal In/Out

from Maix import GPIO from fpioa_manager import fm from board import board_info # Map GPIO0 to D2 for LED fm.register(board_info.D[2],fm.fpioa.GPIO0) led=GPIO(GPIO.GPIO0,GPIO.OUT) # Map for BOOT Button fm.register(board_info.BOOT_KEY,fm.fpioa.GPIOHS0) bootBtn = GPIO(GPIO.GPIOHS0,GPIO.IN,GPIO.PULL_UP) while True: led.value(0 if bootBtn.value() == 1 else 1) # LED on when BOOT Button pushed

PWM

# breathing light (LED@D2) from machine import Timer, PWM import time from fpioa_manager import board_info tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode = Timer.MODE_PWM) ch = PWM(tim, freq = 500000, duty = 50, pin = board_info.D[2]) duty = 0 dir = True while True: if dir: duty += 10 else: duty -= 10 if duty > 100: duty = 100 dir = False elif duty <0: duty = 0 dir = True time.sleep(0.05) sink = ch.duty(duty)
# sample2 LED@D2 from machine import Timer, PWM from fpioa_manager import board_info tim = Timer(machine.Timer.TIMER0, machine.Timer.CHANNEL0, mode = machine.Timer.MODE_PWM) ch0 = PWM(tim, freq = 3000000, duty = 20, pin = board_info.D[2], enable = False) ch0.enable() time.sleep(3) sink = ch0.freq(2000000) print("freq:", ch0.freq()) sink = ch0.duty(60) time.sleep(3) ch0.disable()

ADC

Currently Does Not Work?????

K210 does not have ADC. ADC of ESP32(on board) can be used instead of K210.

but it does not work... 'ValueError: [MaixPy]: esp32 read adc failed!' given.

demo_esp32_read_adc.py

import network import utime from Maix import GPIO from fpioa_manager import * #iomap at MaixDuino fm.register(25,fm.fpioa.GPIOHS10)#cs fm.register(8,fm.fpioa.GPIOHS11)#rst fm.register(9,fm.fpioa.GPIOHS12)#rdy fm.register(28,fm.fpioa.GPIOHS13)#mosi fm.register(26,fm.fpioa.GPIOHS14)#miso fm.register(27,fm.fpioa.GPIOHS15)#sclk nic = network.ESP32_SPI(cs=fm.fpioa.GPIOHS10,rst=fm.fpioa.GPIOHS11,rdy=fm.fpioa.GPIOHS12, mosi=fm.fpioa.GPIOHS13,miso=fm.fpioa.GPIOHS14,sclk=fm.fpioa.GPIOHS15) # get ADC0 ADC1 ADC2 adc = nic.adc( (0,1,2) ) print(adc) while True: try: # get ADC0~5 adc = nic.adc() except Exception as e: print(e) continue for v in adc: print("%04d" %(v), end=" ") print() utime.sleep_ms(50)

SPI

There are four SPI interfaces:
Master mode only: SPI0, SPI1
Slave mode only: SPI2

Currently Sample is Not Available.

see NeoPixel(are using SPI) as another sample.

I2C

There are three I2C interfaces:
I2C0, I2C1, I2C2

from machine import I2C i2c = I2C(I2C.I2C0, freq = 100000, scl = 30, sda = 31) i2c.scan() >>> from machine import I2C >>> i2c = I2C (I2C.I2C0, freq = 100000, scl = 30, sda = 31) >>> i2c.scan() [30] >>>
# Map Pins (default: SCL->30 SDA->31) from fpioa_manager import fm, board_info fm.register(30,fm.fpioa.I2C0_SCLK)#scl fm.register(31,fm.fpioa.I2C0_SDA)#sda from machine import I2C i2c = I2C(0) i2c.scan() >>> # Map Pins (default: SCL->30 SDA->31) >>> from fpioa_manager import fm, board_info >>> fm.register(30,fm.fpioa.I2C0_SCLK)#scl 1 >>> fm.register(31,fm.fpioa.I2C0_SDA)#sda 1 >>> >>> from machine import I2C >>> i2c = I2C(0) >>> i2c.scan() [30] >>>
# Map Pins (SCL->D4 SDA->D3) from fpioa_manager import fm, board_info fm.register(board_info.D[4],fm.fpioa.I2C0_SCLK)#scl fm.register(board_info.D[3],fm.fpioa.I2C0_SDA)#sda from machine import I2C i2c = I2C(0) i2c.scan() >>> from fpioa_manager import fm, board_info >>> fm.register(board_info.D[4],fm.fpioa.I2C0_SCLK)#scl 1 >>> fm.register(board_info.D[3],fm.fpioa.I2C0_SDA)#sda 1 >>> from machine import I2C >>> i2c = I2C(0) >>> i2c.scan() # TEMP102 needs 5V as VCC on Maixduino [72] >>>

Module Install:
以下のリンクを参照して該当モジュールをインストールする。
ESP8266のMicroPythonに温度センサーTMP102(i2c)を接続する

Demo Script:

# Map Pins (SCL->D4 SDA->D3) from fpioa_manager import fm, board_info fm.register(board_info.D[4],fm.fpioa.I2C0_SCLK)#scl fm.register(board_info.D[3],fm.fpioa.I2C0_SDA)#sda import utime from machine import I2C from tmp102 import Tmp102 i2c = I2C(0) sensor = Tmp102(i2c, 0x48) while True: print('Temperature: {0:.1f}'.format(sensor.temperature)) utime.sleep(2)

Module Install:
以下のリンクを参照して該当モジュールをインストールする。
RpiZero/Nucleo/ESP8266/ESP32に「Grove - 3Axis Compass」(I2C)を接続する

Demo Script:

# Map Pins (default: SCL->30 SDA->31) from fpioa_manager import fm, board_info fm.register(30,fm.fpioa.I2C0_SCLK)#scl fm.register(31,fm.fpioa.I2C0_SDA)#sda # Nucleo/RPiZero from hmc5883l_md import HMC5883L from machine import I2C i2c=I2C(0) sensor = HMC5883L(i2c) while True: x, y, z = sensor.read() print(sensor.format_result(x, y, z))

RTC

Currently Does Not Work?????

utime.localtime([secs])

Convert a time expressed in seconds since the Epoch (see above) into an 8-tuple which contains: (year, month, mday, hour, minute, second, weekday, yearday) If secs is not provided or None, then the current time from the RTC is used.

year includes the century (for example 2014). month is 1-12 mday is 1-31 hour is 0-23 minute is 0-59 second is 0-59 weekday is 0-6 for Mon-Sun yearday is 1-366

It does not work correctly.

>>> time.localtime(time.mktime((2020,3,11,12,25,9,2,0,0))) (2020, 3, 11, 12, 25, 9, 2, 71) >>> time.localtime() (2496, 7, 31, 14, 55, 0, 2, 213) >>>

NeoPixel

Method#1(SPI_method):

Module Install:

git clone https://github.com/JanBednarik/micropython-ws2812.git cd micropython-ws2812 Patch ws2812.py to ws2812_spi.py as follows: patch#1: import pyb -> import machine as pyb patch#2: self.spi = pyb.SPI(spi_bus, pyb.SPI.MASTER, baudrate=3200000, polarity=0, phase=1) -> self.spi = pyb.SPI(spi_bus,baudrate=3200000, polarity=0, phase=1) patch#3: self.spi.send(self.buf) -> self.spi.write(self.buf) Put it in /flash or /sd ampy put ws2812_spi.py

SPI0 use case:

# Pin Map for SPI0, SD(on board) still effective from fpioa_manager import fm, board_info fm.register(board_info.D[5],fm.fpioa.GPIOHS0)#cs #fm.register(board_info.D[5],fm.fpioa.SPI0_SS0)#cs fm.register(board_info.D[6],fm.fpioa.GPIOHS1)#dc # connect D11 to DIN of neopixel fm.register(board_info.D[11],fm.fpioa.SPI0_D0)#mosi fm.register(board_info.D[12],fm.fpioa.SPI0_D1)#miso fm.register(board_info.D[13],fm.fpioa.SPI0_SCLK)#sclk from ws2812_spi import WS2812 chain = WS2812(spi_bus=0, led_count=4) data = [ (255, 0, 0), # red (0, 255, 0), # green (0, 0, 255), # blue (85, 85, 85), # white ] chain.show(data)
# Pin Map for SPI0, SD(on board) still effective from fpioa_manager import fm, board_info fm.register(board_info.D[5],fm.fpioa.GPIOHS0)#cs #fm.register(board_info.D[5],fm.fpioa.SPI0_SS0)#cs fm.register(board_info.D[6],fm.fpioa.GPIOHS1)#dc # connect D11 to DIN of neopixel fm.register(board_info.D[11],fm.fpioa.SPI0_D0)#mosi fm.register(board_info.D[12],fm.fpioa.SPI0_D1)#miso fm.register(board_info.D[13],fm.fpioa.SPI0_SCLK)#sclk import math from time import sleep_ms from ws2812_spi import WS2812 ring = WS2812(spi_bus=0, led_count=16, intensity=0.1) def data_generator(led_count): data = [(0, 0, 0) for i in range(led_count)] step = 0 while True: red = int((1 + math.sin(step * 0.1324)) * 127) green = int((1 + math.sin(step * 0.1654)) * 127) blue = int((1 + math.sin(step * 0.1)) * 127) data[step % led_count] = (red, green, blue) yield data step += 1 for data in data_generator(ring.led_count): ring.show(data) sleep_ms(10)

Single Pin version(recommend):

# Pin Map for SPI0, SD(on board) still effective from fpioa_manager import fm, board_info # connect D11 to DIN of neopixel fm.register(board_info.D[11],fm.fpioa.SPI0_D0)#mosi import math from time import sleep_ms from ws2812_spi import WS2812 ring = WS2812(spi_bus=0, led_count=16, intensity=0.1) def data_generator(led_count): data = [(0, 0, 0) for i in range(led_count)] step = 0 while True: red = int((1 + math.sin(step * 0.1324)) * 127) green = int((1 + math.sin(step * 0.1654)) * 127) blue = int((1 + math.sin(step * 0.1)) * 127) data[step % led_count] = (red, green, blue) yield data step += 1 for data in data_generator(ring.led_count): ring.show(data) sleep_ms(10)

SPI1 use case:
SD(on board) will be defeat.

# SD(on board) effective after boot from ws2812_spi import WS2812 from fpioa_manager import fm, board_info # caution: the followings make SD(on board) defeat fm.register(board_info.D[5],fm.fpioa.GPIOHS0)#cs #fm.register(board_info.D[5],fm.fpioa.SPI1_SS0)#cs fm.register(board_info.D[6],fm.fpioa.GPIOHS1)#dc # connect D11 to DIN of neopixel fm.register(board_info.D[11],fm.fpioa.SPI1_D0)#mosi fm.register(board_info.D[12],fm.fpioa.SPI1_D1)#miso fm.register(board_info.D[13],fm.fpioa.SPI1_SCLK)#sclk #from machine import SPI chain = WS2812(spi_bus=1, led_count=4) data = [ (255, 0, 0), # red (0, 255, 0), # green (0, 0, 255), # blue (85, 85, 85), # white ] chain.show(data)

Method#2:

# neopixel simple test from modules import ws2812 from board import board_info np = ws2812(board_info.D[4],8) # D4 (Arduino Pin) @Grove Slot_D3 np.set_led(0,(255, 255, 255)) np.set_led(1,(255, 255, 0)) np.set_led(2,(255, 0, 0)) np.set_led(3,(0, 255, 255)) np.set_led(4,(0, 255, 0)) np.set_led(5,(0, 0, 255)) np.set_led(6,(255, 255,0)) np.set_led(7,(255, 0, 0)) np.display()

DHT

N.A.

Networking

MXD_starwars.py
StarWarsのASCII_Artを表示するプログラム
以下は自分の環境に合わせて変更すること:
WIFI_SSID = "your_ssid"
WIFI_PASSWD = "your passwd"

# NIC setup import network, socket from Maix import GPIO from fpioa_manager import fm, board_info WIFI_SSID = "your_ssid" WIFI_PASSWD = "your passwd" # IO map for ESP32 on Maixduino fm.register(25,fm.fpioa.GPIOHS10)#cs fm.register(8,fm.fpioa.GPIOHS11)#rst fm.register(9,fm.fpioa.GPIOHS12)#rdy fm.register(28,fm.fpioa.GPIOHS13)#mosi fm.register(26,fm.fpioa.GPIOHS14)#miso fm.register(27,fm.fpioa.GPIOHS15)#sclk nic = network.ESP32_SPI(cs=fm.fpioa.GPIOHS10,rst=fm.fpioa.GPIOHS11,rdy=fm.fpioa.GPIOHS12, mosi=fm.fpioa.GPIOHS13,miso=fm.fpioa.GPIOHS14,sclk=fm.fpioa.GPIOHS15) print("ESP32_SPI firmware version:", nic.version()) err = 0 while 1: try: nic.connect(WIFI_SSID, WIFI_PASSWD) except Exception: err += 1 print("Connect AP failed, now try again") if err > 3: raise Exception("Conenct AP fail") continue break print(nic.ifconfig()) print(nic.isconnected()) err = 0 #========================================== # Star Wars ASCII Art (python3) import socket addr_info = socket.getaddrinfo("towel.blinkenlights.nl",23) addr = addr_info[0][-1] s = socket.socket() s.connect(addr) while True: data = s.recv(500) print(str(data, 'utf8'), end='') #=============================================

Performance Test

performanceRpiZero.py

# Peformace Test RpiZero import time def performanceTest(): msec = time.ticks_ms endTime = msec() + 10000 count = 0 while msec() < endTime: count += 1 print("Count: ", count) performanceTest()

以上

続きを読む "Turtorial Examples for Maixduino-MicroPython(MaixPy)"

| | コメント (0)

2020年2月 8日 (土)

MaixPy Update(v0.5.0_12)

2020/2/8

MaixPy Update(v0.5.0_12)

MaixPy Update(v0.5.0_12)

概要

MaixPyのfirmwareのUpdateについて記する。(ubuntu環境でのやり方について述べる)

事前準備

(1)ampyのインストール
AMPY_PORTは、自分の環境に合わせる。

pip install adafruit-ampy export AMPY_PORT=/dev/ttyUSB0 export AMPY_BAUD=115200 export AMPY_DELAY=0.5

(2)picocomのインストール

sudo apt-get install picocom

以上のうち、exportしているものは、.bashrcに登録することを勧める。

(3)書き込みツール(kflash)のインストール
以下のコマンドでkflashをインストールする:

sudo pip3 install kflash

MaixDuinoのMaixPyのUpdate

wget http://dl.sipeed.com/MAIX/MaixPy/release/master/maixpy_v0.5.0_12_g284ce83/maixpy_v0.5.0_12_g284ce83_with_lvgl.bin # 実際にはwgetではエラーになったので、ブラウザーでダウンロードした。 # (エラー原因は不明) kflash -p /dev/ttyUSB0 maixpy_v0.5.0_12_g284ce83_with_lvgl.bin # 出力ログ例 [INFO] COM Port Selected Manually: /dev/ttyUSB0 [INFO] Default baudrate is 115200 , later it may be changed to the value you set. [INFO] Trying to Enter the ISP Mode... ._ [INFO] Automatically detected goE/kd233 [INFO] Greeting Message Detected, Start Downloading ISP Downloading ISP: |=============================================| 100.0% 10kiB/s [INFO] Booting From 0x80000000 [INFO] Wait For 0.1 second for ISP to Boot [INFO] Boot to Flashmode Successfully [INFO] Selected Flash: On-Board [INFO] Initialization flash Successfully Programming BIN: |=============================================| 100.0% 9kiB/s [INFO] Rebooting...

M5StickVのMaixPyのUpdate

wget http://dl.sipeed.com/MAIX/MaixPy/release/master/maixpy_v0.5.0_12_g284ce83/maixpy_v0.5.0_12_g284ce83_m5stickv.bin # 実際にはwgetではエラーになったので、ブラウザーでダウンロードした。 # (エラー原因は不明) kflash -p /dev/ttyUSB0 maixpy_v0.5.0_12_g284ce83_m5stickv.bin # 出力ログ例 [INFO] COM Port Selected Manually: /dev/ttyUSB0 [INFO] Default baudrate is 115200 , later it may be changed to the value you set. [INFO] Trying to Enter the ISP Mode... ._ [INFO] Automatically detected goE/kd233 [INFO] Greeting Message Detected, Start Downloading ISP Downloading ISP: |=============================================| 100.0% 10kiB/s [INFO] Booting From 0x80000000 [INFO] Wait For 0.1 second for ISP to Boot [INFO] Boot to Flashmode Successfully [INFO] Selected Flash: On-Board [INFO] Initialization flash Successfully Programming BIN: |=============================================| 100.0% 10kiB/s [INFO] Rebooting...

実行確認(M5StickV)

$ picocom /dev/ttyUSB0 -b115200 MicroPython v0.5.0-12-g284ce83 on 2019-12-31; Sipeed_M1 with kendryte-k210 Type "help()" for more information. >>> >>> import gc >>> gc.collect() >>> gc.mem_free() 507584 # 内蔵モジュール表示 >>> help('modules') KPU gc pye_mp uio Maix hashlib random ujson __main__ heapq re ulab _boot image sensor uos _thread json socket urandom _webrepl lcd struct ure array machine sys usocket audio math time ustruct binascii math ubinascii utime board micropython ucollections utimeq builtins modules ucryptolib uzlib cmath nes uctypes video collections network uerrno zlib errno os uhashlib fpioa_manager pmu uheapq Plus any modules on the filesystem >>>

原因は、まだ不明だが、ときどき/dev/ttyUSB0が接続していても消える場合がある。ホスト環境に原因があるのかもしれないが ホストPCを再起動すると修復できるようだ。

以上

続きを読む "MaixPy Update(v0.5.0_12)"

| | コメント (0)

2020年2月 5日 (水)

MaixduinoボードのGroveコネクタにNeoPxelを接続する

2020/2/5

Maixduino MicroPython NeoPixel demo

Maixduino MicroPython NeoPixel demo

概要

MaixduinoボードのGroveコネクタにNeoPxelを接続する。

参照URL

使用機材:
M5Stack用NeoPixel互換 LEDテープ 10 cm
Sipeed Maixduino
Arduino用 GroveベースシールドV2 - Grove Base Shield V2

ESP32/ESP8266関係:
ESP32/ESP8266 Analog Readings with MicroPython
ESP32/ESP8266 PWM with MicroPython – Dim LED
ESP32/ESP8266 Digital Inputs and Digital Outputs with MicroPython
ESP32/WROOM32

その他:
NUCLEO F446RE MicroPython インストール方法
STM32F4-Discovery」にMicroPythonをインストールする
Grove - 温度および湿度センサー (DHT11)
Grove 温度および湿度センサPro – DHT22 / AM2302 - Grove Temperature & Humidity Sensor Pro
Grove - LCD RGB Backlight
Grove Sensor Grove - Rotary Angle Sensor
Grove 温度センサ - Grove Temperature Sensor

関連モジュールのインストール

内蔵モジュールws2812を使用するので、インストールするものはない。

デモ・スクリプト

Maixuuino + Grove-Base-Sheild のSlot_D3に[M5Stack用NeoPixel互換 LEDテープ 10 cm]を接続する。(実際には、D4に接続することになる)

動作確認用のスクリプト
コンソールに入り手打ちで動作を確認する:
(np.display()が実行されるまでLEDは点灯しないので注意のこと)

# neopixel simple test from modules import ws2812 from board import board_info np = ws2812(board_info.D[4],8) # D4 (Arduino Pin) @Grove Slot_D3 np.set_led(0,(255, 255, 255)) np.set_led(1,(255, 255, 0)) np.set_led(2,(255, 0, 0)) np.set_led(3,(0, 255, 255)) np.set_led(4,(0, 255, 0)) np.set_led(5,(0, 0, 255)) np.set_led(6,(255, 255,0)) np.set_led(7,(255, 0, 0)) np.display()

MXD_demo_NeoPixel.py
(ESP8266のMicroPythonのdocにあったものを移植した)

# Maixduino import time def demo(np,n): # cycle for i in range(4 * n): for j in range(n): sink = np.set_led(j,(0,0,0)) sink = np.set_led(i % n,(255, 255, 255)) sink = np.display() time.sleep_ms(25) # bounce for i in range(4 * n): for j in range(n): sink = np.set_led(j,(0,0,128)) if (i // n) % 2 == 0: sink = np.set_led(i % n,(0, 0, 0)) else: sink = np.set_led(n - 1 - (i % n),(0, 0, 0)) sink = np.display() time.sleep_ms(60) # fade in/out for i in range(0, 4 * 256, 8): for j in range(n): if (i // 256) % 2 == 0: val = i & 0xff else: val = 255 - (i & 0xff) sink = np.set_led(j,(val, 0, 0)) sink = np.display() # clear for i in range(n): sink = np.set_led(i,(0, 0, 0)) sink = np.display() #---------------------- from modules import ws2812 from board import board_info np = ws2812(board_info.D[4],15) # D4 (Arduino Pin) @Grove Slot_D3 demo(np,15)

実行

# RAM実行 ampy run MXD_demo_NeoPixel.py

注意

ボードを抜き差しすると、/dev/ttyUSB0が/dev/ttyUSB1などに変更になるので注意のこと。
「export AMPY_PORT=...」で変更する必要がある。

以上

続きを読む "MaixduinoボードのGroveコネクタにNeoPxelを接続する"

| | コメント (0)