奇怪的 Arduino 旋轉編碼器 (KY-040)

本帖最後由 Super169 於 2017-3-2 22:39 編輯

之前在淘寶買左幾個 KY-040 (旋轉編碼器), 諗住比 Arduino 做旋轉按鈕.
收左之後至發覺, 針腳同預期既有 D 唔同.  佢係 CLK, DT, SW, +, GND.
用網上搵到既程式, 全部都唔 work, 總係話我不停轉緊.  
佢就同 呢度 (https://www.youtube.com/watch?v=J9cDEef0IbQ)  講果塊完全一樣, 但結果不一樣.

舊野係咁樣既:
20170302-001.jpg
2017-3-2 22:34


覺得好奇怪, 以為佢 short 左線, 但..當我放低佢, 佢就唔跳. 試在好多次都係咁, 奇怪.
為左再清楚發生乜事, 我將三條 pin 分別接 D3, 用 attachInterrupt 去測試, 結果真係估你唔到.

當我隻手接近 (係接近, 唔係接觸), 只需要去到大約 2cm 以內, 佢就會自己亂跳.  一走開少少, 就會即停.

玩左好耐, 比我原來想買既野更得意, 幾乎好似人體感應一樣.
所以之前我攞住黎試, 佢就不停咁跳了.
但係, 成件野點睇都唔似內置左乜野 sensor.

我買左幾隻都係咁, 好奇怪, 好似原來既設計就係咁.  但隻手接近就當轉緊, 點用?
唔知仲有無 ching 買過, 會唔會有咁既情況?
家陣既問題, 已經唔係點樣可以用佢.  而係想知道, 有乜野原理, 可以咁樣.

會唔會係因為佢本身產生左既磁場, 因為隻手接近而改變, 所以觸發左 interrupt?

果3條線要pull up, 冇pull up就float, float住接觸人體就會pickup倒50hz

TOP

果3條線要pull up, 冇pull up就float, float住接觸人體就會pickup倒50hz
icefire 發表於 2017-3-2 23:00


問題係...我無接觸到, 仲有 2cm 距離佢就會跳了.

而且, 條 youtube 片入面, 佢好似都無自己接 pullup 喎.

SW (按鍵) 果條反應無咁大, 接線就用 pin8, set 左 INPUT_PULLUP, 可以當成用左 internal pullup.
但係 CLK 同 DT 佢係就咁 INPUT, 連 internal pullup 都無用.

等我搵下有無 10k 既接黎試下先.  唔該哂先.

TOP

問題係...我無接觸到, 仲有 2cm 距離佢就會跳了.

而且, 條 youtube 片入面, 佢好似都無自己接 pullup 喎 ...
Super169 發表於 2017-3-2 23:11


for 3.3v or 5v MCU 4.7k ~ 20k also ok

TOP

個code系寫成點?
你應該系有將2個input IO set成高電平(HIGH),再將佢set做input掛??

TOP

唔知我有無攪錯,  我 加左2 個  10K:  CLK 接 5V, DT 接 5V, 結果不斷出 interrupt.
拔走個 10K, 就要隻手接近至會跳.

TOP

個code系寫成點?
你應該系有將2個input IO set成高電平(HIGH),再將佢set做input掛??
ahuo 發表於 2017-3-2 23:35


條 youtube 片既原碼:
https://dl.dropboxusercontent.co ... rInterrruptsLED.ino

pinA pinB 都係 INPUT, pinSW 至係 INPUT_PULLUP (按下去出 LOW, 正常)

我試過改左 pinA pinB 做 INPUT_PULLUP 就會不斷跳.

再發覺一樣野, 原來唔需要隻手接近 KY-040, 係隻手接近連線既電線就會跳.
頭先去拔 UNO 果邊條線, 發覺佢一樣跳, 再慢慢將隻手沿條線行, 一直都在跳, 一攞開少少就停.

TOP

我將成個 program 簡化成只測試一條 pin, 睇下 interrupt  點解成日跳.
  1. // Used for generating interrupts using CLK signal
  2. const int PinA = 3;

  3. bool isrTriggered = false;
  4. int interruptCnt = 0;

  5. void isr () {
  6.     isrTriggered = true;
  7.     interruptCnt++;
  8. }

  9. void setup() {
  10.   // put your setup code here, to run once:
  11.   pinMode(PinA, INPUT);
  12.   Serial.begin(115200);
  13.   attachInterrupt(digitalPinToInterrupt(PinA), isr, LOW);
  14.   Serial.println("Start");

  15. }

  16. void loop() {
  17.   // put your main code here, to run repeatedly:
  18. //  Serial.println(digitalRead(PinSW));
  19.   if (isrTriggered) {
  20.     Serial.println(interruptCnt);
  21.     isrTriggered = false;
  22.   }
  23. }
複製代碼
(attachInterrupt 用 LOW, CHANGE, FALLING  結果都一樣).

唔加 10K pullup: 只有隻手接近才跳
加左 10K pullup: 本身就跳緊, 放隻手埋去就會加速

TOP

我將成個 program 簡化成只測試一條 pin, 睇下 interrupt  點解成日跳.(attachInterrupt 用 LOW, CHANGE, F ...
Super169 發表於 2017-3-2 23:53


你試下咁改吧:
...
pinMode(PinA, INPUT);
digitalWrite(PinA, HIGH);
Serial.begin(115200);
attachInterrupt(digitalPinToInterrupt(PinA), isr, FALLING);
...

TOP

你試下咁改吧:
...
pinMode(PinA, INPUT);
digitalWrite(PinA, HIGH);
Serial.begin(115200);
attachInte ...
ahuo 發表於 2017-3-3 07:04



唔該 ching 先.  好奇怪, 可能係我塊 UNO 有問題.
因為心急想試, 帶左個 KY-040 番公司玩, 我本身放左塊 UNO 在公司.
再行個測試程式, 完全正常.  無比隻手干擾.
再行番 Youtube 片果個 program, 一切正常.  
睇住一格格扭, 一格格行.  正負方向同按鈕都正常.

咁就奇怪, 屋企塊 UNO 發生乜事.  要搵多幾塊試下先.
今晚帶埋呢塊 UNO 番屋企再試, 睇下係咪公司風水好 D.

TOP

相關文章