第五课--Microduino 模拟电脑键盘/zh

来自Microduino Wikipedia
Pkj讨论 | 贡献2014年3月13日 (四) 05:02的版本 设备
跳转至: 导航搜索
Language English

目的

本教程将教大家如何用Microduino做一个模拟键盘,可以在记事本里输入hello world

设备

  • Microduino-Core
  • Microduino-FT232R
  • 其他硬件设备
    • 面包板跳线 一盒
    • 面包板 一块
    • 68Ω电阻 x2 (没有68Ω的话,用50~100Ω电阻也行)
    • 2.2kΩ电阻 x1 (没有2.2kΩ的话,用1.5k~2.2k电阻也行)
    • USB连接线(一端是USB口,另一端是电线) x1
    • 3.6v 稳压管(建议选用功耗0.25~0.5w的)x2
    • USB数据连接线 一根

稳压管简介:

第五课-稳压管.jpg

稳压二极管(又叫齐纳二极管)是一种硅材料制成的面接触型晶体二极管,简称稳压管。

此二极管是一种直到临界反向击穿电压前都具有很高电阻的半导体器件。

稳压管在反向击穿时,在一定的电流范围内(或者说在一定功率损耗范围内),端电压几乎不变,表现出稳压特性,因而广泛应用于稳压电源与限幅电路之中。稳压二极管是根据击穿电压来分档的,因为这种特性,稳压管主要被作为稳压器或电压基准元件使用。

稳压二极管可以串联起来以便在较高的电压上使用,通过串联就可获得更多的稳定电压。

原理图

第五课-Microduino模拟电脑键盘原理图.jpg

原理图解说:

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不能用。

程序

    /*
	Microduino模拟键盘
   
    功能描述:插上此模拟键盘,打开记事本,然后按下按钮,即可在记事本打印出HELLO WORLD字样
     
    接线方法:
    Microduino D2接68Ω电阻后,接USB线D+
    Microduino D4接68Ω电阻后,接USB线D-
    Microduino D5接2.2kΩ电阻后,接USB线D-
    Microduino D2接3.6v稳压管到GND
    Microduino D4接3.6v稳压管到GND
    +5v接USB线VCC
    GND接USB线GND
    Microduino D1接一个开关到GND
     
    附:USB线序颜色(由于各生产厂不同,不一定准确,仅供参考)
    *USB键鼠:      |        *USB接口
    白<->VCC        |        红<->VCC
    橙<->D-         |        白<->D-
    绿<->D+         |        绿<->D+
    蓝<->GND        |        黑<->GND
     
    */
     
    #include "UsbKeyboard.h"
    int KEYPIN = 1;                //按键接在D1引脚,也可以改成任何引脚
    void setup()
    {
      TIMSK0 &= !(1 << TOIE0);        //
      pinMode(KEYPIN, INPUT);
      digitalWrite(KEYPIN, HIGH);
    }
    void loop()
    {
      UsbKeyboard.update();
      if(digitalRead(KEYPIN) == HIGH)
      {
        delay(100);
        if(digitalRead(KEYPIN) == LOW)
        {
          UsbKeyboard.sendKeyStroke(KEY_H);
          UsbKeyboard.sendKeyStroke(KEY_E);
          UsbKeyboard.sendKeyStroke(KEY_L);
          UsbKeyboard.sendKeyStroke(KEY_L);
          UsbKeyboard.sendKeyStroke(KEY_O);
          UsbKeyboard.sendKeyStroke(KEY_SPACE);
          UsbKeyboard.sendKeyStroke(KEY_W);
          UsbKeyboard.sendKeyStroke(KEY_O);
          UsbKeyboard.sendKeyStroke(KEY_R);
          UsbKeyboard.sendKeyStroke(KEY_L);
          UsbKeyboard.sendKeyStroke(KEY_D);
          UsbKeyboard.sendKeyStroke(KEY_ENTER);
        }
      }
    }

调试

首先介绍下库文件,需要解压缩后放到arduinoIDE目录的libraries内,然后重启arduinoIDE就能加载这个库了

Arduino支持库文件:

http://soft1.wmzhe.com/download/Ansifa2012/Arduino/UsbKeyboard.zip

注意:

1、UsbKeyboard库中,usbconfig.h里面可以更改USB接线的引脚定义,下面给出一个大概解释(下面的PORTD是指AVR单片机的PORTD,要查询Arduino原理图才能得到是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软件测试不同数字下面的键值。

步骤一:把代码复制到IDE中,编译

步骤二:电路连接,如下图:

第五课-Microduino模拟电脑键盘USB引脚焊接图.jpg
第五课-Microduino模拟电脑键盘连接图.jpg

步骤三:运行代码

步骤四:拔下下载程序的USB,插上电路图中的USB,打开记事本,按下按键,记事本会显示如下图:

第五课-Microduino模拟电脑键盘记事本显示.jpg

结果

按下一次按钮,记事本上就会写入hello world 回车

视频

http://v.youku.com/v_show/id_XNjgyNTUwMjA0.html