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)