Skip to main content

Grove - 12键电容式I2C触摸传感器V2 (MPR121)

Grove - 12键电容式I2C触摸传感器V2 (MPR121) 是一个多通道接近电容式触摸传感器。它是一个3合1模块,具有以下功能:电容感应、触摸感应和接近感应。

电容感应:该模块使用恒定直流电流电容感应方案。它可以测量从10 pF到超过2000 pF的电容,分辨率高达0.01 pF。

触摸感应:一旦获取电极电容数据,通过将其与电容基线值进行比较来确定电极的触摸/释放状态。

接近感应:MPR121的一个新功能是近距离接近感应系统。这意味着系统的所有电极可以被汇总在一起创建一个单一的大电极。

基于飞思卡尔MPR121,该传感器具有12个完全独立的电极,内置自动配置功能。得益于I2C接口,您只需一个Grove端口就可以检测所有12个电极信号,并且I2C地址是硬件可配置的,从0X5B到0X5D。这也使得多个Grove - 12键电容式I2C触摸传感器V2 (MPR121) 可以在单个系统中一起使用进行通道扩展,您可以构建一个包含最多36个电极的触摸系统。

该传感器是Grove - I2C触摸传感器的升级版本,为了满足Matsuzawa.Takashi(我们的一位客户)的需求,我们使I2C地址可更改,甚至比旧版本更便宜。所以如果您对所有Grove产品有任何建议,请随时联系我们。我们将始终倾听您的声音,这可能会带来另一次升级,甚至是一个新的Grove产品。请在Grove 100+页面上友善地写下您的建议。

版本变更

项目Grove - 12键电容式I2C触摸传感器V2Grove - I2C触摸传感器
主芯片MPR121MPR121
I2C地址可更改(0X5B ~ 0X5D)不可修改(0X5A)
触摸传感器触头x
输入接口鳄鱼夹接口DIP 2Pin母头
性价比
发布时间2018年9月11日2015年10月31日

特性

  • 内置 10 位 ADC
  • 为每个电极输入集成独立的自动校准功能
  • 完全独立的电极,内置自动配置功能
  • I2C 接口,带有 IRQ 中断输出,用于通知电极状态变化
  • 硬件可配置的 I2C 地址
  • 12 个电极/电容感应输入,其中 8 个具有 LED 驱动和 GPIO 多功能
  • 为每个电极输入自动配置充电电流和充电时间
  • 为每个电极分别设置触摸和释放触发阈值,提供滞后和电极独立性

规格参数

项目数值
工作电压3.3V / 5V
工作温度-40°C 至 +85°C
存储温度范围-40°C 至 +125°C
电容范围10 pF 至超过 2000 pF
分辨率0.01 pF
GPIO 单引脚源电流12 mA
GPIO 单引脚灌电流1.2 mA
接口I2C
I2C 地址范围0x5B,0x5C,0x5D
默认 I2C 地址0x5B

应用

  • PC 外设
  • MP3 播放器
  • 遥控器
  • 移动电话
  • 照明控制

硬件概述

引脚图

引脚编号引脚名称功能引脚复用
8CH0通道0,电极0,输入电容值-
9CH1通道1,电极1,输入电容值-
10CH2通道2,电极2,输入电容值-
11CH3通道3,电极3,输入电容值-
12CH4通道4,电极4,输入电容值GPIO 或 LED 驱动
13CH5通道5,电极5,输入电容值GPIO 或 LED 驱动
14CH6通道6,电极6,输入电容值GPIO 或 LED 驱动
15CH7通道7,电极7,输入电容值GPIO 或 LED 驱动
16CH8通道8,电极8,输入电容值GPIO 或 LED 驱动
17CH9通道9,电极9,输入电容值GPIO 或 LED 驱动
18CH10通道10,电极10,输入电容值GPIO 或 LED 驱动
19CH11通道11,电极11,输入电容值GPIO 或 LED 驱动
tip

对于 CH0 ~ CH11,一旦获取电极电容数据,就会通过与电容基线值比较来确定电极的触摸/释放状态。您可以为每个通道单独设置基线值。引脚12 ~ 引脚19 是多功能的,这意味着您可以将它们配置为 GPIO 或 LED 驱动器,更多详细信息请参考飞思卡尔应用笔记 AN3894

caution

中央焊盘连接到地址线,您可以通过切断导线并重新焊接来更改 I2C 地址。为了您和他人的安全,请小心使用可能用到的刀具或焊枪。

原理图

电源

飞思卡尔 MPR121 的工作电压为 1.71V 至 3.6V,然而 Arduino 的电压为 3.3V 或 5V。为了使其与 5V 系统兼容,我们使用电压转换芯片为飞思卡尔 MPR121 提供 3.3V 电压。

双向电平转换电路

这是一个典型的双向电平转换电路,用于连接 I2C 总线的两个不同电压部分。该传感器的 I2C 总线使用 3.3V,如果 Arduino 的 I2C 总线使用 5V,则需要此电路。在上面的原理图中,Q1Q2 是 N 沟道 MOSFET 2N7002A,充当双向开关。为了更好地理解这部分,您可以参考 AN10441

支持的平台

ArduinoRaspberry Pi
caution

上述提到的支持平台表示该模块的软件或理论兼容性。在大多数情况下,我们只为Arduino平台提供软件库或代码示例。我们无法为所有可能的MCU平台提供软件库/演示代码。因此,用户必须编写自己的软件库。

入门指南

与Arduino一起使用

在这一部分,我们将向您展示如何使用**Grove - 12键电容式I2C触摸传感器V2 (MPR121)**作为触摸传感器,至于如何将其配置为电容传感器或接近传感器,请查看数据手册

硬件

所需材料

Seeeduino V4.2Base ShieldI2C Touch Sensor V2
enter image description hereenter image description hereenter image description here
立即购买立即购买立即购买
note

1 请轻轻插入USB线,否则可能会损坏端口。请使用内部有4根线的USB线,2根线的线缆无法传输数据。如果您不确定您拥有的线缆,可以点击这里购买

2 每个Grove模块在购买时都配有一根Grove线缆。如果您丢失了Grove线缆,可以点击这里购买。

  • 步骤1. 将Grove - 12键电容式I2C触摸传感器V2 (MPR121)连接到Base Shield的I2C端口。

  • 步骤2. 将Grove - Base Shield插入Seeeduino。

  • 步骤3. 通过USB线将Seeeduino连接到PC。

note

如果我们没有Grove Base Shield,我们也可以直接将此模块连接到Seeeduino,如下所示。

SeeeduinoGrove-MPR121
5V红色
GND黑色
SDA白色
SCL黄色

软件

note

如果这是您第一次使用Arduino,我们强烈建议您在开始之前先查看Arduino入门指南

  • 步骤1. 从Github下载Grove触摸传感器MPR121库。

  • 步骤2. 参考如何安装库为Arduino安装库。

  • 步骤3. 重启Arduino IDE。打开示例,您可以通过以下三种方式打开:

    1. 在Arduino IDE中通过路径直接打开:文件 --> 示例 --> Grove触摸传感器MPR121 --> MPR121_demo

    2. 在您的计算机中点击MPR121_demo.ino打开,您可以在xxxx\Arduino\libraries\Grove_touch_sensor_MPR121-master中找到它,XXXX是您安装Arduino IDE的位置。

    3. 或者,您可以直接点击代码块右上角的图标将以下代码复制到Arduino IDE的新草图中。

#include "Seeed_MPR121_driver.h"

Mpr121 mpr121;

u16 touch_status_flag[CHANNEL_NUM]={0};
void setup()
{
s32 ret=0;
Serial.begin(115200);
if(mpr121.begin()<0)
{
Serial.println("Can't detect device!!!!");
}
else
{
Serial.println("mpr121 init OK!");
}
delay(100);
}
void loop()
{
u16 result=0;
u16 filtered_data_buf[CHANNEL_NUM]={0};
u8 baseline_buf[CHANNEL_NUM]={0};

result=mpr121.check_status_register();

mpr121.get_filtered_reg_data(&result,filtered_data_buf);

for(int i=0;i<CHANNEL_NUM;i++)
{
if(result&(1<<i)) /*key i is pressed!!*/
{
if(0==touch_status_flag[i])
{
touch_status_flag[i]=1;
Serial.print("key ");
Serial.print(i);
Serial.println("pressed");
}
}
else
{
if(1==touch_status_flag[i])
{
touch_status_flag[i]=0;
Serial.print("key ");
Serial.print(i);
Serial.println("release");
}
}
}
delay(50);
}
  • 步骤 4. 上传演示程序。如果您不知道如何上传代码,请查看如何上传代码

  • 步骤 5. 点击工具-> 串口监视器打开Arduino IDE的串口监视器。或者同时按下ctrl+shift+m键。将波特率设置为115200

tip

如果一切顺利,您将得到结果。当您触摸CH0 ~ CH11焊盘时,将触发key ?pressedkey ?release

mpr121 inmpr121 init OK!
key 11pressed
key 11release
key 10pressed
key 10release
key 0pressed
key 0release
key 2pressed
key 2release

与Raspberry Pi一起使用

硬件

  • 步骤 1. 本项目中使用的物品:
Raspberry piGrove Base Hat for RasPiI2C Touch Sensor V2
enter image description hereenter image description hereenter image description here
立即获取立即获取立即获取
  • 步骤 2. 将Grove Base Hat插入Raspberry Pi。
  • 步骤 3. 将Grove - 12键电容式I2C触摸传感器V2 (MPR121)连接到Base Hat的I2C端口。
  • 步骤 4. 通过USB线将Raspberry Pi连接到PC。

软件

caution

如果您使用的是Raspberry Pi with Raspberrypi OS >= Bullseye,您必须仅使用Python3运行此命令行。

  • 步骤 1. 按照设置软件配置开发环境。
  • 步骤 2. 通过克隆grove.py库下载源文件。
cd ~
git clone https://github.com/Seeed-Studio/grove.py

  • 步骤 3. 执行以下命令运行代码。
cd grove.py/grove
python3 grove_12_chan_touch_sensor_MPR121.py

以下是grove_12_chan_touch_sensor_MPR121.py代码。

import time
from grove.i2c import Bus


TOUCH_SENSOR_DEFAULT_ADDR = 0x5b

MODE_CONFIG_REG_ADDR = 0x5e
GLOBAL_PARAM_REG_ADDR_L = 0x5c
TOUCH_STATUS_REG_ADDR_L = 0x00
SET_DEBOUNCE_REG_ADDR = 0x5b

FILTERED_DATA_REG_START_ADDR_L = 0x04
CHANNEL_NUM = 12

STOP_MODE = 0
NORMAL_MODE = 0x3c

class TouchSensorMpr121():
def __init__(self,bus_num = 1,addr = TOUCH_SENSOR_DEFAULT_ADDR):
self.bus = Bus(bus_num)
self.addr = addr
self.threshold = 0
self.touch_flag = [0]*CHANNEL_NUM

def sensor_init(self):
self._set_mode(STOP_MODE)
data = [0x23,0x10]
self._set_global_param(data)
self._set_debounce(0x22)
self._set_mode(NORMAL_MODE)

def set_threshold(self,threshold):
self.threshold = threshold

def wait_for_ready(self):
time.sleep(.2)

def _set_mode(self,mode):
self.bus.write_byte_data(self.addr,MODE_CONFIG_REG_ADDR,mode)

def _set_global_param(self,data):
self.bus.write_i2c_block_data(self.addr,GLOBAL_PARAM_REG_ADDR_L,data)

def _set_debounce(self,data):
self.bus.write_byte_data(self.addr,SET_DEBOUNCE_REG_ADDR,data)

def _check_status_register(self):
data_status = self.bus.read_i2c_block_data(self.addr,TOUCH_STATUS_REG_ADDR_L,2)
return data_status

def get_filtered_touch_data(self,sensor_status):
result_value = []
for i in range(CHANNEL_NUM):
time.sleep(.01)
if(sensor_status & (1<<i)):
channel_data = self.bus.read_i2c_block_data(self.addr,FILTERED_DATA_REG_START_ADDR_L+2*i,2)
result_value.append(channel_data[0] | channel_data[1]<<8 )
else:
result_value.append(0)
return result_value

def listen_sensor_status(self):
data = self._check_status_register()
touch_status = data[0] | (data[1]<<8)
touch_result_value = self.get_filtered_touch_data(touch_status)

for i in range(CHANNEL_NUM):
if(touch_result_value[i] < self.threshold ):
touch_result_value[i] = 0
return touch_result_value

def parse_and_print_result(self,result):
for i in range(CHANNEL_NUM):
if(result[i] != 0):
if(0 == self.touch_flag[i]):
self.touch_flag[i] = 1
print("Channel %d is pressed,value is %d" %(i,result[i]))
else:
if(1 == self.touch_flag[i]):
self.touch_flag[i] = 0
print("Channel %d is released,value is %d" %(i,result[i]))



mpr121 = TouchSensorMpr121()
def main():
mpr121.sensor_init()
mpr121.set_threshold(0x60)
mpr121.wait_for_ready()
while 1:
result = mpr121.listen_sensor_status()
mpr121.parse_and_print_result(result)
time.sleep(.1)

if __name__ == '__main__':
main()
tip

如果一切顺利,您将得到结果。当您触摸CH0 ~ CH11焊盘时,将触发channel # pressedChannel # released以及相应的压力值。

>>> %Run grove_12_chan_touch_sensor_MPR121.py
Channel 8 is pressed, value is 308
Channel 8 is released, value is 0
Channel 9 is pressed, value is 170
Channel 9 is released, value is 0
Channel 10 is pressed, value is 340
Channel 8 is pressed, value is 180

原理图在线查看器

资源

项目

这是本产品的介绍视频,包含简单的演示,您可以尝试一下。

叶子钢琴:我们使用触摸传感器制作了一架钢琴,并用叶子作为钢琴键。

玩转 Scratch:如何使用触摸传感器玩 Scratch 游戏?

技术支持与产品讨论

感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...