数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2180|回复: 14

[外设] 苹果妙控A1314-Pro-Plus键盘

[复制链接]
发表于 2024-7-4 12:00:02 | 显示全部楼层 |阅读模式
本帖最后由 飞向狙沙 于 2024-7-4 12:54 编辑


工程地址:妙控A1314-pro-plus三模键盘 - 嘉立创EDA开源硬件平台 (oshwhub.com)

一块苹果键盘,AA电池供电,蓝牙连接,手感一般,颜值尚可,除了还算便携没啥优点,但是看到这个PCB就想拿来DIY,正好之前看了沁恒的三模键盘方案,拿来改改测试用
网络图片




原装主板,中间位置是蓝牙天线,改装有点难度,因为整体是铝合金外壳,只有个小窗口能透信号,FPC座还不能挪动,新加的USB口位置有限,天线只能挤在旁边,大概率会影响信号,好在自己测试用,只要能调通,近距离链接即可


尝试放置USB母座,位置几乎没有可选择的余地

成品板





接收器,外壳之前路上捡的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 2家元 +60 收起 理由
jf201006 + 30 原創內容
wgm468 + 30

查看全部打赏

发表于 2024-7-5 13:52:48 来自手机浏览器 | 显示全部楼层
厉害了大佬
回复 支持 反对

使用道具 举报

发表于 2024-7-4 21:40:39 | 显示全部楼层
控制还可以
回复 支持 反对

使用道具 举报

发表于 2024-7-4 20:10:15 | 显示全部楼层
panmouse 发表于 2024-7-4 12:54
这键盘是给平板电脑用的吧,个人觉得如果不是专门从事文本处理工作的话,这一类外设的使用率不是很高
...

这是电脑用的
回复 支持 反对

使用道具 举报

发表于 2024-7-4 16:37:51 | 显示全部楼层
高手,家里还有两块吃灰
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-4 15:06:07 | 显示全部楼层

其实还好,硬件方面比较简单,就是被USB母座坑了两次,耗了些时间,软件方面官方demo算比较完整了,三模相关一点代码不用写,就改改按键扫描就行了
回复 支持 反对

使用道具 举报

发表于 2024-7-4 14:38:51 | 显示全部楼层
工程量不小
回复 支持 反对

使用道具 举报

发表于 2024-7-4 14:28:37 | 显示全部楼层
技术达不到,没玩过
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-4 12:56:01 | 显示全部楼层
wgm468 发表于 2024-7-4 12:49
成色好的功能齐全的我是不舍得动手的,怕整遭了

原来的PCB还在,也是考虑整不好能还原PFC座都是买的,没搬板,还能还原回去
回复 支持 反对

使用道具 举报

发表于 2024-7-4 12:54:49 | 显示全部楼层
这键盘是给平板电脑用的吧,个人觉得如果不是专门从事文本处理工作的话,这一类外设的使用率不是很高
回复 支持 反对

使用道具 举报

发表于 2024-7-4 12:49:32 | 显示全部楼层
成色好的功能齐全的我是不舍得动手的,怕整遭了
回复 支持 反对

使用道具 举报

发表于 2024-7-4 12:38:27 | 显示全部楼层
小键盘看起来也不错
回复 支持 反对

使用道具 举报

发表于 2024-7-4 12:01:22 来自手机浏览器 | 显示全部楼层
这个键盘得几百块吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-4 12:01:11 | 显示全部楼层
本帖最后由 飞向狙沙 于 2024-7-4 12:56 编辑

二楼软件介绍
因为按键走线黑箱,需要检测键位,碳膜排线扛不住来回测,直接代码测试,把以前写的扫描按键代码搬过来

  1. void keyPositionScan(void) {

  2.     GPIO* keys[ROW_NUM + COL_NUM];
  3.     uint8_t i, j, idx = ROW_NUM + COL_NUM;
  4.     //合并行列集合,方便遍历
  5.     for (i = 0; i < idx; i++)
  6.     {
  7.         keys[i] = i < ROW_NUM ? rowPins[i] : colPins[i - ROW_NUM];
  8.         //全部初始化成推挽输出,高电平(应该设置为开漏,CH582不支持)
  9.         GPIO_SetBits(keys[i]);
  10.         GPIO_ModeCfg(keys[i],GPIO_ModeOut_PP_5mA);
  11.     }

  12.     while (1)
  13.     {
  14.         for (i = 0; i < idx; i++)
  15.         {
  16.             //i切换为上拉输入
  17.             GPIO_ModeCfg(keys[i],GPIO_ModeIN_PU);
  18.             for (j = 0; j < idx; j++)
  19.             {
  20.                 if (i != j)
  21.                 {
  22.                     //拉低j,检查i电平,为低表示i:j按键按下
  23.                     GPIO_ResetBits(keys[j]);
  24. //                       mDelaymS(1);
  25.                     if (GPIO_ReadPortPin(keys[i])==0)
  26.                     {
  27.                         //切换i:j状态,再次检查电平状态,j也为低表示无无冲二极管,j为高表示有无冲二极管,方向i正 j负
  28.                         GPIO_SetBits(keys[j]);
  29.                         GPIO_ModeCfg(keys[i],GPIO_ModeOut_PP_5mA);
  30.                         GPIO_ModeCfg(keys[j],GPIO_ModeIN_PU);
  31.                         GPIO_ResetBits(keys[i]);
  32. //                           mDelaymS(1);
  33.                         //j也为低表示无二极管
  34.                         if (GPIO_ReadPortPin(keys[j])==0)
  35.                         {
  36.                             LOG_INFO("press P%c%d--P%c%d\r\n", keys[i]->port==0?'A':'B', getPinNum(keys[i]->pin), keys[j]->port==0?'A':'B', getPinNum(keys[j]->pin));
  37.                         }
  38.                         else
  39.                         {
  40.                             LOG_INFO("press P%c%d->P%c%d\r\n", keys[i]->port==0?'A':'B', getPinNum(keys[i]->pin), keys[j]->port==0?'A':'B', getPinNum(keys[j]->pin));
  41.                         }
  42.                         GPIO_SetBits(keys[i]);

  43.                         GPIO_ModeCfg(keys[i],GPIO_ModeIN_PU);
  44.                         GPIO_ModeCfg(keys[j],GPIO_ModeOut_PP_5mA);
  45.                     }
  46.                     GPIO_SetBits(keys[j]);
  47.                 }
  48.             }

  49.             GPIO_ModeCfg(keys[i],GPIO_ModeOut_PP_5mA);
  50.         }
  51.     }
  52. }

复制代码
扫描整理出来的键位

按照扫描出来的键位整理出来的键位数组

官方demo的键位数组,用起来掉头发

按键扫描逻辑:
按键以行列矩阵排列,所有行设置为上拉输入,列设置为推挽输出(开漏输出最好,CH583M不支持),全部列拉高,然后拉低一列,检查所有行有低电平的就表示有对应键按下,检测完一列再拉高,继续拉低下一列重新检测所有行
  1.   
  2.     for (uint8_t i = 0; i < COL_NUM; i++) {
  3.         GPIO_ResetBits(colPins[i]);
  4.         __nop();
  5.         __nop();
  6.         //由于上拉输入拉低需要一定的时间,所以必须延时一段时间再读IO
  7.         for (uint8_t j = 0; j < ROW_NUM; j++) {
  8.             if (GPIO_ReadPortPin(rowPins[j]) == 0) {
  9.                 firstbuf[KeyNum++] = (COL_NUM + 1) * j + i + 1;
  10. //                LOG_INFO("key press:R%d,C%d,val:%x",j,i,key8_table[firstbuf[KeyNum-1]]);
  11.             }
  12.         }
  13.         GPIO_SetBits(colPins[i]);
复制代码
去抖、回报率、USB报文等demo了都完成了,懒得研究了,而且之前跟官方要的demo版本比较老,研究了些源码,改完USB正常蓝牙、2.4G通信异常,联系官方说可能因为代码问题,给了新版本代码,结果结构大改,不好直接替换库,就把整体代码重新移植到新demo,费了不少事,新版demo的源码也懒得研究了

Fn组合键设定
  1. <blockquote>static const uint8_t special_key_map[SPECIAL_KEY_NUM] = {
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-4 12:00:49 | 显示全部楼层
本帖最后由 飞向狙沙 于 2024-7-4 12:32 编辑

一楼硬件介绍

硬件按照官方demo改的,增加了AA电池充电电路,按键扫描IO有调整,这里不得不提官方demo代码写的没怎么考虑可移植性,按键扫描直接硬搞,换个IO就得大改

加了RGB指示灯,但是因为AA电池供电,计划最低工作电压2V甚至1.8V,大部分LED这个电压下都点不亮了,而且也没想好有什么好指示的,所以还是使用原装LED,工作压降1.86V,实际代码里也没用到LED,后续考虑加些电量指示和大小写的灯效

电源键本来想利用上,作为关机键和下载键,暂时有点问题,弃用

单片机选择:CH583M,不可用582,因为583的最低工作电压能到1.8V,582太高了,这里不得不说单片机的价格太不稳定了,买的时候4块多,前两天想再买一片测试用,淘宝一开七八块了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 1家元 +30 收起 理由
海上生明月丶 + 30 優秀文章

查看全部打赏

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-20 21:40 , Processed in 0.265200 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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