|
3D8S 沿用旧版 3D8 的设计,实现驱动与动画的分离。设计动画本来就是在应用层面的事情,在底层驱动上直接设计,就显得比较苦逼了。而且 3D8S 为了满足部分用户对”脱机”控制的需要,也有容量更加强大的“小卡”,方便把驱动和动画都在一片单片机上,不过这其实会对编程提出更高的要求,我在博客这边接下来会提供示例的代码。
目前的小卡,有2个版本,一种内核是ATmega8(8K),一种是ATmega328p(32K),都是基于arduino。前者只是烧写驱动和通讯协议,不含动画,需要通过外部控制器(可以是电脑、单片机系统、甚至是另一片arduino)进行动画控制;后者则是完整的 arduino 平台,结合3D8S相关类库,进行驱动和动画控制。个人建议,当然是2片小卡都有比较好。
本文介绍,8K版本上集成的串口通讯协议。
新版协议除了将波特率降低至57600以外,兼容旧版的协议。
命令头 | 参数表 | 功能 | 0xF0 | 1个字节 | 全局赋值 | 0xF1 | 2个字节 | 单束赋值 | 0xF2 | 64个字节 | 批量赋值 | 发送命令的时候,只要把头字节和后面的参数连成一串,一起通过串口发送,就能完成相应的操作。理解这三条命令,只要理解这单束赋值命令(0xF1),理解其它两条也就不难了。一条单束赋值命令,包含3个字节,如”0xf1 0×00 0x0f”,第一个字节“0xf1”是命令头,表示这条命令是单束赋值指令。第1个参数“0×00”,对应需要将第2个参数“0x0f”赋值到的那一束的序号。
关于序号的确定,就要联系到坐标系的建立。新版默认的坐标系与旧版一致,使用内侧右边最底下的那个LED作为坐标原点。而束坐标c的范围是0×00-0x3f,0-64,对应xoy平面的64束,束坐标c = 8*y+x。因为x、y的取值范围都是[0,7],所以束坐标的范围也就是[0,63]。反过来,有了束坐标c,也同样可以通过 x=c%8,y=c/8,计算出x,y的值。
而第二个赋值参数,就对应那一束内的8个LED状态。一个字节有8位,从低位到高位,对应z=0到z=7的8个LED的亮灭,其中为1,LED亮,为0,LED为灭。
从数据核心来说,其实一个8x8x8的单色光立方,其所有的数据就是一个64长的单字节数组。而动画的设计,其实就冲着数组去就好了。
而全局赋值命令(0xF0),就是把所有的束,都设置成后面跟着的那个参数。批量赋值,就是直接发送这64个字节的数据,从低到高,依次发送到每一束上就是了。
命令头 | 参数表 | 功能 | 0xf3 | 1个字节
取值范围{0×00, 0×01, 0×02, 0×03} | 数据输入模式选择,默认为0×03 | 0xf4 | 1个字节
取值范围[0x00, 0xff] | 全局亮度控制 | 0xf5 | 1个字节
第0位控制上面的4个led
第1位控制下面垫脚的4个led | 装饰LED控制 | 目前这新增的三个控制命令,旧版3D8暂时不支持。
先前提到坐标系的建立,因为发送的是数组,而数组还是有方向性的,不同的动画,使用的运算或多或少还是有所不同,但不外乎数组操作和位运算。这就导致一些动画,在某个方向来写,比其他角度来写会更简单,而好不容易把动画写出来,要让它多角度显示又成了问题。新版3D8,其实就把左边的变化也集成到协议中。这些事情,全部交给底层去操作。同时,将主要的坐标原点转移到了前方左上角的点。这个其实是更加规范的设计,毕竟大多数的屏幕的控制都选用左上角作为原点。同时旋转坐标系,包含了三种输入方式。只要在发送坐标之前,先发送一条模式命令,告知主控要按照什么样的方式进行输入,就可以更加灵活地进行控制。赋值依然通过前三条命令。
全局亮度控制命令“0xf4”,很容易理解,直接发送亮度数据,0xff时亮度最亮,0×00亮度为0,等于全灭。旧版使用电位器进行控制,调节范围也有限,现在完全使用软件实现。
装饰LED控制命令“0xf5”,很简单,配合串口命令示例程序,比划一下就好。
所有这些命令可以配合起来使用,至于怎么拆分“解码”,都交给M8的小卡就好,:)
视频讲解:
下载:
视频中提到的2款上位机程序,运行需要Microsoft .Net Framework 4 Client Profile支持,目前以放入3D8光立方技术交流群(165068863)共享。
|
|