Raspberry pi pico W と WAVESHARE-27057(waveshare 1.69インチタッチスクリーンディスプレイ) を C++で繋いで動くところまで確認した

## モチベーション

- Raspberry pi pico W を持ってるけど、入力と出力のインターフェースを付けたい
    - →思い立ってタッチスクリーンを買ったので、繋げてみた
    - →ゆくゆくは、ライブラリを使ったり、Rustで書いたりしてみたい…


## 使うもの

- Raspberry pi pico W
- WAVESHARE-27057(waveshare 1.69インチタッチスクリーンディスプレイ)
- Windows環境
- VSCode + Raspberry pi pico 拡張機能

## それぞれの仕様ページ

### Raspberry pi pico W

https://datasheets.raspberrypi.com/picow/pico-w-datasheet.pdf 


###  WAVESHARE-27057(waveshare 1.69インチタッチスクリーンディスプレイ)

https://www.waveshare.com/1.69inch-Touch-LCD-Module.htm


## 繋ぎ方

### Raspberry pi pico W

まずはPicoW のGPIOの場所を確認。

[https://datasheets.raspberrypi.com/picow/pico-w-datasheet.pdf](https://datasheets.raspberrypi.com/picow/pico-w-datasheet.pdf)　より拝借。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883973/5f7eac76-dba9-4776-abab-6812ba30ab2f.png)

###  WAVESHARE-27057(waveshare 1.69インチタッチスクリーンディスプレイ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883973/426c48be-db4f-492f-92a5-769744960810.png)


## picoとディスプレイの配線

配線はWaveShareのページを参考にしています。

https://www.waveshare.com/1.69inch-Touch-LCD-Module.htm

| ピン名（上から順） | ピン概要 | PicoW GPIO |
| --- | --- | --- |
| VCC | 電源（3.3 / 5 V 入力） | 3.3V（36番：右の上から5番目）<br> |
| GND | グランド | GND（38番：右の上から3番目）<br> |
| LCD\_DIN | SPI MOSI ピン | GP11（15番：左の下から6番目）<br> |
| LCD\_CLK | SPI クロック ピン | GP10（14番：左の下から7番目）<br> |
| LCD\_CS | LCD チップセレクション、Low アクティブ | GP9（12番：左の下から9番目）<br> |
| LCD\_DC | LCD データ/コマンドセレクション（データ用 High、コマンド用 Low） | GP14（19番：左の下から2番目）<br> |
| LCD\_RST | LCD リセット、Low アクティブ | GP8（11番：左の下から10番目）<br> |
| LCD\_BL | LCD バックライト | GP15（20番：左の下から1番目）<br> |
| TP\_SDA | タッチパネル データピン | GP6（9番：左の上から9番目）<br> |
| TP\_SCL | タッチパネル クロックピン | GP7（10番：左の上から10番目）<br> |
| TP\_RST | タッチパネル リセット、Low アクティブ | GP16（21番：右の下から1番目）<br> |
| TP\_IRQ | タッチパネル 割り込みピン | GP17（22番：右の下から2番目）<br> |


## WAVESHARE-27057の仕様確認

このモジュールは、

タッチ制御(Touch Driver)が CST816T チップ

ディスプレイ制御（Display Driver）が ST7789V2 チップを使ってます。

## C++環境

PlatformIO(Arduino系)版と、

Raspberry pi 公式環境（pico-sdk）のどちらか迷ったけど、

WaveShareの公式サンプルがpico-sdkを使ってるので、公式環境を使います。


## WaveShare公式Wikiのサンプルを動かす

WaveShare 公式Wiki

https://www.waveshare.com/wiki/1.69inch_Touch_LCD_Module 


### デモのuf2ファイルを動かす

以下のページの「Click to download [the demo](https://files.waveshare.com/wiki/1.69inch-Touch-LCD-Module/1.69inch_Touch_LCD_Pico.zip), decompress the package and go to the 1.69inch\_Touch\_LCD\_Pico folder.」からデモをダウンロードする。

https://www.waveshare.com/wiki/1.69inch_Touch_LCD_Module#Windows

まずは格納されているuf2ファイルを動かしてみます。

1.69inch_Touch_LCD_Pico/c/uf2/1.69inch-Touch-LCD-Module-Test.uf2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883973/400ad321-741c-4478-b0e0-b28b136faa91.png)
![](Files/696d99d5-0657-456c-a42d-32afed7cd4a4.jpg)<br>
<br>

無事に何かしら表示されました。

<br>

### デモを自分でビルドして動かす

ダウンロードしたzipには、ソースもすべて格納されておりますので、これもビルドして動かします。

pico-sdkが必要なので、 PlatformIOなどでは動きません。

VSCodeのraspberry pi pico開発環境では、pico環境だと認識するためのCMakeのお約束があるので、デモソースに付け足す必要があります。



```txt:CMakeLists.txt
# お約束ここから
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`  を手動で書き込む必要があります。

このあたりはどうしてこういう動きなのかわからない…

<br>

ひとまず、これで自分がビルドしたものも動かすことができました。


### 「Error: Not Detected CST816T.」が出てタッチパネルが反応しないよ…

zipに格納されていたuf2も、自分で格納したuf2も、どちらもシリアルコンソールに `Error: Not Detected CST816T.` が表示されています。

タッチパネルがまったく動きません。

<br>

`Touch_1IN69_WhoAmI` 関数でfalseが返ってくることがわかり、どんな値が返ってくるかを調べました。


```c:Touch_1in69.c
/******************************************************************************
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が返ってくるのか分からず…

----

ひとまず今日はこれで寝ます。

また続きを調べたくなったら追記します。