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上演示功能。硬件框图如下。
2.2PWM输入电路
电位器输入,一般是通过adc读取两个通道的电阻值变化,这里扩展板通过震荡电路的转换,可以通过一个io读取pwm的频率和占空比,即可读取到二轴电位器的阻值变化。
扩展板连接到核心板的IO是GPIO1。
2.3按键输入电路
由于扩展板掉了一颗按键,只有K2按钮,这里通过组合按键实现两个按钮的功能。不同的按键按下,电压值不一样,这里可以采用实测的方法,直接测量电压值,根据范围判断按钮是哪一个按下。这里扩展板连接到核心板是IO1,通过ADC读取电压值判断按键。
3.程序
3.1程序框图
上电后需要先初始化ADC和USB接口以及PWM中断,实现模拟鼠标和读取按键输入,摇杆输入。主循环中采集ADC和PWM的输入,如果这两个数值任何一个达到设定值,就会执行相应的键鼠动作。程序流程图如下。
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编程,虽然编程简单,不需要开发驱动,但是新平台还是会遇到不是问题,后续有机会需要更多了解库文件里面具体的代码。