Tiny2040 でLチカ

最終更新日

小さいなRPi Picoともいえる、 Tiny2040 を購入。

Lチカが意外と面倒だったのでメモ。

CircuitPython 化

とりあえず、MicroPythonが入っているので、 CircuitPython化する。

download ページ。

現時点でdonwloadできたのは、 version 7.2.3

Mac ならどdownloadした .uf2ファイルを、USBメモリのように見えるTiny2040にコピーする。

cp adafruit-circuitpython-pimoroni_tiny2040-en_US-7.2.3.uf2 /Volume/RPI-RP2

勝手にrebootする。

Lチカ

Lチカするためのボード中心部にあるLEDは、R,G,Bをそれぞれ GP18, GP19, GP20 に割り当ててある。

ただ、RED に光らせるなら、GP18 をONにすればいい。
が、明るい赤や暗い赤という表現は、PMWという電圧じゃなくて、電圧をかける時間を細かく制御する方式になっている。

つまり、一定期間に点灯時間を長くすると、明るい。
反対に、点灯時間を短くすると暗い。

ある程度の速さになると、ずっと暗いのか、よく消灯し&たまに点灯しているか、区別がつかない。

GP18 が見つからないエラー

サンプルプログラムを見つけて、ampy で、実行すると、エラーがでる。

ampy.pyboard.PyboardError: ('exception', b'', b'Traceback (most recent call last):\r\n  File "<stdin>", line 11, in <module>\r\nAttributeError: \'module\' object has no attribute \'GP19\'\r\n')

board object の定義を探す

ええー!と、設定を探したのでメモ

まず、screen でTiny2040とシリアル接続する。

$ screen /dev/tty.usbmodemXXXXXXX

REPLモードにしたら、以下のように確認する。

Adafruit CircuitPython 7.2.3 on 2022-03-16; Pimoroni Tiny 2040 (8MB) with rp2040
>>> import board
>>> dir(board)
['__class__', '__name__', 'A0', 'A1', 'A2', 'A3', 'GP0', 'GP1', 'GP2', 'GP26', 'GP26_A0', 'GP27', 'GP27_A1', 'GP28', 'GP28_A2', 'GP29', 'GP29_A3', 'GP3', 'GP4', 'GP5', 'GP6', 'GP7', 'LED_B', 'LED_G', 'LED_R', 'USER_SW', 'board_id']

GP18 の代わりに LED_R がある!

program

RED, GREEN, BLUE の順に、光がふよふよするプログラム。

# SPDX-FileCopyrightText: 2018 Kattni Rembor for Adafruit Industries
#
# SPDX-License-Identifier: MIT

"""CircuitPython Essentials: PWM with Fixed Frequency example."""
import time
import board
import pwmio

# LED setup for most CircuitPython boards:
leds = { "r": None, "g": None, "b": None }
leds["r"] = pwmio.PWMOut(board.LED_R, frequency=5000, duty_cycle=0)
leds["g"] = pwmio.PWMOut(board.LED_G, frequency=5000, duty_cycle=0)
leds["b"] = pwmio.PWMOut(board.LED_B, frequency=5000, duty_cycle=0)
# LED setup for QT Py M0:
# led = pwmio.PWMOut(board.SCK, frequency=5000, duty_cycle=0)

while True:
    for color in leds.keys():
        led = leds[color]
        for i in range(100):
            # PWM LED up and down
            if i < 50:
                led.duty_cycle = int(i * 2 * 65535 / 100)  # Up
            else:
                led.duty_cycle = 65535 - int((i - 50) * 2 * 65535 / 100)  # Down
            time.sleep(0.01)
        led.duty_cycle = 65535  # OFF
    time.sleep(1)

シェアする