亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

仅用 3 根模拟口驱动 4×3 矩阵键盘:电阻分压识别键值

问题背景

标准 4×3 矩阵键盘需 7 个数字 IO(4 行 + 3 列),在 Uno/Nano 等引脚紧张的场景下占用过多。本文提出仅用 3 个模拟输入引脚(A0/A1/A2),通过精心设计的电阻分压网络,将 12 个按键映射为 3 路互不重叠的电压区间,实现零库依赖、低资源占用的按键检测。

电路原理

拓扑结构

每列接一只公共下拉电阻 R5=R6=R7=1kΩ 至地;每行通过不同阻值电阻接 VCC:

按下某键时,对应列被拉高至该行分压电压,其余列保持 0V。ADC 读取三列电压,非零列即为按键所在列,电压幅度对应行号。

电压区间设计(5V 供电,10-bit ADC,0~1023)

行按键理论电压(V)ADC 值容差窗口(±100)
Row11/2/35.001023923~1123
Row24/5/62.50512412~612
Row37/8/91.25256156~356
Row4*/0/#0.45920~192(需调整)

原文给出的实测窗口:Row1 923~1123、Row2 669~869、Row3 412~612、Row4 156~356(单位 ADC 值)。通过选用 1% 精度电阻或软件校准可进一步扩大间隔。

Arduino 实现代码

/* Analog 4x3 Keypad - 3 Analog Inputs
 * G. Carrera 2018
 */
const int NADCmin[4] = {923, 669, 412, 156};
const int NADCmax[4] = {1123, 869, 612, 356};
const char keyMap[12] = {'1','4','7','*',  // Col0: Row1~Row4
                         '2','5','8','0',  // Col1
                         '3','6','9','#'}; // Col2
int keyVal[3];

void setup() { Serial.begin(9600); }

void loop() {
  char k = readKeypad();
  if (k != 'N') {
    Serial.print("Key: "); Serial.println(k);
    delay(300); // 简单去抖
  }
}

char readKeypad() {
  scanColumns();
  // 无按键:三列和 < 40 (约 0.2V)
  if (keyVal[0] + keyVal[1] + keyVal[2] < 40) return 'N';
  delay(10); // 去抖
  scanColumns();
  // 识别哪列非零
  for (int c = 0; c < 3; c++) {
    if (keyVal[c] > 40) {
      int v = keyVal[c];
      for (int r = 0; r < 4; r++) {
        if (v >= NADCmin[r] && v <= NADCmax[r]) {
          return keyMap[c * 4 + r];
        }
      }
    }
  }
  return 'N';
}

void scanColumns() {
  keyVal[0] = analogRead(A0); delay(1);
  keyVal[1] = analogRead(A1); delay(1);
  keyVal[2] = analogRead(A2); delay(1);
}

扩展至 4×4 键盘

增加第 4 列:再接一路模拟输入 A3,复用相同的行电阻网络,即可支持 16 键。同理可扩展至更多列,仅受限于可用模拟输入数量(Uno 6 路,最多 5 列 20 键)。

优缺点分析

优点缺点
节省数字 IO,释放引脚给其他外设需精密电阻(建议 1%)或软件校准
无需扩展芯片(如 MCP23017、74HC165)长导线易受干扰,ADC 抖动需软件滤波
元件成本极低(6 个电阻)不支持多键同时按下(单键扫描)
代码简单,无第三方库依赖3.3V 系统下 ADC 参考电压变化,阈值需重标定

实物原型

仅用 3 根模拟口驱动 4×3 矩阵键盘:电阻分压识别键值

作者用废弃按键手工搭建原型,5 针排针接 Arduino,验证方案可行。

原理图

仅用 3 根模拟口驱动 4×3 矩阵键盘:电阻分压识别键值

制造工艺

  1. Arduino + Excel 驱动 8×8 与 16×16 WS2812 RGB 矩阵动画编程
  2. 智能缺水报警器 – DIY植物土壤湿度监测装置
  3. 意大利语单词时钟:Arduino Nano + NeoPixel 144 灯珠 + LCD + RTC 打造
  4. 基于Arduino MKR Fox 1200构建可靠Sigfox千瓦时电表
  5. 蓝牙温度监测仪:Arduino Nano + NTC 热敏电阻 + HC-06 无线传输
  6. 非接触手势门锁:APDS-9960 + Arduino 实现安全门禁
  7. Arduino Nano 多功能伴侣套件 —— 电阻/电容测量、二极管测试、RTC时钟一体化
  8. Arduino Micro/Leonardo USB MIDI 适配器套件 —— 完整元件清单与固件指南
  9. 为Arduino构建隔离模拟输入电路
  10. RGB 32 频段音频频谱可视化器:Arduino Nano 驱动 WS2812B 8×32 LED 矩阵
  11. 两个电阻自制 Arduino UNO 视频输出线(RCA/TVout)
  12. Arduino UNO 精准视觉反应时间测试仪