keiske-hongyoのアイコン画像
keiske-hongyo 2025年05月12日作成 (2025年05月12日更新) © CC BY-NC-SA 4+
セットアップや使用方法 セットアップや使用方法 閲覧数 233
keiske-hongyo 2025年05月12日作成 (2025年05月12日更新) © CC BY-NC-SA 4+ セットアップや使用方法 セットアップや使用方法 閲覧数 233

TinyGoを使用したカラーグラフィック液晶の制御

TinyGoを使用したカラーグラフィック液晶の制御

はじめに

前回はTinyGOを使用したグラフィック液晶(AQM1248)テストプログラムでモノクロのグラフィック液晶について紹介しました。今回は、カラーグラフィック液晶であるili9341を使用した制御プログラムを紹介します。また、漢字も表示できるようにGT20L16JTYを漢字や全角の平仮名や片仮名も表示できるようにしています。合わせて、ili9341をタッチ制御もできるのでタッチ制御についても確認してみました。

使用部品

今回使用する部品の一覧です。

部品名 型番・値 備考
マイコン Raspberry pi pico
グラフィックLCDモジュール MSP2807 カラーLCD 320×240 タッチパネル SDカード
漢字フォントROM GT20L16JTY
接続用コネクタ B12B-XH-A JST XH端子コネクタ

回路について

今回の回路図になります。
回路図
SPIで通信を行い、画面表示の制御しています。また、タッチパネルやSDカードもSPIで通信ができるようにしています。
はじめはこの回路をブレッドボードで製作しましたが今後の利用のことを考え、プリント基板化しました。
プリント基板
部品を取り付けた写真です。
部品取り付け

プログラムについて

今回もTinyGoを使用して、プログラムを惑星しました。カラー液晶のILI9341をについては、Tinygoのドライバがあるので下のコマンドでインストールしてください。

driversのインストール

go get tinygo.org/x/drivers

また、タッチパネルや漢字ROMについてはgithubにあるので、そちらからダウンロードをしてもらえたらと思います。
メインルーチンを掲載しておきます。今回のサンプルは液晶の表示とタッチされた時の座標の表示、ある範囲に表示している文字をタッチすると赤色で表示するようにしています。

main.go

package main import ( "fmt" "ili9341/lcdProc" "machine" "time" "tinygo.org/x/drivers/ili9341" ) func timer1ms(ch chan<- bool) { for { time.Sleep(1 * time.Millisecond) ch <- true } } func main() { var cnt uint8 = 0 var str string machine.SPI0.Configure(machine.SPIConfig{ Frequency: 24000000, }) display := lcdProc.New( machine.SPI0, // SPI Bus machine.GP15, // DC machine.GP17, // CS machine.GP14, // Reset machine.GP12, // Touch CSN machine.GP13, // Tocuh IRQ machine.GP11, // KanjiFont CSN ) display.Touch.SetTouchIqr() display.Lcd.SetRotation(ili9341.Rotation90) width, height := display.Lcd.Size() display.Lcd.FillRectangle(0, 0, width/2, height/2, lcdProc.White) display.Lcd.FillRectangle(width/2, 0, width/2, height/2, lcdProc.Red) display.Lcd.FillRectangle(0, height/2, width/2, height/2, lcdProc.Green) display.Lcd.FillRectangle(width/2, height/2, width/2, height/2, lcdProc.Blue) display.Lcd.FillRectangle(width/4, height/4, width/2, height/2, lcdProc.Black) ch := make(chan bool) go timer1ms(ch) for { select { case <-ch: cnt++ break } str = fmt.Sprintf("w = %3d h=%3d", width, height) display.LcdPrint(100, 100, str, lcdProc.Orange, lcdProc.Black) str := fmt.Sprintf("カウント = %3d", cnt) display.LcdPrint(100, 130, str, lcdProc.White, lcdProc.Black) if display.GetTouch() { str = fmt.Sprintf("Not tocuched ") display.LcdPrint(100, 150, str, lcdProc.White, lcdProc.Black) display.LcdPrint(120, 200, "ここをタッチ", lcdProc.Red, lcdProc.Black) } else { x, y := display.GetPos() str = fmt.Sprintf("x=%4d y=%4d", x, y) display.LcdPrint(100, 150, str, lcdProc.White, lcdProc.Black) if (x > 120 && x < 220) && (y > 200 && x < 216) { // 文字の範囲内 display.LcdPrint(120, 200, "タッチ!!!", lcdProc.White, lcdProc.Black) } else { // 文字の範囲外 display.LcdPrint(120, 200, "ここをタッチ", lcdProc.Red, lcdProc.Black) } } } }

画面表示を高速にするためにSPIのクロックを24MHzにしていますが、タッチパネル制御のICはその速度に対応していないので2MHzにし、変更して制御しています。そのため、画面表示とタッチパネルの制御を行う前にSPIのクロックを変更しています。

最後に

今回はTinyGoでタッチパネル機能付きのカラー液晶の制御について紹介しました。前回のTinyGOを使用したグラフィック液晶(AQM1248)テストプログラムでは表示画面が狭く、カラーが利用できないので、色々な場面で利用できると思います。ArduinoやMicroPythonがライブラリが充実して簡単にプログラムが作成できるので利用している人が多いとは思いますが、TinyGoもライブラリが多くあり、シンプルで書きやすいプログラム言語なので興味を持たれた方はチャレンジしてほしいと思います。

keiske-hongyoのアイコン画像
マイコンを活用した電子工作に取り組んでいます。 もしよかったら、色々とアドバイスをいただけたらと思います。
ログインしてコメントを投稿する