树莓派使用上spi tft!(fbtft的使用)

来源:互联网 发布:香港量健集团知乎 编辑:程序博客网 时间:2024/06/06 08:37

关于树莓派的视频输出除了HDMI和 VNC基本上没有其他的方法,如果你手上刚好有一块TFT模块的话就可以当做系统显示屏(framebuff),虽然分辨率不高,但足以满足一些cmd的需求。

github上项目:notro/fbtft,很好的实现了spi的tft屏幕显示framebuff。github地址:https://github.com/notro

老徐拉灯(另一个博主)早在2014年发了一篇博文讲述了直接编译进内核的方法:http://blog.csdn.net/xdw1985829/article/details/39583239

PokeBox(另一个博主)也分享了另一种在线模块化的安装的方法:http://jingyan.eeboard.com/article/73720


博主也是参考了这两个前辈的博文才完成了这次实验的,本文也是根据这两篇博文重新排版编写的。虽然两篇博文使用的是早些年的RPI一代,但是经过博主的实验,对于现在的RPI3和(无论是完整版还是lite版)最新的系统(内核4.9)也是通用的,博主有两块RPI(RPIA+和RPI3)都可以用一样的办法将notro的fbtft使用起来。

    

 1.打开SPI

最新系统的SPI默认还是关闭的,需要在raspi-config中打开,在终端输入 :

sudo raspi-config

将spi接口enable就好了。


2:连接wifi或者你的以太网

这个有很多种方法,关于wifi连接这里给出一个简单的方法:

sudo nano /etc/network/interfaces

修改wlan0的配置,保存退出。

allow-hotplug wlan0iface wlan0 inet dhcpwpa-ssid "路由器名称"wpa_psk "路由器密码"


3:下载和安装驱动

依次在终端输入cmd指令

sudo wget https://raw.github.com/Hexxeh/rpi-update/master/rpi-update -O /usr/bin/rpi-updatesudo chmod +x /usr/bin/rpi-updatesudo REPO_URI=https://github.com/notro/rpi-firmwaresudo rpi-update

4:硬件连线

如果安装了wiringPi的话可以使用指令:

gpio readall
查看GPIO口,这里我们使用的是BCM的编号(最边两列的编号)

对应的TFT接口:

接口分别有:

VCC-> 接电源(3.3V 有些可以接5V)

GND-> 接地线(0V)

NC-> 不接(无意义)

CLK-> SPI时钟,接SCLK(BCM11引脚)

SDA-> SPI数据,接MOSI(BCM10引脚)

RS-> 指令控制口,可以随便接一个GPIO口(我这里接BCM24引脚)

RST-> 复位,可以随便接一个GPIO口,也可以直接接VCC(3.3V)(我这里接BCM23引脚)

CS-> 片选口,可以随便接一个GPIO口,也可以直接接GND(0V)(我这里接0V)


当然,你手上的屏幕引脚丝印也有可能对不上号,不过基本都是一致的,比如有:DC(也就是RS),SDA(也就是SDO),SCL(也就是CLK),CE(也就是CS),也有可能有LED、BL这样的背光接口,直接接VCC,也就是3.3V好了。


5:屏幕初始化

初始化也就是加载驱动,驱动名字叫做 fbtft_device

sudo modprobe fbtft_device name=adafruit18 gpios=reset:23,dc:24 speed=16000000


参数name指的是屏幕驱动IC的型号,博主使用的驱动的是型号是st7735r,对应的name就是afruit18,其他型号的别称请对照https://github.com/notro/fbtft/blob/master/fbtft_device.c

参数gpios是用于设置其他IO的,硬件上reset连接了BCM23,所以这里就填写gpios=reset:23,同理还可以设置dc和led(背光)接口,speed设置的是spi总线速度,一般不要超过32M就行。

还有其他参数eg:rotate 翻转,fps 刷屏率,可以参考https://github.com/notro/fbtft/wiki/fbtft_device

如果输入指令后屏幕变黑了,那么恭喜你,这就代表屏幕被成功的驱动了,已经完成了80%的进度了!(最怕就是没有驱动或者初始化不成功)

如果没有你的IC驱动可以尝试使用init参数手动初始化。

输入:

con2fbmap 1 1
显示终端(lite系统)

FRAMEBUFFER=/dev/fb1 startx
显示图形界面(完整版系统)
效果如图,这是fb1的图像。



如果需要卸载驱动,指令:

rmmod fbtft_device

(下面操作可有可无)

6:复制fb0的内容到fb1上

新系统没有git和cmake,所以先需要安装一下:

sudo apt-get install git cmake
然后依次下载安装项目  https://github.com/notro/fbtft/wiki/Framebuffer-use#framebuffer-mirroring
git clone https://github.com/tasanakorn/rpi-fbcpcd rpi-fbcp/mkdir buildcd build/cmake ..makesudo install fbcp /usr/local/bin/fbcp

启动:fbcp &

关闭fbcp:killall fbcp


7:添加启动脚本

关于添加启动脚本的方法有很多,比如在/etc/rc.local 添加,这个是启动系统和自动加载脚本,这里提供一种登录后加载脚本的方法 ~/.bash_login,两种方法应用场合有所不同。博主更加推荐使用.bash_login 脚本+自动登录的方法。

同理,进入设置自动登录,博主用的是lite版本,只能自动登录并进入终端。

sudo raspi-config


然后编写脚本

sudo nano ~/.bash_login
编写cmd指令即可:
sudo modprobe fbtft_device name=adafruit18 gpios=reset:23,dc:24 speed=16000000
su -l pi -c "env FRAMEBUFFER=/dev/fb1 startx &"
或者
su -l pi -c "env con2fbmap 1 1 &"