极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 25747|回复: 10

触摸—capacitive touch

[复制链接]
发表于 2012-9-17 15:51:49 | 显示全部楼层 |阅读模式
不要崇拜哥,哥为人民服务,哥已不在社区,但社区每一个角落都流传着哥的传说。
OK,装B的废话哥已经说完了。镜头转向摸摸板capacityve touch.

先上个图





OK,上完图之后就要上代码了,这是官方的demo

/*
TouchWheel.pde
MPR121 WhellPad Example Code

by:Waiman Zhao
Mail:[email protected]
created on: 11/2/14

      SDA -> A4
      SCL -> A5
      IRQ -> D2
*/
#include <Wire.h>
#include"mpr121.h"

int pin = 13;
volatile int state = LOW;
int key = 0;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  mpr121QuickConfig();
  delay(500);
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, FALLING);
}

void loop()
{
  digitalWrite(pin, state);  
  if(state==HIGH){
    key=wheelKey();
    if(key>=0){
    Serial.print("wheelKey:\t");
    Serial.println(key,DEC);
    }
   
    key=keypad();
    if(key>=0){
    Serial.print("keypad:\t");
    Serial.println(key,DEC);
    }
    state = LOW;
  }
}

void blink()
{
  state =HIGH;
}


上完代码了就该上效果图了。



那么有同学就会想,上完效果图之后,你还能上什么呢?
没错,哥上完效果图还可以上的就是






当,当,当,当,当.......













本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2012-9-17 15:53:26 | 显示全部楼层
附上摸摸板的库文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2012-9-17 17:30:27 | 显示全部楼层
{:soso_e136:}貌似是大神那
回复 支持 反对

使用道具 举报

发表于 2012-9-17 17:44:23 | 显示全部楼层
邓大哥一直都是这样的大神,膜拜了。。。
回复 支持 反对

使用道具 举报

发表于 2012-9-18 07:02:58 | 显示全部楼层
话说上面那个cad的软件是啥?为啥还有dfrobot的模块。。。
回复 支持 反对

使用道具 举报

发表于 2012-9-18 22:38:09 | 显示全部楼层
friskit 发表于 2012-9-18 07:02
话说上面那个cad的软件是啥?为啥还有dfrobot的模块。。。

CAD应该是计算机辅助设计 难道说的是AOTO CAD ?
DFROBOT 是一个成品ARDUINO的品牌,国内做的很多,哈尔滨的一个大学的一帮人做的,配件很全面~~
回复 支持 反对

使用道具 举报

发表于 2012-9-21 23:14:58 | 显示全部楼层
darkorigin 发表于 2012-9-18 22:38
CAD应该是计算机辅助设计 难道说的是AOTO CAD ?
DFROBOT 是一个成品ARDUINO的品牌,国内做的很多,哈尔滨 ...

呃。。我是在说那个画图的软件是啥……dfrobot的模型都有……
回复 支持 反对

使用道具 举报

发表于 2014-1-12 16:04:25 | 显示全部楼层
邓大神,斗胆改了你的程序(mpr121.h),现在的arduino已经不在支持WProgram.h,WConstants.h,而且wire里面也改为了read和write,否则编译不过了。
我一直没有搞清楚这个wheelKey()是干什么的,能否解释一下,实在不想去看datasheet了,万谢,万谢!
  1. /*
  2. MPR121.h
  3. MPR121 WhellPad Example Code

  4. by:Waiman Zhao
  5. Mail:[email protected]
  6. created on: 11/2/14
  7. license: CC-SA 3.0

  8. By Keke Zhou
  9. Mail: [email protected]
  10. Modified on: Jan 12th, 2014

  11. Hardware: 3.3V Arduino Pro Mini
  12.            SDA -> A4
  13.            SCL -> A5
  14.            IRQ -> D2
  15. */

  16. #include <Wire.h>
  17. #include <Arduino.h>


  18. #define MPR121 0x5B        // ADD pin is Vcc So address is 0x5B

  19. // MPR121 Register Defines
  20. #define E0BV        0x1E
  21. #define E1BV        0x1F
  22. #define E2BV        0x20
  23. #define E3BV        0x21
  24. #define E4BV        0x22
  25. #define E5BV        0x23
  26. #define E6BV        0x24
  27. #define E7BV        0x25
  28. #define E8BV        0x26
  29. #define E9BV        0x27
  30. #define E10BV        0x28
  31. #define E11BV        0x29
  32. #define E12BV        0x2A


  33. #define MHD_R        0x2B
  34. #define NHD_R        0x2C
  35. #define        NCL_R         0x2D
  36. #define        FDL_R        0x2E
  37. #define        MHD_F        0x2F
  38. #define        NHD_F        0x30
  39. #define        NCL_F        0x31
  40. #define        FDL_F        0x32


  41. #define        ELE0_T        0x41
  42. #define        ELE0_R        0x42
  43. #define        ELE1_T        0x43
  44. #define        ELE1_R        0x44
  45. #define        ELE2_T        0x45
  46. #define        ELE2_R        0x46
  47. #define        ELE3_T        0x47
  48. #define        ELE3_R        0x48
  49. #define        ELE4_T        0x49
  50. #define        ELE4_R        0x4A
  51. #define        ELE5_T        0x4B
  52. #define        ELE5_R        0x4C
  53. #define        ELE6_T        0x4D
  54. #define        ELE6_R        0x4E
  55. #define        ELE7_T        0x4F
  56. #define        ELE7_R        0x50
  57. #define        ELE8_T        0x51
  58. #define        ELE8_R        0x52
  59. #define        ELE9_T        0x53
  60. #define        ELE9_R        0x54
  61. #define        ELE10_T        0x55
  62. #define        ELE10_R        0x56
  63. #define        ELE11_T        0x57
  64. #define        ELE11_R        0x58


  65. #define        AFE1_CFG        0x5C
  66. #define        AFE2_CFG        0x5D
  67. #define        ELE_CFG                0x5E


  68. #define GPIO_CTRL0        0x73
  69. #define        GPIO_CTRL1        0x74
  70. #define GPIO_DATA        0x75
  71. #define        GPIO_DIR        0x76
  72. #define        GPIO_EN                0x77
  73. #define        GPIO_SET        0x78
  74. #define        GPIO_CLEAR        0x79
  75. #define        GPIO_TOGGLE        0x7A


  76. #define        ATO_CFG0        0x7B
  77. #define        ATO_CFGU        0x7D
  78. #define        ATO_CFGL        0x7E
  79. #define        ATO_CFGT        0x7F
  80. #define        RES_CF          0x80

  81. // Global Constants        //隔住阻焊层
  82. #define TOU_THRESH        0x06
  83. #define        REL_THRESH        0x03
  84. #define        START_BV        0x90
  85. // Global Constants        //隔住0.5mm
  86. //#define TOU_THRESH        0x06
  87. //#define        REL_THRESH        0x03



  88. void mpr121Write(uint8_t reg,uint8_t data){
  89.    Wire.beginTransmission((uint8_t)MPR121);
  90.    Wire.write(reg);
  91.    Wire.write(data);
  92.    Wire.endTransmission();
  93. }

  94. void mpr121Read(uint8_t reg,uint8_t length,uint8_t *ReturnData)
  95. {
  96.    Wire.beginTransmission(MPR121);
  97.    Wire.write(reg);
  98.    //Wire.endTransmission();
  99.    Wire.requestFrom((uint8_t)MPR121, length);  
  100.    uint8_t i=0;
  101.    while(Wire.available())    // slave may send less than requested
  102.    {
  103.      ReturnData[i] = Wire.read(); // receive a byte as character
  104.      i++;
  105.    }
  106. }

  107. int readTouch()
  108. {
  109.    Wire.requestFrom((uint8_t)MPR121,(uint8_t)2);  
  110.    uint8_t a,b;
  111.    if(Wire.available()>=2)    // slave may send less than requested
  112.    {
  113.      a = Wire.read(); // receive a byte as character
  114.      b = Wire.read();
  115.      return (a | (int)(b<<8));
  116.    }else
  117.    {
  118.      return 0;
  119.    }   
  120. }

  121. void mpr121QuickConfig(void){
  122.         // STOP
  123.         mpr121Write(ELE_CFG, 0x00);
  124.         mpr121Write(RES_CF, 0X63);
  125.         delay(10);
  126.         // Section A
  127.         // This group controls filtering when data is > baseline.
  128.         mpr121Write(MHD_R, 0x01);
  129.         mpr121Write(NHD_R, 0x01);
  130.         mpr121Write(NCL_R, 0x00);
  131.         mpr121Write(FDL_R, 0x00);

  132.         // Section B
  133.         // This group controls filtering when data is < baseline.
  134.         mpr121Write(MHD_F, 0x01);
  135.         mpr121Write(NHD_F, 0x01);
  136.         mpr121Write(NCL_F, 0xFF);
  137.         mpr121Write(FDL_F, 0x02);

  138.         // Section C
  139.         // This group sets touch and release thresholds for each electrode
  140.         mpr121Write(ELE0_T, TOU_THRESH);
  141.         mpr121Write(ELE0_R, REL_THRESH);
  142.         mpr121Write(ELE1_T, TOU_THRESH);
  143.         mpr121Write(ELE1_R, REL_THRESH);
  144.         mpr121Write(ELE2_T, TOU_THRESH);
  145.         mpr121Write(ELE2_R, REL_THRESH);
  146.         mpr121Write(ELE3_T, TOU_THRESH);
  147.         mpr121Write(ELE3_R, REL_THRESH);
  148.         mpr121Write(ELE4_T, TOU_THRESH);
  149.         mpr121Write(ELE4_R, REL_THRESH);
  150.         mpr121Write(ELE5_T, TOU_THRESH);
  151.         mpr121Write(ELE5_R, REL_THRESH);
  152.         mpr121Write(ELE6_T, TOU_THRESH);
  153.         mpr121Write(ELE6_R, REL_THRESH);
  154.         mpr121Write(ELE7_T, TOU_THRESH);
  155.         mpr121Write(ELE7_R, REL_THRESH);
  156.         mpr121Write(ELE8_T, TOU_THRESH);
  157.         mpr121Write(ELE8_R, REL_THRESH);
  158.         mpr121Write(ELE9_T, TOU_THRESH);
  159.         mpr121Write(ELE9_R, REL_THRESH);
  160.         mpr121Write(ELE10_T, TOU_THRESH);
  161.         mpr121Write(ELE10_R, REL_THRESH);
  162.         mpr121Write(ELE11_T, TOU_THRESH);
  163.         mpr121Write(ELE11_R, REL_THRESH);

  164.         // Section D
  165.         // Set the Filter Configuration
  166.         // Set ESI2
  167.         mpr121Write(AFE1_CFG, 0x10);
  168.         //AFE配置1 (默认=0x10)
  169.         //        一级采样FFI:00-6次
  170.         //        充放电电流CDC:100000 - 32uA
  171.         mpr121Write(AFE2_CFG, 0x04);
  172.         //AFE配置2        (默认=0x24)
  173.         //        充电时间CDT:010 - 1us
  174.         //        二级采样SFI:00 - 4次
  175.         //        二级采样间隔ESI:100 - 16ms


  176.         // Section E
  177.         // Electrode Configuration
  178.         // Enable 6 Electrodes and set to run mode
  179.         // Set ELE_CFG to 0x00 to return to standby mode
  180.         mpr121Write(ELE_CFG, 0x8C);        // Enables all 12 Electrodes

  181.         //AFE配置1
  182.         //        CL
  183.         //        ELEPROX
  184.         //        ELE:
  185.         // Section F
  186.         // Enable Auto Config and auto Reconfig
  187.         /*mpr121Write(ATO_CFG0, 0x0B);
  188.         mpr121Write(ATO_CFGU, 0xC9);        // USL = (Vdd-0.7)/vdd*256 = 0xC9 @3.3V   mpr121Write(ATO_CFGL, 0x82);        // LSL = 0.65*USL = 0x82 @3.3V
  189.         mpr121Write(ATO_CFGT, 0xB5);*/        // Target = 0.9*USL = 0xB5 @3.3V
  190. }


  191. int8_t wheelKey(void)
  192. {
  193.       switch(readTouch())
  194.       {
  195.                 case 0x0001:
  196.                         return 1;
  197.                 break;
  198.                 case 0x0003:
  199.                         return 2;
  200.                 break;
  201.                 case 0x0002:
  202.                         return 3;
  203.                 break;
  204.                 case 0x0006:
  205.                         return 4;
  206.                 break;
  207.                 case 0x0004:
  208.                         return 5;
  209.                 break;
  210.                 case 0x000C:
  211.                         return 6;
  212.                 break;
  213.                 case 0x0008:
  214.                         return 7;
  215.                 break;
  216.                 case 0x0018:
  217.                         return 8;
  218.                 break;
  219.                 case 0x0010:
  220.                         return 9;
  221.                 break;
  222.                 case 0x0030:
  223.                         return 10;
  224.                 break;
  225.                 case 0x0020:
  226.                         return 11;
  227.                 break;
  228.                 case 0x0060:
  229.                         return 12;
  230.                 break;
  231.                 case 0x0040:
  232.                         return 13;
  233.                 break;
  234.                 case 0x00C0:
  235.                         return 14;
  236.                 break;
  237.                 case 0x0080:
  238.                         return 15;
  239.                 break;
  240.                 case 0x0081:
  241.                         return 16;
  242.                 break;
  243.                 default:
  244.                         return -1;
  245.                 break;               
  246.       }
  247. }


  248. int8_t keypad(void)
  249. {
  250.       switch(readTouch())
  251.       {
  252.                 case 0x0001:
  253.                         return 1;
  254.                 break;
  255.                 case 0x0002:
  256.                         return 4;
  257.                 break;
  258.                 case 0x0004:
  259.                         return 7;
  260.                 break;
  261.                 case 0x0008:
  262.                         return 11;
  263.                 break;
  264.                 case 0x0010:
  265.                         return 2;
  266.                 break;
  267.                 case 0x0020:
  268.                         return 5;
  269.                 break;
  270.                 case 0x0040:
  271.                         return 8;
  272.                 break;
  273.                 case 0x0080:
  274.                         return 0;
  275.                 break;
  276.                 case 0x0100:
  277.                         return 3;
  278.                 break;
  279.                 case 0x0200:
  280.                         return 6;
  281.                 break;
  282.                 case 0x0400:
  283.                         return 9;
  284.                 break;
  285.                 case 0x0800:
  286.                         return 12;
  287.                 break;
  288.                 default:
  289.                         return -1;
  290.                 break;               
  291.       }
  292. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-13 09:24:36 | 显示全部楼层
Keke 发表于 2014-1-12 16:04
邓大神,斗胆改了你的程序(mpr121.h),现在的arduino已经不在支持WProgram.h,WConstants.h,而且wire里面 ...

wheelKey()函数,就是你做按键滑动效果的参考值,它是由一连串的触发感应到的值,不是固定的一个值,我是这么理解的。
回复 支持 反对

使用道具 举报

发表于 2014-2-14 09:07:06 | 显示全部楼层
邓维安 发表于 2014-2-13 09:24
wheelKey()函数,就是你做按键滑动效果的参考值,它是由一连串的触发感应到的值,不是固定的一个值,我是 ...

wheelkey和keypad两个函数连续调用,如果keypad读出来的是按键标示,那第一个wheelkey究竟读出的值具体有什么含义呢?你所说的这个滑动效果参考值究竟是什么呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-17 08:20:27 | 显示全部楼层
Keke 发表于 2014-2-14 09:07
wheelkey和keypad两个函数连续调用,如果keypad读出来的是按键标示,那第一个wheelkey究竟读出的值具体有 ...

keypad和wheelkey都是读按键值,你可以这样理解,keypad定义的是单键触摸的值,wheelkey定义是两个键同时触摸的值。这么简单的问题,你要自已看啊。要自已动手去做,脑袋去想,才能解决疑问。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 19:08 , Processed in 0.063063 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表