Adafruit QT Py RP2040
2021.06.07

YouTube でも紹介しています。画像をクリックすると再生できます。
今回は、Adafruit QT Py RP2040 にCircuitPythonをインストール、SDカードから画像ファイルを読込んで、TFTディスプレイに表示します。

Raspberry Pi Pico では、SPI,I2C,UARTで使用できるピンが多すぎて、どれを選択してよいかわからないとお悩みの方、
Adafruit の QT Py RP2040 ではその心配はありません。
複雑なデバイス制御を除き、機能が刻印されているピンと数本のGPIOを使えば、大抵は事足りてしまいます。
RP2040 32-bit Cortex M0+ dual-core running at ~125 MHz @ 3.3V logic and power
264 KB RAM / 8 MB SPI FLASH
Built-in RGB NeoPixel LED
Plug-and-play STEMMA QT
3.3V regulator with 600mA peak output
※STEMMA QT は Qwiic 互換I2Cコネクタです。
■PinOut
Built-in RGB NeoPixel LED
13 GPIO pins (11 breakout pads and two QT pads):
・Four 12 bit ADCs (one more than Pico)
・Two I2C ports (one on the QT connector, one on the breakout pads)
・SPI and UART peripherals
・PWM outputs on every IO pin
・There are 6 GPIO in consecutive order for PIO compatibility
■開発環境

■CircuitPython のインストール
Download CircuitPython 6.3.0

$ mkdir ~/QTPyRP2040
$ cd QTPyRP2040
$ wget https://downloads.circuitpython.org/bin/adafruit_qtpy_rp2040/en_US /adafruit-circuitpython-adafruit_qtpy_rp2040-en_US-6.3.0.uf2
QT Py のBOOTSELボタンを押しながら、ラズベリーパイにUSB接続します。
$ sudo fdisk -l
Disk /dev/sdb: 128 MiB, 134217728 bytes, 262144 sectors
Disk model: RP2
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000b3195
Device Boot Start End Sectors Size Id Type
/dev/sda1 1 262143 262143 128M e W95 FAT16 (LBA)
$ sudo mount /dev/sda1 /mnt/target
$ cp *.uf2 /mnt/target
$ sudo umount /mnt/target
$ sudo fdisk -l
Disk /dev/sdb: 7 MiB, 7340544 bytes, 14337 sectors
Disk model: QT Py RP2040
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
Device Boot Start End Sectors Size Id Type
/dev/sdb1 1 14336 14336 7M 1 FAT12
CircuitPython インストール後は、QT Pyがデバイスとして認識されます。
ファイル更新の際に、BOOTSELボタンを押してはいけません。
QT Py のSPI FLASH内には下記のようなファイル群が作成されています。
この中の、code.py を編集することでプログラムを実行します。
$ sudo mount /dev/sdb1 /mnt/target
$ ls -al /mnt/target
drwxr-xr-x 4 pi pi 16384 1月 1 1970 .
drwxr-xr-x 4 root root 4096 2月 7 15:08 ..
-rw-r--r-- 1 pi pi 0 1月 1 2020 .Trashes
drwxr-xr-x 2 pi pi 1024 1月 1 2020 .fseventsd
-rw-r--r-- 1 pi pi 0 1月 1 2020 .metadata_never_index
-rw-r--r-- 1 pi pi 78 1月 1 2020 boot_out.txt
-rw-r--r-- 1 pi pi 22 1月 1 2020 code.py
drwxr-xr-x 2 pi pi 1024 1月 1 2020 lib
■Mu エディタのインストール
$ sudo apt-get install mu-editor

最初のMuエディタ起動時に、モードを設定します。ここでは「Adafruit CircuitPython」を選択します。
■QT Py RP2040 NeoPixel LEDを試す
NeoPixel LED を光らせるためには、下記のMicorPythonライブラリが必要になります。
* neopixel.mpy
* adafruit_pypixelbuf.mpy
Ref.Adafruit CircuitPython Module Install
GitHubから、Adafruit CircuitPythonのライブラリをダウンロードします。

$ wget https://github.com/adafruit/Adafruit_CircuitPython_Bundle
/releases/download/20210601/adafruit-circuitpython-bundle-6.x-mpy-20210601.zip
$ unzip adafruit-circuitpython-bundle-6.x-mpy-20210601.zip
$ cd adafruit-circuitpython-bundle-6.x-mpy-20210601
$ cd lib
$ sudo mount /dev/sda1 /mnt/target
$ cp neopixel.mpy /mnt/target/lib
$ cp adafruit_pypixelbuf.mpy /mnt/target/lib
LEDを光らせる程度のコードでしたら、マウントしたディレクトリ内にある code.py を直接編集したほうが早いかもしれません。
$ vi /mnt/target/code.py
import time
import board
import neopixel
led = neopixel.NeoPixel(board.NEOPIXEL, 1)
def colorwheel(pos):
# Input a value 0 to 255 to get a color value.
# The colours are a transition r - g - b - back to r.
if pos < 0 or pos > 255:
return 0, 0, 0
if pos < 85:
return int(255 - pos * 3), int(pos * 3), 0
if pos < 170:
pos -= 85
return 0, int(255 - pos * 3), int(pos * 3)
pos -= 170
return int(pos * 3), 0, int(255 - (pos * 3))
led.brightness = 0.3
i = 0
while True:
i = (i + 1) % 256 # run from 0 to 255
led.fill(colorwheel(i))
time.sleep(0.01)
$ sudo umount /mnt/target
muエディタで編集する場合は、シリアルボタンを押して、シリアルウィンドウを開いておくと、構文エラーなどが表示されます。
保存ボタンを押して、code.py を上書きします。


■Adafruit 1.54" 240x240 TFT LCD Display with MicroSD - ST7789
ディスプレイとSDカード一体型のモジュールです。
下記のように配線しました。TC~BLはピンは任意です。
| ST7789 | - | QT Py RP2040 |
| Vin | - | 3.3V |
| GND | - | GND |
| SCK | - | SCK |
| MISO | - | MISO |
| MOSI | - | MOSI |
| TC | - | A0 |
| RT | - | A1 |
| DC | - | A2 |
| CC | - | A3 |
| BL | - | SDA |
※BL(BackLight)がSDAと結線されていますが、このSDAはPWMピンとして使用できます。
■SDカードのファイル一覧取得
$ cd adafruit-circuitpython-bundle-6.x-mpy-20210601
$ cd lib
$ sudo mount /dev/sda1 /mnt/target
$ cp adafruit_sdcard.mpy /mnt/target/lib
$ cp -r adafruit_bus_device /mnt/target/lib
$ sudo umount /mnt/target
$ vi code.py
import os
import adafruit_sdcard
import board
import busio
import digitalio
import storage
SD_CS = board.A3
# Connect to the card and mount the filesystem.
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
cs = digitalio.DigitalInOut(SD_CS)
sdcard = adafruit_sdcard.SDCard(spi, cs)
vfs = storage.VfsFat(sdcard)
storage.mount(vfs, "/sd")
def print_directory(path, tabs=0):
for file in os.listdir(path):
stats = os.stat(path + "/" + file)
filesize = stats[6]
isdir = stats[0] & 0x4000
if filesize < 1000:
sizestr = str(filesize) + " by"
elif filesize < 1000000:
sizestr = "%0.1f KB" % (filesize / 1000)
else:
sizestr = "%0.1f MB" % (filesize / 1000000)
prettyprintname = ""
for _ in range(tabs):
prettyprintname += " "
prettyprintname += file
if isdir:
prettyprintname += "/"
print('{0:<40} Size: {1:>10}'.format(prettyprintname, sizestr))
# recursively print directory contents
if isdir:
print_directory(path + "/" + file, tabs + 1)
print("Files on filesystem:")
print("====================")
print_directory("/sd")

シリアルモニターにSDカード内のファイル一覧が表示されます。
■TGA画像の表示
SDカードから、TGA画像ファイルを読込み、TFTディスプレイに表示します。
$ cd adafruit-circuitpython-bundle-6.x-mpy-20210601
$ cd lib
$ sudo mount /dev/sda1 /mnt/target
$ cp -r adafruit_rgb_display /mnt/target/lib
$ cp adafruit_st7789.mpy /mnt/target/lib
$ sudo umount /mnt/target
import adafruit_sdcard
import storage
import busio
import digitalio
import board
import displayio
import pwmio
from adafruit_rgb_display import color565
from adafruit_rgb_display.st7789 import ST7789
displayio.release_displays()
sd_cs = board.A3
tft_cs = board.A0
tft_dc = board.A2
tft_reset = board.A1
BAUDRATE = 24000000
spi_mosi = board.MOSI
spi_miso = board.MISO
spi_clk = board.SCK
spi = busio.SPI(spi_clk, spi_mosi,spi_miso)
cs = digitalio.DigitalInOut(sd_cs)
sdcard = adafruit_sdcard.SDCard(spi, cs)
vfs = storage.VfsFat(sdcard)
storage.mount(vfs, "/sd")
# Set up our pin as a PWM output at 500Hz
backlight = pwmio.PWMOut(board.SDA, frequency=500, duty_cycle=8192)
display = ST7789(
spi,
rotation=0,
width=240,
height=240,
x_offset=0,
y_offset=75,
baudrate=BAUDRATE,
cs=digitalio.DigitalInOut(tft_cs),
dc=digitalio.DigitalInOut(tft_dc),
rst=digitalio.DigitalInOut(tft_reset))
display.fill(0)
f=open('/sd/YoRHa2B.tga', 'rb')
f.read(18) # header
for y in range(240):
for x in range(240):
bgr = f.read(3)
display.pixel(x,y,color565(bgr[2],bgr[1],bgr[0]))
f.close()
while True:
pass
TGA画像ファイルは先頭18バイトがヘッダー情報、それに続いて1pixelにつき、BGR3バイトの色情報が続きます。
TGA形式では、色の並びはRGBではなく、BGRになっています。
【補足】バックライトが明るすぎたので、PWMで調整しています。
backlight = pwmio.PWMOut(board.SDA, frequency=500, duty_cycle=8192)

Adafruit QT Py RP2040 ではピンが少なすぎるという方には、Adafruit Feather RP2040 という製品もあります。

■参考文献
・Pinouts
・PIN REFERENCE: Adafruit QT Py RP2040
・Adafruit QT Py RP2040
・Adafruit: Micro SD Card Breakout Board Tutorial
・Adafruit_CircuitPython_ST7789
・MicroPython + ST7735でのbitmap画像表示
・CircuitPython PWM
|
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」
「一念発起して何かを始めても、いつも三日坊主で終わってしまう」
「色んなことを先延ばしにしたまま、時間だけが過ぎていく」
そこで本書では、そんな著者が独自に開発した、
まったく新しい目標達成メソッド「100日デザイン」について、
その知識と技術を、余すところなくご紹介します。
まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。
ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。
今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。
ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。
29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!
【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。
基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。
Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説!
500以上のサンプルを掲載。実行結果も確認。
全24章の包括的なチュートリアル。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。
Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード
電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)
|