ADKeyboard模拟按键模块

概述

ADKeyboard模块让你使用1路模拟口即可读取5个按键的状态,为Arduino节约IO口。 配合Arduino传感器扩展板可以完成使用多个按钮进行互动的作品。

技术规格

  • 工作电压:控制器工作电压
  • 数据类型:模拟信号
  • 尺寸:40x33mm
  • 接口类型:PH2.0-3P

引脚输出图

链接示意图

示例代码


    //ADKeyboard Module
    //Developed by DFRobot.com
    //Last modified 30/11/2011
    //Version 1.0
    int adc_key_val[5] ={600,650, 700,  800, 900 };
    int NUM_KEYS = 5;
    int adc_key_in;
    int key=-1;
    int oldkey=-1;
    void setup()
    {
      pinMode(13, OUTPUT);  //we'll use the debug LED to output a heartbeat
      Serial.begin(9600); // 9600 bps
    }
    void loop()
    {
      adc_key_in = analogRead(0);    // read the value from the sensor
      digitalWrite(13,LOW);
      key = get_key(adc_key_in);  // convert into key press

      if (key != oldkey)   // if keypress is detected
       {
        delay(50);  // wait for debounce time
        adc_key_in = analogRead(0);    // read the value from the sensor
        key = get_key(adc_key_in);    // convert into key press
        if (key != oldkey)
        {
          oldkey = key;
          if (key >=0){
            digitalWrite(13,HIGH);
            switch(key)
            {
               case 0:Serial.println("S1 OK");
                      break;
               case 1:Serial.println("S2 OK");
                      break;
               case 2:Serial.println("S3 OK");
                      break;
               case 3:Serial.println("S4 OK");
                      break;
               case 4:Serial.println("S5 OK");
                      break;
            }
          }
        }
      }
     delay(100);
    }
    // Convert ADC value to key number
    int get_key(unsigned int input)
    {
        int k;
        for (k = 0; k < NUM_KEYS; k++)
        {
          if (input < adc_key_val[k])
         {
                return k;
            }
       }
           if (k >= NUM_KEYS)k = -1;  // No valid key pressed
           return k;
    }

Mind+图形化编程(Arduino UNO)

1、下载及安装软件。下载地址:https://www.mindplus.cc 详细教程:Mind+基础wiki教程-软件下载安装

2、切换到“上传模式”。 详细教程:Mind+基础wiki教程-上传模式编程流程

3、“扩展”中选择“主控板”中的“Arduino Uno”。 详细教程:Mind+基础wiki教程-加载扩展库流程

4、进行编程,程序如下图:

5、菜单“连接设备”,“上传到设备”

编程原则:
根据每个按钮按下显示的模拟值差值区间进行判断,可以取中值。
例如S1按下串口输出580,S2按下串口输出620,则取中间值600,即小于600就认为是S1按下了,大于600则认为是S2按下了。
以此类推S3 S4 S5的模拟值区间。

效果

打开串口监视器,按下不同的按钮输出对应的编号。

Mind+ Python 图形化(行空板 M10)

示例功能

读取模拟五按键模块的信号,判断当前按下的按钮,并在 Mind+ 终端显示 S1~S5 对应的编号。

硬件准备

器材 数量
行空板 M10 1
DFR0075 模拟五按键模块 1
3Pin白色双绞线 1
USB Type-C 数据线 1

硬件接线

推荐接口:行空板 M10 板载 P21 三针模拟输入接口(板上标识为 21~、+、-)。 本例程序固定读取 P21。连接完成后,再通过 USB 数据线将 M10 连接到电脑。

DFR0075 与行空板 M10 的 P21 接线图

图中左侧是DFR0075 模块,右侧是 M10 背面。白色3Pin绞线连接模块右侧的三针插座与 M10 左侧标有 21~、+、- 的三针插座,内部对应关系见下表。

DFR0075 接口引脚 M10 P21 接口引脚 用途
A/模拟信号 P21 读取按键模拟值
+/电源 3.3V 模块供电
-/GND GND 共地

操作步骤

  1. 打开 Mind+,切换到 Python 模式,再切换到图形化,在“扩展”中加载行空板。
  2. 等待 M10 开机,连接远程终端。USB 连接时选择 10.1.2.3;确认终端显示已连接行空板后再运行。详细流程见官方 Python 图形化教程。
  3. 按下图搭建“读数采集”程序,连接 M10 后运行。程序在循环中读取 P21 的模拟值并打印到终端,每次读取后等待 0.1 秒。分别记录全部松开和单独按下 S1~S5 时的稳定读数。
  4. 根据实测读数确定五个整数阈值,停止采集程序,再按下图搭建“按键识别”程序。程序图使用示例阈值;更换模块后,应先重新测量并调整比较值。
  5. 点击运行,逐个按下、松开五个按钮,检查终端输出是否与模块丝印一致。

示例程序

1. 采集按键读数

先按下图搭建读数采集程序,连接 M10 后运行。该程序每隔 0.1 秒读取并打印一次 P21 模拟值,不做按键识别。

第一步:采集 P21 模拟值

先记录全部松开时的读数,再分别按下 S1~S5,记录各按键的稳定读数范围。记录完成后停止采集程序。

2. 根据实测读数确定整数阈值

下表为 M10+DFR0075 在上述接线下的一组实测参考值。阈值取相邻范围之间的中点,再向上取整,使五个比较阈值全部为整数,例如 S1/S2 的分界为 (3120 + 3230) ÷ 2 = 3175。

状态 实测稳定读数/波动范围 程序判断区间
仅按 S1 3100~3120 模拟值 < 3175
仅按 S2 3230~3250 3175 ≤ 模拟值 < 3318
仅按 S3 3385~3405 3318 ≤ 模拟值 < 3483
仅按 S4 3560~3595 3483 ≤ 模拟值 < 3708
仅按 S5 3820~3850 3708 ≤ 模拟值 < 3973
全部松开 4095 模拟值 ≥ 3973

本例识别单个按键。不同模块的读数可能有差异,更换模块后请重新采集读数并调整阈值。

3. 运行完整按键识别程序

确认上述五个整数阈值后,按下图搭建按键识别程序。程序图使用实测得到的阈值;更换模块时,应先完成前两步,再按新的测量结果调整比较值。

六个单分支判断的完整按键识别程序

循环中读取一次 P21 模拟值,依次用六个带“+”的“如果”积木判断所在区间。按下 S1~S5 时,将“按钮编号”设为 1~5,并打印对应的 S1 OK~S5 OK;松开时编号设为 0,打印 none。每轮等待 0.1 秒,避免终端刷新过快。

每个“如果”积木判断一个区间。打印积木的文本框中填写对应提示文字即可。

预期现象

按下 S1~S5 时,终端显示对应的 S1 OK~S5 OK;按住时持续输出。全部松开时持续输出 none,与原 Wiki 图形化例程的行为一致。

<File:nextredirectltr.png>购买 ADKeyboard 模拟5按键模块(SKU: DFR0075)