aki_iic’s blog

己の欲せざる処人に施す事無かれ、狂人の真似するは即ち狂人なり

【2022/04/09更新】MAKER NANO RP2040

 秋月でMAKER NANO RP2040を買ってみた↓

1.MAKER NANO RP2040

akizukidenshi.com

 開発はCytronという処で製造はマレーシアと梱包箱には記載されている↓

f:id:aki_iic:20220403134553j:plain

MAKER NANO RP2040 Package

 データシート↓

docs.google.com Cytron社はpHATやMaker nano(original)を買った事があってSTEM用やそこそこの実装密度でコスパの良いボードを提供していると認識しており個人的には高評価。製造がマレーシア故か基板実装はまあそこそこではあるが個人用途としては全く無問題と想っている。

2.外観

f:id:aki_iic:20220403135429j:plain

MAKER NANO RP2040 with cables

 GROVE変換ケーブル2本も添付されており多少高めではあるがLED付+ケーブル付きで考えるとまあ納得のコスパだろうか(私見)。Seeed等の支那製と何とか勝負してる印象(私見)。

f:id:aki_iic:20220403135900j:plain

MAKER NANO RP2040 bottom view

ウラ面(基板面)。ピエゾブザーとSTEMMA QTコネクタはウラ面に実装されている。

3.プレインストールされているCircuit python

 USBケーブルを接続すると以下のフォルダを表示する↓

f:id:aki_iic:20220403140341p:plain

Startup folder

 プレインストールされている情報はboot_out.txtに出力されているらしい↓

Adafruit CircuitPython 7.1.0 on 2021-12-28; Cytron Maker Nano RP2040 with rp2040
Board id:cytron_maker_nano_rp2040

 令和四年卯月三日時点の情報なので今後バージョンアップ・変更される可能性があります。無知な私はMicroPythonとCircuitPythonの違いが分からないのだがプレインストールされているのはCircuitPython 7.1.0らしい。。。

4.使い方(遊び方)

 上記フォルダでcode.pyというのがCircuitPythonで書かれたコードなのでダブルクリックしてテキストエディタを開く↓

f:id:aki_iic:20220403141129p:plain

MAKER NANO RP2040 CircuitPython code.py

 ご覧の通りPython(CircuitPython)のコードが表示されるので適当に編集してエディタの保存(Save)するとcode.pyが更新されたと判定して保存したコートが実行される。code.pyはMAKER NANO RP2040に保存されているのでpythonコードはエディタでPCに保存しておけば良い。まあこの手のSTEM想定の環境では良く有るパタンで多分IDEも提供されているようなのでそれとの組み合わせを想定していると思います(無知故、直操作でご容赦)。確かMicrobitのPythonIDEのようなものが提供されている筈。。。参考迄にcode.pyの内容は以下の通り↓

import board
import digitalio
import neopixel
import simpleio
import time
import pwmio

# Initialize LEDs
# LEDs placement on Maker Pi RP2040
LED_PINS = [board.GP0, 
            board.GP1,
            board.GP2,
            board.GP3,
            board.GP4,
            board.GP5,
            board.GP6,
            board.GP7,
            board.GP8,
            board.GP9,
            board.GP17,
            board.GP19,
            board.GP16,
        board.GP18]

LEDS = []
for pin in LED_PINS:
    # Set pins as digital output
    digout = digitalio.DigitalInOut(pin)
    digout.direction = digitalio.Direction.OUTPUT
    LEDS.append(digout)

# Initialize Neopixel RGB LEDs
pixels = neopixel.NeoPixel(board.GP11, 2)
pixels.fill(0)

# Melody
MELODY_NOTE = [659, 659, 0, 659, 0, 523, 659, 0, 784]
MELODY_DURATION = [0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.2]

# Define pin connected to piezo buzzer
PIEZO_PIN = board.GP22

# Initialize buttons
btn1 = digitalio.DigitalInOut(board.GP20)
btn1.direction = digitalio.Direction.INPUT
btn1.pull = digitalio.Pull.UP

# -------------------------------------------------
# ON START: Show running light and play melody
# -------------------------------------------------
for i in range(len(LEDS)):
    LEDS[i].value = True
    
    if i < len(MELODY_NOTE):
        # Play melody tones
        simpleio.tone(PIEZO_PIN, MELODY_NOTE[i], duration=MELODY_DURATION[i])
    else:
        # Light up the remainding LEDs
        time.sleep(0.15)

# Turn off LEDs one-by-one very quickly
for i in range(len(LEDS)):
    LEDS[i].value = False
    time.sleep(0.02)


color = 0
state = 0

# -------------------------------------------------
# FOREVER LOOP: Check buttons & animate RGB LEDs
# -------------------------------------------------
while True:
    
    # Check button 1 (GP20)
    if not btn1.value:  # button 1 pressed
        # Light up all LEDs
        for i in range(len(LEDS)):
            LEDS[i].value = True
            
        
        # Play tones
        simpleio.tone(PIEZO_PIN, 262, duration=0.1)
        simpleio.tone(PIEZO_PIN, 659, duration=0.15)
        simpleio.tone(PIEZO_PIN, 784, duration=0.2)
        simpleio.tone(PIEZO_PIN, 984, duration=0.25)

        
        
    # Animate RGB LEDs
    if state == 0:
        if color < 0x101010:
            color += 0x010101   # increase rgb colors to 0x10 each
        else:
            state += 1
    elif state == 1:
        if (color & 0x00FF00) > 0:
            color -= 0x000100   # decrease green to zero
        else:
            state += 1
    elif state == 2:
        if (color & 0xFF0000) > 0:
            color -= 0x010000   # decrease red to zero
        else:
            state += 1
    elif state == 3:
        if (color & 0x00FF00) < 0x1000:
            color += 0x000100   # increase green to 0x10
        else:
            state += 1
    elif state == 4:
        if (color & 0x0000FF) > 0:
            color -= 1          # decrease blue to zero
        else:
            state += 1
    elif state == 5:
        if (color & 0xFF0000) < 0x100000:
            color += 0x010000   # increase red to 0x10
        else:
            state += 1
    elif state == 6:
        if (color & 0x00FF00) > 0:
            color -= 0x000100   # decrease green to zero
        else:
            state += 1
    elif state == 7:
        if (color & 0x00FFFF) < 0x001010:
            color += 0x000101   # increase gb to 0x10
        else:
            state = 1
    pixels.fill(color)  # fill the color on both RGB LEDs
    
    
    # Sleep to debounce buttons & change the speed of RGB color swipe
    time.sleep(0.05)

 このコードを書かれた方は(親しみが湧くように)ピエゾブザーで昔のゲーム機のメロディを再現する為にコードの多くを使っている様でゲームに無縁な私でも大昔のゲーム機っぽい音がしてる気がする。ボタン(GP20)押下で動作が変わる。RGBLEDを2個搭載しておりPWMでじわじわ色を変化させたり色々頑張っている↓

f:id:aki_iic:20220403142440j:plain

RGBLED

5.まとめ

・その名の通りMAKER NANOのRP2040バージョン

・Groveへの変換ケーブル添付で2個のGroveデバイスを本機だけで接続可能

・プレインストールされているCircuitPythonで遊べる(Arduino C/C++を使わない人向け)

 arduinoを使うにはCircuitPythonを消去しなければならないので勿体無い・面倒くさいからCircuitPythonで遊んでみる。この類の環境はがじるねでrubyの方が早かった印象があるが言語の知名度というかエコシステムの暴力でPythonに制圧されそうな今、だろうか。

2022/04/09 12:53追記:

 Ubuntu20.04でmu-editorを導入した。導入方法は

pip3 install mu-editor

 で十分で仮想環境がどうちゃらこうちゃらとか気にしない。。。

f:id:aki_iic:20220409125629p:plain

mu-editor with MAKER NANO RP2040 CircuitPython

 導入はしたもののマウントされたcode.pyをテキストエディタで直接編集・保存した方が単純で性に合ってる気がする。複雑怪奇なIDEはもとよりIDEはあまり好きではないというか頭が単純なので単純な方が理解しやすいだけの事ではある(頭悪いって言ってます)。