SKU:RB-02S104 IIC触摸传感器
来自ALSROBOT WiKi
目录 |
产品概述
IIC触摸传感器是 12 路电容式触摸传感器,基于接近电容式触摸传感器控制器的飞思卡尔- mpr121 芯片。它检测到人类手指的触摸或接近。可以与 Arduino 简单连接,创作你的互动项目。电容式触摸传感器可通过检测当一个人(或动物)接触到的传感器电极之一输出不同的信号给控制器。IIC触摸传感器可能应用于之前我们用过的使用触碰感知的设备上,如触摸式平板电脑和手机,以及触控面板的电器。该IIC触摸传感器允许您用在可以对人体的接触作出反应的电子产品中,并且支持最多 12 个独立的触摸通道。触摸电极有时也能感知到手指的非直接接触,那就是说,你不需要用你的手指触摸的触角上。
产品参数
- 工作电压 :3.3V-5.5V
- 待机电流: 2uA
- 触摸通道:12个
- 接口类型:IIC
- IIC地址:0x5A - 0x5D
- 尺寸大小: 80mm x 50mm
- 重量大小:6g
- 固定孔:4 * M3
- 产品尺寸图:
使用方法
基本应用
- 实验环境
1、硬件环境:
- Starduino UNO R3 控制器 * 1个
- IIC 触摸传感器 * 1个
- 4P 传感器连接线 * 1条
- USB 数据线 * 1条
- LCD12864 液晶扩展板 * 1个
2、软件环境:
- Arduino IDE 1.7.10
- 例子程序
#include <Wire.h> #include "ALSROBOT_MPR121.h" #define cs_mini12864 2 //片选 低电平片选 #define rst_mini12864 3 //物理重置.低电平有效 #define rs_mini12864 4 //寄存器选择 1:数据寄存器 0:指令寄存器 #define sck_mini12864 5 //时钟 #define sda_mini12864 6 //数据 //上面的脚可以自己修改 #define Display 0xAF //显示开启 #define Power 0x2F //电源全开 #define VO 0x24 //对比度调节 #define AllPoint 0xA4 //非全屏显示 #define ADCset 0xA1 //负向,131-4 #define COMset 0xc0 //com0-com63 #define ELECTVO 0x81 //亮度调节 调节颜色 不同的模块需要不同的 ELECTSET #define ELECTSET 0x2a //亮度数值 调节颜色 不同的模块需要不同的 数值 #define BIASSET 0xA2 //占空比1/9 // You can have up to 4 on one i2c bus but one is enough for testing! ALSROBOT_MPR121 cap = ALSROBOT_MPR121(); // Keeps track of the last pins touched // so we know when buttons are 'released' uint16_t lasttouched = 0; uint16_t currtouched = 0; unsigned char shuzi16X32[10][64] = { {0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0xF0,0xFE,0xFF,0x0F,0x01,0x00,0x00,0x00,0x01,0x07,0xFF,0xFE,0xF0,0x00, 0x00,0x00,0x3F,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x3F,0x00, 0x00,0x00,0x00,0x01,0x03,0x07,0x0E,0x0C,0x08,0x08,0x0E,0x07,0x03,0x01,0x00,0x00},/*"0",0*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x01,0x01,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x08,0x08,0x08,0x0C,0x0F,0x0F,0x0F,0x0C,0x08,0x08,0x08,0x00,0x00},/*"1",0*/ {0x00,0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x40,0xC0,0xC0,0x80,0x80,0x00,0x00, 0x00,0x00,0x1E,0x1F,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0xFF,0xFF,0x3E,0x00, 0x00,0x00,0x00,0x00,0x80,0xC0,0x70,0x38,0x1C,0x0E,0x07,0x03,0x01,0xC0,0xC0,0x00, 0x00,0x00,0x0E,0x0F,0x0D,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0E,0x0F,0x03,0x00},/*"2",0*/ {0x00,0x00,0x00,0x80,0x80,0xC0,0x40,0x40,0x40,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,0x80,0xC1,0xFF,0x7F,0x3E,0x00,0x00, 0x00,0x00,0xC0,0xC0,0xC0,0x00,0x01,0x01,0x01,0x03,0x03,0x06,0xFE,0xFC,0xF0,0x00, 0x00,0x00,0x03,0x07,0x07,0x0C,0x08,0x08,0x08,0x08,0x0C,0x06,0x07,0x03,0x00,0x00},/*"3",0*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xE0,0x70,0x1C,0x0F,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, 0x00,0x30,0x3C,0x2E,0x27,0x21,0x20,0x20,0x20,0xFF,0xFF,0xFF,0x20,0x20,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x0F,0x0F,0x0F,0x08,0x08,0x08,0x00},/*"4",0*/ {0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00, 0x00,0x00,0x00,0xFF,0xFF,0x80,0xC0,0x40,0x40,0x40,0xC0,0xC0,0x80,0x00,0x00,0x00, 0x00,0x00,0xC0,0xC3,0xC3,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFC,0x00, 0x00,0x00,0x03,0x07,0x04,0x0C,0x08,0x08,0x08,0x08,0x0C,0x07,0x07,0x03,0x00,0x00},/*"5",0*/ {0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0x40,0x40,0x40,0xC0,0x80,0x80,0x00,0x00, 0x00,0x00,0xE0,0xFC,0xFF,0x87,0xC1,0xC0,0x40,0x40,0xC0,0xC3,0x83,0x03,0x00,0x00, 0x00,0x00,0x7F,0xFF,0xFF,0x83,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFC,0x00, 0x00,0x00,0x00,0x01,0x07,0x07,0x0E,0x0C,0x08,0x08,0x0C,0x0E,0x07,0x03,0x00,0x00},/*"6",0*/ {0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00, 0x00,0x00,0x0E,0x0F,0x03,0x00,0x00,0x00,0x00,0xE0,0xF8,0x1E,0x07,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFC,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"7",0*/ {0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x40,0x40,0x40,0xC0,0xC0,0x80,0x00,0x00,0x00, 0x00,0x00,0x3E,0x7F,0xFF,0xF1,0xC0,0xC0,0x80,0x00,0x80,0xC1,0x7F,0x7F,0x1E,0x00, 0x00,0xF0,0xFC,0xFE,0x0E,0x03,0x01,0x01,0x03,0x07,0x0F,0x1E,0xFE,0xFC,0xF0,0x00, 0x00,0x01,0x03,0x07,0x06,0x0C,0x08,0x08,0x08,0x08,0x0C,0x06,0x07,0x03,0x01,0x00},/*"8",0*/ {0x00,0x00,0x00,0x80,0x80,0xC0,0x40,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00, 0x00,0xFC,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFE,0xF8,0x00, 0x00,0x01,0x03,0x07,0x0F,0x0C,0x08,0x08,0x08,0x0C,0x06,0xE7,0xFF,0x7F,0x1F,0x00, 0x00,0x00,0x07,0x07,0x0F,0x08,0x08,0x08,0x0C,0x0E,0x07,0x03,0x01,0x00,0x00,0x00}/*"9",0*/ };/*"0",0*/ void send_8bit_mini12864(unsigned char d) //传8位数据,高位先传 { for (int i = 0; i < 8; i++) //循环8次,每次发送1个最高位 { digitalWrite(sck_mini12864, 0); //时钟拉低,一位数据开始 if (d & 0x80) //与上10000000,最高位如果是1,就数据位就高 digitalWrite(sda_mini12864, 1); else //与上10000000,最高位如果是0,就数据位就低 digitalWrite(sda_mini12864, 0); digitalWrite(sck_mini12864, 1); //一位数据发送完毕,时钟拉高 d <<= 1; // d|ddddddd0 抛掉最高位,其余数据左移一位,最低位填0 } } void write_cmd_mini12864(unsigned char cmd) //写命令 { digitalWrite(cs_mini12864, 0); //片选拉低,选中芯片 digitalWrite(rs_mini12864, 0); //rs为低,写入命令 send_8bit_mini12864(cmd); //写入8位命令 } void write_dat_mini12864(unsigned char dat) //写数据 { digitalWrite(cs_mini12864, 0); //片选拉低,选中芯片 digitalWrite(rs_mini12864, 1); //rs为高,写入数据 send_8bit_mini12864(dat); //写入8位数据 } void mini12864_cl() //清屏,其实就是把所有的地址全部填成0 { unsigned char x, y; for (y = 0; y < 8; y++) { write_cmd_mini12864(0xb0 + y); write_cmd_mini12864(0x10); write_cmd_mini12864(0x00); for (x = 0; x < 132; x++) write_dat_mini12864(0); } } void mini12864_Init() //初始化 { pinMode(cs_mini12864, OUTPUT); //设置各个I/O为输出 pinMode(rst_mini12864, OUTPUT); pinMode(rs_mini12864, OUTPUT); pinMode(sck_mini12864, OUTPUT); pinMode(sda_mini12864, OUTPUT); digitalWrite(cs_mini12864, LOW); digitalWrite(rst_mini12864, LOW); //物理重置 delay(200); digitalWrite(rst_mini12864, HIGH); delay(1000); write_cmd_mini12864(0xe2); //软件重置 delay(200); //以下为初始设置,具体请参考数据手册 write_cmd_mini12864(0x24);//对比度 write_cmd_mini12864(0x81);//SET ELECTRONIC VOLUME write_cmd_mini12864(0x20);//set pm: 通过改变这里的数值来改变电压 write_cmd_mini12864(0x2f);//set power control write_cmd_mini12864(0xa2);//BR=1/9 write_cmd_mini12864(0xa0);//set seg direction write_cmd_mini12864(0xc8);//set com direction write_cmd_mini12864(0x40);//set scroll line write_cmd_mini12864(0xaf);//开显示 mini12864_cl(); //清屏 } void mini12864_address(unsigned char page, unsigned char column) { digitalWrite(cs_mini12864, 0); //片选拉低,选中芯片 column = column - 1; page = page - 1; write_cmd_mini12864(0xb0 + page); write_cmd_mini12864(((column >> 4) & 0x0f) + 0x10); write_cmd_mini12864(column & 0x0f); } void full_dispaly() { int i, j; for (i = 0; i < 8; i++) { digitalWrite(cs_mini12864, 0); //片选拉低,选中芯片 mini12864_address(i + 1, 0); for (j = 0; j < 128; j++) { write_dat_mini12864(0xff); } } } void display_graphic_16x32(unsigned char page, unsigned char column, unsigned char *dp) { unsigned char i, j; digitalWrite(cs_mini12864, 0); //片选拉低,选中芯片 for (j = 0; j < 4; j++) { mini12864_address(page + j, column); for (i = 0; i < 16; i++) { write_dat_mini12864(*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/ dp++; } } digitalWrite(cs_mini12864, 1); //片选拉低,选中芯片 } void setup() { while (!Serial); // needed to keep leonardo/micro from starting too fast! Serial.begin(9600); Serial.println("ALSROBOT MPR121 Capacitive Touch sensor test"); // Default address is 0x5A, if tied to 3.3V its 0x5B // If tied to SDA its 0x5C and if SCL then 0x5D if (!cap.begin(0x5A)) { Serial.println("MPR121 not found, check wiring?"); while (1); } Serial.println("MPR121 found!"); mini12864_Init(); //初始化液晶 mini12864_cl(); //清屏 } void loop() { // Get the currently touched pads currtouched = cap.touched(); for (uint8_t i=0; i<12; i++) { // it if *is* touched and *wasnt* touched before, alert! if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) { display_graphic_16x32(3, (0+48), shuzi16X32[i/10]); display_graphic_16x32(3, (0+64), shuzi16X32[i%10]); Serial.print(i); Serial.println(" touched"); } } lasttouched = currtouched; }
- 程序效果
通过 Arduino IDE 的串口监视器,我们可以看到当手指触碰到某个感应区域时,串口监视器会输出相应的触碰点信息
资料下载
- 产品资料
下载链接:https://pan.baidu.com/s/1gmo0VCtKwJEoKha6cG96Cw 提取码:wv0w
- 产品购买链接:http://www.alsrobot.cn/goods-774.html
- 奥松机器人技术论坛:http://www.makerspace.cn