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://www.bilibili.com/video/BV12T4y157GJ/

猜你喜欢

转载自blog.csdn.net/shukebeta008/article/details/107954986