5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)

标题: 自制Mini四轴,想配玩具小四轴的遥控,请大神助我一臂之力(已成功,详见24楼) [打印本页]

作者: LuRenJia    时间: 2015-9-7 12:53
标题: 自制Mini四轴,想配玩具小四轴的遥控,请大神助我一臂之力(已成功,详见24楼)
本帖最后由 LuRenJia 于 2015-9-22 10:55 编辑

淘了个PCB板,焊了个小四轴,就是电机直接装在PCB板上的那种。
板上已经上了NRF24L01+的模块,收、发都没问题了。
现在为了省点米,想用以前买的一个玩具小四轴的遥控来操控,
苦于不知道这种玩具控的协议,所以无从下手。
有大神能指点一二吗?万分感激啊!
玩具控如图:
(, 下载次数: 114)

Mini PCB四轴:
(, 下载次数: 115)



作者: LuRenJia    时间: 2015-9-7 13:33
玩具四轴遥控内也有个2.4G模块,但上面是一块“牛屎”,所以目前还无法知道其具体型号。
不过找了点资料,了解到只有两种可能:要么就是NRF24L01,要么就是能与NRF24L01兼容的BK242x系列。
所以,理论上与我的PCB Mini四轴上的NRF24L01+模块是可以通信的。

作者: synoman    时间: 2015-9-7 13:49
试试不就行了么

作者: LuRenJia    时间: 2015-9-7 13:52
要先知道玩具四轴遥控发出的包的格式才行,也就是协议。

作者: 老魔友    时间: 2015-9-7 14:21


作者: shijiamoni    时间: 2015-9-7 14:33
放弃吧,没法省米的

作者: LuRenJia    时间: 2015-9-7 14:35
shijiamoni 发表于 2015-9-7 14:33
放弃吧,没法省米的

看来这方面是深有体会啊。


作者: shijiamoni    时间: 2015-9-7 14:45
首先这个遥控用2401(基本不可能)或者bk24的概率就比较小了,再者这些玩具的通信协议都是各家自己的协议,再加上跳频和对码机制,即使你用逻辑分析仪都给解开了(如果你真能做到这个,你已经很牛了,我还没见过有人去做这个),你还要在你pcb四轴上写程序,然后,你已经早就放弃这个想法了

作者: LuRenJia    时间: 2015-9-7 14:52
shijiamoni 发表于 2015-9-7 14:45
首先这个遥控用2401(基本不可能)或者bk24的概率就比较小了,再者这些玩具的通信协议都是各家自己的协议, ...

这种玩具四轴似乎没有跳频机制,最主要的可能是在对码上。
从我找的一些资料来看,24L01或与其兼容的模块的概率很大。
先看看各大神有没有什么指点,如果实在没什么好资料,下周准备自己试着解解看。


作者: shijiamoni    时间: 2015-9-7 15:01
先问问你单片机的功底到底有多扎实?我见过的这种玩具四轴,基本都有跳频的,有些全频段轮着跳,有些只用个点跳,还有对码,数据协议,这些都更解密码一样的,反正我是不会去干这事的

作者: LuRenJia    时间: 2015-9-7 15:15
shijiamoni 发表于 2015-9-7 15:01
先问问你单片机的功底到底有多扎实?我见过的这种玩具四轴,基本都有跳频的,有些全频段轮着跳,有些只用个 ...

看来我得知难而退了,谢谢提醒。
后续如果有什么进展,会继续发来这里,成与不成都会有个交待。



作者: LuRenJia    时间: 2015-9-9 10:07
如果能有内部人员给点资料就不用这么麻烦了。

作者: maidoo    时间: 2015-9-11 09:55

遥控器高频头上的牛屎,24L01的可能性比较大,另外的有可能的就是A7105。
也有办法区分,从惯用的通信方式上区别,2401四线(CS,SCK,MOSI,MISO),A7105三线(CS,SCK,SDIO)。看看PCB上的走线,结合芯片Datasheet,基本能判定。

另外,找周围用Devo7E加了2401高频头,灌了Galee大神固件的朋友(比如我吧,在杭州),拿他的遥控器对你的玩具4轴,如果某个协议能通信上的话,对着Galee的源代码就能移植到你的PCB四轴上了。

一般的玩具控,虽说是跳频,但是从Galee的代码上看,大部分就是在程序预置的3~4的频点间跳,有点甚至只是在上电时从预置的这几个频点中选一个,以后一直用这个频点。你要找出这些个频点,才能对码、通信。有点难。除非你有频谱仪。

但是这个世界时不时地,在你不经意间会向你展示一些美好的事情,让你相信情怀还是一种可以有的东西:一些玩具控的开发人员们就是使用了大部分网上公开的24L01的例程设计了这个玩具四轴飞行器,那么他所用的频点极有可能就是40,地址就是如下的定义:const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};

祝你好运。


作者: LuRenJia    时间: 2015-9-11 10:37
maidoo 发表于 2015-9-11 09:55
遥控器高频头上的牛屎,24L01的可能性比较大,另外的有可能的就是A7105。
也有办法区分,从惯用的通信方 ...

谢谢朋友的指点。
至于你提到的可求助的大神朋友,目前我已知的也只有你了,可惜与你相距太远,无法借用你的控了。
还有那展现情怀的、美好的事情,只能看运气了。我先试试,有结果了再通报。


作者: LuRenJia    时间: 2015-9-15 16:31
有空了,来继续。
拆开来看看。


(, 下载次数: 33)

[attach]2830505[/attach]



作者: LuRenJia    时间: 2015-9-15 16:34
(, 下载次数: 27)

(, 下载次数: 40)


作者: LuRenJia    时间: 2015-9-15 16:37
(, 下载次数: 41)





作者: LuRenJia    时间: 2015-9-15 16:41
飞上线,先用示波器看看.

(, 下载次数: 26)

MISO    NC    GND    Vcc
    |          |         |         |
————————————
    |          |         |         |
MOSI    CK     CS       CE



作者: LuRenJia    时间: 2015-9-15 16:44
示波器看这个太头疼了,要是有个逻辑分析仪就爽了。
碰到程序中有个长延时时,示波器就很难再继续分析数据了。

(, 下载次数: 26)




作者: LuRenJia    时间: 2015-9-15 16:58
对频时会使用60(0x3C)这个频点,不确定是否固定使用这个点,因为我有时能收到数据,有时却又收不到。
Bind时用的地址是 (0x60,0x60,0x60,0x60,0x60)。
Bind时收到的数据是:0x48,0xCE,0xA3,0x11,0x56,0xAA,0x40,0x00,0xF5,共9个字节。

这个玩具四轴说是可以多个在一起玩,就不知是如何区分的,频点不同还是地址不同呢?
希望有谁能说说。

作者: wangjie    时间: 2015-9-15 23:13
伟力的小四轴是A7105。朋友捡了个四轴送给了我,也是这种邦定的射频模块,但用我自制的多协议高频头的V2X2协议居然能对上,并能爽飞!

作者: wangjie    时间: 2015-9-15 23:14
判断不是24L01就是其兼容芯片。

作者: LuRenJia    时间: 2015-9-16 09:30
wangjie 发表于 2015-9-15 23:14
判断不是24L01就是其兼容芯片。

能确定是BK242x系列的IC,因为在初始化的时候发送了“0x50,0x73”、“0x50,0x53”这样的命令。
这是BK系列专用的。

现在已经快调通了,谢谢关注。


作者: LuRenJia    时间: 2015-9-22 10:51
搞定了,在这里总结一下,分享给有需要的网友。

遥控上用的确定是 BK系列的(BK242x)。
格式:
数据速率——1M;
地址长度——5字节;
CRC校验开启,1字节;
开自动应答;
动态数据包长度。

分两个过程:
一、对码时——使用固定地址(0x60,0x60,0x60,0x60,0x60),固定频点(60即0x3C)。
遥控会连续发送9字节的包,1~4字节为后续用于传送数据包的地址的低4字节(低字节先出),
5~8为一串固定值,目前还未发现有什么用(我的遥控是:0x56,0xAA,0x40,0x00)。
第9字节为校验字节,保证前8字节与校验字节相加结果为0xFF(只保留一个字节)。
例如我的遥控发出的对码包:0x48,0xCE,0xA3,0x11,0x56,0xAA,0x40,0x00,0xF5。
遥控发送对码包一段时间后,会切换到数据包的发送地址,发送一个数据包,若收到接收机
的应答,则说明对码成功,就进入第二阶段——连续发送数据包。

二、发送数据包——对码成功后,遥控器会等待用户解锁(将油门推至最高再拉回最低)。
若不解锁将不会有数据包发出。解锁后就进入连续的数据包发送阶段,且会一直使用固定
的频点(60也即0x3C)和地址(对码包中的地址低4字节,高字节固定为0xC1)。
数据包的格式也是9字节:
油门——偏航(Yaw)——偏航微调——俯仰(Pitch)——横滚(Roll)——俯仰微调——横滚微调——辅助功能字节——校验字节
例子:0x00,0x80,0x40,0x80,0x80,0x40,0x40,0x00,0xBF。
各种角度是在0x80的基础上增减,各微调是在0x40的基础上增减。
注:接收机需自动应答数据包,若无应答,遥控器会停止发送数据包。




作者: LuRenJia    时间: 2015-9-22 10:53
另外我猜想不同的遥控器发出的对码包内的地址段应该是不同的吧,因只有这样,才能让同品牌的多个飞机在相同的地方一起玩。

作者: LuRenJia    时间: 2015-9-22 10:54
另外我猜想不同的遥控器发出的对码包内的地址段应该是不同的吧,因只有这样,才能让同品牌的多个飞机在相同的地方一起玩。

作者: maidoo    时间: 2015-9-22 22:01
恭喜啊,解出了协议细节,下一步就可以和自己的PCB四轴对接了。

作者: LuRenJia    时间: 2015-9-23 14:53
maidoo 发表于 2015-9-22 22:01
恭喜啊,解出了协议细节,下一步就可以和自己的PCB四轴对接了。


遥控是可以了,但长路漫漫啊。
飞起来后发现不稳,又回到姿态解算与PID调整了。
理论知识太匮乏,还要继续学习啊。


作者: payne_pan    时间: 2015-9-24 17:15
你的 mini 四轴是基于 MultiWii 的吗? (只改了接收部分)

作者: payne_pan    时间: 2015-9-25 08:51
看我的

(, 下载次数: 53)


作者: LuRenJia    时间: 2015-9-25 09:27
payne_pan 发表于 2015-9-24 17:15
你的 mini 四轴是基于 MultiWii 的吗? (只改了接收部分)

我是在CrazyFlie基础上改的,
跑的是FreeRTOS。


作者: LuRenJia    时间: 2015-9-25 09:34
payne_pan 发表于 2015-9-25 08:51
看我的

你的进展怎样?
我的感觉升力不太够,不知是否是浆的原因。
我的马达PWM频率用的是36K,电流要到3A才能飞起来。
马达用的是720,浆是55mm的。


作者: payne_pan    时间: 2015-9-25 09:47
LuRenJia 发表于 2015-9-25 09:27
我是在CrazyFlie基础上改的,
跑的是FreeRTOS。

原来 arm 芯片的,不过看taobao的CrazyFlie卖太贵了
我这个成本很低 100元以内,不过自己还是花了很多时间焊接




作者: payne_pan    时间: 2015-9-25 09:49
LuRenJia 发表于 2015-9-25 09:34
你的进展怎样?
我的感觉升力不太够,不知是否是浆的原因。
我的马达PWM频率用的是36K,电流要到3A才能 ...



我的也是 7x20 电机
频率应该 50hz expand PWM

飞起来还可以
http://bbs.5imx.com/bbs/forum.ph ... ;page=1#pid16967575


作者: LuRenJia    时间: 2015-9-25 14:32
payne_pan 发表于 2015-9-25 09:49
我的也是 7x20 电机
频率应该 50hz expand PWM

看了视频,飞的挺稳的,恭喜、恭喜啊!
你的小四轴有多重?我的电池一起刚好40克。
我也是淘来PCB板,自己焊的。
板子加元器件一起一百五、六了,主要是单买元器件价格没优势。
另外,这家买点,那家买点儿运费就上去了。
你是用的串级PID吗?我现在就卡这儿了,参数一直没调好,飞起来抖得很。


作者: payne_pan    时间: 2015-9-25 21:46
我的45g (电池520mah) , 轴距大概15cm

前段主要研究遥控器,PID还不太懂

我用的 MultiWii 开源
算 IMU 的理论是  http://starlino.com/imu_guide.html80

算PID代码就下面这些,应该不是串级

  //**** PITCH & ROLL & YAW PID ****
  int16_t prop;
  prop = min(max(abs(rcCommand[PITCH]),abs(rcCommand[ROLL])),500); // range [0;500]

  for(axis=0;axis<3;axis++) {
    if ((f.ANGLE_MODE || f.HORIZON_MODE) && axis<2 ) { // MODE relying on ACC
      // 50 degrees max inclination
      errorAngle = constrain((rcCommand[axis]<<1) + GPS_angle[axis],-500,+500) - angle[axis] + conf.angleTrim[axis]; //16 bits is ok here
      PTermACC = ((int32_t)errorAngle*conf.P8[PIDLEVEL])>>7;                          // 32 bits is needed for calculation: errorAngle*P8[PIDLEVEL] could exceed 32768   16 bits is ok for result
      PTermACC = constrain(PTermACC,-conf.D8[PIDLEVEL]*5,+conf.D8[PIDLEVEL]*5);

      errorAngleI[axis]     = constrain(errorAngleI[axis]+errorAngle,-10000,+10000);    // WindUp     //16 bits is ok here
      ITermACC              = ((int32_t)errorAngleI[axis]*conf.I8[PIDLEVEL])>>12;            // 32 bits is needed for calculation:10000*I8 could exceed 32768   16 bits is ok for result
    }
    if ( !f.ANGLE_MODE || f.HORIZON_MODE || axis == 2 ) { // MODE relying on GYRO or YAW axis
      if (abs(rcCommand[axis])<500) error =          (rcCommand[axis]<<6)/conf.P8[axis] ; // 16 bits is needed for calculation: 500*64 = 32000      16 bits is ok for result if P8>5 (P>0.5)
                               else error = ((int32_t)rcCommand[axis]<<6)/conf.P8[axis] ; // 32 bits is needed for calculation

      error -= gyroData[axis];

      PTermGYRO = rcCommand[axis];
      
      errorGyroI[axis]  = constrain(errorGyroI[axis]+error,-16000,+16000);         // WindUp   16 bits is ok here
      if (abs(gyroData[axis])>640) errorGyroI[axis] = 0;
      ITermGYRO = ((errorGyroI[axis]>>7)*conf.I8[axis])>>6;                        // 16 bits is ok here 16000/125 = 128 ; 128*250 = 32000
    }
    if ( f.HORIZON_MODE && axis<2) {
      PTerm = ((int32_t)PTermACC*(512-prop) + (int32_t)PTermGYRO*prop)>>9;         // the real factor should be 500, but 512 is ok
      ITerm = ((int32_t)ITermACC*(512-prop) + (int32_t)ITermGYRO*prop)>>9;
    } else {
      if ( f.ANGLE_MODE && axis<2) {
        PTerm = PTermACC;
        ITerm = ITermACC;
      } else {
        PTerm = PTermGYRO;
        ITerm = ITermGYRO;
      }
    }

    PTerm -= ((int32_t)gyroData[axis]*dynP8[axis])>>6; // 32 bits is needed for calculation   

    delta          = gyroData[axis] - lastGyro[axis];  // 16 bits is ok here, the dif between 2 consecutive gyro reads is limited to 800
    lastGyro[axis] = gyroData[axis];
    deltaSum       = delta1[axis]+delta2[axis]+delta;
    delta2[axis]   = delta1[axis];
    delta1[axis]   = delta;

    DTerm = ((int32_t)deltaSum*dynD8[axis])>>5;        // 32 bits is needed for calculation
                     
    axisPID[axis] =  PTerm + ITerm - DTerm;
  }







作者: huluwa_cd    时间: 2015-11-13 07:16
高手!

作者: 31415926wang    时间: 2015-12-1 23:54
虽然不懂,但是顶你们DIY的精神!!





欢迎光临 5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年) (http://bbs.5imx.com/) Powered by Discuz! X3.3