极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26933|回复: 9

8F328-U讀取 TM003容栅位移传感器模块

[复制链接]
发表于 2019-4-16 17:05:39 | 显示全部楼层 |阅读模式
8F328-U讀取 TM003容栅位移传感器模块
  1. /*
  2.    Capacitive Grid Sensor Module TM003 Readout Program
  3.    https://item.taobao.com/item.htm?id=17251121381&ns=1&abbucket=14#detail
  4.    Date: 20190416
  5.    Rev: 01
  6.    By: Eddie
  7. */

  8. #define SCLK 2    // Clock come from TM003 SCLK pin
  9. #define SDATA 3   // Data come from TM003 SDATA pin
  10. #define CLEAR 7   // Connect to TM003 CLEAR pin, Low 0.5sec to set Zero
  11. #define minStartTime 100000  //
  12. #define maxStartTime 500000  //

  13. unsigned long startDuration = 0;
  14. unsigned long rawData = 0;
  15. bool startFlag = false;
  16. bool negativeFlag = false;

  17. void setup() {
  18.   pinMode(SCLK, INPUT);
  19.   pinMode(SDATA, INPUT);
  20.   pinMode(CLEAR, INPUT);
  21.   Serial.begin(115200);
  22. }

  23. void loop() {
  24.   checkStart();
  25.   getData();
  26.   showResult();
  27. }

  28. void checkStart() {
  29.   startDuration = pulseIn(SCLK, HIGH);
  30.   while ((startDuration < minStartTime) or (startDuration > maxStartTime)) {
  31.     startDuration = pulseIn(SCLK, HIGH);
  32.   }
  33.   startFlag = true;
  34. }

  35. void getData() {
  36.   rawData = 0 ;
  37.   for (int i = 0; i < 24; i++) {
  38.       rawData = rawData >> 1;
  39.     bool tmpClk = digitalRead(SCLK);
  40.     while (tmpClk == false) {
  41.       tmpClk = digitalRead(SCLK);
  42.     }
  43.     bool tmpData = digitalRead(SDATA);
  44.     if (tmpData == true) {
  45.       rawData = rawData | 0x00800000;
  46.     }
  47.     else {
  48.       rawData = rawData & 0xFF7FFFFF;
  49.     }
  50.     while (tmpClk == true) {
  51.       tmpClk = digitalRead(SCLK);
  52.     }
  53.   }
  54. }

  55. void showResult(){
  56.   if (rawData & 0x00100000) {
  57.     negativeFlag = true;
  58.   }
  59.   else {
  60.     negativeFlag = false;
  61.   }
  62.   unsigned long result = rawData & 0x000FFFFF; // only use 5-byte data
  63.   Serial.print("Result: ");
  64.   if (negativeFlag) {
  65.     Serial.print(" -");
  66.   }
  67.   else {
  68.     Serial.print("  ");
  69.   }
  70.   Serial.println(result);  
  71. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2019-4-17 16:21:32 | 显示全部楼层
不使用 pulseIn(),用 pin2 interrupt 的範例:
  1. /*
  2.    Capacitive Grid Sensor Module TM003 Readout Program (Use Interrupt pin2)
  3.    https://item.taobao.com/item.htm?id=17251121381&ns=1&abbucket=14#detail
  4.    Date: 20190417
  5.    Rev: 01
  6.    By: Eddie
  7. */

  8. #define SCLK 2    // Clock come from TM003 SCLK pin
  9. #define SDATA 3   // Data come from TM003 SDATA pin
  10. #define CLEAR 7   // Connect to TM003 CLEAR pin, Low 0.5sec to set Zero
  11. #define STATUS_LED 13 // To output the waveform as pin2 SCLK input
  12. #define minStartTime 100000  //
  13. #define maxStartTime 500000  //

  14. unsigned long startDuration = 0;
  15. unsigned long rawData = 0;
  16. bool startFlag = false;
  17. bool negativeFlag = false;
  18. volatile bool inHighFlag = false;
  19. volatile bool inLowFlag = false;
  20. volatile unsigned long pulseWidthStart, pulseWidthEnd, pulseWidth;

  21. void setup() {
  22.   pinMode(SCLK, INPUT);
  23.   pinMode(SDATA, INPUT);
  24.   pinMode(CLEAR, INPUT);
  25.   pinMode(STATUS_LED, OUTPUT);
  26.   digitalWrite(STATUS_LED, LOW);
  27.   attachInterrupt(digitalPinToInterrupt(SCLK), ISRrisingEdge, RISING);
  28.   Serial.begin(115200);
  29. }

  30. void loop() {
  31.   checkStart();
  32.   getData();
  33.   showResult();
  34. }

  35. void ISRrisingEdge() {
  36.   digitalWrite(STATUS_LED, HIGH);
  37.   pulseWidthStart = micros();
  38.   pulseWidth = 0;
  39.   attachInterrupt(digitalPinToInterrupt(SCLK), ISRfallingEdge, FALLING);
  40. }

  41. void ISRfallingEdge() {
  42.   digitalWrite(STATUS_LED, LOW);
  43.   pulseWidthEnd = micros();
  44.   pulseWidth = pulseWidthEnd - pulseWidthStart;
  45.   attachInterrupt(digitalPinToInterrupt(SCLK), ISRrisingEdge, RISING);
  46. }

  47. void checkStart() {
  48.   if ((pulseWidth < minStartTime) or (pulseWidth > maxStartTime)) {
  49.     startFlag = false;
  50.   }
  51.   else {
  52.     startFlag = true;
  53.   }
  54. }

  55. void getData() {
  56.   if (startFlag) {
  57.     rawData = 0 ;
  58.     for (int i = 0; i < 24; i++) {
  59.       rawData = rawData >> 1;
  60.       bool tmpClk = digitalRead(SCLK);
  61.       while (tmpClk == false) {
  62.         tmpClk = digitalRead(SCLK);
  63.       }
  64.       bool tmpData = digitalRead(SDATA);
  65.       if (tmpData == true) {
  66.         rawData = rawData | 0x00800000;
  67.       }
  68.       else {
  69.         rawData = rawData & 0xFF7FFFFF;
  70.       }
  71.       if (i < 23) {
  72.         while (tmpClk == true) {
  73.           tmpClk = digitalRead(SCLK);
  74.         }
  75.       }
  76.     }
  77.   }
  78. }

  79. void showResult() {
  80.   if (rawData & 0x00100000) {
  81.     negativeFlag = true;
  82.   }
  83.   else {
  84.     negativeFlag = false;
  85.   }
  86.   unsigned long result = rawData & 0x000FFFFF; // only use 5-byte data
  87.   Serial.print("Result: ");
  88.   if (negativeFlag) {
  89.     Serial.print(" -");
  90.   }
  91.   else {
  92.     Serial.print("  ");
  93.   }
  94.   Serial.println(result);
  95. }
复制代码
回复 支持 1 反对 0

使用道具 举报

发表于 2019-4-16 17:07:14 | 显示全部楼层
问一下,容栅位移传感器,的寿命有长,长时间频繁使用是否会偏差。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-16 17:17:08 | 显示全部楼层
剛買回來的模塊,詳細的不清楚,你可問賣家。
回复 支持 反对

使用道具 举报

发表于 2019-4-16 17:31:04 | 显示全部楼层
居然开始玩容栅了。。。。感觉我已经跟不上时代发展。。。。
回复 支持 反对

使用道具 举报

发表于 2019-9-7 20:12:46 | 显示全部楼层
请教楼主,这个传感器量出来的数据准确吗?精度如何?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 11:42:36 | 显示全部楼层
duanyz 发表于 2019-9-7 20:12
请教楼主,这个传感器量出来的数据准确吗?精度如何?

數據準確度可以,但配合的結構也會影響最終的準確性。
回复 支持 反对

使用道具 举报

发表于 2019-9-10 09:13:08 | 显示全部楼层
本帖最后由 duanyz 于 2019-9-10 10:39 编辑
eddiewwm 发表于 2019-9-9 11:42
數據準確度可以,但配合的結構也會影響最終的準確性。


感谢你的回复,可惜程序里没有什么注释,能请你说说tm003这个芯片输出的数据格式是什麽样的吗?知道了数据格式应该更容易理解程序内容。


另外请教楼主你买的是tm003a还是tm003啊?两个产品相差了100块哦,也不知有什么区别,卖家也语焉不详啊。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-11 10:04:41 | 显示全部楼层
duanyz 发表于 2019-9-10 09:13
感谢你的回复,可惜程序里没有什么注释,能请你说说tm003这个芯片输出的数据格式是什麽样的吗?知道了数据 ...

實驗的主要目的是以 8F328-U 讀取 TM003,用以體驗操作的過程,且實驗的結構也不能做得很精確,所以用的 是較平宜的 TM003。一般購買時會連同定柵,若沒有,就不能完成這實驗。

以下是賣家在d淘寶上的說明:
========================================
产品的测量速度为3m/s,显示的速度为8次/s;

1、产品供电电源3-3.3V,不得超过3.6V;电源输入需加滤波电容;

2、外部清零可通过第2线与负极短接500MS实现;

3、产品负极接地(金属),否则会出现数据不稳现象;

4、产品与反射栅之间的间隙控制在0.2mm以内为宜,反射栅可根据需要延长;

5、产品测量范围-999.99 ~ 999.99mm,分辨率为0.01mm;

6、芯片数据主动发射,不被动接收;

7、串行数据输出为开漏输出,前20位是数据,后4位是标志位
==============================================

用示波器看到起始時脈一般在 100ms~500ms 之間,在這之後就可以讀數據 和 顯示結果了。
回复 支持 反对

使用道具 举报

发表于 2021-10-22 11:07:29 | 显示全部楼层
eddiewwm 发表于 2019-4-17 16:21
不使用 pulseIn(),用 pin2 interrupt 的範例:

#define STATUS_LED 13 // To output the waveform as pin2 SCLK input
你好,这句没有太理解13脚是连接到哪里
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 16:27 , Processed in 0.042153 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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