From cad7a741881c358caf1766b87523457655bc2dee Mon Sep 17 00:00:00 2001 From: Peter Hinch Date: Thu, 5 May 2022 18:39:05 +0100 Subject: [PATCH] Add working image. --- hardware_setup.py | 78 +++++++++++++------------------- images/debug/foo.py_working.png | Bin 0 -> 23286 bytes 2 files changed, 31 insertions(+), 47 deletions(-) create mode 100644 images/debug/foo.py_working.png diff --git a/hardware_setup.py b/hardware_setup.py index 02cf963..21ba6ed 100644 --- a/hardware_setup.py +++ b/hardware_setup.py @@ -1,56 +1,40 @@ -# ili9341_pico.py Customise for your hardware config +# hardware_setup.py Customise for your hardware config # Released under the MIT License (MIT). See LICENSE. -# Copyright (c) 2021 Peter Hinch +# Copyright (c) 2021 Peter Hinch, Ihor Nehrutsa -# As written, supports: -# ili9341 240x320 displays on Pi Pico -# Edit the driver import for other displays. +# Supports: +# Waveshare Pico LCD 1.14" 135*240(Pixel) based on ST7789V +# https://www.waveshare.com/wiki/Pico-LCD-1.14 +# https://www.waveshare.com/pico-lcd-1.14.htm -# Demo of initialisation procedure designed to minimise risk of memory fail -# when instantiating the frame buffer. The aim is to do this as early as -# possible before importing other modules. - -# WIRING -# Pico Display -# GPIO Pin -# 3v3 36 Vin -# IO6 9 CLK Hardware SPI0 -# IO7 10 DATA (AKA SI MOSI) -# IO8 11 DC -# IO9 12 Rst -# Gnd 13 Gnd -# IO10 14 CS - -# Pushbuttons are wired between the pin and Gnd -# Pico pin Meaning -# 16 Operate current control -# 17 Decrease value of current control -# 18 Select previous control -# 19 Select next control -# 20 Increase value of current control - -from machine import Pin, SPI, freq +from machine import Pin, SPI import gc +from drivers.st7789.st7789_4bit import * +SSD = ST7789 + +mode = LANDSCAPE # Options PORTRAIT, USD, REFLECT combined with | -from drivers.ili93xx.ili9341 import ILI9341 as SSD -freq(250_000_000) # RP2 overclock -# Create and export an SSD instance -pdc = Pin(8, Pin.OUT, value=0) # Arbitrary pins -prst = Pin(9, Pin.OUT, value=1) -pcs = Pin(10, Pin.OUT, value=1) -spi = SPI(0, baudrate=30_000_000) gc.collect() # Precaution before instantiating framebuf -ssd = SSD(spi, pcs, pdc, prst, usd=True) +# Conservative low baudrate. Can go to 62.5MHz. +spi = SPI(1, 30_000_000, sck=Pin(10), mosi=Pin(11), miso=None) +pcs = Pin(9, Pin.OUT, value=1) +prst = Pin(12, Pin.OUT, value=1) +pbl = Pin(13, Pin.OUT, value=1) +pdc = Pin(8, Pin.OUT, value=0) + +portrait = mode & PORTRAIT +ht, wd = (240, 135) if portrait else (135, 240) +ssd = SSD(spi, height=ht, width=wd, dc=pdc, cs=pcs, rst=prst, disp_mode=mode, display=TDISPLAY) -from gui.core.ugui import Display, quiet -# quiet() # Create and export a Display instance -# Define control buttons -nxt = Pin(19, Pin.IN, Pin.PULL_UP) # Move to next control -sel = Pin(16, Pin.IN, Pin.PULL_UP) # Operate current control -prev = Pin(18, Pin.IN, Pin.PULL_UP) # Move to previous control -increase = Pin(20, Pin.IN, Pin.PULL_UP) # Increase control's value -decrease = Pin(17, Pin.IN, Pin.PULL_UP) # Decrease control's value -# display = Display(ssd, nxt, sel, prev) # 3-button mode -display = Display(ssd, nxt, sel, prev, increase, decrease, 4) # Encoder mode +from gui.core.ugui import Display +# Define control buttons: adjust joystick orientation to match display +# Orientation is only correct for basic LANDSCAPE and PORTRAIT modes +pnxt, pprev, pin, pdec = (2, 18, 16, 20) if portrait else (20, 16, 2, 18) +nxt = Pin(pnxt, Pin.IN, Pin.PULL_UP) # Move to next control +sel = Pin(3, Pin.IN, Pin.PULL_UP) # Operate current control +prev = Pin(pprev, Pin.IN, Pin.PULL_UP) # Move to previous control +increase = Pin(pin, Pin.IN, Pin.PULL_UP) # Increase control's value +decrease = Pin(pdec, Pin.IN, Pin.PULL_UP) # Decrease control's value +display = Display(ssd, nxt, sel, prev, increase, decrease) diff --git a/images/debug/foo.py_working.png b/images/debug/foo.py_working.png new file mode 100644 index 0000000000000000000000000000000000000000..2a1593b4c0b830c05cdfef949223069aaafd809d GIT binary patch literal 23286 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 C3!_8; literal 0 HcmV?d00001