モチベーション
- Raspberry pi pico W を持ってるけど、入力と出力のインターフェースを付けたい
- →思い立ってタッチスクリーンを買ったので、繋げてみた
- →ゆくゆくは、ライブラリを使ったり、Rustで書いたりしてみたい…
使うもの
- Raspberry pi pico W
- WAVESHARE-27057(waveshare 1.69インチタッチスクリーンディスプレイ)
- Windows環境
- VSCode + Raspberry pi pico 拡張機能
それぞれの仕様ページ
Raspberry pi pico W
WAVESHARE-27057(waveshare 1.69インチタッチスクリーンディスプレイ)
繋ぎ方
Raspberry pi pico W
まずはPicoW のGPIOの場所を確認。
https://datasheets.raspberrypi.com/picow/pico-w-datasheet.pdf より拝借。
WAVESHARE-27057(waveshare 1.69インチタッチスクリーンディスプレイ)
picoとディスプレイの配線
配線はWaveShareのページを参考にしています。
ピン名(上から順) | ピン概要 | PicoW GPIO |
---|---|---|
VCC | 電源(3.3 / 5 V 入力) | 3.3V(36番:右の上から5番目) |
GND | グランド | GND(38番:右の上から3番目) |
LCD_DIN | SPI MOSI ピン | GP11(15番:左の下から6番目) |
LCD_CLK | SPI クロック ピン | GP10(14番:左の下から7番目) |
LCD_CS | LCD チップセレクション、Low アクティブ | GP9(12番:左の下から9番目) |
LCD_DC | LCD データ/コマンドセレクション(データ用 High、コマンド用 Low) | GP14(19番:左の下から2番目) |
LCD_RST | LCD リセット、Low アクティブ | GP8(11番:左の下から10番目) |
LCD_BL | LCD バックライト | GP15(20番:左の下から1番目) |
TP_SDA | タッチパネル データピン | GP6(9番:左の上から9番目) |
TP_SCL | タッチパネル クロックピン | GP7(10番:左の上から10番目) |
TP_RST | タッチパネル リセット、Low アクティブ | GP16(21番:右の下から1番目) |
TP_IRQ | タッチパネル 割り込みピン | GP17(22番:右の下から2番目) |
WAVESHARE-27057の仕様確認
このモジュールは、
タッチ制御(Touch Driver)が CST816T チップ
ディスプレイ制御(Display Driver)が ST7789V2 チップを使ってます。
C++環境
PlatformIO(Arduino系)版と、
Raspberry pi 公式環境(pico-sdk)のどちらか迷ったけど、
WaveShareの公式サンプルがpico-sdkを使ってるので、公式環境を使います。
WaveShare公式Wikiのサンプルを動かす
WaveShare 公式Wiki
デモのuf2ファイルを動かす
以下のページの「Click to download the demo, decompress the package and go to the 1.69inch_Touch_LCD_Pico folder.」からデモをダウンロードする。
まずは格納されているuf2ファイルを動かしてみます。
1.69inch_Touch_LCD_Pico/c/uf2/1.69inch-Touch-LCD-Module-Test.uf2
無事に何かしら表示されました。
デモを自分でビルドして動かす
ダウンロードしたzipには、ソースもすべて格納されておりますので、これもビルドして動かします。
pico-sdkが必要なので、 PlatformIOなどでは動きません。
VSCodeのraspberry pi pico開発環境では、pico環境だと認識するためのCMakeのお約束があるので、デモソースに付け足す必要があります。
# お約束ここから
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Initialise pico_sdk from installed location
# (note this can come from environment, CMake cache etc)
# == DO NOT EDIT THE FOLLOWING LINES for the Raspberry Pi Pico VS Code Extension to work ==
if(WIN32)
set(USERHOME $ENV{USERPROFILE})
else()
set(USERHOME $ENV{HOME})
endif()
set(sdkVersion 2.1.0)
set(toolchainVersion 13_3_Rel1)
set(picotoolVersion 2.1.0)
set(picoVscode ${USERHOME}/.pico-sdk/cmake/pico-vscode.cmake)
if (EXISTS ${picoVscode})
include(${picoVscode})
endif()
# ====================================================================================
set(PICO_BOARD pico_w CACHE STRING "Board type")
# お約束ここまで
cmake_minimum_required(VERSION 3.12)
include(pico_sdk_import.cmake)
project(Pico_ePaper_Code)
pico_sdk_init()
#添加编译子目录
add_subdirectory(./lib/Config)
add_subdirectory(./lib/LCD)
add_subdirectory(./lib/Fonts)
add_subdirectory(./lib/GUI)
add_subdirectory(./examples)
#添加头文件目录
include_directories(./examples)
include_directories(./lib/Config)
include_directories(./lib/Fonts)
include_directories(./lib/GUI)
include_directories(./lib/LCD)
# 生成可执行文件
add_executable(main
main.c
)
# enable usb output, disable uart output
pico_enable_stdio_usb(main 1)
pico_enable_stdio_uart(main 1)
# create map/bin/hex/uf2 file etc.
pico_add_extra_outputs(main)
target_link_libraries(main examples LCD GUI Fonts Config pico_stdlib hardware_spi hardware_i2c )
さらに、 raspberry pi pico 拡張機能の「Run Project」を実行すると、
プロジェクトフォルダ/build/Pico_ePaper_Code.elf
を書き込もうとするので、
プロジェクトフォルダ/build/main.uf2
を手動で書き込む必要があります。
このあたりはどうしてこういう動きなのかわからない…
ひとまず、これで自分がビルドしたものも動かすことができました。
「Error: Not Detected CST816T.」が出てタッチパネルが反応しないよ…
zipに格納されていたuf2も、自分で格納したuf2も、どちらもシリアルコンソールに Error: Not Detected CST816T.
が表示されています。
タッチパネルがまったく動きません。
Touch_1IN69_WhoAmI
関数でfalseが返ってくることがわかり、どんな値が返ってくるかを調べました。
/******************************************************************************
function : 读取ID
parameter: CST816T : 0xB5
******************************************************************************/
UBYTE Touch_1IN69_WhoAmI()
{
printf("Touch_1IN69_WhoAmI: %d\r\n", DEV_I2C_Read_Byte(address,0xA7));
if (DEV_I2C_Read_Byte(address,0xA7) == 0xB5)
return true;
else
return false;
}
10進数的には32
。16進数的には 0x20
でした。
CST816T は 0xB5 を返すのは、世間一般的には正しそうです。
ほかのライブラリを参照しました。
ということで、どうして0x20が返ってくるのか分からず…
ひとまず今日はこれで寝ます。
また続きを調べたくなったら追記します。