
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
さんが
2025/05/12
に
編集
をしました。
(メッセージ: 初版)
-
keiske-hongyo
さんが
2025/05/12
に
編集
をしました。
-
keiske-hongyo
さんが
2025/05/12
に
編集
をしました。
ログインしてコメントを投稿する