Q-Keyboard-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5333|回复: 2

[项目] Q-Keyboard

[复制链接]
发表于 2017-10-19 23:06 | 显示全部楼层 |阅读模式
本帖最后由 Zoologist 于 2017-11-29 21:02 编辑

很多时候,我们需要更简单的方式定义按键(特别是对于笔记本之类的),因此我使用 Pro Micro 制作一个小型键盘,上面有三个全尺寸的按键,能够完成特定的功能。

功能如下:

1.一键发出自定义快捷键。 比如,我们使用 Win + Space 来切换输入法。具体的代码实现就是模拟按下2个按键。

2.一键锁屏。比如,我们离开座位,最好将屏幕锁定,使用Win+L 来锁定屏幕,方法和上面的相同

3.一键调出应用程序。这个的实现比较特殊,需要重新加入一个 HID 的描述符,为此我编写了一个函数库。每次按下按钮,会掉出来计算器

4.一键静音。这个实现原理和3类似。只是因为我键盘上只有3个按钮所以代码中没有加入。

电路图
qkey.PNG

板子上有3个按键,5个LED, 3个在按键下面,2个在板子上。多余的2个LED是原本计划用来实现提醒的功能的。比如说,电脑上在编译,然后当编译结束的时候,这个LED会进行闪烁提醒。

装配的部分过程
ko.jpg

焊接好之后,还有一个激光切割的外壳,按下之后LED会亮起来逐渐熄灭(PWM 实现)
wo.jpg

完整的代码:
[kenrobot_code]#include <Keyboard.h>
#include <Remote.h>


#define MOD_GUI_LEFT       0x83              // Win 按键


//从左到右,Key[1-3]
byte key[3]={2,4,7};


//从左到右,按键上的LED,Led[1-3]
byte led[5]={3,5,6,9,8};
byte brightness[3];


void setup() {
  Serial.begin(9600);
  Keyboard.begin();
  Remote.begin();
  Serial.println("Q Starting....");
  for (byte i=0;i<sizeof(key);i++)
    {
      pinMode(key,INPUT_PULLUP);
    }  
  for (byte i=0;i<sizeof(led);i++)
    {
      pinMode(led,OUTPUT);
      digitalWrite(led,HIGH);
      delay(300);
      digitalWrite(led,LOW);
    }     
}


void loop() {
  for (byte i=0;i<3;i++)
  {
    if (LOW==digitalRead(key))
    {
      delay(50);
      if (LOW==digitalRead(key))
      {
        Serial.print(i);
        Serial.println("key pressed");
        brightness=255;
        if (0==i) {
          Keyboard.press(MOD_GUI_LEFT); //按下 Win Key
          Keyboard.press('l');          //按下 L
          delay(200);
          Keyboard.releaseAll();        //抬起全部按键
        }
        if (1==i) {
          Keyboard.press(MOD_GUI_LEFT); //按下 Win Key
          Keyboard.press(' ');         //按下 Space
          delay(200);
          Keyboard.releaseAll();        //抬起全部按键        
        }


        if (2==i) {
          Remote.calc();      
        }         
      }
    }
    }
  delay(30);
  for (byte i=0;i<3;i++) {
      if (brightness!=0) {
          brightness--;
          analogWrite(led,brightness);
        }
    }   
}


[/kenrobot_code]

实现功能3 4 的库: Remote.zip (4.09 KB, 下载次数: 10)


 楼主| 发表于 2017-10-23 16:08 | 显示全部楼层
本帖最后由 Zoologist 于 2017-10-23 16:10 编辑

这是工作视频


发表于 2017-10-26 21:48 | 显示全部楼层
1.感谢对社区比赛的支持,开发者积分和贡献值已发放,请点击以下链接领取纪念衫并参与抽奖~
http://www.arduino.cn/thread-48132-1-1.html
2.比赛结果会在11.15号前公布,请耐心等待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 00:55 , Processed in 0.077216 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表