找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9486|回复: 5
打印 上一主题 下一主题
收起左侧

Arduino学习11-Arduino模拟电脑键盘(基于AVR-USB的USB-HID设备)

[复制链接]
跳转到指定楼层
楼主
键盘作为经典的输入设备,使用在很多互动中都有特别的优势,比如我们可以通过键盘直接给flash传递按键事件。而无需通过串口之类的特殊接口,虽然我们可以拆一个传统的键盘,然后将里面的按键引出来,但是这样有一个缺点,就是键值不能动态改变并且不能一次多键。使用模拟键盘的话,我们就可以随意在程序设置按键的时间和键值。比如本文的例子就是按下一个按键,模拟键盘就在电脑输入“HELLO WORLD”。

硬件部分:
材料清单:
Arduino x1
68Ω电阻 x2 (没有68Ω的话,用50~100Ω电阻也行)
2.2kΩ电阻 x1 (没有2.2kΩ的话,用1.5k~2.2k电阻也行)
USB连接线(一端是USB口,另一端是电线) x1
3.6v 稳压管(建议选用功耗0.25~0.5w的)x2


电路原理图:

电路图解说:
1、两个68Ω的电阻起到限流和保护作用,防止在意外情况下损坏计算机的USB端口或单片机的端口。
2、2.2kΩ电阻是上拉电阻,用于分辨总线状态。如果上拉电阻接于D+和+5v端则是高速USB设备,接于D-与+5v端,则是低速设备。此处键盘传输速率不高,接到D-作为低速设备即可。
3、D+和D-上的3.6V稳压二极管D1和D2起到限制数据线上的电平的作用。因为在USB规范中规定数据线D+和D-上的电平范围是3.0V至3.6V,而AVR单片机的输出电平是Vcc。如果单片机的Vcc是5V,在没有D1和D2的情况下将造成电平不匹配,会造成在很多计算机中无法正确识别出USB设备。如果用户系统的Vcc在3.0V至3.6V之间,就可以省略这两个稳压二极管。从这里也可以看出用户系统的Vcc必须高于3V。
4、由于低速AVRUSB所需要的是1.5MHz时钟,而单片机每8条指令就能精确完成一个数据位的采集。所以AVRUSB最小单片机时钟频率是12MHz。并且可以使用的时钟频率有12MHz、12.8MHz、15MHz、16MHz、16.5MHz、20MHz,其他的不支持。所以如果使用最小系统制作此模拟键盘的话8MHz的话,ATMega8L不能用。
————————
软件部分:

Arduino支持库文件:
UsbKeyboard.zip (112.45 KB, 下载次数: 50)
文件下载后解压到arduino编译器的libraries文件夹下面。
注意:

1、UsbKeyboard库中,usbconfig.h里面可以更改USB接线的引脚定义,下面给出一个大概解释(下面的PORTD是指AVR单片机的PORTD,要查询Arduino原理图: Arduino_Uno_Rev3-schematic.pdf (81.39 KB, 下载次数: 15) 才能得到是Arduino的哪个引脚):

#define USB_CFG_IOPORTNAME D
USB输入输出引脚使用AVR单片机的PORTD,如果改成B就是使用PORTB
#define USB_CFG_DMINUS_BIT 4
USB的D-接PORTD的第四位PD4,对应Arduino D4
#define USB_CFG_DPLUS_BIT  2
USB的D+接PORTD的第二位PD2,对应Arduino D2
#define USB_CFG_PULLUP_IOPORTNAME D
USB上拉引脚使用AVR单片机的PORTD,如果改成B就是使用PORTB
#define USB_CFG_PULLUP_BIT  5
USB的上拉电阻接PORTD的第五位PD5,对应Arduino  D5


2、在UsbKeyboard库的UsbKeyboard.h里面,有关于模拟键值的表
#define KEY_A       4
#define KEY_B       5
#define KEY_C       6
#define KEY_D       7
#define KEY_E       8
等。但不齐全。经过测试,其实这个键盘基本可以模拟几乎所有键值(Power,Sleep,Pause似乎不能)。
比如方向键右左下上分别对应79,80,81,82数字。即写成
UsbKeyboard.sendKeyStroke(79);
UsbKeyboard.sendKeyStroke(81);
等。由于整理比较麻烦,大家可以自己下载个KeyboardTest软件测试不同数字下面的键值。

程序示例:
下面的例子演示了用Arduino虚拟键盘的应用例子。打开记事本,然后将Arduino的D12引脚和GND连起来,就会打印HELLO WORLD字样。
  1.     /*
  2.     Arduino模拟键盘 by Ansifa
  3.     2012.6.8
  4.      
  5.     功能描述:插上此模拟键盘,打开记事本,然后按下按钮,即可在记事本打印出HELLO WORLD字样
  6.      
  7.     接线方法:
  8.     Arduino D2接68Ω电阻后,接USB线D+
  9.     Arduino D4接68Ω电阻后,接USB线D-
  10.     Arduino D5接2.2kΩ电阻后,接USB线D-
  11.     Arduino D2接3.6v稳压管到GND
  12.     Arduino D4接3.6v稳压管到GND
  13.     +5v接USB线VCC
  14.     GND接USB线GND
  15.     Arduino D1接一个开关到GND
  16.      
  17.     附:USB线序颜色(由于各生产厂不同,不一定准确,仅供参考)
  18.     *USB键鼠:      |        *USB接口
  19.     白<->VCC        |        红<->VCC
  20.     橙<->D-         |        白<->D-
  21.     绿<->D+         |        绿<->D+
  22.     蓝<->GND        |        黑<->GND
  23.      
  24.     */
  25.      
  26.     #include "UsbKeyboard.h"
  27.     int KEYPIN = 1;                //按键接在D1引脚,也可以改成任何引脚
  28.     void setup()
  29.     {
  30.       TIMSK0 &= !(1 << TOIE0);        //
  31.       pinMode(KEYPIN, INPUT);
  32.       digitalWrite(KEYPIN, HIGH);
  33.     }
  34.     void loop()
  35.     {
  36.       UsbKeyboard.update();
  37.       if(digitalRead(KEYPIN) == HIGH)
  38.       {
  39.         delay(100);
  40.         if(digitalRead(KEYPIN) == LOW)
  41.         {
  42.           UsbKeyboard.sendKeyStroke(KEY_H);
  43.           UsbKeyboard.sendKeyStroke(KEY_E);
  44.           UsbKeyboard.sendKeyStroke(KEY_L);
  45.           UsbKeyboard.sendKeyStroke(KEY_L);
  46.           UsbKeyboard.sendKeyStroke(KEY_O);
  47.           UsbKeyboard.sendKeyStroke(KEY_SPACE);
  48.           UsbKeyboard.sendKeyStroke(KEY_W);
  49.           UsbKeyboard.sendKeyStroke(KEY_O);
  50.           UsbKeyboard.sendKeyStroke(KEY_R);
  51.           UsbKeyboard.sendKeyStroke(KEY_L);
  52.           UsbKeyboard.sendKeyStroke(KEY_D);
  53.           UsbKeyboard.sendKeyStroke(KEY_ENTER);
  54.         }
  55.       }
  56.     }
复制代码

注意,先插上Arduino数据线,将程序写入Arduino。然后拔掉数据线,将模拟键盘USB线接到电脑,即可使用。

下面随便点实物图

刚焊好的正反面


插数据线写程序进Arduino:




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:114115 发表于 2016-4-18 01:18 | 只看该作者
开始
此时正好手头没事,而且所需的硬件都有,所以果断摆上东西,按照帖子的说明一步步链接好电路,下好程序,插上USB线。
“无法识别的USB设备”
怀疑
首先,觉得是自己的接线方法有问题,所以把所有器件都拆下来从新连接上,结构依旧无法识别。看了下跟帖,也有些人说无法识别,但也没有提出解决方案。
其次,是不是帖子贴出来的代码有问题呢?遍在网上搜了好多发布的arduino的USB库和代码,有的编译不通,有的编译成功,但是下载下去之后依旧无法识别。

再次,怀疑是稳压管的型号不对,因为用的稳压管是在桌子上小垃圾堆里照出来的,不知道具体型号。用万用表量了一下USB信号线的电压,4+V,果然超了……原贴上建议的是3+V,这下完蛋了,看来这个鼠标我是做不成了。
休息干点别的吧,反正手头也没有适合的稳压二极管。突然灵光一现:这个稳压管是坐什么用的呢?可能一:作为USB信号线,对静电比较敏感,所以用稳压管来释放经静电,放置静电打坏器件。如果是这样,那就会有如下两个疑问:1、如果作保护器件的话,去掉这个器件也不会影响系统工作,2、如果是保护器件为什么一定要用3+V的稳压管呢,我的是4+V的应该也没有问题啊。显然不是起保护作用。 可能二:作为USB信号线的阻抗匹配即滤波。因为二极管的PN结宽度会随两端点啊的变化而变化,所以二极管是带有电容性的,如果这样也会有疑问,1、如上可能性疑问二,既然3+V二极管可以那么4+V的二极管也可以。2,滤波USB低速通信时影响不大。所以也不是其这个作用。最后的可能,因为使用5V的arduino,所以稳压管的作用就是限制USB数据线的电压,这个倒是说得通,3+V二极管可以,4+V的二极管也不可以。俗话说要动脑也要动手,所以我火速查了一下USB标准的文档


,证明,稳压管的作用就是把USB信号线的电压限制在2.8-3.6。这样既然知道了稳压管的作用就好办了,虽然手头没有没有稳压管,但是把信号线的电压先知道这个范围内,方法也很简单。我让arduino运行在3.3V这个问题就解决了。因为我用的是arduino pro mini,

他是电源可外接的,恰好手头的FTDI也有3。3V输出,

拿来借用一下,OK这个问题解决。USB在此插在电脑上试了一下,发现还是不行,哭了!
最后,发现所给的电路图中USB信号定义顺序有问题,记忆总USB数据线顺序是VUSB,D-,D+,GND。而原贴中的顺序VUSB,D+,D-,GND。神奇了!还是再看看USB标准吧

也就是说原帖子上拉电阻拉到D-是没错的,但是因为D-D+的顺序颠倒了,所以大多数人都会把上拉电阻拉到D+。当然我也接错了,之后调了一下上拉的位置,模拟的鼠标就被识别了。
总之,原帖USB接口线序有问题会误导大家接线,所以大家的会出现无法识别的问题。贴出来的程序没问题
另外,传统不带USB的AVR能够实现USB功能,虽然是很常见的事,但是在Arduino在国内还是比较少见的。对于比较专业的Arduino也比较建议使用pro mini这样的精简硬件版本,好处有三,第一引出端口超多,方便自己使用。第二体积小,便于潜入各种作品当中,第三价价格低。

第二季主要分析用普通arduino普通IO口模拟USB所需电路的硬件分析
先贴张图:

上图是5V系统的IO口仿真USB所需的硬件电路。
其实这个电路对大家来说并不陌生,大家手头的USBasp一般都是采用这个电路,应为这种下载器也是采用没哟USB接口的AVR来设计的。
先说下2.2k电阻的作用。第一季已经提到过了,USB标准中,低速设备的D-信号线要有1.5k电阻上拉到电源,这里就不在上图了。因为这个是5V系统,所以使用电阻要比标准电阻大一些。
只有是稳压二极管。也就是传说中的齐纳二极管,学过模电的同学肯定知道(二极管的方向击穿有两种,一种是雪崩击穿,一种是齐纳击穿。书里大概是这么说的。)稳压二极管的工作原理就是当反向电压达到一定值时,他便会被反向击穿,通过这种方式来稳定电压。这种击穿当电压降低之后二极管可以恢复到正常状态,几乎不会对二极管有损坏。不说废话了,这个二极管的作用就是将数据线电压有5V等级,稳定到3V左右等级。
最后呢,说下串联在信号线68欧姆的电阻。这个电阻的作用大家可以探讨一下,我这里只是说下自己理解的主要作用。首先呢,还是来看标准,

标准上的意思就是USB信号的单端等效阻抗是28-44欧,所以这个68的电阻其这个作用。第二,这作用个人觉得重要与第一个。当信号被arduino拉到高时,稳压二极管便会被击穿。假设没有这个电阻,因为arduino的IO引脚与稳压管之间没有压降(因为没有电阻)所以稳压二极管就要漏下很多电流,知道吧IO口电压拉低至稳压电压。在这种情况下可以认为是IO重负载,所以输出电流接近AVR的IO的最大驱动电流40mA,这样会极大损害IO结构,无辜功耗增加,再个就是需要选一个功率稍大的稳压二极管,这种情况下也会增加不稳定性,有了这两个电阻便会避免以上问题。这样看这个电阻可以看做是限流电阻了

在3.3V系统中
2.2K的电阻,当然可以按照标准改为1.5k
再个限流电阻可以去掉了
另外68欧姆的电阻,也有可以去掉的可能……没试过,稍后去掉看下上来汇报
回复

使用道具 举报

板凳
ID:618619 发表于 2019-10-4 18:53 | 只看该作者
t楼主,提示如下错误信息。为何。
Arduino:1.8.9 (Windows 7), 开发板:"Arduino/Genuino Uno"

D:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware D:\Program Files (x86)\Arduino\hardware -tools D:\Program Files (x86)\Arduino\tools-builder -tools D:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries D:\Program Files (x86)\Arduino\libraries -libraries D:\UserData\Personal\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=1A86_7523 -ide-version=10809 -build-path C:\Users\ADMINI~1\AppData\Local\Temp\arduino_build_792218 -warnings=default -build-cache C:\Users\ADMINI~1\AppData\Local\Temp\arduino_cache_518244 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.2.1.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-5.4.0-atmel3.6.1-arduino2.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino14.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -verbose D:\UserData\Personal\Arduino\sketch_oct04a\sketch_oct04a.ino
D:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware D:\Program Files (x86)\Arduino\hardware -tools D:\Program Files (x86)\Arduino\tools-builder -tools D:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries D:\Program Files (x86)\Arduino\libraries -libraries D:\UserData\Personal\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=1A86_7523 -ide-version=10809 -build-path C:\Users\ADMINI~1\AppData\Local\Temp\arduino_build_792218 -warnings=default -build-cache C:\Users\ADMINI~1\AppData\Local\Temp\arduino_cache_518244 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.2.1.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-5.4.0-atmel3.6.1-arduino2.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino14.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -verbose D:\UserData\Personal\Arduino\sketch_oct04a\sketch_oct04a.ino
Using board 'uno' from platform in folder: D:\Program Files (x86)\Arduino\hardware\arduino\avr
Using core 'arduino' from platform in folder: D:\Program Files (x86)\Arduino\hardware\arduino\avr
Detecting libraries used...
"D:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\arduino_build_792218\\sketch\\sketch_oct04a.ino.cpp" -o nul
"D:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-ID:\\UserData\\Personal\\Arduino\\libraries\\UsbKeyboard" "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\arduino_build_792218\\sketch\\sketch_oct04a.ino.cpp" -o nul
"D:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-ID:\\UserData\\Personal\\Arduino\\libraries\\UsbKeyboard" "D:\\UserData\\Personal\\Arduino\\libraries\\UsbKeyboard\\oddebug.c" -o nul
"D:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-ID:\\UserData\\Personal\\Arduino\\libraries\\UsbKeyboard" "D:\\UserData\\Personal\\Arduino\\libraries\\UsbKeyboard\\usbdrv.c" -o nul
"D:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-ID:\\UserData\\Personal\\Arduino\\libraries\\UsbKeyboard" "D:\\UserData\\Personal\\Arduino\\libraries\\UsbKeyboard\\usbdrvasm.S" -o nul
Error while detecting libraries included by D:\UserData\Personal\Arduino\libraries\UsbKeyboard\usbdrvasm.S
Generating function prototypes...
"D:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-ID:\\UserData\\Personal\\Arduino\\libraries\\UsbKeyboard" "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\arduino_build_792218\\sketch\\sketch_oct04a.ino.cpp" -o "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\arduino_build_792218\\preproc\\ctags_target_for_gcc_minus_e.cpp"
"D:\\Program Files (x86)\\Arduino\\tools-builder\\ctags\\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\arduino_build_792218\\preproc\\ctags_target_for_gcc_minus_e.cpp"
正在编译项目...
"D:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-ID:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-ID:\\UserData\\Personal\\Arduino\\libraries\\UsbKeyboard" "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\arduino_build_792218\\sketch\\sketch_oct04a.ino.cpp" -o "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\arduino_build_792218\\sketch\\sketch_oct04a.ino.cpp.o"
In file included from D:\UserData\Personal\Arduino\libraries\UsbKeyboard/UsbKeyboard.h:13:0,

                 from D:\UserData\Personal\Arduino\sketch_oct04a\sketch_oct04a.ino:26:

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/usbdrv.h:479:26: error: variable 'usbDescriptorDevice' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

char usbDescriptorDevice[];

                          ^

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/usbdrv.h:485:33: error: variable 'usbDescriptorConfiguration' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

char usbDescriptorConfiguration[];

                                 ^

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/usbdrv.h:491:29: error: variable 'usbDescriptorHidReport' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

char usbDescriptorHidReport[];

                             ^

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/usbdrv.h:497:27: error: variable 'usbDescriptorString0' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

char usbDescriptorString0[];

                           ^

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/usbdrv.h:503:31: error: variable 'usbDescriptorStringVendor' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

int usbDescriptorStringVendor[];

                               ^

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/usbdrv.h:509:31: error: variable 'usbDescriptorStringDevice' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

int usbDescriptorStringDevice[];

                               ^

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/usbdrv.h:515:37: error: variable 'usbDescriptorStringSerialNumber' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

int usbDescriptorStringSerialNumber[];

                                     ^

In file included from D:\UserData\Personal\Arduino\sketch_oct04a\sketch_oct04a.ino:26:0:

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/UsbKeyboard.h:36:39: error: variable 'usbDescriptorHidReport' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

PROGMEM char usbHidReportDescriptor[35] = { /* USB report descriptor */

                                       ^

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/UsbKeyboard.h:55:1: warning: narrowing conversion of '161' from 'int' to 'char' inside { } [-Wnarrowing]

};

^

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/UsbKeyboard.h:55:1: warning: narrowing conversion of '224' from 'int' to 'char' inside { } [-Wnarrowing]

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/UsbKeyboard.h:55:1: warning: narrowing conversion of '231' from 'int' to 'char' inside { } [-Wnarrowing]

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/UsbKeyboard.h:55:1: warning: narrowing conversion of '149' from 'int' to 'char' inside { } [-Wnarrowing]

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/UsbKeyboard.h:55:1: warning: narrowing conversion of '129' from 'int' to 'char' inside { } [-Wnarrowing]

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/UsbKeyboard.h:55:1: warning: narrowing conversion of '149' from 'int' to 'char' inside { } [-Wnarrowing]

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/UsbKeyboard.h:55:1: warning: narrowing conversion of '129' from 'int' to 'char' inside { } [-Wnarrowing]

D:\UserData\Personal\Arduino\libraries\UsbKeyboard/UsbKeyboard.h:55:1: warning: narrowing conversion of '192' from 'int' to 'char' inside { } [-Wnarrowing]

使用库 UsbKeyboard 在文件夹: D:\UserData\Personal\Arduino\libraries\UsbKeyboard (legacy)
exit status 1
为开发板 Arduino/Genuino Uno 编译时出错。
回复

使用道具 举报

地板
ID:618619 发表于 2019-10-6 17:16 | 只看该作者
后来换了一个版本的ide好了
回复

使用道具 举报

5#
ID:891140 发表于 2021-8-4 18:20 | 只看该作者
请问,USB键盘按键信息都是布尔数据,如果想做一个外设将0-100%的模拟量输入电脑,该怎么处理呢?USB键盘和鼠标功能额能实现吗?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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