Neonode触摸传感器模块之I2C鼠标和键盘

这篇具有很好参考价值的文章主要介绍了Neonode触摸传感器模块之I2C鼠标和键盘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

触摸传感器模块可用于通过I2C向计算机发送键盘或鼠标输入。Arduino Library示例zForceKeyboardMouse中包含了如何实现这一点的示例。该示例使用官方的Arduino库<Mouse.h>和<Keyboard.h>与主机系统通信。
zForceKeyboardMouse代码

#include <Zforce.h>
#include <Keyboard.h>
#include <Mouse.h>

// IMPORTANT: change "1" to assigned GPIO digital pin for dataReady signal in your setup:
#define DATA_READY 1

long globalMillis = millis();         // global timestamp
const int keyboardBoundary = 750;     // set boundary between mouse and keyboard areas on the x-axis to 75 mm.
const int holdTime = 150;             // sensitivity for mouse "left-click", unit in milli-second

TouchData previousTouch;

void setup()
{
  Keyboard.begin();           // initialize keyboard
  Mouse.begin();              // initialize mouse
  Serial.begin(115200);
  Serial.println("zforce start");
  zforce.Start(DATA_READY);

  Message* msg = nullptr;
  
  zforce.Enable(true);

  msg = zforce.GetMessage();

  do
  {
    msg = zforce.GetMessage();
  } while (msg == nullptr);

  if (msg->type == MessageType::ENABLETYPE)
  {
    Serial.print("Message type is: ");
    Serial.println((int)msg->type);
    Serial.println("Sensor is now enabled and will report touches.");
  }

  zforce.DestroyMessage(msg);
}

void loop()
{
  Message* touch = zforce.GetMessage();

  if (touch != nullptr)
  {
    if (touch->type == MessageType::TOUCHTYPE)
    {
      //Sends reported touch coordinates [x,y] and event data to mouse and keyboard function.
      loopMouse(((TouchMessage*)touch)->touchData[0].x, ((TouchMessage*)touch)->touchData[0].y, ((TouchMessage*)touch)->touchData[0].event);
      loopKeyboard(((TouchMessage*)touch)->touchData[0].x, ((TouchMessage*)touch)->touchData[0].y, ((TouchMessage*)touch)->touchData[0].event);
    }
    zforce.DestroyMessage(touch);
  }
}

void loopMouse(int16_t x , int16_t y, int8_t event)
{
  if (x <= keyboardBoundary) //return if the touch object is outside mouse area
  {
    return;
  }

  switch (event)
  {
    case 0:  // DOWN event
      previousTouch.x =  x;
      previousTouch.y =  y;
      globalMillis = millis();
      Serial.println("Mouse Input - DOWN");
      break;

    case 1: // MOVE event
      if ((millis() - globalMillis) >= holdTime)
      {
        Mouse.move((x - previousTouch.x), (y - previousTouch.y));
        Serial.println("Mouse Input - Moving cursor");
      }
      previousTouch.x = x;
      previousTouch.y = y;
      break;

    case 2: // UP event
      Serial.print("Mouse Input - UP");
      if (millis() - globalMillis < holdTime)  // mouse "left click", sensitivity
      { // can be tuned by changing "holdTime"
        Mouse.click(MOUSE_LEFT);
        Serial.print("(Left-Click)");
      }
      Serial.println("");
      break;

    default:
      break;
  }
}

void loopKeyboard(int16_t x , int16_t y, int8_t event)
{
  if (x > keyboardBoundary) //return if the touch object is outside keyboard area
  {
    return; 
  }

  // Only act on event == DOWN, i.e. when an object has entered the touch area
  if (event == 0)
  {
    //assign Key to the given interval
    if (y < 250)
    {
    Keyboard.print('A'); //Print Key "A"
    Serial.println("Keyboard Input - Button Press 'A'");
    }
    else if (y < 500)
    {
    Keyboard.print('B'); //Print Key "B"
    Serial.println("Keyboard Input - Button Press 'B'");
    }
    else if (y < 750)
    {
    Keyboard.print('C'); //Print Key "C"
    Serial.println("Keyboard Input - Button Press 'C'");
    }
    else if (y < 1000)
    {
    Keyboard.print('D'); //Print Key "D"
    Serial.println("Keyboard Input - Button Press 'D'");
    }
    else
    {
    Keyboard.print('E'); //Print Key "E"
    Serial.println("Keyboard Input - Button Press 'E'");
    }
  }
}

触摸传感器模块可以作为空气中解决方案或任何表面放置,为广泛的用户提供了大量的替代方案。传感器模块例如可以被配置为用作个性化控制面板或混合板。由于可自定义的布局和控件,它可以用于开发,也可以帮助需要自定义工作空间的人。

1说明

zForceKeyboardMouse示例展示了如何将触摸输入转换为鼠标或键盘输入。该示例使基于SAMD微型板(例如Neonode原型板)能够通过HID使用官方Arduino库<mouse.h>和<Keyboard.h>向主机系统发送按键或鼠标导航。此示例将触摸活动区域划分为一个鼠标垫和一个键盘部分,其中包含5个按钮(a-E)。鼠标部分的工作方式类似于相对鼠标垫,其中光标相对于其先前位置移动。
键盘按钮被编程为在每个相应部分中进行触摸时打印字母A-E。
我们可以通过zForce Arduino库访问传感器模块的触摸数据

int16_t x = ((TouchMessage*)touch)->touchData[0].x;
//Touch
input position x coordinate
int16_t y = ((TouchMessage*)touch)->touchData[0].y;
//Touch
input position y coordinate
int8_t event = ((TouchMessage*)touch)->touchData[0].event;
//Touch input event
state, i.e TouchUp, TouchDown...

触摸式鼠标垫
由于触摸传感器模块被识别为触摸屏数字化仪,因此需要提取触摸输入数据,以便将其转换为鼠标输入。为了将绝对位置输入坐标转换为其相对位置(移动),我们将当前触摸数据位置与先前跟踪的对象位置相减。

Mouse.move((x - previousTouch.x), (y - previousTouch.y));
//"x" and "y" arethe location of the reported touch coordinates "previousTouch.x" and "previousTouch.y" are the location of the previous reported coordinate.

在鼠标部分内“点击”或“点击”后,将执行鼠标左键单击操作。当报告的触摸具有事件数据“UP”时,会触发左键点击动作。在实践中,这意味着最终用户需要“按压”和“释放”他们的手指才能进行触摸。触摸灵敏度可以通过全局变量holdTime进行调整,它就像一个“触摸”所需时间的计时器。

为了使用鼠标垫,我们使用从传感器模块收集的触摸信息:

switch (event)
{
case 0: // DOWN event
previousTouch.x = x;
previousTouch.y = y;
globalMillis = millis();
Serial.println("Mouse Input - DOWN");
break;
case 1: // MOVE event
if ((millis() - globalMillis) >= holdTime)
{
Mouse.move((x - previousTouch.x), (y - previousTouch.y));
Serial.println("Mouse Input - Moving cursor");
}
previousTouch.x = x;
previousTouch.y = y;
break;
case 2: // UP event
Serial.print("Mouse Input - UP");
if (millis() - globalMillis < holdTime) // mouse "left click", sensitivity
{ // can be tuned by changing "holdTime"
Mouse.click(MOUSE_LEFT);
Serial.print("(Left-Click)");
}
Serial.println("");
break;
default: break;
}

空中非接触式触摸调节

对于空中解决方案,我们建议在DOWN事件而不是UP事件上预生成所有“左键点击”或“按键”。通过进行此调整,当最终用户按下手指时(而不是松开手指时)将触发左键单击。这为触摸活动区域提供了更具触觉的响应,是空中解决方案的最佳选择
要在DOWN事件上进行左键点击触发,请考虑以下调整:

switch (event)
{
case 0: // DOWN event
previousTouch.x = x;
previousTouch.y = y;
globalMillis = millis();
Mouse.click(MOUSE_LEFT);
//Left-click on DOWN-event
break;
case 1: // MOVE event
if ((millis() - globalMillis) >= holdTime)
{
Mouse.move((x - previousTouch.x), (y - previousTouch.y));
}
previousTouch.x = x;
previousTouch.y = y;
break;
case 2: // UP event
break;
default: break;
}

触摸处理键盘

键盘按钮将根据触摸对象的位置发送按键。每个按钮都由可变键盘Boundary分割,然后进一步分割以区分每个键。
如果报告的带有DOWN事件的触摸位于键盘边界内,则将执行第二次查找,以评估要打印的键。文章来源地址https://www.toymoban.com/news/detail-814625.html

if (event == 0) { // DOWN event
//assign Key to the given interval
if (y < 250)
Keyboard.print('A'); //Print Key "A"
else if (y < 500)
Keyboard.print('B'); //Print Key "B"
else if (y < 750)
Keyboard.print('C'); //Print Key "C"
else if (y < 1000)
Keyboard.print('D'); //Print Key "D"
else
Keyboard.print('E'); //Print Key "E"
}

到了这里,关于Neonode触摸传感器模块之I2C鼠标和键盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【雕爷学编程】Arduino智能家居之触摸和声音传感器

    Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来

    2024年02月03日
    浏览(58)
  • 【传感器模块】 HC-SR501 人体红外感应模块 热释电 红外传感器

    HC-SR501是基于红外线技术的自动控制模块,采用德国原装进口LHI778 探头设计,灵敏度高,可靠性强,超低电压工作模式,广泛应用于各类自动感应电器设备,尤其是干电池供电的自动控制产品。 1、全自动感应:人进入其感应范围则输出高电平, 人离开感应范围则自动延时关闭

    2023年04月26日
    浏览(36)
  • STM32 HAL库硬I2C的TOF050C模块

    最近在倒腾毕业设计,需要用到TOF050C,但是现有的案例都是软IIC,并且还是基于STM32F103的,笔者用的STM32F767,没有GPIO-CRH寄存器。问题来了,如果我每次都要去看寄存器手册属实费时间,这不干脆直接用硬IIC? 于是乎,打开了TOF050C手册,硬啃! 这手册好在它有工作流程图,

    2024年02月14日
    浏览(60)
  • 电子模块|压力传感器模块HX711---硬件介绍

    HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性

    2024年02月07日
    浏览(45)
  • 红外传感器模块与 Arduino 连接

    原文地址 Arduino 红外传感器接口 红外**接近传感器或红外传感器它发射红外光以感知周围环境, 并可 用于检测物体的运动。由于这是一个无源传感器,它只能测量红外辐射。如果您曾经尝试过设计避障机器人或任何其他基于接近检测的系统,那么您很可能已经知道这个模块

    2023年04月21日
    浏览(46)
  • 1.3寸OLED模块初始化,驱动芯片为SH1106,i2c通讯

    之前使用过0.96寸的OLED,驱动芯片SSD1306,看了下两个芯片数据手册,差异不是很大,买了一个1.3寸的,花了一个下午点亮了,在过程中遇到了些问题,网上的资料不多,于是做个总结。 主要遇到的问题有, 1.显示不正常,出现花屏等现象。 从我遇到的情况来说,出现花屏可

    2024年02月12日
    浏览(45)
  • Arduino开发之如何连接压力传感器模块?

      在利用Arduino开发过程中,若需知道设备能感知到受到外部按压,设备可以通过压力传感器模块来感知周围环境。本文在【Arduino如何进行开发?】基础上,借鉴现有网络资料,阐述Arduino如何连接压力传感器模块。      压力传感器模块为电阻式薄膜压力传感器模块。

    2023年04月15日
    浏览(59)
  • 心率血氧传感器模块MAX30102

    心率血氧传感器模块MAX30102实物图   模块简介 MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。 它集成了一个红光LED和一个红外光LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。 MAX30102采用一个1.8V电源和一个独立的5.0V用于内部LED的电源,应

    2024年02月12日
    浏览(36)
  • K_A35_017 基于STM32等单片机驱动TTP229矩阵触摸传感器 串口与OLED0.96双显示

    其他资料目录 直戳跳转 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M TTP229矩阵触摸模块 STC89C52RC驱动TTP229矩阵触摸模块 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M TTP229矩阵触摸模块 STM32F103C8T6驱动TTP229矩阵触摸模块 串口与OLED0.96双显示 TTP229矩阵触摸传

    2024年02月02日
    浏览(46)
  • 红外人体感应传感器SR602模块使用说明

    ​一.HC-SR602模块         红外人体感应传感器HC-SR602是基于红外线技术的自动控制模块,专用于感应周围人体的存在。该模块相较于HC-SR501,灵敏度较高,抗干扰能力大,且简单易用。 二.HC-SR602模块主要参数 工作电压:3.3V-15V; 静态电流:20uA; 感应距离:最大5M;建议0-

    2024年02月06日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包