6006| 7
|
[MP动手做] MicroPython动手做(38)——控制触摸屏 |
本帖最后由 驴友花雕 于 2020-7-7 17:23 编辑 ![]() 1、触摸屏技术 触摸屏在结构上由一个感应式液晶显示装置组成,这个感应显示器可以接收触控头或者其他触控动作的信号。当这个感应显示器收到了触控信号,整个触控装置会按照事先编写的程序执行不同的指令,实现用户的触控意图。这种技术替代了传统的机械式按钮装置,加上液晶显示器的画面,可以得到十分生动形象的画面和操作享受,受到了越来越多人的欢迎。 触摸屏技术最早出现在一些工业和商业设备中,例如POS终端机、电梯按钮等。触摸屏技术在很大程度上方便了人机交互,触摸屏本身又很坚固耐用,这些特点都让触摸屏技术有了很大的应用和发展。利用触摸屏技术,用户只要用手指点击相应的触控图案,就可以解决过去繁杂的操作问题,极大的方便了用户。由于近些年i Phone手机的推出,更是刺激了触摸屏相关产业的发展,触摸屏技术也由此被应用到不同的产品中。随着移动互联网、云计算等技术的快速发展,人们对触摸屏技术的需求和要求也日益提高,相信触摸屏技术将会越来越多的出现在不同的电子产品中。除此之外,触摸屏在汽车电子领域和零售业也有很大的发展空间,具相关权威调查,到2012年,用于汽车电子和零售业的触摸屏市场将会达到20亿美元,占触摸屏产业总体市场的20%。同时在PC行业,由于微软操作系统的不断发展,触摸屏技术也将占据着十分重要的角色,再加上医疗领域、公共设施领域等方面,触摸屏控制技术将会得到进一步的普及,有着极好的市场前景。 中国的触摸屏消费市场有着极大潜力,尤其在数码电子产品市场中,然而在触摸屏产业中,中国的触摸屏产业主要集中在产业链的中下游,目前辽宁沈阳的沈北新区也建立了手机制造中心,吸引了包括晨讯科技等手机触摸屏生产厂家。一方面体现了手机触摸屏这一强大的市场,另一方面又反映了我国触摸屏产业的技术含量偏低,多以加工代工为主。然而在触摸屏产业链中,触摸屏驱动芯片是核心,决定着触摸屏产品的优劣,全球各大芯片设计公司也都在致力研发高精度、低功耗的触摸屏驱动芯片。 2、电阻式触摸屏 是一种传感器,基本上是薄膜加上玻璃的结构,薄膜和玻璃相邻的一面上均涂有ITO(纳米铟锡金属氧化物)涂层,ITO具有很好的导电性和透明性。当触摸操作时,薄膜下层的ITO会接触到玻璃上层的ITO,经由感应器传出相应的电信号,经过转换电路送到处理器,通过运算转化为屏幕上的X、Y值,而完成点选的动作,并呈现在屏幕上。它将矩形区域中触摸点(X,Y)的物理位置转换为代表X坐标和Y坐标的电压。很多LCD模块都采用了电阻式触摸屏,这种屏幕可以用四线、五线、七线或八线来产生屏幕偏置电压,同时读回触摸点的电压。 ![]() 3、电阻触摸屏的工作原理 主要是通过压力感应原理来实现对屏幕内容的操作和控制的,这种触摸屏屏体部分是一块与显示器表面非常配合的多层复合薄膜,其中第一层为玻璃或有机玻璃底层,第二层为隔层,第三层为多元树脂表层,表面还涂有一层透明的导电层,上面再盖有一层外表面经硬化处理、光滑防刮的塑料层。在多元脂表层表面的传导层及玻璃层感应器是被许多微小的隔层所分隔电流通过表层,轻触表层压下时,接触到底层,控制器同时从四个角读出相称的电流及计算手指位置的距离。这种触摸屏利用两层高透明的导电层组成触摸屏,两层之间距离仅为2.5微米。当手指触摸屏幕时,平常相互绝缘的两层导电层就在触摸点位置有了一个接触,因其中一面导电层接通Y轴方向的5V均匀电压场,使得侦测层的电压由零变为非零,控制器侦测到这个接通后,进行A/D转换,并将得到的电压值与5V相比,即可得触摸点的Y轴坐标,同理得出X轴的坐标,这就是所有电阻技术触摸屏共同的最基本原理。 触摸屏包含上下叠合的两个透明层,四线和八线触摸屏由两层具有相同表面电阻的透明阻性材料组成,五线和七线触摸屏由一个阻性层和一个导电层组成,通常还要用一种弹性材料来将两层隔开。当触摸屏表面受到的压力(如通过笔尖或手指进行按压)足够大时,顶层与底层之间会产生接触。所有的电阻式触摸屏都采用分压器原理来产生代表X坐标和Y坐标的电压。如图3,分压器是通过将两个电阻进行串联来实现的。上面的电阻(R1)连接正参考电压(VREF),下面的电阻(R2)接地。两个电阻连接点处的电压测量值与下面那个电阻的阻值成正比。 为了在电阻式触摸屏上的特定方向测量一个坐标,需要对一个阻性层进行偏置:将它的一边接VREF,另一边接地。同时,将未偏置的那一层连接到一个ADC的高阻抗输入端。当触摸屏上的压力足够大,使两层之间发生接触时,电阻性表面被分隔为两个电阻。它们的阻值与触摸点到偏置边缘的距离成正比。触摸点与接地边之间的电阻相当于分压器中下面的那个电阻。因此,在未偏置层上测得的电压与触摸点到接地边之间的距离成正比。 电阻式触摸屏内部渡涂的透明ITO导电薄膜有工艺要求。涂层不可太厚,否则不但会降低透光率,还会形成内反射层,降低清晰度;涂层也不可太薄,否则容易断裂。在使用过程中,由于触摸屏的工作准确性需要依靠电阻网络的精密性来实现,如果某处电阻网络出现了故障将会使此处触摸屏触摸失灵:触摸屏表面经常被触摸,表层薄薄的一层透明ITO导电薄膜会出现细小裂纹,也会导致触摸失灵;透明ITO导电薄膜的外层采用的是塑胶材料,没有保护层,所以安全性较差。但是,从结构上看,电阻式触摸屏是一个相对封闭的系统,因此相比于其他触摸屏,不受外界污染物的影响,比如灰尘、水汽、油溃等,而且适合配带手套或是不能用手直接触摸的场合,因此能够在恶劣环境下正常工作,适合于航空机载显示系统。 ![]() ![]() 4、电阻触摸屏的优缺点 (1)优点 电阻式触摸屏的优点是它的屏和控制系统都比较便宜,反应灵敏度很好,而且不管是四线电阻触摸屏还是五线电阻触摸屏,它们都是一种对外界完全隔离的工作环境,不怕灰尘和水汽,能适应各种恶劣的环境。它可以用任何物体来触摸,稳定性能较好。电阻式触摸屏的优点可归类为: a.电阻式触控屏的精确度高,可到像素点的级别,适用的最大分辨率可达4096x4096。 b. 屏幕不受灰尘、水汽和油污的影响,可以在较低或较高温度的环境下使用。 c. 电阻式触控屏使用的是压力感应,可以用任何物体来触摸,即便是带着手套也可以操作,并可以用来进行手写识别。 d. 电阻式触控屏由于成熟的技术和较低的门槛,成本较为廉价。 (2)缺点 缺点是电阻触摸屏的外层薄膜容易被划伤导致触摸屏不可用,多层结构会导致很大的光损失,对于手持设备通常需要加大背光源来弥补透光性不好的问题,但这样也会增加电池的消耗。电阻式触摸屏的缺点可归类为: a. 电阻式触控屏能够设计成多点触控,但当两点同时受压时,屏幕的压力变得不平衡,导致触控出现误差,因而多点触控的实现程度较难。 b. 电阻式触控屏较易因为划伤等导致屏幕触控部分受损。 ![]() 5、MixPY_ 触摸屏幕的函数库 touchscreen模块包含了基本的读取触摸屏幕操作(import touchscreen as ts)。 (1)初始化触摸屏 [mw_shl_code=python,false]ts.init(i2c=None, cal=None)[/mw_shl_code] 初始化触摸屏 参数: i2c: 支持I2C通信的触摸屏, 传入I2C实例对象, 后期这个参数可能会被重命名或者取消 cal: 校准数据, 是一个7个整型值的元组, 可以通过touchscreen.calibrate()函数得到 返回: None (2)校准屏幕 [mw_shl_code=python,false]ts.calibrate()[/mw_shl_code] 校准屏幕,使屏幕显示和触摸屏像素能够对应 参数: 无 返回: 返回一个7个整型值的元组, 可以保存到文件系统或者flash,在初始化的时候传入,这样就不用每次都校准了 (3)获取触摸数据 [mw_shl_code=python,false]ts.read()[/mw_shl_code] 读取当前屏幕的状态以及按下的点的坐标值 参数: 无 返回: 一个由3个整型值组成的元组(status, x, y), 注意这个值会一直保持上一个状态 status: 状态, 取值有touchscreen.STATUS_PRESS,touchscreen.STATUS_MOVE,touchscreen.STATUS_RELEASE x:x轴坐标 y:y轴坐标 (4)系统默认touchscreen常量: [mw_shl_code=python,false]touchscreen.STATUS\_PRESS[/mw_shl_code] 屏幕被按下,read()函数返回的元组的第一个值 [mw_shl_code=python,false]touchscreen.STATUS\_MOVE[/mw_shl_code] 屏幕被按住并移动,即按住移动,read()函数返回的元组的第一个值 [mw_shl_code=python,false]touchscreen.STATUS\_RELEASE[/mw_shl_code] 屏幕不再被按住,即没有点击,read()函数返回的元组的第一个值。 6、实验之一:手动校准触摸屏幕 红灯亮开始校准,校准屏幕上五点之后,绿灯亮结束 [mw_shl_code=python,false]#MicroPython动手做(38)——控制触摸屏 #实验之一:手动校准触摸屏幕 import touchscreen as ts import mixno import lcd from machine import I2C lcd.init(freq=15000000,color=0) i2c = I2C(I2C.I2C0, freq=400000, scl=30, sda=31) LED_R=mixno.pin(7,mixno.GPIO.OUT) ts.init(i2c) ts.calibrate() LED_G=mixno.pin(6,mixno.GPIO.OUT)[/mw_shl_code] 校准屏幕的示意图 ![]() MixPY 实验图形编程 ![]() 7、实验之二:触摸点亮红色屏幕 触摸屏幕上的任意区域均可 [mw_shl_code=python,false]#MicroPython动手做(38)——控制触摸屏 #实验之二:触摸点亮红色屏幕 import touchscreen as ts import time import mixno import lcd from machine import I2C lcd.init(freq=15000000,color=0) i2c = I2C(I2C.I2C0, freq=400000, scl=30, sda=31) ts.init(i2c) LED_G=mixno.pin(6,mixno.GPIO.OUT) while True: if ts.read()[0] == 2: lcd.clear(248) time.sleep_ms(300) else: lcd.clear(0)[/mw_shl_code] 实验示意图如下 ![]() MixPY 实验图形编程 ![]() 8、实验之三:触摸绿色块开关绿色LED灯 [mw_shl_code=python,false]#MicroPython动手做(38)——控制触摸屏 #实验之三:触摸绿色块开关绿色LED灯 import touchscreen as ts import time import mixno import lcd import image from machine import I2C i2c = I2C(I2C.I2C0, freq=400000, scl=30, sda=31) lcd.init(freq=15000000,color=0) ts.init(i2c) LED_G=mixno.pin(6,mixno.GPIO.OUT) image = image.Image() while True: image = image.draw_rectangle([100,80,120,80],57351,1,1) if ts.read()[0] == 3: if 100 < ts.read()[1] < 220 and 80 < ts.read()[2] < 160: LED_G.value(0) time.sleep_ms(300) else: LED_G.value(1) lcd.display(image)[/mw_shl_code] 实验三的场景示意图 ![]() MixPY 实验图形编程 ![]() 9、实验之四:红蓝触摸块控制红蓝色LED灯 红蓝二个色块按钮,点动打开相应颜色的LED灯 [mw_shl_code=python,false]#MicroPython动手做(38)——控制触摸屏 #实验之四:红蓝触摸块控制红蓝色LED灯 import touchscreen as ts import mixno import lcd import image from machine import I2C i2c = I2C(I2C.I2C0, freq=400000, scl=30, sda=31) lcd.init(freq=15000000,color=0) ts.init(i2c) LED_R=mixno.pin(7,mixno.GPIO.OUT) LED_B=mixno.pin(8,mixno.GPIO.OUT) image = image.Image() image = image.draw_rectangle([50,80,60,80],248,1,1) image = image.draw_rectangle([190,80,60,80],7936,1,1) while True: if 50 < ts.read()[1] < 110 and 80 < ts.read()[2] < 160: LED_R.value(0) else: LED_R.value(1) if 190 < ts.read()[1] < 250 and 80 < ts.read()[2] < 160: LED_B.value(0) else: LED_B.value(1) lcd.display(image)[/mw_shl_code] 实验四的场景示意图 ![]() MixPY 实验四图形编程 ![]() 10、实验之五:触摸画红线 [mw_shl_code=python,false]#MicroPython动手做(38)——控制触摸屏 #实验之五:触摸画红线 import touchscreen as ts import mixno import lcd import image from machine import I2C lcd.init(freq=15000000,color=0x0000) i2c = I2C(I2C.I2C0, freq=400000, scl=30, sda=31) ts.init(i2c) lcd.clear(0x0000) img = image.Image() status_last = ts.STATUS_IDLE x_last = 0 y_last = 0 draw = False LED_R=mixno.pin(7,mixno.GPIO.OUT) while True: status = ts.read()[0] x = ts.read()[1] y = ts.read()[2] if draw: img = img.draw_line([x_last,y_last,x,y],(255,0,0),1) if status_last != status: if status == ts.STATUS_MOVE or status == ts.STATUS_PRESS: draw = True else: draw = False status_last = status lcd.display(img) x_last = x y_last = y[/mw_shl_code] 实验五的场景示意图 ![]() MixPY 实验五的图形编程 ![]() 11、实验之六:红绿灯触摸滑动自锁转换开关 [mw_shl_code=python,false]#MicroPython动手做(38)——控制触摸屏 #实验之六:红绿灯触摸滑动自锁转换开关 import touchscreen as ts import time import mixno import lcd import image from machine import I2C lcd.init(freq=15000000,color=0) i2c = I2C(I2C.I2C0, freq=400000, scl=30, sda=31) ts.init(i2c) image = image.Image() LED_R=mixno.pin(7,mixno.GPIO.OUT) LED_G=mixno.pin(6,mixno.GPIO.OUT) x = 0 image = image.draw_rectangle([50,80,60,80],7936,1,1) while True: if 50 < ts.read()[1] < 110 and 80 < ts.read()[2] < 160: while 50 < ts.read()[1] < 110 and 80 < ts.read()[2] < 160: time.sleep_ms(12) x = not x if x == 0: LED_R.value(0) else: LED_R.value(1) if x == 1: LED_G.value(0) else: LED_G.value(1) lcd.display(image)[/mw_shl_code] 实验六的场景示意图 ![]() MixPY 实验六的图形编程 ![]() 12、实验之七:触控全屏变色灯 [mw_shl_code=python,false]#MicroPython动手做(38)——控制触摸屏 #实验之七:触控全屏变色灯 import touchscreen as ts import time import mixno import lcd from machine import I2C lcd.init(freq=20000000,color=0) i2c = I2C(I2C.I2C0, freq=400000, scl=30, sda=31) ts.init(i2c) LED_R=mixno.pin(7,mixno.GPIO.OUT) LED_G=mixno.pin(6,mixno.GPIO.OUT) LED_B=mixno.pin(8,mixno.GPIO.OUT) while True: if ts.read()[0] == 2: lcd.clear(248) LED_R.value(0) time.sleep_ms(500) LED_R.value(1) lcd.clear(57351) LED_G.value(0) time.sleep_ms(500) LED_G.value(1) lcd.clear(7936) LED_B.value(0) time.sleep_ms(500) LED_B.value(1) else: lcd.clear(0) LED_R.value(1) LED_G.value(1) LED_B.value(1)[/mw_shl_code] 实验七的场景示意图 ![]() MixPY 实验七的图形编程 ![]() 13、实验之八:屏幕触控显示Hello world [mw_shl_code=python,false]#MicroPython动手做(38)——控制触摸屏 #实验之八:屏幕触控显示Hello world import touchscreen as ts import time import mixno import lcd import image from machine import I2C lcd.init(freq=20000000,color=0) i2c = I2C(I2C.I2C0, freq=400000, scl=30, sda=31) ts.init(i2c) image = image.Image() LED_G=mixno.pin(6,mixno.GPIO.OUT) while True: if ts.read()[0] == 2: print(image.draw_string(0,50,'''Hello world''',248,7,mono_space=0)) lcd.display(image) LED_G.value(0) time.sleep_ms(3000) else: LED_G.value(1) lcd.clear(0)[/mw_shl_code] 实验八的场景示意图 ![]() MixPY 实验八的图形编程 ![]() |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed