Raspberry Pi で ST7735ドライバ使用TFT液晶

前回、Raspberry Pi PicoでST7735Sドライバを使う1.8インチTFT液晶を動かしました。その後、ATOMS3 LITEなどでも動かしてみましたが話題性に乏しいので、Raspberry Piの方で動かしてみましました。

1.ドライバの入手

Raspberry Pi用のST7735ドライバは、以下で取得できます。

このリンク先で書かれている内容を忠実に行うことで、1.8インチTFT液晶を使うことができます。また、サンプルも用意されています。ただし、サンプルは128×128ドットのTFT液晶用であることに注意してください。

2.接続図

上記サイトで接続方法も説明されているので必要ないかとも思いましたが、少し分かりづらいので載せてみました。左がTFT液晶で右がRaspberry Piです。

GND -> GND
VCC -> 3.3V電源
SCL -> GPIO11
SDA -> GPIO10
RES -> GPIO25
DC -> GPIO24
CS -> GPIO8

1.8インチフルカラー128×160 SPIフルカラーTFT LDディスプレイモジュールST7735S 3.3V DIYキット用OLED電源の交換

3.サンプルプログラムを動かす

サンプルプログラムはいくつか用意されていて、動かしたいサンプルプログラムはMakefileで選択してビルドする必要があります。

SRC=src/Hello_world
#SRC=src/Hello_world_SWSPI
#SRC=src/Text_Tests
#SRC=src/Graphic_Tests
#SRC=src/Function_Tests
#SRC=src/Bitmap_Tests
#SRC=src/Frame_rate_test
#SRC=src/Frame_rate_test_2
# ************************************************

最初は「Hello_world」がビルドされるようになっています。そして、コメントをON/OFFすることで目的のサンプルプログラムを動かすことができます。

また、includeパスがインストールによっては通らない場合があると思うので、そこは通るように修正してください。さらにSPIインタフェイスを使いますから、Raspberry Piの設定で有効にしておいてください。

サンプルを動作させてみると、何か色が変です。どうも赤と青が入れ替わっているみたいで、これはPicoでも設定するフラグがありました。

今回は、PCB_TYPEの指定で、「TFT_ST7735S_Black」を指定する必要がありました。

	if(myTFT.TFTInitPCBType(myTFT.TFT_ST7735S_Black, SCLK_FREQ, SPI_CE_PIN) != 0)
	// if(myTFT.TFTInitPCBType(myTFT.TFT_ST7735R_Red, SCLK_FREQ, SPI_CE_PIN) != 0)

無事、正常な色で表示ができました。

その後、サンプルを一通り動かしてみましたが、さすがにRaspberry Pi 4 Model Bの処理能力の高さが、以前行ったRaspberry Pi Picoよりも際立ちました。グラフィックを処理しても、モッサリ感なく表示します。

4. 128×160ドットで画像を表示してみる

サンプルと大して変わりませんが、使うTFT液晶の解像度が128×160ドットですので、プログラムを合わせて作ってみます。画像は、24ビットビットマップ画像を用意します。Raspberry Piなので、ディレクトリ構成と画像ファイルで画像を操作できることが便利ですね。

void MyTest(void)

{

	std::cout << "MyTest 24 bit color image bitmaps from the file system" << std::endl;
	myTFT.TFTfillScreen(ST7735_BLACK);
	char teststr1[] = "My Bitmap";
	myTFT.TFTdrawText(5, 5, teststr1, ST7735_WHITE, ST7735_BLACK, 2);
	TFT_MILLISEC_DELAY(TEST_DELAY1);

	FILE *pFile ;
	size_t pixelSize = 3;
	uint8_t* bmpBuffer = nullptr;

	bmpBuffer = (uint8_t*)malloc((128 * 160) * pixelSize);
	if (bmpBuffer == nullptr)
	{
		std::cout << "Error My Test : MALLOC could not assign memory " << std::endl;
		return;
	}

	pFile = fopen("bitmap/bitmap24images/img_24bit.bmp", "r");

	if (pFile == nullptr)  // Check file exists
	{
		std::cout << "Error Test 403: File does not exist" << std::endl;
		free(bmpBuffer);
		return;
	}

	fseek(pFile, 54, 0); // Put file in Buffer
	fread(bmpBuffer, pixelSize, 128 * 160, pFile);
	fclose(pFile);

	if(myTFT.TFTdrawBitmap24(0, 0, bmpBuffer, 128, 160) != 0)
	{// Check for success 0x00
		free(bmpBuffer);
		return;
	}

	TFT_MILLISEC_DELAY(TEST_DELAY5);
	free(bmpBuffer);  // Free Up Buffer
}

サンプルソースに上記関数を足しています。実行結果が、一番最初の画像になります。これで、ビットマップ画像を自由に表示できますね。PNGやJPEGの方が良いですが、それについても今後、調べてみます。

5.Raspberry Piでも小型TFT液晶は便利

ちらつきのない表示もできています

Raspberry PiはHDMIディスプレイを接続できることから、今まで小型TFT液晶を使わないできました。しかしながら、Raspberry Piでも小型TFT液晶の表示はいいですね。小型TFT液晶を使う場合でCPUパワーを要する場合は、Raspberry Piの選択も良いと思いました。

特に、Raspberry Pi Zero 2で使っていきたいと思います。

※やっぱり、このTFT液晶は130×161ドットの表示サイズのようです。今回はあえて128×160で処理しています。