应援棒与遥控设备
演唱会的应援棒可以分区遥控开关变色。淘宝和阿里巴巴上有不少在售,具体可以参考这些商品的介绍。
遥控器可以通过上面的按键控制发射无线控制信号,不同分区的应援棒接收信号变换各自的灯光,从而实现分区场控(废话)。有的遥控器上还有DMX512接口。
这些设备的控制大概率通用(都是深圳几家厂产的)。控制信号有433.92MHz和2.4GHz两种频率,前者更常见,本文介绍的也是这种。
信号捕捉
我用的是HackRF One(硬件)+Universal Radio Hacker(软件)录制遥控器信号,反正随便什么SDR都行。
最简单的OOK(On-off keying)信号,频率433.92MHz,波特率3936(即每个信号持续254μs,实际录下来的是这么多,不确定是不是应该是4000)。
Universal Radio Hacker会自动识别为ASK,然后解析出对应的二进制串。
总体来说,是在用牛刀杀鸡。
信号分析
以“所有分区都长亮白光”为例,OOK信号解析后的二进制串为:
11111111000011110010010010010010010010010011011011011011011011011011011011011011011011011011011011011011011011011010010010010010010010011010010010010010011010010011010010011011010010010
标了颜色之后特征就很明显了,最前面蓝色的17个bit固定,然后每两个绿色的bit(01)后面接一个红色的bit。这些红色的bit是实际有意义的数据,我们把它们分离出来(实际上述信号会重复数次防止干扰,重复之间有间隔,所以最后面应该加几个0,这里就忽略了)。
00000000 11111111 11111111 11111111 00000001 00000100 10011000
总共56个bit,分成7组,每组8个bit。
最前面紫色一组表示功能,其数值决定了后面有多少组,每组的定义是什么,在后面“编码规则”一节详细讨论。
最后面橙色一组是checksum,其数值等于前面n组(这里n=6)都加起来再加10010110,取末尾的8个bit。
比如这里 00000000 + 11111111 + 11111111 + 11111111 + 00000001 + 00000100 + 10010110 = 1110011000
一些常量
介绍编码的规则之前先做一点准备工作。应援棒在不接收新的信号的情况下,会保持一种固定的颜色和固定的闪烁状态。这些颜色和闪烁状态用以下数字表示:
颜色:
0(0000): 红色 1(0001): 绿色
2(0010): 蓝色 3(0011): 粉色
4(0100): 白色 5(0101): 黄色
6(0110): 浅蓝 7(0111): 浅绿
8(1000): 紫色 9(1001): 橙色
10(1010): 浅粉 11(1011): 没那么浅的蓝
12(1100): 浅黄 13(1101): 没那么浅的绿
14(1110): 浅红 15(1111): 更亮的白色
名字乱写的,屏幕上的颜色更是乱选的,请以实物为准。
总共16种颜色,括号内的是二进制数,此外还有特殊的(10101010),表示颜色不变。
闪烁状态:
0(0000): 长暗(不亮) 1(0001): 常亮
2(0010): 慢速闪烁 3(0011): 中速闪烁
4(0100): 快速闪烁
5(0101): Fade in 6(0110): Fade out
11(1011): 闪烁状态不变
注意这个Fade in和Fade out比较坑爹,必须要Fade in点亮的才能Fade out熄灭,猜测做出来就是为了实现呼吸灯的效果,所以总是成对出现,就没考虑单独使用的场景。
编码规则
“信号分析”一节提到,编码的前8个bit定义了后面内容的具体含义,依此进行分类:
指定分区变更(00000000)
指定的分区的应援棒变更为指定的颜色和指定的闪烁状态,应该是最常用的一种类型。
还是上面“所有分区常亮白光”的例子:
00000000 11111111 11111111 11111111 00000001 00000100 10011000
最前和最后的8个bit已经有了明确的定义,剩下中间的5组。
11111111 11111111 11111111 00000001 00000100
最后一组是颜色,倒数第二组是闪烁状态。如上一节所示,00000100代表白色,00000001代表常亮。
前面的两组代表分区的选择,各个比特对应的分区依次为:
HGFEDCBA PONMLKJI
第三组固定为11111111,实际改了也没影响,不清楚是不是给另外8个分区预留。
再举一个例子:
00000000 00000101 00000000 11111111 00000100 10101010 01001000
表示A, C两个分区的应援棒维持当前颜色不变,闪烁状态变更为快速闪烁。
所有分区变色(11000000)
一次性让不同分区的应援棒变更为各自不同的颜色。
举个例子:
11000000 01000001 00000000 00000000 00000000 00000000 10010111
中间的五组:第一组前半表示A分区的颜色,后半表示B分区颜色,第二组前半C分区,后半D分区,依此类推。
所以这串码会让A分区变更为白色(0100),B分区变更为绿色(0001),CDEFGH分区变更为红色(0000)。
这里有个问题,分区总共有A到P共16个,但这串码只能覆盖到10个。我手里只有A到H共8个分区的应援棒,所以不清楚后8个分区的应援棒会如何响应。
解锁(11011010)
应援棒接收信号变换状态后会锁定当前状态,无法再通过物理按键改变颜色。解锁即恢复该按键的功能。
11011010 11111111 11111111 11111111 00000001 00000000 01101110
中间的五组,前两组表示分区,后三组的数值对信号效果无影响。
脉冲(10100110)
所有分区应援棒闪一下,然后快速熄灭。
举例:
10100110 00000111 01000011
与前面几种长度不同,除去头尾的两组,只有中间的一组8个bit表示脉冲的颜色,这里是浅绿色(0111)。
上述编码均来自遥控器的按键操作,不清楚连接DMX512接口时是否会使用另外的编码类型。
参考本节内容写编码,再按照“信号分析”一节还原为“原始”二进制串,之后就可以用各种能发射433.92MHz信号的设备控制应援棒了,便宜的比如Arduino加上对应模块。
题外话
1. 几年前的应援棒和遥控器之间通信用的也是433.92MHz的频率,但编码的规则不同(比如小黄鱼上卖的旧遥控器大多是老编码的),不排除后面厂商会再次更新。
2. 大多数商家都不愿意卖少量不同分区的应援棒,淘宝上问了很多家都要200根起。反而是阿里巴巴上有个别(可能是接近源头的)商家愿意单卖。
3. 感叹一下,编程菜鸟在嵌入式平台上写程序真的太折磨了……