การใช้งาน โมดูลปุ่มกด 12 ปุ่ม 3x4 Matrix Keypad บน Raspberry pi ด้วย Node js


วันนี้ผมจะพาท่านผู้อ่านไปใช้งาน โมดูลปุ่มกด 12 ปุ่ม 3x4 Matrix Keypad เชื่อมต่อกับ Raspberry pi โดยใช้ Node js ในการเขียนโปรแกรม เพื่อให้ทุกท่านไปประยุกต์ใช้งานกัน


3x4 Matrix Keypad คือ สวิทช์ที่นำมาต่อกันแบบแนวนอนและแนวตั้ง การใช้งานต้องใช้วิธีสแกน ส่งสัญญาณทาง Row และรับทาง Column ดังรูป

 


ถ้ายังไม่ลง Node js ดูบทความ 


    มาต่อใช้งานและโปรแกรมกัน

    1. ต่อ Keypad เข้ากับ Raspberry pi 


    Pi GPIO6   to keypad R1
    Pi GPIO13 to keypad R2
    Pi GPIO19 to keypad R3
    Pi GPIO26 to keypad R4
    Pi GPIO21 to keypad C1
    Pi GPIO20 to keypad C2
    Pi GPIO16 to keypad C3

    2. เนื่องจากผมต้องการต่อ input pull up แบบ internal กำหนดค่าใน /boot/config.txt New "gpio" config command
    sudo nano /boot/config.txt
    


    กด ctrl+x > y เพื่อ save แล้ว Reboot

    2. สร้างโฟลเดอร์ของโปรเจค จากนั้น init โปรเจค
    mkdir keypad3x4
     cd keypad3x4
     npm init -y
    


    3. ติดตั้ง module onoff  npmjs.com/package/onoff
    npm add onoff
    


    4. สร้างไฟล์ app.js เพื่อเขียนโปรแกรม จากนั้นกด Save
    //Pi GPIO6  to keypad R1
    //Pi GPIO13 to keypad R2
    //Pi GPIO19 to keypad R3
    //Pi GPIO26 to keypad R4
    //Pi GPIO21 to keypad C1
    //Pi GPIO20 to keypad C2
    //Pi GPIO16 to keypad C3
    
    const Gpio = require('onoff').Gpio;
    
    const keypadR1 = new Gpio(6, 'out');
    const keypadR2 = new Gpio(13, 'out');
    const keypadR3 = new Gpio(19, 'out');
    const keypadR4 = new Gpio(26, 'out');
    
    const keypadC1 = new Gpio(21, 'in', 'falling', {debounceTimeout: 10});
    const keypadC2 = new Gpio(20, 'in', 'falling', {debounceTimeout: 10});
    const keypadC3 = new Gpio(16, 'in', 'falling', {debounceTimeout: 10});
    
    let scanRow = 0
    const keys = [
      ['1','2','3'],
      ['4','5','6'],
      ['7','8','9'],
      ['*','0','#'],
    ]
    
    keypadC1.watch((err, value) => {
      if (err) {
        throw err;
      }
    
      console.log('keypad C1')
      checkKey(0)
    });
    
    keypadC2.watch((err, value) => {
      if (err) {
        throw err;
      }
    
      console.log('keypad C2')
      checkKey(1)
    });
    
    keypadC3.watch((err, value) => {
      if (err) {
        throw err;
      }
    
      console.log('keypad C3')
      checkKey(2)
    });
    
    const checkKey = (col) => {
      console.log('Key:', keys[scanRow][col], new Date().getTime())
    }
    
    const scanInterval = setInterval(function(){ 
      // console.log('scanRow:', scanRow)
    
      if(++scanRow >= 4) scanRow = 0; 
    
      keypadR1.writeSync(1)
      keypadR2.writeSync(1)
      keypadR3.writeSync(1)
      keypadR4.writeSync(1)
      
      switch(scanRow) {
        case 0: keypadR1.writeSync(0); break; 
        case 1: keypadR2.writeSync(0); break;
        case 2: keypadR3.writeSync(0); break;
        case 3: keypadR4.writeSync(0); break;
      }
     
    }, 50);
    
    process.on('SIGINT', _ => {
      keypadR1.unexport();
      keypadR1.unexport();
      keypadR1.unexport();
      keypadR1.unexport();
    
      keypadC1.unexport();
      keypadC1.unexport();
      keypadC1.unexport();
    });
    
    console.log('Start scan keypad')
     
    


    5. กลับไปที่ Terminal รันโปรแกรม พิมพ์คำสั่ง node app แล้วลองกดปุ่มดู
    node app
    


    มาดูการทำงานของโปรแกรมคร่าวๆ

    const Gpio = require('onoff').Gpio;
    เรียกใช้งาน module onoff เพื่อควบคุม gpio

    const keypadR1 = new Gpio(6, 'out');
    กำหนดขา 6 เป็น output สำหรับ keypad row

    const keypadC1 = new Gpio(21, 'in', 'falling', {debounceTimeout: 10});
    กำหนดขา 21 เป็น input สำหรับ keypad column, falling=interrupt ขอบลบ, debounce=10ms 

    let scanRow = 0
    const keys = [
      ['1','2','3'],
      ['4','5','6'],
      ['7','8','9'],
      ['*','0','#'],
    ]
    กำหนดตัวแปร scanRow=นับค่า row, keys=ค่า key 

    keypadC1.watch((err, value) => {
      if (err) {
        throw err;
      }

      console.log('keypad C1')
      checkKey(0)
    });
    กำหนด interrupt รับปุ่ม

    const checkKey = (col) => {
      console.log('Key:', keys[scanRow][col], new Date().getTime())
    }
    ฟังชั่นแสดงค่า key

    const scanInterval = setInterval(function(){ 
      // console.log('scanRow:', scanRow)

      if(++scanRow >= 4) scanRow = 0; 

      keypadR1.writeSync(1)
      keypadR2.writeSync(1)
      keypadR3.writeSync(1)
      keypadR4.writeSync(1)
      
      switch(scanRow) {
        case 0: keypadR1.writeSync(0); break; 
        case 1: keypadR2.writeSync(0); break;
        case 2: keypadR3.writeSync(0); break;
        case 3: keypadR4.writeSync(0); break;
      }
     
    }, 50);
    สแกน row ทุกๆ 50ms

    ฝากกดติดตาม blog นี้ด้วยนะครับ
    ติดตามพูดคุยได้ที่ facebook: Bulantech

    การใช้งาน โมดูลปุ่มกด 12 ปุ่ม 3x4 Matrix Keypad บน Raspberry pi ด้วย Node js การใช้งาน โมดูลปุ่มกด 12 ปุ่ม 3x4 Matrix Keypad บน Raspberry pi ด้วย Node js Reviewed by amaloma on ตุลาคม 08, 2564 Rating: 5

    ไม่มีความคิดเห็น

    Advertisement

    Main Ad