打算用esp32做一个BLE手柄【持续更新】
本帖最后由 leon...... 于 2019-9-24 09:49 编辑最近想着自已做一个游戏手柄,自从用过esp32后,感觉esp32这货就是DIY而生,使用esp32应该是一个不错的选择,不过工作电流有些大。如果能降低功耗就完美了。
使用ESP32还有一个好处就是以为可以扩展加入WIFI,又或者加入MOUSE/KEYBOARD功能也可以(有些游戏只能键盘玩)。希望能够成功。 支持,如有好的ble hid资料可以分享下 为什么说esp32是为Diy而生的?请教。 887799 发表于 2019-9-23 23:21
为什么说esp32是为Diy而生的?请教。
资源丰富,功能强大,上手容易,micropython,arduino,platfromIO,各种git库应有尽有,我真心觉得它是DIY首选了 gamethink 发表于 2019-9-23 23:25
用什么开发环境和仿真,这个很痛苦
platformIO + jlink可以直接仿真,不过手柄功能不复杂,只是几个按键,应该用不到仿真,直接UART调试就好了。环境就基于arduino来弄 智涅 发表于 2019-9-23 22:20
支持,如有好的ble hid资料可以分享下
欢迎围观,准备先出线路。刚试了一下树莓和PC游戏模拟器,都能很好兼容BLE设备,看来有戏。 本帖最后由 leon...... 于 2019-9-24 08:52 编辑
gamethink 发表于 2019-9-24 08:22
PIO需要爱国才能安装,烦死了
你编译个hello world要多久?我这里测试3,4分钟 ...
我这边倒是没有,我在vscode上装的arduino和PIO插件,pio framework使用arduino来编译200行代码也就十来秒的事情。当然第一次编译会久一点。如下:
=========================== Took 17.55 seconds ====================================
还有PIO不需要爱国吧,我这边使用没有发现这种情况。
到时我也跟风弄一个 zhutr99 发表于 2019-9-24 08:50
到时我也跟风弄一个
那我调试好后便上传到github,共同探讨完善 gamethink 发表于 2019-9-24 09:28
arduino是不是需要PCB将IO口什么的做成它要求的规范才能用它的库函数
我没用过arduino,想认识一下 ...
我也是才接触,不那么在行,似乎和你说的刚好相反,我感觉arduino不太需要关注硬件部分了。
arduino对接的是二个函数,setup()用来进行初始化,loop()是主循环。因为esp32是其于freeRTOS的,所以可以初始化一些task, thread,timer, int什么的。当然也可以不用。
所有的硬件都有api来初始化了,调用即可。似乎不懂硬件也能玩得通。
gamethink 发表于 2019-9-24 09:28
arduino是不是需要PCB将IO口什么的做成它要求的规范才能用它的库函数
我没用过arduino,想认识一下 ...
PIO支持多种ESP的frameworks,除了arduino SDK,直接用官方的ESP-IDF SDK也可以。 leon...... 发表于 2019-9-24 00:58
资源丰富,功能强大,上手容易,micropython,arduino,platfromIO,各种git库应有尽有,我真心觉得它是D ...
micropython,arduino这些是和开发板捆绑的么?如果按自己的需求画硬件,micropython,arduino怎样配置? 887799 发表于 2019-9-24 09:53
micropython,arduino这些是和开发板捆绑的么?如果按自己的需求画硬件,micropython,arduino怎样配置? ...
没有捆绑,micropython通用,而arduino, 因为ESP32有外置flash和RAM, 所以arduino选board时注意选ROM和RAM和自已的一致就好了。 gamethink 发表于 2019-9-24 10:02
能否帮个忙,PIO编译官方ESP-IDF的例程,就找那个spi_master吧,我弄了一个星期都没办法通过
PIO没办法 ...
我也发现这个c_cpp_properties.json是每次重新打开都会自动生成的,所以怎么改都没屁用,等我线路图出来了我帮你试试。 能连WIFI 带蓝牙,确实可玩性很高。
VSCODE+ PIO 刚把 arduinouno 点亮了。
ESP32 还没测试过, 好像可以选择 arduino 开发, NONOS RTOS 支持楼主,很感兴趣
所以,重点问下头像出处? leon...... 发表于 2019-9-24 01:02
platformIO + jlink可以直接仿真,不过手柄功能不复杂,只是几个按键,应该用不到仿真,直接UART调试就 ...
jlink可以仿真?记得它好像不是ARM核的吧 Jmhh247 发表于 2019-9-24 13:23
支持楼主,很感兴趣
所以,重点问下头像出处?
我说我杀人不眨眼,你问我眼睛干不干? 9509238 发表于 2019-9-24 13:30
jlink可以仿真?记得它好像不是ARM核的吧
可以仿真,PIO官方有详细说明: https://docs.platformio.org/en/latest/boards/espressif32/nodemcu-32s.html?highlight=NodeMCu Jmhh247 发表于 2019-9-24 13:23
支持楼主,很感兴趣
所以,重点问下头像出处?
隔壁坛子猎过来的,很熟悉? 本帖最后由 leon...... 于 2019-9-24 15:42 编辑
分配了IO,还好刚刚够用。等买的板子到了再补上电源部分。
买的这货,不晓得电池电源部分漏电大不大,不行就直接换成单独的模块再飞线
BLE 使用 Nordic系芯片配合Arduino库开发也是很方便的。而且挂上SWD调试器一样用VSCODE调试。 gamethink 发表于 2019-9-24 08:22
PIO需要爱国才能安装,烦死了
你编译个hello world要多久?我这里测试3,4分钟 ...
没有找到你说的examples : https://github.com/platformio/platform-espressif32/tree/master/examples?utm_source=platformio&utm_medium=docs
如果你是从espressif下载的,那应该有些兼容性的问题,我也帮不到你。
因为我对PIO配置也不了解,的确挺头疼的,如果只是库缺失,建议可以把缺失库库直接放lib目录试试。
另外我尝试了一下helloworld官方SDK编译:
首次编译 5分钟
====================================== Took 126.15 seconds ======================================
Environment Status Duration
----------------------------------
esp32dev SUCCESS 00:01:05.173
esp wrover kitSUCCESS 00:01:53.038
lolin 32 SUCCESS 00:02:06.147
======================================= 3 succeeded in 00:05:04.358 =======================================
修改main.c后 第二次编译 47秒
====================================== Took 16.15 seconds ======================================
Environment Status Duration
----------------------------------
esp32dev SUCCESS 00:00:16.511
esp wrover kitSUCCESS 00:00:15.117
lolin 32 SUCCESS 00:00:16.154
======================================= 3 succeeded in 00:00:47.782 ======================================= iamseer 发表于 2019-9-24 15:54
BLE 使用 Nordic系芯片配合Arduino库开发也是很方便的。而且挂上SWD调试器一样用VSCODE调试。 ...
不想去熟悉太多的IC,用ESP32玩过WIFI,所以干脆用它来做BLE折腾一下了。当然这货省电方面应该没有NORDIC之类的好,我相信如果用NORDIC不关电都不用太担心耗电问题。 持续关注 楼主加油 gamethink 发表于 2019-9-24 17:05
是esp提供的esp-idf包里面,PIO里面也有,不过感觉有点不一样
我试了试,开始是提示lcd_type没有初始化,我初始化成0后,编译完成,但连接的时候出错:
Linking .pio/build/lolin 32/firmware.elf
.pio/build/lolin 32/src/decode_image.o:(.literal.decode_image+0x14): undefined reference to `_binary_image_jpg_start'
应该这个decode_image库有问题。可以去翻翻它的文档 本帖最后由 leon...... 于 2019-9-25 09:29 编辑
gamethink 发表于 2019-9-25 09:04
按照规范,不应该直接初始化为0
应该在头文件定义CONFIG_LCD_TYPE_AUTO=1,乐鑫官方的做法是在menuconifg ...
gamethink: QQ私信给你了,有什么需要帮忙的直接Q我,尽管我可能什么也帮不上{:lol:}
本帖最后由 leon...... 于 2019-9-25 09:32 编辑
翻出个旧手柄,直接烫掉牛屎IC,开始飞线,ESP32应该下午能够到,快递太慢了。
本帖最后由 leon...... 于 2019-9-25 17:58 编辑
终于等到了ESP32, 这货是带电池充电的,不用再装充电部分,而且下载也是自动的,不用再按BOOT键,只需要将20多条飞线直接拉到排针上就搞定了。
而且这货将GPIO21没有引出来,挨千刀的,本来GPIO就不够。
只好改成GPIO33
然后,跑了一下测试程序顺利通过:
const uint8_t KEYS[] ={
KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_A, KEY_B, KEY_X, KEY_Y,
KEY_L, KEY_LT, KEY_R, KEY_RT, KEY_MODE, KEY_SELECT, KEY_TURBO1, KEY_TURBO2 };
void my_test(void*) {
for(int i=0; i<sizeof(KEYS); i++)
pinMode(KEYS, INPUT_PULLUP);
pinMode(LEFT_MOTOR, OUTPUT);
pinMode(RIGHT_MOTOR, OUTPUT);
pinMode(CONNECTED_LED_INDICATOR_PIN, OUTPUT);
digitalWrite(LEFT_MOTOR, HIGH);
delay(2000);
digitalWrite(LEFT_MOTOR, LOW);
delay(1000);
digitalWrite(RIGHT_MOTOR, HIGH);
delay(2000);
digitalWrite(RIGHT_MOTOR, LOW);
delay(1000);
digitalWrite(CONNECTED_LED_INDICATOR_PIN, HIGH);
delay(2000);
digitalWrite(CONNECTED_LED_INDICATOR_PIN, LOW);
delay(1000);
while(1)
{
for(int i=0; i<sizeof(KEYS); i++)
Serial.print(digitalRead(KEYS));
Serial.print(' ');
Serial.print(analogRead(LEFT_VR1));
Serial.print(' ');
Serial.print(analogRead(LEFT_VR2));
Serial.print(' ');
Serial.print(analogRead(RIGHT_VR1));
Serial.print(' ');
Serial.print(analogRead(RIGHT_VR2));
Serial.println(' ');
delay(100);
}
}
等测试好省电程序,才装电池,现在直接USB供电吧 支持楼主,爱折腾的奶爸 本帖最后由 leon...... 于 2019-9-26 15:38 编辑
didadida 发表于 2019-9-26 12:43
支持楼主,爱折腾的奶爸
谢谢楼上的支持。正式发布:
目前是一个可以运行的程序版本,但程序还不完整,没有模式切换(摇柄和按键互换),宏定义,马达振动功能。还没有加入省电功能。
这是HID描述文件,同时,求大神传授马达控制方法
const uint8_t reportMapJoystick[] = { //This is where the amount, type, and value range of the inputs are declared
USAGE_PAGE(1), 0x01, // USAGE_PAGE (Generic Desktop)
USAGE(1), 0x05, // USAGE (Gamepad)
COLLECTION(1), 0x01, // COLLECTION (Application)
REPORT_ID(1), 0x01, // REPORT_ID (1)
LOGICAL_MINIMUM(1), 0x00, // LOGICAL_MINIMUM (0)
LOGICAL_MAXIMUM(1), 0x01, // LOGICAL_MAXIMUM (1)
PHYSICAL_MINIMUM(1), 0x00, // PHYSICAL_MINIMUM (0)
PHYSICAL_MAXIMUM(1), 0x01, // PHYSICAL_MAXIMUM (1)
REPORT_SIZE(1), 0x01, // REPORT_SIZE (1)
REPORT_COUNT(1), 0x10, // REPORT_COUNT (16)
USAGE_PAGE(1), 0x09, //(Button)
USAGE_MINIMUM(1), 0x01,
USAGE_MAXIMUM(1), 0x10, // 16
INPUT_(1), 0x02, // variable | absolute
LOGICAL_MAXIMUM(2), 0xff, 0x00, // LOGICAL_MAXIMUM (255)
PHYSICAL_MAXIMUM(2),0xff, 0x00, // PHYSICAL_MAXIMUM (255)
REPORT_SIZE(1), 0x08, // REPORT_SIZE (8)
REPORT_COUNT(1), 0x04, // REPORT_COUNT (1)
USAGE_PAGE(1), 0x01, // USAGE_PAGE (Generic Desktop)
USAGE(1), 0x30, // X axis
USAGE(1), 0x31, // Y axis
USAGE(1), 0x32, // Z axis
USAGE(1), 0x35, // Z-rotator axis
INPUT_(1), 0x02, // INPUT (Data,Var,Abs)
LOGICAL_MINIMUM(1), 0x00,
LOGICAL_MAXIMUM(1), 0x07,
PHYSICAL_MINIMUM(1), 0x01,
PHYSICAL_MAXIMUM(2), (315 & 0xFF), ((315>>8) & 0xFF),
REPORT_SIZE(1), 0x04,
REPORT_COUNT(1), 0x01,
UNIT(1), 20,
USAGE_PAGE(1), 0x01,
USAGE(1), 0x39,//hat switch
INPUT_(1), 0x42,//variable | absolute | null state
END_COLLECTION(0) // END_COLLECTION
};
库使用的是nkolban/ESP32_BLE_Arduino,有了库一切都简单了。
源代码在这:https://github.com/kkaoo/esp32_hid
程序在电脑上测试通过,玩了一会玛丽兄弟,还不错,所有键的扫描时间是10MS,灵敏度很高的了。上图:
lyg407 发表于 2019-9-24 10:28
能连WIFI 带蓝牙,确实可玩性很高。
VSCODE+ PIO 刚把 arduinouno 点亮了。
ESP32也很方便,可以arduino也可以PIO,还可以官方ESPIDF。我是用着就发现中毒了,DIY不再想选其它了。现在就盼ESP32 - S2版本能早些开卖。 本帖最后由 leon...... 于 2019-9-29 21:59 编辑
电路图按买回来的新模块更新了一下:
VR用IO来控制电源进行省电
马达没有用处,加上IO不够,暂时去掉了一个
调整了几个IO
买的这个模组有电池电路,但是还是有漏电问题,需要做一些调整
原模组CH340串口IC静态电流1.6MA,如下图中,
将CH340的VCC挑起来,连接到USB5V,将4脚挑起来接一个0.1UF到GND
修改后还50UA的漏电流,应该是LDO的静态电流,有空再找个低静态LDO试试
当前程序5分钟后自动休眠,按下方向左键可以唤醒
最终休眠电流50〜70UA
工作电流50〜60MA
来张成品图
本帖最后由 leon...... 于 2019-9-29 22:06 编辑
树莓派的测试
测试RPI-4B buster: 正常(兼容性不是特别好), 使用模拟器玩dino恐龙快打时感觉有些延迟,MACOS & WIN10系统没有这个问题。
raspberry-buster配对蓝牙时,在我的RPI4B有时会出现AUTH TIME的错误,使用bluetoothctl查看蓝牙的状态蓝牙连接成功,但没有成功配对。
手动在主屏幕点蓝牙图标关闭,然后重新打开,再重新配对后正常。是何原因未知。
然后三连发: 安装测试软件jstest, 查看JS设备端口(比如js0), 运行jstest测试
sudo apt install jstest
ls /dev/input/
jstest /dev/input/js0
上测试图
最新程序稍后上传GITHUB 不错不错,都是大神!!! 楼主,手柄接收数据搞定了吗?
页:
[1]