MaixPy

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)