拓展模块

电阻触摸屏

本实验 LCD 触摸屏上使用 NS2009 芯片,将电阻触摸屏信号转化为 I2C 信号跟 K210 通信,而 MaixPy 已经集成了触摸屏应用的相关函数模块,具体介绍如下:

构造函数

1
import touchscreen as ts

导入 touchscreen 模块;

使用方法

1
ts.init(i2c=None,cal=None)

初始化触摸屏。

【i2c】I2C 总线;

【cal】一个 7 个整型值的元组,触摸校准数据。

1
ts.calibrate()

触摸校准。返回一个 7 个整型值的元组。

1
ts.read()

读取屏幕状态和坐标信息。返回(status,x,y)

【status】: 触摸状态,取值有如下

touchscreen.STATUS_RELEASE,值为 1,触摸屏没动作;

touchscreen.STATUS_PRESS,值为 2,触摸屏被按下;

touchscreen.STATUS_MOVE,值为 3,触摸屏在滑动;

【x】x 轴坐标

【y】y 轴坐标

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from machine import I2C
from fpioa_manager import fm
from Maix import GPIO
import lcd, image
import touchscreen as ts

#按键 KEY 用于清屏
fm.register(16, fm.fpioa.GPIO1, force=True)
btn_clear = GPIO(GPIO.GPIO1, GPIO.IN)

#触摸使用 I2C 控制(NS2009)
i2c = I2C(I2C.I2C0, freq=400000, scl=30, sda=31)

#触摸屏初始化
ts.init(i2c)
#ts.calibrate() #触摸校准

#LCD 初始化
lcd.init()
lcd.clear()

#新建图像和触摸屏相关参数变量
img = image.Image()
status_last = ts.STATUS_IDLE
x_last = 0
y_last = 0
draw = False

while True:

#获取触摸屏状态
(status,x,y) = ts.read()
print(status, x, y)

#画图
if draw:
img.draw_line((x_last, y_last, x, y))

#更新最后坐标
x_last = x
y_last = y

#根据触摸屏状态判断是否继续执行画图功能
if status_last!=status:
if (status==ts.STATUS_PRESS or status == ts.STATUS_MOVE):
draw = True
else: #松开
draw = False
status_last = status

#LCD 显示
lcd.display(img)

#按键 KEY 按下清屏
if btn_clear.value() == 0:
img.clear()

固件用如下所示固件,其中含有touchscreen库

 

 

舵机

伺服电机对象通过 3 线(信号,电源,地)控制,pyBase 上有 4 个位置可以插这些电机,分别是 X1-X4 引脚。对应 pyAI-K210 的 17、35、34、33 脚。

180°舵机的控制一般需要一个 20ms 左右的时基脉冲,该脉冲的高电平部分一般为 0.5ms-2.5ms 范围内的角度控制脉冲部分,总间隔为 2ms。以 180 度角度伺服为例,在 MicroPython 编程对应的控制关系是从-90°至 90°,示例图如下

而对于 360°连续旋转舵机,上面的脉冲表则对应从正向最大速度旋转到反向最大速度旋转的过程。

如果过你学习过前面基于 STM32 平台的舵机实验,那就知道在 STM32 平台集成了舵机模块,使用起来非常方便。当前的 ESP32 平台并没有集成 Servo 模块,但从上面可以看到上面是通过 PWM 来控制的,我们可以直接写 PWM 函数驱动即可。代码编程流程图如下:

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from machine import Timer,PWM
import time

#PWM 通过定时器配置,接到 IO17 引脚
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
S1 = PWM(tim, freq=50, duty=0, pin=17)

'''
说明:舵机控制函数
功能:180 度舵机:angle:-90 至 90 表示相应的角度
360 连续旋转度舵机:angle:-90 至 90 旋转方向和速度值。
【duty】占空比值:0-100
'''

def Servo(servo,angle):
S1.duty((angle+90)/180*10+2.5)
while True:

#-90 度
Servo(S1,-90)
time.sleep(2)

#-45 度
Servo(S1,-45)
time.sleep(2)

#0 度
Servo(S1,0)
time.sleep(2)

#45 度
Servo(S1,45)
time.sleep(2)

#90 度
Servo(S1,90)
time.sleep(2)

将 180°舵机插到 pyBase 的 X1 的三线接口,运行程序。可以看到舵机依次旋转至不同角度。

实验拓展:

我们刚刚实现了 180°舵机的角度控制,现在来做一下 360°连续旋转舵机的实验,360°连续旋转舵机可以实现直流减速电机功能,用在小车或者航模上。

实验的代码不变,参数【-90 至 90】代表旋转方向和速度值大小。插上 360°连续旋转舵机。可以看到舵机的旋转速度和方向逐渐变变化。