Portapack应用开发,控制遥控小车OOK
最近看到老外在github上找了个rf-car的程序,想往portapack上搬我感觉挺有趣。
想起来以前hackrf.net上有类似教程,对应github上叫做gr-remotecar。
我找出了我自己的遥控车,打算分析一下信号。
流图上半部分是用来收遥控器信号并分析的,下半部分是发射用的,暂时要disable。
我依次按下左前,左后,右前,右后,变形,发射几个按键,得到了几个信号图。
左前: 1011110000100000101111000010000010
左后:000001000010111100000100001011110000010
右前:101111000000000110111100000000011011110
右后:000010001011110000001000101111000000100
变形:111100000001001011110000000100101111000
发射:000111100110000000011110011000000001111
然后,我整理总结了一下:
左前:1011110000100000
左后:1011110000010000
右前:1011110000000001
右后:1011110000001000
变形:1011110000000100
开炮:1111001100000000
多数都是101111开头,相当于是一个preamble,然后后面是好多0加上不同位置有个1,类似one hot。
我可以参考hackrf.net教程用python代码生成iq文件,然后再用gnuradio发射出去。
import struct
SAMP_RATE=10e6
TIME_TOTAL = int(1 * SAMP_RATE) #s
TIME0 = int(0.5e-3 * SAMP_RATE)
TIME1 = int(1.50e-3 * SAMP_RATE)
MIN=struct.pack('B',0)
MAX=struct.pack('B',64)
'''
1011110000100000
1:
WriteFrame(MAX,TIME1,f)
i += TIME1
WriteFrame(MIN,TIME0,f)
i += TIME0
0:
WriteFrame(MAX,TIME0,f)
i += TIME0
WriteFrame(MIN,TIME1,f)
i += TIME1
'''
def WriteFrame(value,quantity,f):
j = 0
while j < quantity:
f.write(value) #i
f.write(value) #q
j += 1
def main():
f = open('w.iq','wb')
i = 0
WriteFrame(MAX,TIME1,f)
i += TIME1
WriteFrame(MIN,TIME0,f)
i += TIME0
WriteFrame(MAX,TIME0,f)
i += TIME0
WriteFrame(MIN,TIME1,f)
i += TIME1
WriteFrame(MAX,TIME1,f)
i += TIME1
WriteFrame(MIN,TIME0,f)
i += TIME0
WriteFrame(MAX,TIME1,f)
i += TIME1
WriteFrame(MIN,TIME0,f)
i += TIME0
WriteFrame(MAX,TIME1,f)
i += TIME1
WriteFrame(MIN,TIME0,f)
i += TIME0
WriteFrame(MAX,TIME1,f)
i += TIME1
WriteFrame(MIN,TIME0,f)
i += TIME0
WriteFrame(MAX,TIME0,f)
i += TIME0
WriteFrame(MIN,TIME1,f)
i += TIME1
WriteFrame(MAX,TIME0,f)
i += TIME0
WriteFrame(MIN,TIME1,f)
i += TIME1
WriteFrame(MAX,TIME0,f)
i += TIME0
WriteFrame(MIN,TIME1,f)
i += TIME1
WriteFrame(MAX,TIME0,f)
i += TIME0
WriteFrame(MIN,TIME1,f)
i += TIME1
WriteFrame(MAX,TIME1,f)
i += TIME1
WriteFrame(MIN,TIME0,f)
i += TIME0
WriteFrame(MAX,TIME0,f)
i += TIME0
WriteFrame(MIN,TIME1,f)
i += TIME1
WriteFrame(MAX,TIME0,f)
i += TIME0
WriteFrame(MIN,TIME1,f)
i += TIME1
WriteFrame(MAX,TIME0,f)
i += TIME0
WriteFrame(MIN,TIME1,f)
i += TIME1
WriteFrame(MAX,TIME0,f)
i += TIME0
WriteFrame(MIN,TIME1,f)
i += TIME1
WriteFrame(MAX,TIME0,f)
i += TIME0
WriteFrame(MIN,TIME1,f)
i += TIME1
f.close()
if __name__ == "__main__":
main()
一开始生成出的文件不太对,我先用audacity观察,并调整了MIN和MAX变量,使得波形在合适的大小上。然后把获得的iq文件,用gnuradio读取,一边发射一边接了示波器,但是我对比后发现波形宽度和我之前收的遥控器波形不一样,我通过更改python代码里的SAMP_RATE变量使得实际发射时的波形宽度与遥控器的一样,至于为啥是10e6,我还不知道,我是凑出来的。
然后,这样发射就能控制小车左边的*往前转了。
接着我用portapack的ook发射app,编辑了同样的流图。然后我调整了不同的clk频率,调到10kHz左右也能达到同样的效果。
但是不管是电脑发射还是portapack发射或者原来的遥控器发射,除了左轮前进外,还会带动炮台发射。我记得以前左轮右轮同时前进时不会干扰炮台,而且发射的1010序列也跟其他不一样。
我觉得可能用遥控器同时按下前进和后退,还会有新的波形出现。然后我试了试,发现果然如此。
同时前进:1111000010000100
同时后退:1111000001100000
开炮:1111001100000000
可以看到,前导码跟其他按钮不同,是11110000,并且数据位里有2个1.与开炮的码比较接近。
后来我还发现portapack按照右轮前进的信号波形生成,如果clk调到11kHz也能有用,但是10kHz就不行。
我就用gnuradio和另一个hackrf观察了一下portapack发射第一种波形(左轮前进)的到底是怎样的信号
发现波形十分奇怪,但是居然可以控制小车按照我的指令运行。
资料:
链接:https://pan.baidu.com/s/1nlaQSLh8GNlIWKru700xfQ
提取码:wnan
本文地址:https://blog.csdn.net/shukebeta008/article/details/107954986