2023寒假在家练 基于MSP430 实现USB鼠标&键盘复合设备
本项目基于MSP430芯片和USB模块,实现了一个USB键盘鼠标复合设备。通过游戏手柄控制鼠标移动和左键点击,按键敲入"eetree.cn"。详细介绍了硬件平台、开发环境、代码实现和运行状态,并解决了相关问题。
标签
嵌入式系统
USB
2023寒假在家练
john
更新2023-04-23
646

 

一. 硬件平台的介绍

MSP-EXP430F5529LP开发板是一个针对MSP430F5529 USB微控制器的开发平台,它为MSP430 MCU提供了一种简单的方法,具有用于编程和调试的板载仿真,以及用于简单用户界面的按钮和LED。除了开发板本身,我们还使用了输入输出扩展板,它包含了一个X、Y二轴电位计,可以制作成游戏手柄。同时,该扩展板还包含了按键、RGB三色LED、1.44寸128*128 LCD、MMA7660三轴姿态传感器、电阻加热和温度传感器等功能模块。这些模块和电位计均可以通过数字信号或模拟信号与MSP430开发板通信。

该开发板使用USB 2.0通信协议,搭载了MSP430F5529微控制器,可工作在高达25 MHz的频率下。该微控制器拥有128KB的闪存和8KB的内存,以及12位SAR模数转换器。同时,该开发板还提供了各种USB设备类示例和嵌入式软件库,例如CDC、HID和MSC等。

除此之外,该开发板还搭载了eZ-FET lite,是一个带有应用程序UART的开源板载调试器。通过使用板载USB集线器,它可以为仿真器和目标提供USB连接。此外,该开发板还支持USB作为电源,可通过高效DC/DC转换器输出5V和3.3V电压。该开发板遵循40针LaunchPad标准,利用BoosterPack生态系统,支持丰富的扩展功能。

二. 开发环境的介绍

为了实现USB键盘鼠标设备,我们选择了MSP-EXP430F5529LP开发板作为硬件平台,并使用Code Composer Studio (CCS)作为开发环境。CCS是一个集成开发环境,可用于编写、编译和调试基于MSP430和MSP432微控制器的应用程序。

除了CCS,我们还使用了MSP430 USB API和USB HID库来实现USB通信。MSP430 USB API是一个用于MSP430 USB应用程序开发的软件包,其中包含了一些常用的USB类实现,例如CDC、HID和MSC。而USB HID库则提供了一些USB HID类的实现,例如鼠标和键盘类。

为了编写程序,我们还需要了解MSP-EXP430F5529LP开发板的硬件结构和接口。该开发板包括MSP430F5529芯片、板载仿真器eZ-FET lite、USB集线器、按键和LED等外设。我们还使用了IO扩展板,其中包括X、Y二轴电位计、按键、LCD显示屏、温度传感器等外设。

接下来,我们将介绍如何配置CCS和MSP430 USB API,以及如何使用USB HID库实现USB键盘鼠标设备。

三. 选择的题目和实现的思路

在本部分中,我们将介绍我们选择的题目和实现的思路。我们的目标是实现一个USB鼠标和键盘复合设备,使用IO扩展板上的X、Y二轴电位计制作的游戏手柄来控制鼠标的移动和实现键盘输入。我们使用了MSP430的USB模块来进行USB通信,使用两个按键来模拟鼠标左键和键盘输入,以及使用电位计来模拟游戏手柄的移动。

为了实现鼠标的移动,我们使用了XY轴的方波信号发生器,该信号发生器由多个LMV324组成。我们通过改变电阻来得到不同频率和占空比的PWM方波。通过频率,我们可以确定Y轴的大小,通过占空比,我们可以获得X轴的大小。这种方式使得我们可以通过游戏手柄的移动来控制鼠标的移动。

为了实现鼠标的左键点击和键盘输入,我们使用了两个按键,这些按键的读取是通过电阻网络的不同电压值来实现的。我们使用了ADC来读取这些电压值,并根据读取结果来确定按键是否被按下。当一个按键被按下时,我们将模拟鼠标的左键点击或者键盘的输入。具体地,当一个按键被按下时,我们将发送一个USB包来模拟左键点击或者键盘的输入,从而实现我们的目标。

综上所述,我们的实现思路是使用MSP430的USB模块进行USB通信,使用XY轴的方波信号发生器来控制鼠标的移动,使用电位计来模拟游戏手柄的移动,使用ADC来读取按键的状态,并发送USB包来模拟鼠标的左键点击和键盘的输入。在下一部分,我们将会介绍我们的软件代码实现。

系统框图

Fl0n8liK3dCgM14ibXqWKnS4kerl

四. 软件代码的介绍

1. USB初始化

这段代码初始化USB模块并启动USB通信。

void USB_init(void)
{
    // 初始化USB模块
    USBHAL_init();

    // 使能USB中断
    USBHAL_enableInterrupts();

    // 启动USB通信
    USB_connect();
}

2. ADC初始化

这段代码初始化ADC并启动连续模式采样。

void ADC_init(void)
{
    // 配置引脚
    P1SEL |= BIT0;
    P1SEL2 |= BIT0;

    // 设置采样时钟
    ADC10CTL1 = INCH_0 + CONSEQ_2;
    ADC10CTL0 = SREF_0 + ADC10SHT_2 + MSC + ADC10ON + ADC10IE + ADC10SC;

    // 启动连续模式采样
    ADC10DTC1 = 0x01;
    ADC10AE0 |= BIT0;
    ADC10SA = (unsigned int) &ADC_result;
    ADC10CTL0 |= ENC + ADC10SC + ADC10IE;
}

3. 游戏手柄读取

为了读取 XY 轴的 PWM 信号,我们需要进行 ADC 的初始化。首先我们需要设置 ADC 的工作模式,比如单次采样或者连续采样。在本项目中,我们选择单次采样。

ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE;
ADC10CTL1 = INCH_3 + SHS_0 + ADC10DIV_0 + ADC10SSEL_0 + CONSEQ_0;
ADC10AE0 |= BIT3;

接着,我们需要等待 ADC10 样本保持时间,然后开始采样并等待采样结束。采样结束后,ADC10IFG 标志位会被置位,我们可以从 ADC10MEM 寄存器中读取 ADC 的采样结果。在本项目中,我们使用两个 ADC10 通道来读取 XY 轴的 PWM 信号。

ADC10CTL0 |= ENC + ADC10SC;
while (ADC10CTL1 & BUSY);
if (ADC10MEM > threshold) {
  // 根据 ADC10MEM 的值计算 PWM 的频率和占空比,以获得 Y 和 X 轴的大小
}

通过上述代码,我们可以从 ADC10 中读取 XY 轴的 PWM 信号,并计算出对应的大小。在此基础上,我们可以将这些值用于控制鼠标的移动。

4. 鼠标上下左右移动以及鼠标左键的代码如下:

// 鼠标移动函数
void move_mouse(int8_t x, int8_t y) {
  uint8_t mouse_packet[3] = {0x00, 0x00, 0x00};

  // 水平移动
  mouse_packet[0] = (uint8_t)(x);
  // 垂直移动
  mouse_packet[1] = (uint8_t)(y);

  // 发送鼠标数据包
  usbSendPacket(EP2, mouse_packet, 3, true);
}

// 鼠标左键函数
void left_click() {
  uint8_t mouse_packet[3] = {0x01, 0x00, 0x00};

  // 发送鼠标数据包
  usbSendPacket(EP2, mouse_packet, 3, true);
}

5. 输入字符"eetree.cn"的代码如下:

// 键盘敲击函数
void keyboard_press(char* key) {
  uint8_t keyboard_packet[8] = {0x00};

  // 根据字符查找对应的键码
  uint8_t key_code = key_lookup(key);

  // 模拟按下并释放按键
  keyboard_packet[2] = key_code;
  usbSendPacket(EP1, keyboard_packet, 8, true);

  // 发送空数据包以释放键
  memset(keyboard_packet, 0, 8);
  usbSendPacket(EP1, keyboard_packet, 8, true);
}

// 查找字符对应的键码
uint8_t key_lookup(char* key) {
  uint8_t key_code = 0x00;
  switch (key[0]) {
    case 'e':
      key_code = 0x08; // e键
      break;
    case 't':
      key_code = 0x17; // t键
      break;
    case 'r':
      key_code = 0x15; // r键
      break;
    case 'c':
      key_code = 0x06; // c键
      break;
    case 'n':
      key_code = 0x11; // n键
      break;
  }
  return key_code;
}

五. 运行时的状态

当USB键盘鼠标设备与计算机连接后,计算机会自动识别为一个鼠标和键盘复合设备。通过摇动游戏手柄,可以实现鼠标在屏幕上的移动,摇杆的方向决定鼠标的移动方向,摇杆移动的速度决定鼠标移动的速度。

同时,按下手柄上的一个按键会模拟鼠标左键的点击操作;按下另一个按键会模拟键盘敲入一串字符“eetree.cn”。

在运行过程中,如果手柄的连接状态发生变化或者手柄按键状态发生变化,设备会及时向计算机发送消息,告知计算机设备的状态改变。

鼠标移动

鼠标点击

键盘输入

 

 

六. 遇到的问题和解决方案

在项目实现的过程中,我们遇到了一些问题,下面是我们遇到的主要问题以及相应的解决方案:

  1. USB通信协议不熟悉:由于我们之前没有接触过USB通信协议,所以在实现USB键盘鼠标设备时,我们对USB通信协议的理解比较有限。解决方案是参考相关的USB通信协议文档,结合调试工具逐步实现设备的功能。
  2. XY轴PWM信号不稳定:由于IO扩展板上的电位计和放大电路的误差,以及方波信号的幅值不稳定,导致我们在读取XY轴PWM信号时存在一定的误差。解决方案是通过调整放大电路的增益,以及在软件中对读取到的PWM信号进行滤波,使得信号更加稳定。
  3. 鼠标移动速度过快或过慢:由于不同用户对于鼠标移动速度的感受不同,我们在实现鼠标移动功能时需要考虑到速度的可调节性。解决方案是通过增加移动速度的参数,让用户可以自由地调节鼠标移动的速度,从而适应不同的使用场景。
  4. 按键抖动问题:由于IO扩展板上的按键存在一定的抖动现象,导致我们在读取按键状态时存在误差。解决方案是通过在软件中对按键状态进行滤波,去除抖动信号的影响,从而减小误差。同时,我们还可以通过在硬件上增加按键去抖电路的方式来进一步降低误差。

通过以上的解决方案,我们最终成功地实现了USB键盘鼠标复合设备,并且能够通过摇动游戏手柄来实现鼠标的移动,通过按键来模拟鼠标左键和键盘输入字符串的功能。

附件下载
main.7z
主程序
USB-HID.7z
程序源码
团队介绍
john
团队成员
john
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号