การใช้งาน โมดูลปุ่มกด 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
Reviewed by amaloma
on
ตุลาคม 08, 2564
Rating:
ไม่มีความคิดเห็น