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
pip install adafruit-ampy
export AMPY_PORT=/dev/ttyUSB0
export AMPY_BAUD=115200
export AMPY_DELAY=0.5
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になる。
LED Blink
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()
以上
| 固定リンク
「linux」カテゴリの記事
- platfomioを使ってnaitive(linux/windows)のプログラムをビルドする方法(2021.03.10)
- micro:bit Yotta開発ツール(linux版)(2021.01.09)
- PlatformIOをRaspberryPi4で動かしてみる(実験)(2020.10.20)
- headless RaspberryPiインストール方法(v2)(2020.10.20)
- wio-terminalのファームウェア・アップデートについて(linux版)(2020.10.15)
「MicroPython」カテゴリの記事
- microbit-v2にMicropythonをインストールする(2021.05.06)
- PicoボードのMicroPythonをVS_CodeのextensionのPico-Goでプログラミングする(2021.02.10)
- MicroPython/CircuitPython Performance Test(2021.02.07)
- PicoボードにMicropython/CircuitPythonをインストールする(2021.02.03)
- MicroPython(F767ZI) Network Samples(2021.01.03)
「Maixduino」カテゴリの記事
- MicroPython/CircuitPython Performance Test(2021.02.07)
- Turtorial Examples for Maixduino-MicroPython(MaixPy)(2020.03.13)
- MaixPy Update(v0.5.0_12)(2020.02.08)
- MaixduinoボードのGroveコネクタにNeoPxelを接続する(2020.02.05)
「MaixPy」カテゴリの記事
- Turtorial Examples for Maixduino-MicroPython(MaixPy)(2020.03.13)
- MaixPy Update(v0.5.0_12)(2020.02.08)
この記事へのコメントは終了しました。
コメント