2024年3月17日日曜日

RP2040-ZERO+micropythonにてGPS AT6558の日時緯度経度を丸形液晶GC9A01に表示してみる

以前の記事。
RP2040-ZEROとGC9A01の試験→https://matsu-log.blogspot.com/2024/03/aitendom128gc9a01a-gc9a01rp2040-zero.html
GPS AT6558→https://matsu-log.blogspot.com/2024/03/gpsat6558.html

今度は、RP2040-ZEROに液晶とGPSを繋いで、緯度経度を液晶に表示してみる。


USART0を使いたいので、GP0,1を空ける。DCとRSTは、代わりにGP3,4に繋いでおく。

■液晶

  1. GND → GND
  2. VCC → 3V3
  3. SCL → GP6/SPI0 SCK
  4. SDA → GP5/SPI0 TX
  5. RES → GP3
  6. DC → GP4
  7. CS → GP5/SPI0 CSn
  8. BLK → 未使用
■GPS
  1. GND → GND
  2. VCC → 3V3
  3. TX → GP1
    ※RXは繋がなくてもいいので無視

Fritzingで作った回路図。探してみると、RP2040-ZEROなどたくさんのAdd-onパーツが公開されていて非常に有難い。さすがにGPSは無かったので、似たような部品と汎用ヘッダで代用。

以下のようなコードで、$GNGGAと$GNRMCから日時と緯度経度を吸い上げて、液晶に表示した。液晶、GPSをうまく繋げられていたので、これはすんなり作れた。

以下、micropythonコード。

from machine import Pin, SPI
import gc9a01py as gc9a01
import time

import vga2_8x16 as font

from machine import UART
uart = UART(0, baudrate=9600, tx=0, rx=1)

# GPSの結果から日時と緯度経度を抜き出す
def GPS(input):
    if input is None:
        return ("","","","")
    msgs = str(input)[2:-1].split("\\r\\n")
    lat = ""
    lgt = ""
    date = ""
    time = ""
    for msg in msgs:
        if msg[0:6] is "$GNGGA":
            item = msg.split(",")
            if len(item) <= 4:
                continue
            #print(item[1], item[2], item[4])
            time = item[1]
            lat = item[2]
            lgt = item[4]
        elif msg[0:6] is "$GNRMC":
            item = msg.split(",")
            if len(item) <= 10:
                continue
            time = item[1]
            lat = item[3]
            lgt = item[5]
            date = item[9]
    return (date, time, lat, lgt)

# GC9A01初期化
SPI_PORT = 0
SPI_BAUDRATE = 60000000
RESET_PIN = Pin(3, Pin.OUT)
DC_PIN = Pin(4, Pin.OUT)
CS_PIN = Pin(5, Pin.OUT)

spi = SPI(SPI_PORT, baudrate=SPI_BAUDRATE, sck=Pin(6), mosi=Pin(7))
tft = gc9a01.GC9A01(spi=spi, dc=DC_PIN, cs=CS_PIN, reset=RESET_PIN, backlight=None, rotation=0)

bgcolor = gc9a01.color565(0x00, 0x44, 0x22)
tft.fill(bgcolor)

tft.text(font,"GPS Tracker",80,20,gc9a01.BLACK,bgcolor)
while True:
    msg = uart.read()
    ret = GPS(msg)
    pos = 40
    for item in ret:
        if not item is "":
            tft.text(font,item,80,pos,gc9a01.BLACK,bgcolor)
        pos += 20
    tft.fill_rect(88,80,24,40, gc9a01.GREEN)
    time.sleep(0.5)

0 件のコメント:

コメントを投稿