Lotlab / nrf51822-keyboard

a simple G84-4100 ble keyboard with nrf51822. For nrf52, see nrf52-keyboard.
Other
101 stars 50 forks source link

询问电量检测的问题 #6

Closed genokolar closed 5 years ago

genokolar commented 5 years ago

我的PCB已经打板回来了,昨天焊接测试(只焊接了蓝牙部分,锂电池充电也暂时没焊接),调整后没有什么问题了。

我想问问,因为我用的其他的蓝牙模块,不是NRF51822-02这个主控。连接到电脑后,能显示电量为98%,但是从昨天中午待机到现在,电量显示还是98%,接其他我未提前充满电的电池的话,会显示为35%。

我想问下:这个方案的蓝牙待机时间能达到多长时间?感觉如果电量显示没有错,那待机也太强悍了(我现在用的1350mah/6Wh的手机锂电池)

jim-kirisame commented 5 years ago

不用的时候自动休眠,电流在几uA;如果一直使用的话,我记得综合耗电量是小于1mA的(具体数值不太记得),也就是大概能用几个月这样?

genokolar commented 5 years ago

那挺强悍的,今天试用来看,感觉慢速扫描时间,休眠时间什么的还要调整。损失部分电量消耗,保证连接的持续性很必要。我先测着,有问题再请教。

jim-kirisame commented 5 years ago

是,这些调整到你喜欢的大小比较好。毕竟性能和省电两个确实比较难平衡

genokolar commented 5 years ago

JIM大佬是已经自己做了一个lot60-ble吗? 感觉蓝牙连接不够稳定。有时候稍微一会儿不输入后(强调一下是有时候,不是每次,肯定不到休眠的10分钟,有时候是仅仅进入慢速扫描模式)按键很多次都无法输入,直到起码3秒后才重新恢复输入模式。 我看你的慢速扫描间隔也仅仅是100ms,不应该这么慢(按键那么多次)才恢复正常输入啊。

代码中也没有发现异常的地方。

jim-kirisame commented 5 years ago

嗯,我在4100的时候很明显能感觉到,但是自己做的60就延迟很低(不到1s)。之前判断可能是debonce和扫描间隔冲突的问题,建议将debonce或者是慢速扫描的间隔调低点。

还有可能就是蓝牙连接的问题,这个你看看调整SLAVE_LATENCY 等相关参数会不会好一点。

之后有可能的话我看看要怎么优化一下这部分的问题。

jim-kirisame commented 5 years ago

话说你那里的表现是怎么样的? 是几秒内无法输入然后一瞬间出现很多个,还是就单纯无法输入,一旦可以输入后就恢复正常?


我提交了一个补丁尝试缓解后面那种情况,你看看能不能起作用

genokolar commented 5 years ago

单纯无法输入,一旦可以输入后就恢复正常,前面输入的并不会出现,所以应该不是延迟问题。

genokolar commented 5 years ago

我提交了一个补丁尝试缓解后面那种情况,你看看能不能起作用

测试了下。这个补丁应该有效。我明天再测试一下,没问题就在你的提交上点验证

自己做的60就延迟很低(不到1s)。之前判断可能是debonce和扫描间隔冲突的问题,建议将debonce或者是慢速扫描的间隔调低点。

感觉就是这个冲突问题。因为基本都是进入慢速模式后(也就是短短的15秒不输入以后),就出现了按键好一会儿无反应。


继续提问题,感觉一检测到蓝牙离线就进入休眠模式,这种设定不太好吧。我感觉我连接了电脑,然后带着键盘离开电脑一会儿,走回来不会自动连接。建议可以进入休眠模式后还是运行几分钟等待重连更好。

https://github.com/Lotlab/nrf51822-keyboard/blob/8bdf2ac6661b853c6f163c0c1cb6e362c99a7039/main/ble/main.c#L208

我按击power-sleep键后,直接进入休眠模式,然后马上就退出休眠了。这个和开启了keyboard debug有关系吗?

jim-kirisame commented 5 years ago

感觉一检测到蓝牙离线就进入休眠模式,这种设定不太好吧

这是为了省电做的,不过确实体验不太好,需要做一些优化。

这个和开启了keyboard debug有关系吗?

是的,开启这个DEBUG后就不会检测开机按键,而是直接开机了

jim-kirisame commented 5 years ago

https://github.com/Lotlab/nrf51822-keyboard/blob/8bdf2ac6661b853c6f163c0c1cb6e362c99a7039/main/ble/ble_services.c#L352

这一行的最初用意是在广播无法找到设备时进入休眠状态(即ADV_FAST -> ADV_SLOW -> ADV_IDLE -> 休眠),可能造成了断开连接后就进入休眠模式。

genokolar commented 5 years ago

nrf51822-keyboard/main/ble/ble_services.c

Line 352 in 8bdf2ac

sleep_mode_enter(true); 这一行的最初用意是在广播无法找到设备时进入休眠状态(即ADV_FAST -> ADV_SLOW -> ADV_IDLE -> 休眠),可能造成了断开连接后就进入休眠模式。

嗯。引用错代码位置了。我指的就是这里。

建议可以做一个单独的计时,比如离线后并不休眠,而是开始重连计时(3到5分钟,可以自行在config设定),这个时候按键是不会重置计时的,计时完成期间没有重连(或者连接其他设备)然后才进入休眠模式。


今早遇到新问题,键盘配列错乱了。昨晚睡前好好的。今早起来就发现配列错乱了。就是按3输出5,按D输出F这种。以前qmk重新刷机也容易出现,但是很少(我基本没有遇到)刷完后无故出现配列错乱。


那么开启了Debug,实际键盘就无法进入休眠?

jim-kirisame commented 5 years ago

建议可以做一个单独的计时,比如离线后并不休眠,而是开始重连计时(3到5分钟,可以自行在config设定),这个时候按键是不会重置计时的,计时完成期间没有重连(或者连接其他设备)然后才进入休眠模式。

我会考虑看看怎么弄的

键盘配列错乱了

有可能是存储键盘配列区域出现了某些问题?这个没怎么出现过所以不太清楚。不过看你的描述更像是……IO口指定出现了问题?

那么开启了Debug,实际键盘就无法进入休眠?

对。本来这个功能就是方便调试,不用每次调试的时候都得按开机键去开机。

genokolar commented 5 years ago

对。本来这个功能就是方便调试,不用每次调试的时候都得按开机键去开机。

通过代码看和实测看,开启debug不影响自动休眠的,仅仅影响了休眠按钮进入睡眠(也并不是无法进入,实际是进入睡眠,马上又退出),从代码看,应该是按休眠键进入休眠,由于同时出现了按键行为,所以这里检测到了按键行为,所以先休眠,马上又唤醒。不知道分析的对不对

https://github.com/Lotlab/nrf51822-keyboard/blob/8bdf2ac6661b853c6f163c0c1cb6e362c99a7039/main/ble/main.c#L324

https://github.com/Lotlab/nrf51822-keyboard/blob/8bdf2ac6661b853c6f163c0c1cb6e362c99a7039/main/keyboard/matrix.c#L187

实际我倒是觉得开启debug的模式更好,开机直接启动蓝牙。休眠主要交给自动休眠,没必要手动休眠,当然有手动休眠更好,因为现在没有硬件电源按钮(我当时准备加一个在60壳子底部开孔位置的,但是没找到合适的按钮)。

不开启debug有问题就是,自动休眠后重新唤醒很麻烦。

jim-kirisame commented 5 years ago

开启了之后是完全无法休眠的。具体启动/休眠流程是:

任意按键按下->唤醒设备->检测开机键是否按下->没有按下则再次进入休眠状态/按下后进入正常启动流程

开启debug后,即跳过了检测开机键按下的过程,直接正常启动。使得按下任何一个键就会解除休眠。如果是使用按键进入休眠的话,就会造成按下后没有放开那段时间差导致再次唤醒设备,无法正常休眠。

genokolar commented 5 years ago

那休眠重新唤醒必须按开机键的设定实在不方便。

问题一:那开启debug到底自动休眠能否进入?我实测是10分钟后,蓝牙连接是和电脑断开的了。按任意键即可唤醒 问题二:锂电池充电部分,我仔细看了TP4057的数据手册:TP4057的正常充电电流大约200ma是吧(PROG脚接的4.7K),如果电池充电后电压达到4.1V(比4.2V低100mv),也就是大约95%电流的时候就停止充电,我理解有错吗? 问题三:CH554的USB部分怎么编译?采用keli c51编译的话,缺正常stdbool.h这些头文件,指定了ARMCC的头文件也还是要报错。看起来也不想是SDCC编译的。


今晚上用蓝牙键盘玩了局LOL,没有任何问题。但是游戏刚刚要结束,键盘就出问题了。现在蓝牙根本连接不上了(搜索不到键盘的蓝牙了),重新擦除芯片烧录协议栈、APP问题依旧。

现在可以了,怀疑是蓝牙适配器的锅。。。因为最终我拔插了蓝牙适配器就好了。真是什么古怪问题我都遇到了。

jim-kirisame commented 5 years ago
genokolar commented 5 years ago

又有两问题要咨询一下JIM大佬:

问题一:我CH554的固件编译完成了,但是windows10下连接usb提示无驱动,无法用WCHISPTool烧写固件。我安装了WCHISPTool,也通过先断电,然后短接K1,再插入USB线。驱动问题怎么处理?

问题二:配例下载工具我是编译好了,我比较好奇配例的hex文件怎么生成,通过tkg生成吗?

jim-kirisame commented 5 years ago
 keyboard/config/gh60-ble.json | 14 ++++++++++++++
 keyboard/list.json            |  4 ++++
 2 files changed, 18 insertions(+)
 create mode 100644 keyboard/config/gh60-ble.json

diff --git a/keyboard/config/gh60-ble.json b/keyboard/config/gh60-ble.json
new file mode 100644
index 0000000..e5beb24
--- /dev/null
+++ b/keyboard/config/gh60-ble.json
@@ -0,0 +1,14 @@
+{
+   "name": "Lot60-BLE (RevA)",
+   "description": "Bluetooth 60% keyboard made by Lotlab",
+   "led_count": 0,
+   "action_functions": [{
+       "name": "Power Off",
+       "description": "使键盘进入睡眠状态",
+       "opt": []
+   },{
+       "name": "Switch USB",
+       "description": "USB/蓝牙模式切换",
+       "opt": []
+   }]
+}
\ No newline at end of file
diff --git a/keyboard/list.json b/keyboard/list.json
index dd3d779..7d49062 100644
--- a/keyboard/list.json
+++ b/keyboard/list.json
@@ -2,6 +2,10 @@
    "name": "GH60 (RevA/B/C)",
    "size": 60,
    "group": "third-party"
+},{
+   "name": "GH60 (BLE)",
+   "size": 60,
+   "group": "third-party"
 },{
    "name": "GH60 (RevCHN)",
    "size": 60,
genokolar commented 5 years ago
  • 关于休眠和切换的两个按键功能的添加可以参考下面的这个patch

你这是自己建立tkg?我就问问,我不一定会用这个更新配例。我现在配例是自己用惯的配例。二合一了方向键,相当于65键的键盘。

https://github.com/genokolar/nrf51822-keyboard/blob/2637b19a4f98b70dd3be84dd44012a9ec3ff4bc1/main/keyboard/keymap_plain.c#L42

我看到说明说WCHISPTool自动安装驱动,大佬是什么系统下烧写的CH552? 我害怕是WIN10系统下无法安装驱动

jim-kirisame commented 5 years ago

我用的是win10,你看看烧写软件目录里面的驱动有没有装

genokolar commented 5 years ago

嗯。应该是你的PCB的原理图有问题:CH552的P3.6脚接到D-脚上了,应该是D+。你的PCB倒是没问题,我也没有发现这个问题,现在要解决只有飞线。暂时用着蓝牙吧。

jim-kirisame commented 5 years ago

我看了下我原理图没问题啊,P3.6接UD_P接D+。是不是你在导入的时候原理图库的版本出错了?

genokolar commented 5 years ago

应该不是吧。我看你的原理图是这样的: https://genokolar.github.io/img/BUG.jpg

靠近VCC的应该是D-

我飞线再试一下

jim-kirisame commented 5 years ago

default 太惨……官方库的排列是反的

genokolar commented 5 years ago

飞线大法解决了。。。不过打了5块板子,收到6块,其他可能就只能作废了。

新问题是:是不是不关闭DEBUG,插入USB后蓝牙依然处于开启状态?

jim-kirisame commented 5 years ago

是。无论是否关闭DEBUG,蓝牙都会一直保持连接

genokolar commented 5 years ago

那蓝牙和USB的协作,还有蓝牙键盘休眠后的唤醒机制上感觉还需要改进。个人认为理想状态是: 1、蓝牙通电自动开机,休眠后按任意键唤醒;如果是软按键休眠,那就需要按(space+u)开机;当然,现在的每次都通过space+u也不是不行,就是感觉不够方便。 2、蓝牙和USB的协作应该是:USB插入后优先使用USB,蓝牙键盘主动断开蓝牙;USB断开后蓝牙部分自动开启蓝牙连接。

jim-kirisame commented 5 years ago

现在USB部分的逻辑就是你说的那样,插入USB后就自动切换到USB,断开后切回蓝牙。只不过为了保证两边切换的时候能够平滑,默认没有断开蓝牙而已,实际上是不会往蓝牙那边发送数据的。

genokolar commented 5 years ago

现在USB部分的逻辑就是你说的那样,插入USB后就自动切换到USB,断开后切回蓝牙。只不过为了保证两边切换的时候能够平滑,默认没有断开蓝牙而已,实际上是不会往蓝牙那边发送数据的。

那开着就开着吧。反正无所谓。。我再研究下蓝牙休眠唤醒,看能不能通过检测power_sleep的状态来决定休眠唤醒后是直接任意键可以唤醒、还是需要power_sleep来唤醒。(比如写入eeprom)

jim-kirisame commented 5 years ago

也可以。我的建议还是保留开机按键唤醒防止误触,然后把自动休眠(准确来说应该叫做关机)的时间调大一些。

genokolar commented 5 years ago

有开机按键啊。 1、正常接上电池、或者开启硬件电源开关。通电后检测power按键开关状态,一般是ON(true)。所以直接开机。 2、正常使用离开后,蓝牙过了十分钟左右自动关机,这时候power的按键开关状态还是ON。归来后直接任意键就可以唤醒开始输入。(这种状态更方便,不用刻意去先按唤醒) 3、如果是自己按power按键关机,这时候power按键开关状态更改为OFF(false)。任意键无法直接唤醒,需要按(space+u)才能开机,同时将power按键开关状态更改为ON。

这样应该比当前的更好,代码上也应该能实现。我回头折腾下,先休息一下,最近连续搞,有点累。

jim-kirisame commented 5 years ago

这个方案有个非常明显的问题,当你很久不用这个键盘并自动休眠后,按任意键也是会唤醒的。我个人还是希望在长时间不用后就转入自动关机,防止误触发造成困扰。

genokolar commented 5 years ago

这个方案有个非常明显的问题,当你很久不用这个键盘并自动休眠后,按任意键也是会唤醒的。我个人还是希望在长时间不用后就转入自动关机,防止误触发造成困扰。

正常情况一般不存在误触发吧,如果你去按键盘基本上都是想要使用。如果要携带外出可以采用power键休眠就好了。如果是上面说的方式,那么自动休眠进入的时间可以设置的短一点。就算误触发也还是会短时间内自动进入休眠。(上面的方案是参考我的蓝牙鼠标来说的,鼠标没办法有软power键)

其实根本问题是我的电池比较大,我不太在意稍微多一点点耗电。JIM大佬你的电池比较小。:)

当然也可以通过配置项自由进行选择。有没有即时通讯方式,这样沟通比较麻烦。

jim-kirisame commented 5 years ago

联系方式我发你邮箱了 :)