数码之家

 找回密码
 立即注册
搜索
查看: 1675|回复: 20

[Arduino] 模拟USB键盘

[复制链接]
发表于 2023-10-13 12:14:56 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x



写代码,经常使用CTRL+C和CTRL+V,那么,用单片机就可以有很简单的方法去实现。无图,有真相

直接上代码


#include <unoHID.h>

/*
接线、引脚
USB                 UNO/Nano,etc.
Red   VCC           5v

       |---2.2k---  D5
White D+  1~200R    D4

Green D-  1~200R    D2

Black GND           GND

复制、粘贴到等宽体的文字编辑工具,不会那么乱。
*/

void setup() {
  delay(500);
  Serial.begin(115200);
  // Start USB connection
  //Mouse.begin();
  Keyboard.begin();

  // 鼠标Click
  //Mouse.click();

  //Mouse.end();
  //Keyboard.end();

  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
}

void loop() {
  if (digitalRead(7) == LOW) {
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press('x');
    delay(80);
    Keyboard.releaseAll();
    Serial.println("CTRL+x");
    return;

  } else if (digitalRead(8) == LOW) {
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press('c');
    delay(80);
    Keyboard.releaseAll();
    Serial.println("CTRL+C");
    return;

  } else if (digitalRead(9) == LOW) {
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press('v');
    delay(80);
    Keyboard.releaseAll();
    Serial.println("CTRL+V");
    return;
  }


  // 或者,输出一些文字
  // Keyboard.print("Hello, World!\n");
}





接好线、成功下载后,电脑会识别到USB键盘。
发表于 2023-10-13 13:06:22 来自手机浏览器 | 显示全部楼层
没说用哪个芯片呀???
回复 支持 反对

使用道具 举报

发表于 2023-10-13 13:21:12 | 显示全部楼层
这是说用开关代替吗
回复 支持 反对

使用道具 举报

发表于 2023-10-13 13:35:19 | 显示全部楼层
挂ardunio,使用三个触点开关通过系统调用的方式来模拟三个不同的组合键。看下来应该是这么弄得。

但是感觉这么弄还不如直接用键盘方便啊。键盘可以不用动手臂就完成,这个模拟还需要移动手臂去点DIY的键盘。
这个例程明显是网上复制的,估计楼主也没测试吧?要不然那么多测试的语句应该不会留着。
回复 支持 反对

使用道具 举报

发表于 2023-10-13 13:46:47 | 显示全部楼层
press()方法内容是啥?
回复 支持 反对

使用道具 举报

发表于 2023-10-13 14:20:46 | 显示全部楼层
做一个两键的鼠标?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-13 14:39:21 | 显示全部楼层
1065307738 发表于 2023-10-13 13:06
没说用哪个芯片呀???

第一段注解,uno/nano,也可以说是arduino能用的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-13 15:50:48 | 显示全部楼层
alangxl 发表于 2023-10-13 13:21
这是说用开关代替吗

常开的就可以, 常开轻触开关、甚至街机的大按钮,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-13 15:52:14 | 显示全部楼层
本帖最后由 devcang 于 2023-10-13 15:56 编辑
the0503 发表于 2023-10-13 13:35
挂ardunio,使用三个触点开关通过系统调用的方式来模拟三个不同的组合键。看下来应该是这么弄得。

但是感 ...

代码修改自例子,原例子只有后面那个Hell world,修改成开关触发、组合键,100%测试过,焊接也很简单,就不照相、不贴图片了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-13 15:53:39 | 显示全部楼层
wangxiangtan2 发表于 2023-10-13 13:46
press()方法内容是啥?

size_t Keyboard_::press(uint8_t k)  函数原型。看原码,应该是扫描码


size_t Keyboard_::press(uint8_t k) {
    uint8_t i;
    if (k >= 136) {         // it's a non-printing key (not a modifier)
        k = k - 136;
    } else if (k >= 128) {  // it's a modifier key
        _keyReport.modifiers |= (1<<(k-128));
        k = 0;
    } else {                // it's a printing key
        k = pgm_read_byte(_asciimap + k);
        if (!k) {
            setWriteError();
            return 0;
        }
        if ((k & ALT_GR) == ALT_GR) {
            _keyReport.modifiers |= 0x40;   // AltGr = right Alt
            k &= 0x3F;
        } else if ((k & SHIFT) == SHIFT) {
            _keyReport.modifiers |= 0x02;   // the left shift modifier
            k &= 0x7F;
        }
        if (k == ISO_REPLACEMENT) {
            k = ISO_KEY;
        }
    }

    // Add k to the key report only if it's not already present
    // and if there is an empty slot.
    if (_keyReport.keys[0] != k && _keyReport.keys[1] != k &&
        _keyReport.keys[2] != k && _keyReport.keys[3] != k &&
        _keyReport.keys[4] != k) {

        for (i=0; i<5; i++) {
            if (_keyReport.keys == 0x00) {
                _keyReport.keys = k;
                break;
            }
        }
        if (i == 5) {
            setWriteError();
            return 0;
        }
    }

    sendReport(&_keyReport);
    return 1;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-13 15:55:10 | 显示全部楼层
hznetmask 发表于 2023-10-13 14:20
做一个两键的鼠标?

可以做全功能鼠标模拟
回复 支持 反对

使用道具 举报

发表于 2023-10-13 18:12:06 | 显示全部楼层
只有写简单的控制功能用arduino写atmgea
你这个直接用1块多的 ch552 就可以了 支持usb
还有就是 1块多的 stm32f103c6t6 也能支持 usb
都比atmega价格便宜
这2个都能支持用 arduino开发
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-14 21:17:58 | 显示全部楼层
firseve 发表于 2023-10-13 18:12
只有写简单的控制功能用arduino写atmgea
你这个直接用1块多的 ch552 就可以了 支持usb
还有就是 1块多的 st ...

嗯   很多芯片都直接有usb功能,,,,,只是手头都让狗日arduino空闲了,可以发挥“余热”以免吃灰
回复 支持 反对

使用道具 举报

发表于 2023-10-14 22:36:23 | 显示全部楼层
devcang 发表于 2023-10-14 21:17
嗯   很多芯片都直接有usb功能,,,,,只是手头都让狗日arduino空闲了,可以发挥“余热”以免吃灰 ...

uno 的主控 m328 没有硬件 USB 的,目测得在 16u2 那个片子上运行。

或者直接换 Arduino Leonardo
回复 支持 反对

使用道具 举报

发表于 2023-10-16 10:14:36 | 显示全部楼层
atmega 可以搞虚拟usb ,fc的kazzo烧录器就是个例子
还有 atmega 的下载器 usbasp 也是搞得虚拟usb,就是用起来很恶心,经常不识别
回复 支持 反对

使用道具 举报

发表于 2023-10-16 12:27:52 来自手机浏览器 | 显示全部楼层
单纯这个需求来说,换个可以自定义按键功能的鼠标就行了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-18 22:48:19 | 显示全部楼层
mmxx2015 发表于 2023-10-16 12:27
单纯这个需求来说,换个可以自定义按键功能的鼠标就行了。

好是好,很多现成的。但,那样没有玩单片机的乐趣了
回复 支持 反对

使用道具 举报

发表于 2023-10-19 00:22:55 | 显示全部楼层
当前有一个支持切层可以定制按键宏的25键机械小键盘只要40多块,我觉得他贵,直接后来涨到80多块时,我才发现他更贵了
工作需要,经常需要输入一些固定的短语或者数字,所以很早就想搞个能定义宏的小键盘来用,但是自己DIY没那个技术,买成品吧,又都不便宜(主要是老板不报销),目前的方案是用的输入法的自定义短语,把这些玩意定义成只有自己知道并且理解的字母组合来实现快速输入的,但感觉还是买个小键盘一键输入更省事
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-19 10:30:04 | 显示全部楼层
1325133 发表于 2023-10-19 00:22
当前有一个支持切层可以定制按键宏的25键机械小键盘只要40多块,我觉得他贵,直接后来涨到80多块时,我才发 ...


搞单片机,几块就可以——
回复 支持 反对

使用道具 举报

发表于 2023-10-22 00:28:05 | 显示全部楼层
devcang 发表于 2023-10-19 10:30
搞单片机,几块就可以——

小白只会拿来主义,所以有现在的方案可以仿制吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-28 02:14 , Processed in 0.171600 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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