« Turtorial Examples for CC3200-MicroPython | トップページ | Nucleo-MicroPythonにGrove-RTC(i2c)を接続する »

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 CC3200-MicroPython | トップページ | Nucleo-MicroPythonにGrove-RTC(i2c)を接続する »

linux」カテゴリの記事

MicroPython」カテゴリの記事

Maixduino」カテゴリの記事

MaixPy」カテゴリの記事

コメント

この記事へのコメントは終了しました。