这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【纯水小白玩键盘】KingCloud的GH60进程(staryu简单教程+震撼发

共88条 2/9 1 2 3 4 5 6 ›| 跳转至
助工
2015-10-10 22:36:12     打赏
11楼
配合代码详解keng板

其实看到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大蜀熟帮助我来理解代码





助工
2015-10-10 22:36:35     打赏
12楼

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大神原因,答复如下:


7E  LEN  CMD  DATA[0...LEN-1] CHECK 7E

LEN 为CMD 和DATA的总长度


整一包的数据长度不定,但由LEN可知后面数据有多长


虽然看不大懂,但算是问出了原因,等和大家一起讨论帮我这小白理解理解吧。





助工
2015-10-10 22:37:06     打赏
13楼

【JB板软件框架总思路】

既然参加JB板众筹活动,负责软件框架,那么还是把我的大题思路发一下吧。

①声明头文件;

声明数组,包括markbuilding要求的 键盘音乐频谱显示、kai大的呼吸灯数组、波浪灯效(数字雨)数组 等

②定义LM变量(LightMode)使328读取到切换键组1时--,读取到切换键组2时++

③复合判断LM的值 1则循环一号灯效 2则循环二号灯效……

④当LM=33, LM=1

当 LM=0 ,LM=32

让灯效循环起来


响应炫Q要求 来个涂鸦


这段时间来找我要灯效的小伙伴很多啊,我群太多了也可能来不及回,欢迎大家加入到写灯效的团队来,欢迎大家找我们亲爱的LJB同学预定JB板,一起玩键盘,一起玩灯效!


末尾放一个毒,来个移植版的kai大 呼吸龟速版灯效



#include 

void setup() {
  pinMode (8, OUTPUT);
  pinMode (9, OUTPUT);
  pinMode (10, OUTPUT);
  digitalWrite(8, HIGH);
  SPI.begin();
  digitalWrite(10, LOW);
  SPI.transfer(0xff); 
  SPI.transfer(0x00); 
  SPI.transfer(0x00); 
  digitalWrite(10, HIGH);
  digitalWrite(9, LOW);
  delay(100);
}

int breathing_table[128] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 29, 30, 32, 34, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 56, 58, 61, 63, 66, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98, 102, 105, 108, 112, 116, 119, 123, 126, 130, 134, 138, 142, 145, 149, 153, 157, 161, 165, 169, 173, 176, 180, 184, 188, 192, 195, 199, 203, 206, 210, 213, 216, 219, 223, 226, 228, 231, 234, 236, 239, 241, 243, 245, 247, 248, 250, 251, 252, 253, 254, 255, 255, 255
};

void loop(){
  for(int i=0;i<256;i++) { if(i<128) analogWrite(9, 0xff-breathing_table[i]); else analogWrite(9, 0xff-breathing_table[255-i]); delay(20); } }




助工
2015-10-10 22:37:18     打赏
14楼

默认八种灯效的移植

首先谢谢炫Q对我的支持,写出来一个大体的框架交给我学习。

不过我觉得对于灯效这种东西来说,面对对象的编程、会不会更方便单独一个灯效的替换呢?

结尾不多说,放一个好东西吧[滑稽]:JB板、keng板都能兼容的默认灯效移植的代码(加入了炫Q的点谁谁亮的小程序)

——回复可见内容——


工程师
2015-10-24 01:05:05     打赏
15楼
我来看大水怪~

菜鸟
2015-10-24 15:30:16     打赏
16楼
楼主Holly high

专家
2015-10-24 20:54:08     打赏
17楼
不是初中生嘛,后生可畏啊,牛

菜鸟
2015-10-28 10:43:47     打赏
18楼
Holly high

菜鸟
2015-11-02 22:15:49     打赏
19楼
学习了

专家
2015-11-03 09:37:49     打赏
20楼
写得很细致,加油!

共88条 2/9 1 2 3 4 5 6 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]