该模块是一个基于触摸检测IC(TTP223B)的电容式点动型触摸开关模块。常态下,模块输出低电平,模式为低功耗模式;当用手指触摸相应位置时,模块会输出高电平,模式切换为快速模式;当持续12秒没有触摸时,模式又切换为低功耗模式。可以将模块安装在非金属材料如塑料、玻璃的表面。也可以将薄薄的纸片(非金属)覆盖在模块的表面,直到触摸的位置正确,即可做成隐藏在墙壁、桌面等地方的按键。该模块可以让你免除常规按压型键的烦恼。
模块来源
规格参数
工作电压:2.4-5.5V
工作电流:2.5uA~9uA
模块尺寸:35x29 mm
最快响应时间:100Ms
控制方式:GOIO
管脚数量:6 Pin(2.54mm间距排针)
以上信息见厂家资料文件
移植过程
我们的目标是将例程移植至开发板上【实现4路按键的触摸功能】。
引脚选择
这里选择的引脚见引脚接线表
代码移植
下载为大家准备的驱动代码文件夹,复制到自己工程中\luban-lite\application\rt-thread\helloworld\user-bsp
文件夹下
提示
如果未找到 user-bsp
这个文件夹,说明你未进行模块移植的前置操作。请转移到手册使用必要操作(点击跳转)中进行必要的配置操作!!!
接下来打开自己的工程,开始修改Kconfig文件。
1、在 VSCode 中打开 application\rt-thread\helloworld\Kconfig 文件
2、在该文件的 #endif
前面添加该模块的 Kconfig路径语句
# TTP224触摸传感器
source "application/rt-thread/helloworld/user-bsp/ttp224-touch-sensor/Kconfig"
2
添加完成之后:
menuconfig操作
1、我们 双击 luban-lite
文件夹下的 win_env.bat
脚本打开env工具:
2、输入以下命令列出所有可用的默认配置:
scons --list-def
3、选择 d13x_JLC_rt-thread_helloworld
这个配置!这个是我们衡山派开发板的默认配置!输入以下命令即可:
scons --apply-def=7
或者
scons --apply-def=d13x_JLC_rt-thread_helloworld_defconfig
这两个命令作用是一样的,一个是 文件名 ,一个是 编号 !!!
4、输入以下命令进入menuconfig菜单
scons --menuconfig
进入以下界面:
5、选中 Porting code using the LCKFB module
按
Y
选中按
N
取消选中方向键
左右
调整 最下面菜单的选项方向键
上下
调整 列表的选项
回车
执行最下面菜单的选项
6、回车进入 Porting code using the LCKFB module
菜单
7、按方向键 上下
选中 USE TTP224 touch sensor
后按 Y
键,看到前面括号中出现一个 *
号,就可以下一步了。
8、按方向键 左右
选中 <Save>
然后一路回车
,然后 退出
即可
编译
我们 保存并退出menuconfig菜单 之后,输入以下命令进行编译:
scons
或
scons -j16
-j 用来选择参与编译的核心数: 我这里是选择16
大家可以根据自己的电脑来选择
核心越多编译越快
如果写的数量高于电脑本身,那么就自动按照最高可用的来运行!
镜像烧录
编译完成之后会在 \luban-lite\output\d13x_JLC_rt-thread_helloworld\images
文件夹下生成一个 d13x_JLC_v1.0.0.img
镜像文件!
然后我们烧录镜像,具体的教程请查看:镜像烧录(点击跳转🚀)
到这里完成了,请移步到 最后一节 进行移植验证。
工程代码解析
bsp_touchkey.c
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 文档网站:wiki.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 嘉立创社区问答:https://www.jlc-bbs.com/lckfb
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*/
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <sys/time.h>
#include <rtthread.h>
#include "hal_adcim.h"
#include "rtdevice.h"
#include "aic_core.h"
#include "aic_log.h"
#include "hal_gpai.h"
#include <stdio.h>
#include "aic_hal_gpio.h"
#include "bsp_touchkey.h"
/* 引脚号获取 */
#define TTP224_OUT1 rt_pin_get("PA.3")
#define TTP224_OUT2 rt_pin_get("PA.4")
#define TTP224_OUT3 rt_pin_get("PD.3")
#define TTP224_OUT4 rt_pin_get("PD.2")
/* 引脚状态读取 */
#define TTP224_READ_OUT1 rt_pin_read(TTP224_OUT1)
#define TTP224_READ_OUT2 rt_pin_read(TTP224_OUT2)
#define TTP224_READ_OUT3 rt_pin_read(TTP224_OUT3)
#define TTP224_READ_OUT4 rt_pin_read(TTP224_OUT4)
/**********************************************************
* 函 数 名 称:TTP224_GPIO_Init
* 函 数 功 能:初始化GPIO
* 传 入 参 数:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:LP
**********************************************************/
void TTP224_GPIO_Init(void)
{
/* 设定OUT1引脚的模式 */
rt_pin_mode(TTP224_OUT1, PIN_MODE_INPUT_PULLUP); // 上拉输入
/* 设定OUT1引脚的模式 */
rt_pin_mode(TTP224_OUT2, PIN_MODE_INPUT_PULLUP); // 上拉输入
/* 设定OUT1引脚的模式 */
rt_pin_mode(TTP224_OUT3, PIN_MODE_INPUT_PULLUP); // 上拉输入
/* 设定OUT1引脚的模式 */
rt_pin_mode(TTP224_OUT4, PIN_MODE_INPUT_PULLUP); // 上拉输入
}
/**********************************************************
* 函 数 名 称:TTP224_KEY_SCAN
* 函 数 功 能:按键值扫描
* 传 入 参 数:key:状态数组 key_size:数组长度
* 函 数 返 回:void
* 作 者:LC
* 备 注:往数组中写入对应键OUT状态
**********************************************************/
void TTP224_KEY_SCAN(u8 *key, size_t key_size)
{
if(key_size < 5)
{
rt_kprintf("\nThe array size should be at least 5 !!\n");
rt_kprintf("example: uint8_t key[5];\n");
return;
}
rt_memset(key, 0, sizeof(key));
if(TTP224_READ_OUT1 == 1)
{
key[1] = 1;
}
else
{
key[1] = 0;
}
if(TTP224_READ_OUT2 == 1)
{
key[2] = 1;
}
else
{
key[2] = 0;
}
if(TTP224_READ_OUT3 == 1)
{
key[3] = 1;
}
else
{
key[3] = 0;
}
if(TTP224_READ_OUT4 == 1)
{
key[4] = 1;
}
else
{
key[4] = 0;
}
}
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
bsp_touchkey.h
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 文档网站:wiki.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 嘉立创社区问答:https://www.jlc-bbs.com/lckfb
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*/
#ifndef __BSP_TOUCHKEY_SENSOR_H__
#define __BSP_TOUCHKEY_SENSOR_H__
#include "stdio.h"
void TTP224_GPIO_Init(void);
void TTP224_KEY_SCAN(u8 *key, size_t key_size);
#endif
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Kconfig
这个是一个menuconfig中的选项,如果在菜单中选中该选项,就会在rtconfig.h
中定义一个语句,用来if判断条件编译之类的。
config LCKFB_TTP224_TOUCH_SENSOR
bool "USE TTP224 touch sensor"
default n
help
More information is available at: https://wiki.lckfb.com/
2
3
4
5
6
SConscript
自动化构建文件,如果定义了 LCKFB_EC11
和 USING_LCKFB_TRANSPLANT_CODE
就自动编译当前目录下的文件!!
Import('RTT_ROOT')
Import('rtconfig')
import rtconfig
from building import *
cwd = GetCurrentDir()
CPPPATH = [cwd]
src = []
if GetDepend('LCKFB_TTP224_TOUCH_SENSOR') and GetDepend('USING_LCKFB_TRANSPLANT_CODE'):
src = Glob(os.path.join(cwd, '*.c'))
group = DefineGroup('lckfb-ttp224-touch-sensor', src, depend = [''], CPPPATH = CPPPATH)
Return('group')
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
test_ttp224_touch_sensor.c
这个文件定义了一个处理TTP224触摸按键传感器的线程,初始化了传感器的GPIO,并设置了线程的优先级、栈大小和时间片。
线程的主要任务是检测TTP224触摸按键的状态,并在按键被按下时打印相应的信息到控制台。
线程入口函数逻辑
- 定义两个
u8
类型的数组last_key
和key
,分别用于存储上一次和当前的按键状态,数组大小为5,因为TTP224通常有4个按键加上一个额外的状态位。 - 在一个无限循环中,首先使用
rt_memcpy
函数将last_key
数组的内容复制到key
数组,保存上一次的按键状态。 - 调用
TTP224_KEY_SCAN
函数扫描当前按键的状态,并将结果存储在key
数组中。 - 通过比较
key
数组和last_key
数组,检测是否有按键从未按下状态变为按下状态(即边缘触发)。如果检测到某个按键被按下,则打印相应的信息到控制台。 - 在每次循环结束时,线程会挂起一段时间,这里是50毫秒。
此外,该文件还定义了一个命令test_ttp224_touch_sensor
,用于启动TTP224触摸按键传感器线程。
test_ttp224_touch_sensor
命令首先调用TTP224_GPIO_Init
函数来初始化TTP224传感器的GPIO。- 然后创建并启动一个名为
module_thread
的线程,该线程将执行module_thread_entry
函数。 - 如果线程创建成功,则启动该线程。
通过在命令行中输入test_ttp224_touch_sensor
,用户可以启动触摸按键传感器的检测线程,并且每当按键被按下时,都会在控制台上看到相应的输出信息。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <getopt.h>
#include <sys/time.h>
#include <rtthread.h>
#include "rtdevice.h"
#include "aic_core.h"
#include "aic_hal_gpio.h"
#include "bsp_touchkey.h"
#define THREAD_PRIORITY 25 // 线程优先级
#define THREAD_STACK_SIZE 1024 // 线程大小
#define THREAD_TIMESLICE 20 // 时间片
static rt_thread_t module_thread = RT_NULL; // 线程控制块
// 线程入口函数
static void module_thread_entry(void *param)
{
u8 last_key[5] = {0}; // 上一次按键状态
u8 key[5] = {0}; // 本次按键状态
while(1)
{
/* 保存上一次的状态 */
rt_memcpy(last_key, key, sizeof(last_key));
TTP224_KEY_SCAN(key, sizeof(key)/sizeof(key[0]));
if(key[1] == 1 && last_key[1] != 1)
{
rt_kprintf("[1]-Touch !!\n");
}
if(key[2] == 1 && last_key[2] != 1)
{
rt_kprintf("[2]-Touch !!\n");
}
if(key[3] == 1 && last_key[3] != 1)
{
rt_kprintf("[3]-Touch !!\n");
}
if(key[4] == 1 && last_key[4] != 1)
{
rt_kprintf("[4]-Touch !!\n");
}
rt_thread_mdelay(50);
}
}
static void test_ttp224_touch_sensor(int argc, char **argv)
{
TTP224_GPIO_Init();
/* 创建线程,名称是 module_thread,入口是 module_thread_entry */
module_thread = rt_thread_create("module_thread",
module_thread_entry, RT_NULL,
THREAD_STACK_SIZE,
THREAD_PRIORITY, THREAD_TIMESLICE);
/* 如果获得线程控制块,启动这个线程 */
if (module_thread != RT_NULL)
rt_thread_startup(module_thread);
}
// 导出函数为命令
MSH_CMD_EXPORT(test_ttp224_touch_sensor, ttp224 touch key test);
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
移植验证
我们使用串口调试,将 USB转TTL模块 连接到衡山派开发板上面!!
具体的教程查看:串口调试(点击跳转🚀)
串口波特率默认为
115200
我们在输入下面的命令运行该模块的线程:
输入的时候按下
TAB键
会进行命令补全!!
test_ttp224_touch_sensor
模块上电效果: