TFT 3.5 LCD Raspberry

Iš Žinynas.
02:49, 12 gruodžio 2022 versija, sukurta \dev\null (Aptarimas | indėlis)
(skirt) ← Ankstesnė versija | Dabartinė versija (skirt) | Vėlesnė versija → (skirt)
Jump to navigation Jump to search

Rpi 3.5inch display lcd.png

B421c0e53d336396dc0592f764d0bc27f0341032.png

ESP8266

ESP8266 NodeMCU support for spi interface displays https://github.com/Bodmer/TFT_eSPI

Turėkite omenyje, kad konfigūracija yra globali visiems projektams, nes keičiama pačiame library konfigūraciniame faile. Norint naudotis "per project" konfigūracija, siūlyčiau migruoti į normalesnį IDE -> PlatformIO

Lib konfigūracija Arduino/libraries/TFT_eSPI/User_Setup.h:

#define RPI_ILI9486_DRIVER
#define SPI_FREQUENCY  20000000
#define TOUCH_CS PIN_D2     // Chip select pin (T_CS) of touch screen

Pajungimo schema:

  • Display SDO/MISO to NodeMCU pin D6
  • Display LED to NodeMCU pin VIN (or 5V)
  • Display SCK to NodeMCU pin D5
  • Display SDI/MOSI to NodeMCU pin D7
  • Display DC (or AO)to NodeMCU pin D3
  • Display RESET to NodeMCU pin D4 (or RST, see below)
  • Display CS to NodeMCU pin D8 (or GND, see below)
  • Display GND to NodeMCU pin GND (0V)
  • Display VCC to NodeMCU 5V or 3.3V
  • Display Touch_CD to NodeMCU pin D1
  • Display T_CS to NodeMCU pin D2

Kitas lib: https://github.com/ZinggJM/ILI9486_SPI

Galima drąsiai išbandyti su projektu: https://github.com/e1z0/WifiAnalyzer

ESP32

Turėkite omenyje, kad konfigūracija yra globali visiems projektams, nes keičiama pačiame library konfigūraciniame faile. Norint naudotis "per project" konfigūracija, siūlyčiau migruoti į normalesnį IDE -> PlatformIO

Lib konfigūracija Arduino/libraries/TFT_eSPI/User_Setup.h

#define RPI_ILI9486_DRIVER
#define SPI_FREQUENCY  20000000
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS   15  // Chip select control pin
#define TFT_DC    2  // Data Command control pin
#define TFT_RST   4  // Reset pin (could connect to RST pin)
#define TOUCH_CS 21     // Chip select pin (T_CS) of touch screen

TFT Taip pat gali veikti kartu su SD Kortele pagal šį aprašymą, abu moduliai naudos skirtingus SPI interfeisus, todėl nesipyks tarpusavyje. Pinai atitinka aprašytus ant esp32 esančius fizinius pinus. Kodo pavyzdys:

#include <SPI.h>

#include <TFT_eSPI.h>       // Hardware-specific library

TFT_eSPI tft = TFT_eSPI();  // Invoke custom library

void setup(void) {
  tft.init();

  tft.setRotation(3);

  tft.fillScreen(TFT_BLACK);
  
  // Set "cursor" at top left corner of display (0,0) and select font 4
  tft.setCursor(0, 0, 4);

  // Set the font colour to be white with a black background
  tft.setTextColor(TFT_WHITE, TFT_BLACK);

  // We can now plot text on screen using the "print" class
  tft.println("Initialised default\n");
  tft.println("White text");
  
  tft.setTextColor(TFT_RED, TFT_BLACK);
  tft.println("Red text");
  
  tft.setTextColor(TFT_GREEN, TFT_BLACK);
  tft.println("Green text");
  
  tft.setTextColor(TFT_BLUE, TFT_BLACK);
  tft.println("Blue text");

  delay(5000);

}

void loop() {

  tft.invertDisplay( false ); // Where i is true or false
 
  tft.fillScreen(TFT_BLACK);
  
  tft.setCursor(0, 0, 4);

  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.println("Invert OFF\n");

  tft.println("White text");
  
  tft.setTextColor(TFT_RED, TFT_BLACK);
  tft.println("Red text");
  
  tft.setTextColor(TFT_GREEN, TFT_BLACK);
  tft.println("Green text");
  
  tft.setTextColor(TFT_BLUE, TFT_BLACK);
  tft.println("Blue text");

  delay(5000);


  // Binary inversion of colours
  tft.invertDisplay( true ); // Where i is true or false
 
  tft.fillScreen(TFT_BLACK);
  
  tft.setCursor(0, 0, 4);

  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.println("Invert ON\n");

  tft.println("White text");
  
  tft.setTextColor(TFT_RED, TFT_BLACK);
  tft.println("Red text");
  
  tft.setTextColor(TFT_GREEN, TFT_BLACK);
  tft.println("Green text");
  
  tft.setTextColor(TFT_BLUE, TFT_BLACK);
  tft.println("Blue text");

  delay(5000);
}

Metodas (su gfx akseleracija) be touchscreen

apt-get install cmake git
git clone https://github.com/juj/fbcp-ili9341.git
cd fbcp-ili9341
mkdir build
cd build
cmake -DILI9486=ON -DSPI_BUS_CLOCK_DIVISOR=6 ..
make -j
sudo ./fbcp-ili9341

Patvirtintas metodas su touchscreen

/boot/config.txt

dtparam=spi=on
dtparam=i2c_arm=on
dtoverlay=piscreen2r,speed=16000000,rotate=270

/boot/cmdline.txt

Pridedam į galą branduolio parametrų eilutės:

fbcon=map:10 fbcon=font:VGA2x2


pygameui fix (raspbian jessie)

The package "libsdl1.2-15-10", which ships with Debian Jessie, breaks pygame. To make it work we have to revert back to "libsdl1.2-15-5" from Wheezy.

The quickest way is to comment everything out in your /etc/apt/sources.list and temporarily add:

deb http://archive.raspbian.org/raspbian wheezy main contrib non-free

Import the corresponding keys:

deb http://archive.raspbian.org/raspbian wheezy main contrib non-free
gpg -a --export 9165938D90FDDD2E | sudo apt-key add -

Remove the offending package and replace it with the working one:

sudo apt-get update
sudo apt-get remove libsdl1.2debian python-pygame
apt-get install libsdl-image1.2 libsdl-mixer1.2 libsdl-ttf2.0-0 libsdl1.2debian libsmpeg0 python-pygame
sudo apt-mark hold libsdl1.2debian

Restore "/etc/apt/sources.list" to it's original state.

pygameui fix (raspbian stretch)

Downgradiname paketa ir nepamirstame is naujo perkalibruoti touchscreen.

TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/event0 TSLIB_CALIBFILE=/etc/pointercal TSLIB_CONFFILE=/etc/ts.conf TSLIB_PLUGINDIR=/usr/lib/ts ts_calibrate

Binary Install way

wget http://devnull.eofnet.lt/stuff/raspbian_wheezy/libsdl1.2-dev_1.2.15-5~bpo9%2B1_armhf.deb
wget http://devnull.eofnet.lt/stuff/raspbian_wheezy/libsdl1.2debian_1.2.15-5~bpo9%2B1_armhf.deb
dpkg -i libsdl1.2debian_1.2.15-5~bpo9+1_armhf.deb 
dpkg -i libsdl1.2-dev_1.2.15-5~bpo9+1_armhf.deb 

Source install way

mkdir /root/sources
cd /root/sources
wget http://legacy.raspbian.org/raspbian/pool/main/libs/libsdl1.2/libsdl1.2_1.2.15.orig.tar.gz
wget http://legacy.raspbian.org/raspbian/pool/main/libs/libsdl1.2/libsdl1.2_1.2.15-5.debian.tar.gz

Or use my mirror

wget http://devnull.eofnet.lt/stuff/raspbian_wheezy/libsdl1.2_1.2.15-5.debian.tar.gz
http://devnull.eofnet.lt/stuff/raspbian_wheezy/libsdl1.2_1.2.15.orig.tar.gz
tar xzvf libsdl1.2_1.2.15.orig.tar.gz
tar xzvf libsdl1.2_1.2.15-5.debian.tar.gz
mv debian SDL-1.2.15/
cd SDL-1.2.15

Install dependencies to build the packages

apt-get install packaging-dev debian-keyring devscripts equivs

Prepare the package deps

mk-build-deps --install

Add the revision to the change file, report the backporting

dch --bpo

Build the package

fakeroot debian/rules binary
dpkg-buildpackage -us -uc

Now you can install the package

dpkg -i ../libsdl1.2debian_1.2.15-5~bpo9+1_armhf.deb 
dpkg -i ../libsdl1.2-dev_1.2.15-5~bpo9+1_armhf.deb 

/etc/X11/xorg.conf.d/99-ads7846-cal.conf

Section "InputClass"
       Identifier      "calibration"
       MatchProduct    "ADS7846 Touchscreen"
       Option	"Calibration"	"3950 253 254 3971"
       Option  "SwapAxes"      "0"
       driver "evdev"
EndSection

Išimam iš konfigūracinių failų esančių /usr/share/X11/xorg.conf.d/ touchscreen interfeisus pvz. 40-libinput.conf esantis su Driver "libinput", būtina jį pašalinti, galima taip pat padaryti, kad naudotų draiverį "evdev". Pakeičiam 99-fbturbo.conf esantį fb0 į fb1

Failai iš /usr/share/X11/xorg.conf.d/

10-amdgpu.conf

 Section "OutputClass"
	Identifier "AMDgpu"
	MatchDriver "amdgpu"
	Driver "amdgpu"
 EndSection

10-evdev.conf

 Section "InputClass"
        Identifier "evdev pointer catchall"
        MatchIsPointer "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
 EndSection

 Section "InputClass"
        Identifier "evdev keyboard catchall"
        MatchIsKeyboard "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
 EndSection

 Section "InputClass"
        Identifier "evdev touchpad catchall"
        MatchIsTouchpad "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
 EndSection

 Section "InputClass"
        Identifier "evdev tablet catchall"
        MatchIsTablet "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
 EndSection

 Section "InputClass"
        Identifier "evdev touchscreen catchall"
        MatchIsTouchscreen "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
 EndSection

10-quirks.conf

# Collection of quirks and blacklist/whitelists for specific devices.


# Accelerometer device, posts data through ABS_X/ABS_Y, making X unusable
# http://bugs.freedesktop.org/show_bug.cgi?id=22442 
Section "InputClass"
        Identifier "ThinkPad HDAPS accelerometer blacklist"
        MatchProduct "ThinkPad HDAPS accelerometer data"
        Option "Ignore" "on"
EndSection

# https://bugzilla.redhat.com/show_bug.cgi?id=523914
# Mouse does not move in PV Xen guest
# Explicitly tell evdev to not ignore the absolute axes.
Section "InputClass"
        Identifier "Xen Virtual Pointer axis blacklist"
        MatchProduct "Xen Virtual Pointer"
        Option "IgnoreAbsoluteAxes" "off"
        Option "IgnoreRelativeAxes" "off"
EndSection

# https://bugs.freedesktop.org/show_bug.cgi?id=55867
# Bug 55867 - Doesn't know how to tag XI_TRACKBALL
Section "InputClass"
        Identifier "Tag trackballs as XI_TRACKBALL"
        MatchProduct "trackball"
        MatchDriver "evdev"
        Option "TypeName" "TRACKBALL"
EndSection

# https://bugs.freedesktop.org/show_bug.cgi?id=62831
# Bug 62831 - Mionix Naos 5000 mouse detected incorrectly
Section "InputClass"
        Identifier "Tag Mionix Naos 5000 mouse XI_MOUSE"
        MatchProduct "La-VIEW Technology Naos 5000 Mouse"
        MatchDriver "evdev"
        Option "TypeName" "MOUSE"
EndSection

40-libinput.conf

# Match on all types of devices but tablet devices and joysticks
Section "InputClass"
        Identifier "libinput pointer catchall"
        MatchIsPointer "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
EndSection

Section "InputClass"
        Identifier "libinput keyboard catchall"
        MatchIsKeyboard "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
EndSection

Section "InputClass"
        Identifier "libinput touchpad catchall"
        MatchIsTouchpad "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
EndSection

Section "InputClass"
        Identifier "libinput tablet catchall"
        MatchIsTablet "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
EndSection

70-wacom.conf

# Some of the below input classes appear 3x times, once for each of
# "tablet", "touchscreen", and "touchpad" to ensure that the Wacom
# driver is not accidentally bound to other types of hardware that
# Wacom has made which are not handled by the wacom driver (e.g the
# Wacom Bluetooth Keyboard)
#
# https://sourceforge.net/p/linuxwacom/bugs/294/

Section "InputClass"
        Identifier "Wacom USB tablet class"
        MatchUSBID "056a:*"
        MatchDevicePath "/dev/input/event*"
        MatchIsTablet "true"
        Driver "wacom"
EndSection

Section "InputClass"
        Identifier "Wacom USB touchscreen class"
        MatchUSBID "056a:*"
        MatchDevicePath "/dev/input/event*"
        MatchIsTouchscreen "true"
        Driver "wacom"
EndSection

Section "InputClass"
        Identifier "Wacom USB touchpad class"
        MatchUSBID "056a:*"
        MatchDevicePath "/dev/input/event*"
        MatchIsTouchpad "true"
        Driver "wacom"
EndSection

Section "InputClass"
	Identifier "Wacom tablet class"
	MatchProduct "Wacom|WACOM|PTK-540WL|ISD-V4"
	MatchDevicePath "/dev/input/event*"
	MatchIsTablet "true"
	Driver "wacom"
EndSection

Section "InputClass"
	Identifier "Wacom touchscreen class"
	MatchProduct "Wacom|WACOM|PTK-540WL|ISD-V4"
	MatchDevicePath "/dev/input/event*"
	MatchIsTouchscreen "true"
	Driver "wacom"
EndSection

Section "InputClass"
	Identifier "Wacom touchpad class"
	MatchProduct "Wacom|WACOM|PTK-540WL|ISD-V4"
	MatchDevicePath "/dev/input/event*"
	MatchIsTouchpad "true"
	Driver "wacom"
EndSection

# Serial Wacom devices should always be one of tablet, touchscreen, or
# touchpad so we can safely get away with just one match section in
# these cases
Section "InputClass"
        Identifier "Wacom PnP device class"
        MatchPnPID "WACf*|WCOM*|WACM*|FUJ02e5|FUJ02e7|FUJ02e9"
        MatchDevicePath "/dev/input/event*"
        Driver "wacom"
EndSection

Section "InputClass"
	Identifier "Wacom serial class"
	MatchProduct "Serial Wacom Tablet"
	Driver "wacom"
EndSection

Section "InputClass"
        Identifier "Wacom serial class identifiers"
        MatchProduct "WACf|FUJ02e5|FUJ02e7|FUJ02e9"
        Driver "wacom"
EndSection

# Hanwang tablets
Section "InputClass"
	Identifier "Hanwang class"
	MatchProduct "Hanwang"
	MatchDevicePath "/dev/input/event*"
	Driver "wacom"
EndSection

# Waltop tablets
Section "InputClass"
	Identifier "Waltop class"
	MatchProduct "WALTOP"
	MatchIsTablet "on"
	MatchDevicePath "/dev/input/event*"
	Driver "wacom"
EndSection

# N-Trig Duosense Electromagnetic Digitizer
Section "InputClass"
	Identifier "Wacom N-Trig class"
	MatchProduct "HID 1b96:0001|N-Trig Pen|N-Trig DuoSense"
	MatchDevicePath "/dev/input/event*"
	Driver "wacom"
	Option "Button2" "3"
EndSection

799-fbturbo.conf

Section "Device"
        Identifier      "Allwinner A10/A13 FBDEV"
        Driver          "fbturbo"
        Option          "fbdev" "/dev/fb1"

#        Option          "SwapbuffersWait" "true"
EndSection

Kataloge /etc/X11/xorg.conf.d/ failų apart mūsų įdeto 99-ads7846-cal.conf daugiau nėra.

Kivy GUI toolkit

Prieš pradėdami, atnaujiname sistemą:

pi@raspberrypi ~ $ sudo apt-get update && sudo apt-get -y upgrade

Perkrauname:

pi@raspberrypi ~ $ sudo reboot

Įdiegiame paketus

pi@raspberrypi ~ $ sudo apt-get -y libffi-dev install libpango1.0-dev libcogl-pango-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev libsdl2-gfx-dev libsdl2-dev libsdl-ttf2.0-dev libsdl-sge-dev libsdl-pango-dev libsdl-ocaml-dev  libsdl-console-dev libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev \
  pkg-config libgl1-mesa-dev libgles2-mesa-dev \
  python-setuptools libgstreamer1.0-dev git-core \
  gstreamer1.0-plugins-{bad,base,good,ugly} \
  gstreamer1.0-{omx,alsa} python-dev libmtdev-dev \
  xclip xsel

Įdiegiame pip iš source

pi@raspberrypi ~ $ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
pi@raspberrypi ~ $ sudo python get-pip.py

Įdiegiame kitus reikalingus paketus:

pi@raspberrypi ~ $ pip install -U Cython==0.28.2
pi@raspberrypi ~ $ sudo pip install pygments docutils

Pagaliau galime įdiegti kivy:

pi@raspberrypi ~ $ git clone https://github.com/kivy/kivy
pi@raspberrypi ~ $ cd kivy
pi@raspberrypi ~/kivy $ python setup.py build
pi@raspberrypi ~/kivy $ sudo python setup.py install

Norint įgalinti touchscreen reikia padaryti keletą modifikacijų kivy konfigūraciniame faile, pirmiausia paleiskime:

pi@raspberrypi ~/kivy $ python ~/kivy/examples/demo/pictures/main.py

Bus sukurtas kivy konfigūracinis failas, kurį atsidarysime:

pi@raspberrypi ~/kivy $ nano ~/.kivy/config.ini

Einame į [input] sekciją, išimame esančias eilutes ir pridedame šias:

mouse = mouse
mtdev_%(name)s = probesysfs,provider=mtdev
hid_%(name)s = probesysfs,provider=hidinput

Paleidžiame kitą demo ir išbandome (patampome, paspaudžiame, bandome tempti):

pi@raspberrypi ~/kivy $ python ~/kivy/examples/demo/pictures/main.py

Išbandome kitus demo:

pi@raspberrypi ~/kivy $ python ~/kivy/examples/demo/showcase/main.py

Taip pat yra daugelis kitų direktorijoje ~/kivy/examples/.

FIXME

Reziume gauname totalų šūdą kuris segfaultina norint paleisti be X'o... Laukiam kol sutvarkys kivy, jog veiktu be Xorg palaikymo, tik sdl'e.

raylib-go

apt-get update&&apt-get install libbsd-dev
rpi-update
wget https://dl.google.com/go/go1.12.5.linux-armv6l.tar.gz
tar -C /usr/local -xzf go1.12.5.linux-armv6l.tar.gz

Sudedame į /etc/profile ir /root/.bashrc:

export GOPATH=$HOME/go
export RPI_HOME=/opt/tools/arm-bcm2708/arm-linux-gnueabihf
export PATH=${RPI_HOME}/bin:/usr/local/go/bin:$PATH:$GOPATH/bin

Sudiegiame biblioteką

go get github.com/gen2brain/raylib-go/raylib

Sudedam mirrorinima i mūsų LCD:

git clone https://github.com/AndrewFromMelbourne/raspi2fb.git
cd raspi2fb&&mkdir build&&cd build&&cmake ..&&make&&make install

Taip pat reiktų nustatyti LCD rezoliuciją į mažesnę, kadangi mirrorinimas HDMI išėjimo į rezoliuciją pvz.: 480x320, bus nelabai įskaitomas. Prirašome eilutę į /boot/config.txt:

hdmi_cvt 480 320 60 1 0 0 0
framebuffer_width=480
framebuffer_height=320

Paleidžiame mirrorinimą:

/usr/local/bin/raspi2fb --daemon

Padarome, kad mirrorinimas vyktų sistemos startavimo metu:

cd ..&&mv raspi2fb\@.service /etc/systemd/system/&&systemctl daemon-reload&&systemctl enable raspi2fb@1.service

Sukalibruojame ekrana:

TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/event0 TSLIB_CALIBFILE=/etc/pointercal TSLIB_CONFFILE=/etc/ts.conf TSLIB_PLUGINDIR=/usr/lib/ts ts_calibrate

Taip pat sukuriame tslib pagalba naują touchscreen input:

TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/event0 TSLIB_CALIBFILE=/etc/pointercal TSLIB_CONFFILE=/etc/ts.conf TSLIB_PLUGINDIR=/usr/lib/ts ts_uinput -v -d

/dev/input/event0 yra mūsų touchscreen (Įsitikinkite, kad ten būtent jis), paleidus turėtų ateiti grąžinimas pvz.:

/dev/input/event1

Tai ir bus mūsų naujas event device'as

package main

import "github.com/gen2brain/raylib-go/raylib"

func main() {
	rl.InitWindow(800, 450, "raylib [rpi] example - basic window")

	rl.SetTargetFPS(60)

	for !rl.WindowShouldClose() {
		rl.BeginDrawing()

		rl.ClearBackground(rl.RayWhite)

		rl.DrawText("Congrats! You created your first window!", 190, 200, 20, rl.LightGray)

		rl.EndDrawing()
	}

	rl.CloseWindow()
}
go build main.go
./main