那么就先发一张完成了的键盘作品图,手机拍照质量……就请各位不要吐槽了吧。
传送门
那么就先发一张完成了的键盘作品图,手机拍照质量……就请各位不要吐槽了吧。
传送门
其实我在14日就收到了pcb,但是由于种种个人(逗比的)原因,拖到了今天才搞完键盘。废话不多讲,先看看拆箱图吧。
胖玲的包装很给力(虽然对于暴力快递来说有点单薄),包的还严实。
pcb+元件全家福
漂亮的沉金EEPWlogo,恨不得拿牙咬一咬。
可爱的小撸logo
键帽买的4X元普通白色键帽
键轴买的老鸨家的三角Cherry红轴。外壳、卫星轴和led热插拔灯座也在老鸨家买的。
led小灯由xiudi介绍购买的
由于我买的是三角轴,必须使用定位板,所以在淘宝上买了定位板。大家买的时候一定要提醒卖家好好包装!我因为钢板折弯的问题拖延了一个周才解决。
在这里提醒大家,如果用老鸨家的那个焊锡焊键盘,最好买个三四个,免得到时候焊锡没了要像我一样东跑西跑买焊锡。
前面提到过,我是小白,这算是我这辈子活到现在第一次动手焊接,难免出错。搞砸了USB口,各种短路、掉焊盘,万般无奈我想起了我的好基友-LJB[滑稽][滑稽]。于是快递了过去让他帮帮忙,在这里也是谢谢LJB的无私帮助。
LJB还顺便帮我搞了一块keng板,果然是好基友
虽然LJB帮我完成了pcb贴片的焊接,但是键轴还是需要自己焊接。
注意在焊接大键位部分的时候,板子上的重影很有可能会影响到焊接。为了保险起见,败家King提醒大家最好在焊大键位的时候,盖上键帽比对着,免得最后因为配列问题要反复折腾。
附上一张焊接完毕的图片
键盘测试通过。
首先这是我们可爱的cherry红轴。
我们需要用镊子顶开两侧的钩角。
当两侧都顶开之后,我们就可以用手直接拿下轴盖。于是我们就看到了红轴的内部结构。
本人拍照技术是在渣,不能完美表现红轴里面的结构,就用网上搜来的gif代替一下吧。
打开了轴盖之后把轴体和弹簧清清取出,留下弹片。注意不要挤压弹片导致变形。
用镊子夹好灯座放到轴座前面预留的小孔里面。
【强迫症请自觉换楼】完成图。由于这个灯座有点小高,我是卡着装的。其实不卡着装也行,只是焊接的时候需要手扶着而已。具体问题可以咨询xiudi。
键帽的安装不用多说,照着其他键盘的配列装就可以了。但是右下角部分每个人刷的键都不一样,根据各自的键位功能装就可以了。左上角的那个键默认是ESC,所以装ESC的话能比[~]顺手一些。
贴上我的键帽安装方案给大家作为参考
那么在这里请允许我贴上 小撸 的在线键帽配色工具
地址如下http://h.0w0.pw/keyboard-color.html
为大家提供一些配色参考方案
我自己用的配色方案就是第一张。
灯控板(keng板)参考资料
关于开发概要的初稿可以去炫Q的帖子里面找。这里主要补一下炫Q漏掉的一部分。
这是关于arduino as isp的方法介绍
https://www.arduino.cc/en/Tutorial/ArduinoISP
我手里没有Nano,所以用的是uno做下载器。
这里为大家讲一下具体的连线方式
首先,拿出6根杜邦线,按照下图iscp接口定义连接。
如图所示reset连接D10
MOSI连接D11
MISO连接D12
SCK连接D13
VCC连接5V
GND接GND
连接好之后给uno先接到电脑上,打开文件>>示例>>ArduinoISP>>上传
接下来是最重要的一步。 工具>>板 选择Arduino Nano 工具>>处理器 ATmega328 工具>>端口 选择 uno所在端口 工具>>编程器 Arduino as ISP 工具 工具>>烧录引导程序
提示上传成功之后,找出来灯板代码,打开 文件>>新建 然后把代码放进去
在这里经常会有一些朋友卡在这里 烧录引导程序各种出错 那么我给出的建议就是 ①检查连线有无错误,是否正确、准确连接 ②检查灯板上面三个595芯片引脚是否正确焊接,有无虚焊漏焊。因为keng板的焊盘是银色的,很容易与焊锡混成一个色,分辨不清楚。建议大家使用放大镜认真观察 ③检查系统是否缺少一些重要文件。此问题经常出现于一些 非官方的私人ghost系统中 ④检查IDE能否正确与Arduino Uno正常通讯,因为有些时候不同版本的IDE也存在组件不全的问题。
对于使用较早版本IDE-比如说1.0-的用户,再打开这个ArduinoISP示例之后,改成需要找到 heartbeat()这一行,把其中的"delay(40);" 改成"delay(20);"
附上本人的连接图如下:
首先在未连接keng板的时候Uno上的L灯(绿灯)和ON灯(红灯)会常亮
在连接了keng板之后 ON灯依旧常亮,而L灯会熄灭,证明Uno成功连接并识别了新的Arduino设备(即keng板)。
这样就算是连接成功了。
下面附上全灯亮测试代码。
#include <SPI.h> void setup() { pinMode (8, OUTPUT); pinMode (9, OUTPUT); pinMode (10, OUTPUT); digitalWrite(8, HIGH); SPI.begin(); digitalWrite(10, LOW); SPI.transfer(0x00); SPI.transfer(0xff); SPI.transfer(0xff); digitalWrite(10, HIGH); digitalWrite(9, LOW); delay(100); } void loop() { digitalWrite(10, LOW); SPI.transfer(0xff); SPI.transfer(0x00); SPI.transfer(0x00); digitalWrite(10, HIGH); delay(50); }
其实看到025大神的帖子后半段的人大概都能了解keng板的控制原理了吧,那么我在这里附一张图来为大家讲解一下keng板。
先借用一下pengchang大蜀熟给我的keng板原理图(我也忘了作者是谁)
那么这张图就表示了三个595芯片的连接状态。先讲最基础的吧,三个595分别控制后六列LED的负极、前八列LED的负极、五行LED的正极。为什么是负极呢,这个就要去查GH60原理图了。三个595首尾相连,所以在代码里面对应的就是三条SPI.transfer放在一起,与之一一对应。
有些细心的同学如果在这个时候比对上一楼给出的全灯亮的代码就可能会疑问了:这对应关系是不是错了啊?
我很负责任的告诉大家:没错。因为这个涉及到了595级联的知识。
请允许我引用pengchang大蜀熟的形象的比喻吧:
你把数据看成一队小学生 一共3*8 24个
595看成3个可以站八个人 并且出口入口相连的房子
0x多少代表学生性别
你的clk就是命令
一个clk就进一个学生
发了8个之后 第一间房占满了8个小学生
你继续发这一队学生继续往前走 这时候第一个进去的小学生会走到第二间房子的第一个位子
以此类推 24个学生都走进来的时候 最先进来的八个人已经在第三间房子了
SPI.transfer(0x00); SPI.transfer(0xff); SPI.transfer(0xff);
为啥要这样对LED进行这样“复杂”的控制呢?估计有些大神看到这里要笑了,那你们就先跳过去,这一段给我们这样的无脑小白讲一讲吧。
先来一张表示LED灯阵控制大体原理的图片
(图片转自百度文库)
这是讲解了LED灯阵的控制原理。我们可以把Nano 328芯片理解为控制芯片,是控制者;而那三块595就是执行者,控制行列的通断电。
有些小白朋友可能会感到奇怪,为毛要用0x00 这样奇怪的字符来控制595的输出呢?如果你真想到这里请先打自己屁股!!快去前面看原理图。每个595有8个引脚(第九个是作为通讯的),每个引脚的输出高低电平用0 1表示。0表示低电平,1表示高电平。所以595的输出情况就可以用8位二进制数字表示了。(比如00011000)
为什么要用16进制的数字来替换呢?我也不知道,但是至少两位的16进制数字可以表示8位二级制数字。
这样就好理解关于这些SPI代码的意义了吧。
这里送出来自己瞎写的双排流水灯代码:
#include <SPI.h> void setup() { pinMode (8, OUTPUT); pinMode (9, OUTPUT); pinMode (10, OUTPUT); digitalWrite(8, HIGH); SPI.begin(); digitalWrite(10, LOW); SPI.transfer(0x00); SPI.transfer(0xff); SPI.transfer(0xff); digitalWrite(10, HIGH); digitalWrite(9, LOW); delay(100); } void loop() { int i; for(i=1;i<256;i*=2) { digitalWrite(10, LOW); SPI.transfer(0xff); SPI.transfer((byte)(0xff-i)); SPI.transfer((byte)(0xff-i)); digitalWrite(10, HIGH); delay(50); } }
在这里感谢一下pengchang大蜀熟帮助我来理解代码
Arduino平台分析wlbxcj大神的i2c固件
为了实现按键联动,为了实现多种等效的切换,为了不外加开关,需要我们来研究研究i2c协议。
在这里讲一句,因为我参加了JB板的内测活动,而我又负责软件框架的搭建,同时为了减少麻烦,建议大家最好能统一一下键盘固件,即使用025大神最新发布的i2c键盘固件作为基础。
因为据分析不同版本的i2c固件发送出来的数据不一样,我并不能保证我写出来的框架能完美兼容不同版本的键盘固件。
=============接线分析===============
先发一个键盘的扩展接口定义
如图四个GPIO即为键盘用于和外接灯控板进行i2c通讯的接口,但是实际上只用到了两个:GPIO0和GPIO3
那么怎么连线呢?
在这里用到了uno的SDA SCL
根据arduino官方给出的定义来解读 GPIO0接SDA GPIO3接SCL
在这里附一张uno的引脚图(引用自极客工坊)
到这里,接线分析完成
《《《《【注意】》》》》 如果使用的uno和键盘没有接在同一个hub上面 最好把P4上面的GND印出来一块接到uno上面,防止数据不共地造成误差以及一些我暂时还不懂的错误[可爱]
==============刷写新固件===============
既然要对i2c做研究,没有i2c固件怎么行。于是费劲潜心万苦终于找到了025大神的最新版的i2c键盘固件
掏出来键盘,准备好固件
把固件拖到toolkit里面的refresh中去
输入Y 回车
出现如图提示时按下键盘北面的reset复位键(最好按下一秒钟左右,直到系统发出提示音)
然后等待固件烧录
到这里,固件就算烧好了
==============接线实拍================
接线分析好了,固件也刷好了,那么开始i2c的测试吧
掏出来我的uno 几根杜邦线
然后接好线
首先刷入示例中的reciever:文件》》示例》》Wire》》slave-reciever
打开Arduino串口监视器来分析数据
净是些乱七八糟的数据,怎么才能让他变成正常的二进制数字或者十六进制数字呢?
这就需要修改一下我们的reciever了
在这里需要感谢炫Q的帮助
#include void setup() { Wire.begin(8); Wire.onReceive(receiveEvent); Serial.begin(9600); } void loop() { delay(100); } void receiveEvent(int howMany) { while (1 < Wire.available()) { int c = Wire.read(); Serial.print(" a="); Serial.print(c); } int x = Wire.read(); Serial.print(" b="); Serial.println(x); }
把修改后的重新刷入 再来看我们的串口监视器读取到的数据
瞬间舒服了好多好多
==========继续乱按键,寻找规律=========
由于考虑到灯效切换问题,需要一些特殊键位的数据,所以测试了一下Fn+G和Fn+H的键位数据
但是结果如下
注:第一行为Fn数据
明显发现了Fn+H的数据字节短了一块,为啥。于是咨询了025大神原因,答复如下:
整一包的数据长度不定,但由LEN可知后面数据有多长
虽然看不大懂,但算是问出了原因,等和大家一起讨论帮我这小白理解理解吧。
有奖活动 | |
---|---|
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
【有奖活动】智能可穿戴设备AR/VR如何引领科技新潮流! | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! |
打赏帖 | |
---|---|
如何实现基于NXPiMX.RT1021的BH1730采集被打赏50分 | |
【换取手持数字示波器】AHT10温度检测分享被打赏40分 | |
【换取手持数字示波器】ACM32F070开发板点亮LCD屏和触控按键,串口,ADC被打赏40分 | |
【换取手持数字示波器】ACM32F070LCD屏和触控按键功驱动蜂鸣器分享被打赏40分 | |
【换取手持数字示波器】国民技术PWM功能知识分享被打赏40分 | |
【换取手持数字示波器】放大器运放知识分享被打赏40分 | |
【分享评测,赢取加热台】+开关电源AC输入知识分享被打赏30分 | |
【换取手持数字示波器】N32G430点亮数码管与串口打印、ADC被打赏40分 | |
老胖子聊电路--分析一个反馈电路被打赏50分 | |
【换取手持数字示波器】+点亮WS2812RGB灯被打赏50分 |