[Chia sẻ] Touchpad dùng MSP430

2death

Cố Vấn CLB
Staff member
Chiều nay, các bạn FW và SW đã báo cáo đề tài touchpad tại phòng Chuyên đề.
Đây là 1 số hình ảnh ghi lại được tại buổi báo cáo:
(nhìn chung đề tài này chỉ có 1 số bạn hoàn thành (rất đáng khen ngợi :) ) và dám vác lên chạy thử).

1 - Touchpad của em Khoa cooliovato:


Lúc chưa chạm:


Sau khi chạm:


2 - Touch của em Vũ messier:


Ko hiểu sao chụp nó có 1 tấm, đành đợi clip để xem nó hoạt động ra sao.

3 - Em Bảo: cowboyhere:


4 - Em Hiệp honghiep
Up nhiều hình để bà con anh em tham khảo.




<xem tiếp phần sau>
 

honghiep

Cố Vấn CLB
Staff member
Em xin mở đầu cái nha :4cool_beauty:
- Bài viết này mình xin giới thiệu về cách làm 1 cái Capacitive Touchpad (Nói đơn giản là bàn phím cảm ứng điện dung) sử dụng chức năng Pin-Osc của dòng VĐK MSP430Gxxxx
- Đầu tiên mình xin trình bày cấu tạo của mạch:

Mạch gồm các phím cảm ứng là các pad đồng nối đến các chân I/O có chức năng Pin-Osc của VĐK. Xung quanh các phím là 1 lớp mass, độ nhạy của các phím phụ thuộc vào khoảng cách giữa phím và lớp mass xung quanh. Theo như khuyến cáo của TI thì khoảng cách tốt nhất là 0.5mm. Mặt dưới của board cũng được phủ 1 lớp mass nhằm giảm nhiễu cho phím.

Để hiểu rõ hơn, mọi người có thể xem thêm tài liệu tại: http://www.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=slaa363a&fileType=pdf
- Schematic :


- Layout


- Nguyên lí hoạt động:
Khi chưa có tác động, phím với mass tạo thành 1 tụ điện có điện dung nhất định. Trong 1 khoảng thời gian nhất định, ta đo số chu kì tích phóng của mạch RC trên.
Khi đưa tay đến gần/chạm vào phím, điện dung của tụ tăng lên làm chu kì tích phóng của mạch RC tăng -> số chu kì tích phóng trong khoảng thời gian trên giảm xuống. Ta dựa vào sự thay đổi này để biết phím có được nhấn hay không.
Để đo được số chu kì tích phóng của mạch RC, ta sử dụng chức năng Capture của Timer với nguồn clock ngoại lấy từ chân VĐK nối với phím tương ứng.

Mọi người có thể xem thêm tại: www.ti.com/lit/ug/slaa490/slaa490.pdf
Ở đây mình sử dụng kiểu Relaxation Oscillator
- Code cho 4 phím với schematic trên các bạn xem trong file:
Code:
http://www.mediafire.com/?xr2c5324gs3dy3i

Lưu ý: Theo như code trên, GND được nối đến chân P2.6 của VĐK để tạo thêm phần Proximity (Cảm biến khoảng cách) với nguyên lý tương tự các phím khác
 

cooliovato

Cố Vấn CLB
Staff member
+ Bài này ko dám gọi là TUT, chỉ là một chia sẻ nhỏ cho bạn nào đang tìm hiểu về touchpad! ^^

+ Có nhiều cách để thực hiện 1 capacitive touchpad, nguyên tắc chung là phải nhận biết được sự thay đổi điện dung khi có tay chạm vào. Đầu tiên các bạn có thể ghé qua topic này để download các tài liệu do anh Cao Long chia sẻ: http://www.payitforward.edu.vn/forum/threads/807/

+ Ở đây mình xin chia sẻ 1 cách khác so với cách mà bạn Hồng Hiệp đã nêu ở trên, giống nhau hoàn toàn về nguyên tắc chung, chỉ khác nhau ở thuật toán để đo điện dung thôi. Vi điều khiển sử dụng MSP430G2553

+ Về phần cứng sơ đồ nguyên lí như sau:

+ Sơ đồ trên dùng cho 5 nút nhấn cảm ứng, mỗi nút nhấn xem như một tụ điện được mắc song song với một điện trở có giá trị lớn (tầm mega ohm, có thể dùng 2M). Với cách mắc như vậy thì tụ sẽ được nạp rất nhanh thông qua chân vi điều khiển (vđk) sau đó sẽ xả chậm hơn qua điện trở (trở càng lớn xả càng chậm), ta sẽ đo khoảng thời gian xả này để xác định điện dung của nút nhấn nên việc xả chậm là cần thiết để vđk kịp nhận biết.
+ Về layout:

+ Các bạn có thể layout theo kiểu mình thích nhưng lưu ý các điểm sau:
1. Dây nối từ nút nhấn đến chân vđk càng ngắn càng tốt, nếu bạn nào dùng launchpad thì nên làm theo kiểu hàn header cái rồi cắm trực tiếp lên launchpad giống như các sản phẩm ở trên. Dùng bus nối sẽ bị nhiễu rất nặng, thậm chí ko sử dụng được.
2. (dành cho bạn nào làm trên launchpad) Không nên nối nút nhấn đến các chân có chức năng đặc biệt như Led, Button, UART,...để có thể dùng vào việc khác, layout trên mình sơ ý nên nối 1 nút vào led P1.0, các bạn có thể dời sang một chân khác
3. Cái layout share ở trên khi in phải mirror lại thì khi ủi mới đúng!
4. ..........các bạn tự suy nghĩ thêm...........^^
+ Về phần mềm mới cái quan trọng đây, phần cứng đơn giản là thế nhưng nếu các bạn code tốt sẽ có một touchpad với rất nhiều trò hay ho như nút nhấn, slider, wheel,... ta dùng giải thuật đo điện dung của nút nhấn theo lưu đồ sau:


+ Mỗi nút nhấn sẽ có một điện dung "nền" base, tức là điện dung khi chưa được chạm, khi có tay chạm vào điện dung của nút nhấn sẽ tăng lên kéo theo thời gian xả sẽ tăng. Có thể dùng thuật toán sau để kiểm tra một nút nhấn:
Code:
delta = 0;
measure();
delta = meas - base;
if (delta > threshold)
{
      action();
}
else adjust();
+ Base là điện dung nền, meas là điện dung đo được bằng hàm measure() (hàm measure có lưu đồ như đã trình bày ở hình trên), delta là độ chênh lệch giữa điện dung nền và đo được, nếu mức chênh lệch này vượt qua 1 ngưỡng threshold nào đó thì xem như có tay chạm và ta cho vdk thực hiện 1 action() nào đó. Ở đây thuật toán có dùng thêm 1 bước điều chỉnh điện dung nền của nút nhấn tuy nhiên các bạn có thể bỏ qua phần này.

+ Muốn thực hiện trên nhiều nút nhấn ta chỉ cần quét lần lượt từng nút và áp dụng thuật toán trên cho mỗi nút, khi đã quét được nhiều nút các bạn có thể làm tiếp slider, wheel,... phần này các bạn xem thêm trong code của bạn Hiệp đã chia sẻ. Bài dài quá viết hết nổi rồi...@@
 

cooliovato

Cố Vấn CLB
Staff member
Ấy quên mất cái topic share tài liệu của anh Cao Long nằm trong box TVCT, quote ra ngoài để mọi người tiện download, nhớ đăng nhập vào google trước rồi mới down đc
P/S: cơ mà mấy cái emotion đâu mất hết rồi ta? Tag member cũng ko đc lun!?
Link này là thư viện tài liệu về touch của mình (nó nằm trong 1 cái lớn hơn, mình cóp nhặt nhiều nơi rồi tự sắp xếp theo phần tìm hiểu, thích thì coi): https://drive.google.com/#folders/0B3jjJvyr91KDc1FzNkVUOFlJSjA
Xem slaa363, slaa379 là khá đủ để tự làm rồi :6cool_boss: Xem thêm phần hardware trong slau337 để học cách tiết kiệm chân của TI. Ngoài ra có thể xem qua schematic/capture của development board f5529 - có 4 nút cảm ứng - trong thư mục Schematics & Footprints.
 

messier

Ban Chủ Nhiệm
[Demo] Remote cảm ứng và led feedback
Tính năng:
- Led feedback kết hợp với sensor
- Keypad multiplexing (kiểu ma trận phím) và wheel
- Remote đa năng với khả năng học lệnh (chưa code và ko biết biết có code nổi ko :5cool_sweat: )
 

Kisses Hacker

Art Supporter
Staff member
messier lại khủng bố diễn đàn bằng "hàng" mới của anh ấy :6cool_boss:

Hôm bữa nghe loáng thoáng giải thuật điều khiển cái touch remote này khá khủng, messier có thể nói lại ngắn gọn cho mọi người cùng hiểu được không :D
 

messier

Ban Chủ Nhiệm
Thấy dạo này nhiều bạn hỏi code đo điện dung không chạy, nhân tối nay rảnh rỗi nên post lên 1 demo đơn giản cảm ứng 4 nút. Hardware rất đơn giản (dùng lại cái touch đầu tiên mình làm) có dán thêm lớp mica 1.5mm bằng keo 502 lên mặt trên. Về firmware sử dụng phương pháp RO_PinOsc và định nghĩa thêm kiểu struct Element để quản lý các sensor pad dễ hơn. Lưu ý cần phải Enable support for GCC extensions trong phần Language Options thì code mới chạy được :P.
Code:
#include <msp430g2553.h>
#define WDT_meas_setting    (WDT_MDLY_8)        // watchdog interval = 0.5 ms
 
int base_cap[4];                                // Baseline capacitance for each pad
 
struct Element{                                    // This structure contains informations of sensor pad
    unsigned char *Pxsel;                        // Pointer to Pxsel register
    unsigned char *Pxsel2;                        // Pointer to Pxsel2 register
    unsigned char *Pxdir;                        // Pointer to Pxdir register
    unsigned char *Pxout;                        // Pointer to Pxout register
    unsigned char inputBits;                    // Input bit
    int *baseline;                                // Pointer to baseline capacitance
};
//*************************************************************************
// Define sensor pad element
//*************************************************************************
const struct Element KEY_1 = {
        .Pxsel = (unsigned char *)&P1SEL,
        .Pxsel2 = (unsigned char *)&P1SEL2,
        .Pxdir = (unsigned char *)&P1DIR,
        .inputBits = BIT0,
        .baseline = &base_cap[0]
};
 
const struct Element KEY_2 = {
        .Pxsel = (unsigned char *)&P1SEL,
        .Pxsel2 = (unsigned char *)&P1SEL2,
        .Pxdir = (unsigned char *)&P1DIR,
        .inputBits = BIT3,
        .baseline = &base_cap[1]
};
 
const struct Element KEY_3 = {
        .Pxsel = (unsigned char *)&P2SEL,
        .Pxsel2 = (unsigned char *)&P2SEL2,
        .Pxdir = (unsigned char *)&P2DIR,
        .inputBits = BIT4,
        .baseline = &base_cap[2]
};
 
const struct Element KEY_4 = {
        .Pxsel = (unsigned char *)&P1SEL,
        .Pxsel2 = (unsigned char *)&P1SEL2,
        .Pxdir = (unsigned char *)&P1DIR,
        .inputBits = BIT7,
        .baseline = &base_cap[3]
};
 
const struct Element *KEY[] = {&KEY_1, &KEY_2, &KEY_3, &KEY_4};    // Define Element pointer array
 
//*************************************************************************
// Program subroutines
//*************************************************************************
void base_calib(void){                        // Measure the baseline capacitance each pad
    char i;
    for(i = 0; i < 4; i++){
        base_cap[i] = measure_count(*KEY[i]);
    }
}
//------------------------------------------------------------------------
int measure_count(struct Element pad){        // Measure raw capacitance
    int meas_cnt;
    TA0CTL = TASSEL_3 + MC_2;              // TACLK, continous mode
    TA0CCTL1 = CM_3 + CCIS_2 + CAP;        // Pos & Neg, GND, capture mode
 
    *(pad.Pxsel) &= ~pad.inputBits;            // TACLK input
    *(pad.Pxsel2) |= pad.inputBits;
    *(pad.Pxdir) &= ~pad.inputBits;            // input pins
 
    /*Setup Gate Timer*/
    WDTCTL = WDT_meas_setting;              // WDT, SMCLK, interval timer
    TA0CTL |= TACLR;                        // Clear Timer_A TAR
    __bis_SR_register(LPM0_bits+GIE);      // Wait for WDT interrupt
    meas_cnt = TA0CCR1;                    // Save result
    WDTCTL = WDTPW + WDTHOLD;              // Stop watchdog timer
    TA0CTL = MC_0;                            // Stop timer0
    *(pad.Pxsel2) &= ~pad.inputBits;
    return meas_cnt;
}
//------------------------------------------------------------------------
//*************************************************************************
// Main Program
//*************************************************************************
int main(void) {
    int delta_count;
    WDTCTL = WDTPW | WDTHOLD;                // Stop watchdog timer
    BCSCTL1 = CALBC1_16MHZ;                // Set DCO to 1MHz
    DCOCTL =  CALDCO_16MHZ;
 
    IE1 |= WDTIE;                          // Enable WDT interrupt
    base_calib();
    while(1){
        delta_count = *(KEY_2.baseline) - measure_count(KEY_2);
        if(delta_count > 15){                // If Key 2 is touched -> turned on LED 1
            P1DIR |= BIT0;
            P1OUT |= BIT0;
        }
        else P1OUT &= ~BIT0;
 
        delta_count = *(KEY_3.baseline) - measure_count(KEY_3);
        if(delta_count > 20){                // If Key 2 is touched -> turned on LED 2
            P1DIR |= BIT6;
            P1OUT |= BIT6;
        }
        else P1OUT &= ~BIT6;
    }
    return 0;
}
 
//*************************************************************************
// Interrupt service routine
//*************************************************************************
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
    TA0CCTL1 ^= CCIS0;                        // Toggle CM0 to initiate capture
    __bic_SR_register_on_exit(LPM3_bits);  // Exit LPM3 on reti
}
 

messier

Ban Chủ Nhiệm
em để code theo cách của em vậy sẽ làm mọi người hơi rối đấy messier. Nên nói rõ đây là sự kết hợp giữa code của em và thư viện TI chứ ko phải chỉ dùng thư viện của TI :D
Không hiểu ý anh lắm, tại sao nói rõ ra thì lại bớt rối ??
Project này đặt ra để mọi người tham khảo cách thiết lập 1 GPIO thành chức năng PinOsc & config các timer (tất cả đều trong hàm measure_count() ) và việc cảm ứng xuyên qua lớp mica dày 1, 2 mm là hoàn toàn khả thi. :D
 

MMKC

Thành Viên PIF
Đọc Slide TA mỏi mắt quá.
Cho mình hỏi thuật toán đo điện dung hình như có 3 cách: RO RC fRO
Nếu muốn Wheels hay Slider thì nên dùng thuật toán nào ?
Việc sử dụng dụng thư viện TI khá nhiều hàm nên nhức mắt wa' :(, mình đọc thấy có COMPA và COMPB, tức là TimerA và TimerB hả bạn :(.
 

Phạm Thành Danh

Thành Viên PIF
Bài này viết lâu rôi, không biết giờ em hỏi còn ai trả lời không ta :-(, tình hình là em mới đọc xong một số tài liệu về cái này nhưng mà không hiểu lắm về phần cứng :gach. Em muốn hỏi là cái touch pad của anh Hiệp có thêm cái miếng đồng ở dưới thì có phải nối thêm dây gì với nó không, nếu không có thì có ảnh hưởng gì không ạ. Hi, sẵn anh chị nào có tài liệu tiếng Việt về phần này không, cho em xin với, đọc tiếng Anh không hiểu hết được, một số cái phải đoán mệt quá :D. Ah, cho em xin luôn cái thư viện layout của mấy cái pad được không ạ! Em cảm ơn nhiều hihi:1cool_byebye:
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Cái này cắm thẳng vào chân MCU cũng chạy mà :2cool_sexy_girl::2cool_sexy_girl::2cool_sexy_girl:.. quất zị luôn cho nó "ngon, bổ, rẻ" :whaaat::doubt::misdoubt:
 

trinhdieuhvktqs

Trứng gà
Các bạn cho mình hỏi nếu mình để 1 LED ở chính giữa, mặt sau của PAD ( ví dụ PAD để trên lớp TOP thì LED sẽ đặt tại lớp BOTTON , tại chính giữa )thì có bị ảnh hưởng gì không nhỉ ? thanks !
 

Vũ Long

Thành Viên PIF
Em xin mở đầu cái nha :4cool_beauty:
- Bài viết này mình xin giới thiệu về cách làm 1 cái Capacitive Touchpad (Nói đơn giản là bàn phím cảm ứng điện dung) sử dụng chức năng Pin-Osc của dòng VĐK MSP430Gxxxx
- Đầu tiên mình xin trình bày cấu tạo của mạch:

Mạch gồm các phím cảm ứng là các pad đồng nối đến các chân I/O có chức năng Pin-Osc của VĐK. Xung quanh các phím là 1 lớp mass, độ nhạy của các phím phụ thuộc vào khoảng cách giữa phím và lớp mass xung quanh. Theo như khuyến cáo của TI thì khoảng cách tốt nhất là 0.5mm. Mặt dưới của board cũng được phủ 1 lớp mass nhằm giảm nhiễu cho phím.

Để hiểu rõ hơn, mọi người có thể xem thêm tài liệu tại: http://www.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=slaa363a&fileType=pdf
- Schematic :


- Layout


- Nguyên lí hoạt động:
Khi chưa có tác động, phím với mass tạo thành 1 tụ điện có điện dung nhất định. Trong 1 khoảng thời gian nhất định, ta đo số chu kì tích phóng của mạch RC trên.
Khi đưa tay đến gần/chạm vào phím, điện dung của tụ tăng lên làm chu kì tích phóng của mạch RC tăng -> số chu kì tích phóng trong khoảng thời gian trên giảm xuống. Ta dựa vào sự thay đổi này để biết phím có được nhấn hay không.
Để đo được số chu kì tích phóng của mạch RC, ta sử dụng chức năng Capture của Timer với nguồn clock ngoại lấy từ chân VĐK nối với phím tương ứng.

Mọi người có thể xem thêm tại: www.ti.com/lit/ug/slaa490/slaa490.pdf
Ở đây mình sử dụng kiểu Relaxation Oscillator
- Code cho 4 phím với schematic trên các bạn xem trong file:
Code:
http://www.mediafire.com/?xr2c5324gs3dy3i

Lưu ý: Theo như code trên, GND được nối đến chân P2.6 của VĐK để tạo thêm phần Proximity (Cảm biến khoảng cách) với nguyên lý tương tự các phím khác

Anh Hiệp còn sche và layout của cái project này không anh? Chia sẻ cho em với, hình nó died hết rồi :(
 
Top