基于ESP32 S2的模拟键盘鼠标
用X、Y二轴电位计控制鼠标的移动,一个按键左键点击,另一个按键敲入"eetree.cn"
标签
嵌入式系统
USB
esp32s2
2023寒假在家练
模拟键鼠
llzx
更新2023-03-29
2284

1简介

    ESP32-S2芯片搭载 Xtensa® 32 位 LX7 单核处理器,工作频率高达 240 MHz。芯片支内置 320 KB SRAM/128 KB ROM,这款芯片支持带有usb接口,虽然没有蓝牙接口,但是在物联网方面应用也是广泛,支持arduino编程,网上的参考资料和例程都比较多。usb接口省去了usb转串口模块,所以整个核心板模块非常小巧。但是这款开发板用arduino编程,搭建环境较为曲折。

    这次实现的是ESP32模拟USB键盘鼠标设备,因为是S2这里通过usb接口实现键鼠设备,如果是ESP32其他型号,还可以通过蓝牙实现键鼠设备。

2.硬件原理图

2.1硬件框图

   控制鼠标移动和实现字符串输入,按键点击,需要用到摇杆和按键部分硬件,模拟键盘鼠标是通过ESP32的USB接口,通过USB接口连接到PC,在PC上演示功能。硬件框图如下。

FnHj8YXWvRG72a9eKs9BFnDxToBw

2.2PWM输入电路

    电位器输入,一般是通过adc读取两个通道的电阻值变化,这里扩展板通过震荡电路的转换,可以通过一个io读取pwm的频率和占空比,即可读取到二轴电位器的阻值变化。

    扩展板连接到核心板的IO是GPIO1。

Fo1LW9xyv4COzMastcw0gJ7JFVQd

2.3按键输入电路

   由于扩展板掉了一颗按键,只有K2按钮,这里通过组合按键实现两个按钮的功能不同的按键按下,电压值不一样,这里可以采用实测的方法,直接测量电压值,根据范围判断按钮是哪一个按下。这里扩展板连接到核心板是IO1,通过ADC读取电压值判断按键。

FqtXrXII17sxeGQ6speLH0Va8wzc

3.程序

3.1程序框图

    上电后需要先初始化ADC和USB接口以及PWM中断,实现模拟鼠标和读取按键输入,摇杆输入。主循环中采集ADC和PWM的输入,如果这两个数值任何一个达到设定值,就会执行相应的键鼠动作。程序流程图如下。

FiZMKdQuT-ZYVIjYmb1-z89_BTZ_

3.2初始化程序

    Arduino程序部分实现比较简单,这里通过修改KeyboardandmouseControl例程,在这个基础上去实现功能,初始化的程序如下,注意键盘符合设备和usb虚拟串口只能有一个工作。

void setup() { // initialize the buttons' inputs:
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(leftButton, INPUT_PULLUP);
  pinMode(rightButton, INPUT_PULLUP);
  pinMode(mouseButton, INPUT_PULLUP);

  // initialize mouse control:
  Mouse.begin();
  Keyboard.begin();
  USB.begin();
    pinMode(pwmPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(pwmPin), changeISR, CHANGE);
  analogReadResolution(12);
  //Serial.begin(115200);
  pinMode(1, INPUT);
}

3.3 IO分配

      根据扩展板引脚接线原理图,IO引脚定义和初始化如下

int pwmPin = 2;   //信号输入的管脚
 pinMode(pwmPin, INPUT);
 pinMode(1, INPUT);
analogReadResolution(12);

3.4 PWM占空比和频率测量函数

    esp32的例程丰富,这里直接借用网上的PWM处理的函数。读取后将占空比和频率存入两个全局变量中。

void changeISR()
{
  auto now = micros();
  if(digitalRead(pwmPin))  //现在是高
  {
    portENTER_CRITICAL_ISR(&mux);   //进入临界区
    auto total = now - raiseTime;
    fre = 1e6/(double)total;
    auto h = fallTime - raiseTime;
    duty = h/(double)total;
    portEXIT_CRITICAL_ISR(&mux);   //离开临界区
    raiseTime = now;
  }
  else
  {
    fallTime = now;
  }
}

3.5主函数

    1s检测一次按键的输入,和PWM的频率和占空比,如果电位器发生变化或者按键按下,调用按键或者鼠标函数。附件的程序文档,有很多是测试的部分并未删除,不影响程序功能。

void loop() {
  // use serial input to control the mouse:
  if (Serial.available() > 0) {
    char inChar = Serial.read();
  portENTER_CRITICAL(&mux);
  double f = fre;
  double d = duty;
  portEXIT_CRITICAL(&mux);
  //Serial.println(f);
  //Serial.println(d);
   int analogValue = analogRead(1);
    if ((analogValue>1500)&&(d>0.7)) {//Serial.println("down");
    Mouse.move(0, 10);}
    if (d<0.45) {//Serial.println("up");
    Mouse.move(0, -10);}
    if (f>400) {//Serial.println("right");
    Mouse.move(10, 0);}
    if (f<230) {//Serial.println("left");
    Mouse.move(-10, 0);}
    if (analogValue<1500)
  { SendString("eetree.cn");
    }
     if ((analogValue<1500)&&(d>0.7))
  { 
    Mouse.click(MOUSE_LEFT);
    }
  delay(1000);
}

4.遇到的问题

    程序之前是在win8的平台下写的,esp32 s2如果是使用usb虚拟串口烧录程序,驱动需要安装,不然是无法烧录的,只能通过串口烧录。并且键鼠设备,win8下识别也并不可靠,视频是通过连接到一台win10的电脑演示。

   arduino并不是所有的例程都能实现,由于时间不足没有过多深入,可以多尝试,不同开发板,同一例程有时候会有不同的结果。

    网上很多关于S2的搭建环境已经失效,有时候并不是网络问题,导致安装失败。

5.总结

    通过arduino编程,虽然编程简单,不需要开发驱动,但是新平台还是会遇到不是问题,后续有机会需要更多了解库文件里面具体的代码。

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