搜索
bottom↓
回复: 41

打算用esp32做一个BLE手柄【持续更新】

[复制链接]

出0入0汤圆

发表于 2019-9-23 21:54:36 | 显示全部楼层 |阅读模式
本帖最后由 leon...... 于 2019-9-24 09:49 编辑

最近想着自已做一个游戏手柄,自从用过esp32后,感觉esp32这货就是DIY而生,使用esp32应该是一个不错的选择,不过工作电流有些大。如果能降低功耗就完美了。

使用ESP32还有一个好处就是以为可以扩展加入WIFI,又或者加入MOUSE/KEYBOARD功能也可以(有些游戏只能键盘玩)。希望能够成功。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出40入518汤圆

发表于 2019-9-23 22:20:16 | 显示全部楼层
支持,如有好的ble hid资料可以分享下

出0入0汤圆

发表于 2019-9-23 23:21:43 | 显示全部楼层
为什么说esp32是为Diy而生的?请教。

出0入0汤圆

 楼主| 发表于 2019-9-24 00:58:53 | 显示全部楼层
887799 发表于 2019-9-23 23:21
为什么说esp32是为Diy而生的?请教。

资源丰富,功能强大,上手容易,micropython,arduino,platfromIO,各种git库应有尽有,我真心觉得它是DIY首选了

出0入0汤圆

 楼主| 发表于 2019-9-24 01:02:26 | 显示全部楼层
gamethink 发表于 2019-9-23 23:25
用什么开发环境和仿真,这个很痛苦

platformIO + jlink可以直接仿真,  不过手柄功能不复杂,只是几个按键,应该用不到仿真,直接UART调试就好了。环境就基于arduino来弄

出0入0汤圆

 楼主| 发表于 2019-9-24 01:04:58 | 显示全部楼层
智涅 发表于 2019-9-23 22:20
支持,如有好的ble hid资料可以分享下


欢迎围观,准备先出线路。刚试了一下树莓和PC游戏模拟器,都能很好兼容BLE设备,看来有戏。

出0入0汤圆

 楼主| 发表于 2019-9-24 08:48:49 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-24 08:52 编辑
gamethink 发表于 2019-9-24 08:22
PIO需要爱国才能安装,烦死了
你编译个hello world要多久?我这里测试3,4分钟 ...


我这边倒是没有,我在vscode上装的arduino和PIO插件,pio framework使用arduino来编译200行代码也就十来秒的事情。当然第一次编译会久一点。如下:


=========================== [SUCCESS] Took 17.55 seconds ====================================


还有PIO不需要爱国吧,我这边使用没有发现这种情况。

出0入0汤圆

发表于 2019-9-24 08:50:44 | 显示全部楼层
到时我也跟风弄一个

出0入0汤圆

 楼主| 发表于 2019-9-24 08:54:22 | 显示全部楼层
zhutr99 发表于 2019-9-24 08:50
到时我也跟风弄一个

那我调试好后便上传到github,共同探讨完善

出0入0汤圆

 楼主| 发表于 2019-9-24 09:41:23 | 显示全部楼层
gamethink 发表于 2019-9-24 09:28
arduino是不是需要PCB将IO口什么的做成它要求的规范才能用它的库函数
我没用过arduino,想认识一下 ...

我也是才接触,不那么在行,似乎和你说的刚好相反,我感觉arduino不太需要关注硬件部分了。

arduino对接的是二个函数,setup()用来进行初始化,loop()是主循环。因为esp32是其于freeRTOS的,所以可以初始化一些task, thread,timer, int什么的。当然也可以不用。

所有的硬件都有api来初始化了,调用即可。似乎不懂硬件也能玩得通。

出0入0汤圆

 楼主| 发表于 2019-9-24 09:48:10 | 显示全部楼层
gamethink 发表于 2019-9-24 09:28
arduino是不是需要PCB将IO口什么的做成它要求的规范才能用它的库函数
我没用过arduino,想认识一下 ...

PIO支持多种ESP的frameworks,除了arduino SDK,直接用官方的ESP-IDF SDK也可以。

出0入0汤圆

发表于 2019-9-24 09:53:37 | 显示全部楼层
leon...... 发表于 2019-9-24 00:58
资源丰富,功能强大,上手容易,micropython,arduino,platfromIO,各种git库应有尽有,我真心觉得它是D ...

micropython,arduino这些是和开发板捆绑的么?如果按自己的需求画硬件,micropython,arduino怎样配置?

出0入0汤圆

 楼主| 发表于 2019-9-24 10:19:06 | 显示全部楼层
887799 发表于 2019-9-24 09:53
micropython,arduino这些是和开发板捆绑的么?如果按自己的需求画硬件,micropython,arduino怎样配置? ...

没有捆绑,micropython通用,而arduino, 因为ESP32有外置flash和RAM, 所以arduino选board时注意选ROM和RAM和自已的一致就好了。

出0入0汤圆

 楼主| 发表于 2019-9-24 10:21:05 | 显示全部楼层
gamethink 发表于 2019-9-24 10:02
能否帮个忙,PIO编译官方ESP-IDF的例程,就找那个spi_master吧,我弄了一个星期都没办法通过

PIO没办法 ...

我也发现这个c_cpp_properties.json是每次重新打开都会自动生成的,所以怎么改都没屁用,等我线路图出来了我帮你试试。

出0入0汤圆

发表于 2019-9-24 10:28:50 | 显示全部楼层
能连WIFI 带蓝牙,确实可玩性很高。  

VSCODE  + PIO 刚把 arduino  uno 点亮了。




ESP32 还没测试过, 好像可以选择 arduino 开发, NONOS   RTOS  

出0入8汤圆

发表于 2019-9-24 13:23:07 | 显示全部楼层
支持楼主,很感兴趣

所以,重点问下头像出处?

出0入0汤圆

发表于 2019-9-24 13:30:24 | 显示全部楼层
leon...... 发表于 2019-9-24 01:02
platformIO + jlink可以直接仿真,  不过手柄功能不复杂,只是几个按键,应该用不到仿真,直接UART调试就 ...

jlink可以仿真?记得它好像不是ARM核的吧

出0入0汤圆

发表于 2019-9-24 14:00:05 | 显示全部楼层
Jmhh247 发表于 2019-9-24 13:23
支持楼主,很感兴趣

所以,重点问下头像出处?

我说我杀人不眨眼,你问我眼睛干不干?

出0入0汤圆

 楼主| 发表于 2019-9-24 14:10:36 | 显示全部楼层
9509238 发表于 2019-9-24 13:30
jlink可以仿真?记得它好像不是ARM核的吧

可以仿真,PIO官方有详细说明: https://docs.platformio.org/en/l ... l?highlight=NodeMCu

出0入0汤圆

 楼主| 发表于 2019-9-24 15:37:33 | 显示全部楼层
Jmhh247 发表于 2019-9-24 13:23
支持楼主,很感兴趣

所以,重点问下头像出处?

隔壁坛子猎过来的,很熟悉?

出0入0汤圆

 楼主| 发表于 2019-9-24 15:39:18 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-24 15:42 编辑

分配了IO,还好刚刚够用。等买的板子到了再补上电源部分。



买的这货,不晓得电池电源部分漏电大不大,不行就直接换成单独的模块再飞线

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入309汤圆

发表于 2019-9-24 15:54:48 | 显示全部楼层
BLE 使用 Nordic系芯片配合Arduino库开发也是很方便的。而且挂上SWD调试器一样用VSCODE调试。

出0入0汤圆

 楼主| 发表于 2019-9-24 16:05:43 | 显示全部楼层
gamethink 发表于 2019-9-24 08:22
PIO需要爱国才能安装,烦死了
你编译个hello world要多久?我这里测试3,4分钟 ...

没有找到你说的examples : https://github.com/platformio/pl ... amp;utm_medium=docs
如果你是从espressif下载的,那应该有些兼容性的问题,我也帮不到你。
因为我对PIO配置也不了解,的确挺头疼的,如果只是库缺失,建议可以把缺失库库直接放lib目录试试。


另外我尝试了一下helloworld官方SDK编译:

首次编译 5分钟
====================================== [SUCCESS] Took 126.15 seconds ======================================

Environment     Status    Duration
--------------  --------  ------------
esp32dev        SUCCESS   00:01:05.173
esp wrover kit  SUCCESS   00:01:53.038
lolin 32        SUCCESS   00:02:06.147
======================================= 3 succeeded in 00:05:04.358 =======================================



修改main.c后 第二次编译 47秒
====================================== [SUCCESS] Took 16.15 seconds ======================================

Environment     Status    Duration
--------------  --------  ------------
esp32dev        SUCCESS   00:00:16.511
esp wrover kit  SUCCESS   00:00:15.117
lolin 32        SUCCESS   00:00:16.154
======================================= 3 succeeded in 00:00:47.782 =======================================

出0入0汤圆

 楼主| 发表于 2019-9-24 16:10:56 | 显示全部楼层
iamseer 发表于 2019-9-24 15:54
BLE 使用 Nordic系芯片配合Arduino库开发也是很方便的。而且挂上SWD调试器一样用VSCODE调试。 ...


不想去熟悉太多的IC,用ESP32玩过WIFI,所以干脆用它来做BLE折腾一下了。当然这货省电方面应该没有NORDIC之类的好,我相信如果用NORDIC不关电都不用太担心耗电问题。

出0入0汤圆

发表于 2019-9-24 19:53:35 | 显示全部楼层
持续关注 楼主加油

出0入0汤圆

 楼主| 发表于 2019-9-24 21:40:44 | 显示全部楼层
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库有问题。可以去翻翻它的文档

出0入0汤圆

 楼主| 发表于 2019-9-25 09:26:02 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-25 09:29 编辑
gamethink 发表于 2019-9-25 09:04
按照规范,不应该直接初始化为0
应该在头文件定义CONFIG_LCD_TYPE_AUTO=1,乐鑫官方的做法是在menuconifg ...


gamethink: QQ私信给你了,有什么需要帮忙的直接Q我,尽管我可能什么也帮不上

出0入0汤圆

 楼主| 发表于 2019-9-25 09:31:37 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-25 09:32 编辑

翻出个旧手柄,直接烫掉牛屎IC,开始飞线,ESP32应该下午能够到,快递太慢了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-9-25 17:55:26 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-25 17:58 编辑

终于等到了ESP32, 这货是带电池充电的,不用再装充电部分,而且下载也是自动的,不用再按BOOT键,只需要将20多条飞线直接拉到排针上就搞定了。
而且这货将GPIO21没有引出来,挨千刀的,本来GPIO就不够。
只好改成GPIO33



然后,跑了一下测试程序顺利通过:
  1. const uint8_t KEYS[] =  {
  2.   KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_A, KEY_B, KEY_X, KEY_Y,
  3.   KEY_L, KEY_LT, KEY_R, KEY_RT, KEY_MODE, KEY_SELECT, KEY_TURBO1, KEY_TURBO2 };

  4. void my_test(void*) {
  5.   for(int i=0; i<sizeof(KEYS); i++)
  6.     pinMode(KEYS[i], INPUT_PULLUP);

  7.   pinMode(LEFT_MOTOR, OUTPUT);
  8.   pinMode(RIGHT_MOTOR, OUTPUT);
  9.   pinMode(CONNECTED_LED_INDICATOR_PIN, OUTPUT);


  10.   digitalWrite(LEFT_MOTOR, HIGH);
  11.   delay(2000);
  12.   digitalWrite(LEFT_MOTOR, LOW);
  13.   delay(1000);

  14.   digitalWrite(RIGHT_MOTOR, HIGH);
  15.   delay(2000);
  16.   digitalWrite(RIGHT_MOTOR, LOW);
  17.   delay(1000);

  18.   digitalWrite(CONNECTED_LED_INDICATOR_PIN, HIGH);
  19.   delay(2000);
  20.   digitalWrite(CONNECTED_LED_INDICATOR_PIN, LOW);
  21.   delay(1000);

  22.   while(1)
  23.   {
  24.     for(int i=0; i<sizeof(KEYS); i++)
  25.       Serial.print(digitalRead(KEYS[i]));

  26.     Serial.print(' ');
  27.     Serial.print(analogRead(LEFT_VR1));

  28.     Serial.print(' ');
  29.     Serial.print(analogRead(LEFT_VR2));

  30.     Serial.print(' ');
  31.     Serial.print(analogRead(RIGHT_VR1));

  32.     Serial.print(' ');
  33.     Serial.print(analogRead(RIGHT_VR2));

  34.     Serial.println(' ');
  35.     delay(100);
  36.   }
  37. }
复制代码


等测试好省电程序,才装电池,现在直接USB供电吧

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-9-26 12:43:54 | 显示全部楼层
支持楼主,爱折腾的奶爸

出0入0汤圆

 楼主| 发表于 2019-9-26 15:34:50 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-26 15:38 编辑
didadida 发表于 2019-9-26 12:43
支持楼主,爱折腾的奶爸


谢谢楼上的支持。正式发布:

目前是一个可以运行的程序版本,但程序还不完整,没有模式切换(摇柄和按键互换),宏定义,马达振动功能。还没有加入省电功能。

这是HID描述文件,同时,求大神传授马达控制方法
  1. const uint8_t reportMapJoystick[] = { //This is where the amount, type, and value range of the inputs are declared
  2.   USAGE_PAGE(1),                               0x01,   // USAGE_PAGE (Generic Desktop)
  3.   USAGE(1),                 0x05,   // USAGE (Gamepad)
  4.   COLLECTION(1),            0x01,   // COLLECTION (Application)
  5.   REPORT_ID(1),             0x01,   // REPORT_ID (1)
  6.   
  7.   LOGICAL_MINIMUM(1),       0x00,   // LOGICAL_MINIMUM (0)
  8.   LOGICAL_MAXIMUM(1),       0x01,   // LOGICAL_MAXIMUM (1)
  9.   PHYSICAL_MINIMUM(1),      0x00,   // PHYSICAL_MINIMUM (0)
  10.   PHYSICAL_MAXIMUM(1),      0x01,   // PHYSICAL_MAXIMUM (1)
  11.   REPORT_SIZE(1),                        0x01,   // REPORT_SIZE (1)
  12.   REPORT_COUNT(1),          0x10,   // REPORT_COUNT (16)
  13.   USAGE_PAGE(1),            0x09,   //(Button)
  14.       USAGE_MINIMUM(1),     0x01,
  15.       USAGE_MAXIMUM(1),     0x10,   // 16
  16.       INPUT_(1),            0x02,   // variable | absolute

  17.   LOGICAL_MAXIMUM(2),   0xff, 0x00, // LOGICAL_MAXIMUM (255)
  18.   PHYSICAL_MAXIMUM(2),  0xff, 0x00, // PHYSICAL_MAXIMUM (255)
  19.   REPORT_SIZE(1),           0x08,   // REPORT_SIZE (8)
  20.   REPORT_COUNT(1),          0x04,   // REPORT_COUNT (1)
  21.   USAGE_PAGE(1),            0x01,   // USAGE_PAGE (Generic Desktop)
  22.       USAGE(1),                                     0x30,   // X axis
  23.       USAGE(1),                               0x31,   // Y axis
  24.       USAGE(1),                                     0x32,   // Z axis
  25.       USAGE(1),                                     0x35,   // Z-rotator axis
  26.       INPUT_(1),            0x02,   // INPUT (Data,Var,Abs)

  27.   LOGICAL_MINIMUM(1),       0x00,
  28.   LOGICAL_MAXIMUM(1),       0x07,
  29.   PHYSICAL_MINIMUM(1),      0x01,
  30.   PHYSICAL_MAXIMUM(2),      (315 & 0xFF), ((315>>8) & 0xFF),
  31.   REPORT_SIZE(1),                        0x04,
  32.   REPORT_COUNT(1),                0x01,
  33.   UNIT(1),                  20,
  34.   USAGE_PAGE(1),                               0x01,
  35.       USAGE(1),                                     0x39,  //hat switch
  36.       INPUT_(1),            0x42,  //variable | absolute | null state

  37.   END_COLLECTION(0)         // END_COLLECTION
  38. };
复制代码


库使用的是nkolban/ESP32_BLE_Arduino,有了库一切都简单了。

源代码在这:https://github.com/kkaoo/esp32_hid

程序在电脑上测试通过,玩了一会玛丽兄弟,还不错,所有键的扫描时间是10MS,灵敏度很高的了。上图:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-9-29 21:32:47 | 显示全部楼层
lyg407 发表于 2019-9-24 10:28
能连WIFI 带蓝牙,确实可玩性很高。  

VSCODE  + PIO 刚把 arduino  uno 点亮了。

ESP32也很方便,可以arduino也可以PIO,还可以官方ESPIDF。我是用着就发现中毒了,DIY不再想选其它了。现在就盼ESP32 - S2版本能早些开卖。

出0入0汤圆

 楼主| 发表于 2019-9-29 21:36:39 | 显示全部楼层
本帖最后由 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


来张成品图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-9-29 22:03:20 | 显示全部楼层
本帖最后由 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-7-20 18:55:39 | 显示全部楼层
不错不错,都是大神!!!

出100入95汤圆

发表于 2021-2-10 22:52:30 来自手机 | 显示全部楼层
楼主,手柄接收数据搞定了吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 10:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表