電容式觸控開關實驗(一):RC延時電路應用

海椰人 發佈 2022-07-29T09:27:49.426857+00:00

實驗材料Arduino Uno控制板一片電阻:1MΩ×3、680Ω×2LED×2(顏色不拘)(沒有塑料皮的)回形針×3公對母連接線×3鋁箔紙:裁剪3枚(筆者剪裁的大小是15mm×12mm)實驗電路與麵包板組裝示範本單元的實驗電路如下,全部的1MΩ電阻的一端都連接到同一個數位腳(此

實驗材料

  • Arduino Uno控制板一片
  • 電阻:1MΩ×3、680Ω×2
  • LED×2(顏色不拘)
  • (沒有塑料皮的)回形針×3
  • 公對母連接線×3
  • 鋁箔紙:裁剪3枚(筆者剪裁的大小是15mm×12mm)


實驗電路與麵包板組裝示範

本單元的實驗電路如下,全部的1MΩ電阻的一端都連接到同一個數位腳(此處為第4腳,可改用其他腳位),電阻的另一端連接到不同的數位腳,以及充當「觸控感測端」的鋁箔紙,你可以嘗試其他導體,像銅箔或香蕉番石榴之類的東東。

使用麵包板組裝電路的示範如下,用回形針固定電阻的一端和鋁箔紙:

筆者把觸控電路焊接在PCB板,鋁箔紙用白膠黏貼:

電容觸控與RC電路的原理

本實驗程序將在電阻的一端(數位第4腳)發送脈衝信號,在沒有人體碰觸感測界面情況下,該脈衝信號幾乎原封不動地傳送到電阻的另一端:

當手指靠近感測端時,手指和感測端的導體(鋁箔)之間會形成電容,相當於電阻的另一端接了一個電容器:

電容的基本結構像下圖一樣,用兩片導體、中間以絕緣介質(如:空氣、雲母、陶瓷…)隔離。當兩端導體通電時,導體就會聚集正、負電荷,形成「電的容器」。

左下圖是用電阻(R)電容(C)組成的基本RC電路。對電容通電時,電容將開始儲存電荷,直到注滿到電壓的相同准位;斷電時,電容會開始放電,直到降到0(亦即,「接地」的准位)。

在充電過程中,電流與電容電壓的變化量受到電阻與電容值影響。電阻R與電容值C的乘積稱為時間常數(time constant),寫成希臘字母τ(念作「tau」),有時也直接用英文字母t代表:

τ= RC

電容充電到約70%(實際為63.2%)僅需花費一個時間常數,充到飽和(約99.3%)需要5個時間常數;電阻或電容值愈大,充電所需時間也愈長。電容放電時,在一個時間常數之後,約剩下40%(實際為36.8%)。

因此,向電阻的一端輸入脈衝信號,當手指接觸電阻另一端時,輸出脈衝的高、低電位時間將被「延後」。程序透過比對輸入和輸出的脈衝時間,就能得知是否有人碰觸到感應器(鋁箔)。

感測端的電容量,與手指和感應器的距離成反比。本單元程序採用Paul Stoffregen撰寫的Captivative Sensor程序庫,此程式庫的說明頁指出,電路中的電阻值可介於100KΩ~50MΩ,阻值越大越靈敏但反應變遲鈍:

  • 若要偵測手指是否碰觸到感測面,請使用1MΩ
  • 若要偵測4~6吋(註:1吋=2.54公分)的距離,請使用10MΩ。
  • 若要偵測12~24寸的距離(視感測面的金屬片尺寸而定),請使用40MΩ。市面所能買到的最大電阻值為10MΩ,請自行串連4個電阻。

說明頁也提到,在感測端加上一個100pF的電容(標示為101),可增加檢測的穩定性。

觸控開關實驗程序

下載CaptivativeSensor程序庫、解壓縮之後,筆者將它重新命名成「CaptivativeSensor」,存入Arduino的libraries文件夾:

開啟Arduino IDE,選擇「檔案→示例→CapacitiveSensor→CapacitiveSensorScketch」,開啟程序庫提供的示例程序。此示例程序的感測脈衝信號發射腳是4,接收腳是2,6和8,請將它們改成5,6,7:

其餘代碼不用改。編譯並上傳到Arduino控制板之後,開啟序列埠監控視窗,這是尚未碰觸任何感應界面的輸出:

碰觸感應界面的結果:

CapacitiveSensor程序庫的方法

CapacitiveSensor程序庫包含3個主要方法以及一些工具方法:

CapacitiveSensor CapacitiveSensor(byte脈衝發射腳,byte感測腳)

CapacitiveSensor用於建立程序庫的物件實體(請留意大小寫)。

long capacitiveSensorRaw(byte取樣數)

capacitiveSensorRaw將傳回長整數類型的原始電容值,「取樣數」參數可用於增加傳回值的解析度,其代價是處理性能降低。傳回的電容值並非取樣數的平均,也不包含總電容量數。

capacitiveSensorRaw將傳回-2,若電容值超過CS_Timeout_Millis(偵測超時)定義的毫秒值。CS_Timeout_Millis預設為2000毫秒(2秒)。

long capacitiveSensor(byte取樣數)

capacitiveSensor將傳回長整數類型的感應電容值,capacitiveSensor會紀錄未感測到碰觸時的最低電容值,並且用碰觸時的電容量與之相減。

最低容量值每隔一段時間(由CS_Autocal_Millis定義)重新校正一次,預設校正間隔時間是200000毫秒(20秒)。此重新校正機制可透過設定一個很大的數值(0xFFFFFFFF)給CS_Autocal_Millis來關閉。

void set_CS_Timeout_Millis(unsigned long超時毫秒數)

set_CS_Timeout_Millis方法用於設定CS_Timeout_Millis的值,來設定等待感測端信號跟著發射端高、低變化的超時毫秒值。在等待感應脈衝變化之間,程序會暫停運作,所以必須設定超時,預設為2000毫秒(2秒)。

void reset_CS_AutoCal()

立即校正capacitiveSensor函式的電容值

void set_CS_AutocaL_Millis(unsigned long自定義校正的毫秒數)

設定capacitiveSensor函式超時間隔。給定」0xFFFFFFFF」數值可關閉自動校正功能。

觸控LED開關

底下的程序將能在感測到使用者碰觸時點亮LED,筆者設定的電容臨界值是1500,請依照你的測試結果調整此值。

#include <CapacitiveSensor.h>
#define threshold 1500 // 感測電容量的臨界值
#define LED1 11 // LED1的腳位
#define LED2 12 // LED2的腳位
#define LED3 13 // LED3的腳位
// 設定電容觸控的訊號輸入和輸出腳位
CapacitiveSensor cs_4_5 = CapacitiveSensor(4,5);
CapacitiveSensor cs_4_6 = CapacitiveSensor(4,6);
CapacitiveSensor cs_4_7 = CapacitiveSensor(4,7);
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
}
void loop() {
long total1 = cs_4_5.capacitiveSensor(30);
long total2 = cs_4_6.capacitiveSensor(30);
long total3 = cs_4_7.capacitiveSensor(30);
// 若第一個觸控點的電容量大於臨界值,則點亮LED。
if (total1 > threshold) {
digitalWrite(LED1, HIGH);
} else {
digitalWrite(LED1, LOW);
}
if (total2 > threshold) {
digitalWrite(LED2, HIGH);
} else {
digitalWrite(LED2, LOW);
}
if (total3 > threshold) {
digitalWrite(LED3, HIGH);
} else {
digitalWrite(LED3, LOW);
}
}
關鍵字: