新飞控做好了--就叫老邢飞控吧
本帖最后由 golaced 于 2015-10-25 17:58 编辑渣相机 请护眼!!!!!!!!
先上两张图:
新飞控
自制遥控器,之前还做了个安卓软件可以实时调参和查看姿态高度波形,之后会提供安卓包和通信协议
老版飞控和测试机架
芯片参数是论坛里常用的:
飞控板和导航板器件一样:
主控:STM32F407
IMU:MPU6050 HML5833l MS5611
目前光流已经调整差不多,可以达到基本的定点悬停视频带录制上传,并且正在结合超声波避障进行修改,以后提供详细说明,
实验室是做模式识别的未来会把OPENCV的东西移植到迷你电脑上用小飞机坐机械视觉的东西首先打算将PXflow模块代替掉 你这个是夹心汉堡吗? 图片像素真感人 LZ,拍照前把镜头上的手印擦干净了。{:titter:} 上资料先 大哥你这是拿10多年前的手机穿越到15年来拍照的? 这叫朦胧美。。。。。。。。。。。。。。。{:lol:} 楼主牛叉 看起来感觉不错 画面太美!哈哈! 楼主厉害,可否上传个定点的视频 图片感人! 楼主用什么拍的? 架子好大啊,而且感觉板子好多,好重啊,续航怎么样 治好了多年的老花眼哈哈{:lol:} 防抄板最好的利器{:lol:} 朦胧美,看着不错...{:lol:} 超级喜欢那几个眼睛,不知楼主能否共享下眼睛的资料 朦朦的{:lol:} 防抄板{:lol:}{:lol:}{:lol:} 膜拜大牛。
接插件真多。 这个DIY高端了,不过还是赞一下图片像素,很感人 牛x,用DMP做的吗? OPEN CV 好东西啊!!!如果能移植到低成本电脑那就爽歪了!!!!!!!!!11 楼主把十年前的四轴传上来了!{:lol:} yanpenghao 发表于 2015-10-25 21:28
架子好大啊,而且感觉板子好多,好重啊,续航怎么样
450 轴距现在带4S4200 mah 1.7 公斤飞11
分钟吧 yanpenghao 发表于 2015-10-25 21:28
架子好大啊,而且感觉板子好多,好重啊,续航怎么样
450 轴距现在带4S4200 mah 1.7 公斤飞11
分钟吧外面那圈是防炸鸡的基本都是它断了桨没断 jifei538610 发表于 2015-10-26 00:33
超级喜欢那几个眼睛,不知楼主能否共享下眼睛的资料
就是个3d打印的把超声波模块嵌进去到时候会上传模型 hyghyg1234 发表于 2015-10-26 09:06
牛x,用DMP做的吗?
就传统的四元数但是参照惯性导航书上加上了圆锥运动优化和二阶笛卡尔解算但和arsh那个方法目前看起来没太大区别 Dongshan888 发表于 2015-10-25 20:00
楼主厉害,可否上传个定点的视频
这几天比赛视频估计要11月分才有空录了 求细节,膜拜膜拜再膜拜 厉害,膜拜 一个人干的?? 的确牛逼
更新上位机和API
本帖最后由 golaced 于 2015-11-4 14:54 编辑2015.11.4 号更新 老邢 上位机和通信协议(施工中)
上位机下载楼主只测试过三星note3其他没有测试不知道能不能装上
登陆界面使用请先选择连接蓝牙模块,楼主使用的链接是https://item.taobao.com/item.htm?spm=a1z09.2.0.0.kF6730&id=38908945323&_u=41klsj8999fe或者是手机能搜到的蓝牙转串口模块波特率9600
主界面实时显示姿态角高度和电量等信息,请不要点GPS那块还没有编辑
传感器参数显示界面
PID调参界面,调参利器,通过写入和读出可以查看PID参数是否写入,高度PID那块貌似有BUG请暂时不要使用
飞行模式写入界面
单片机接收程序(注vs16 即int型)
typedef struct PID_STA{u16 OP,OI,OD,IP,II,ID,YP,YI,YD;}PID_STA;
u8 is_lock=1;
u8 EN_FIX_GPSF=0;
u8 EN_FIX_LOCKWF=0;
u8 EN_CONTROL_IMUF=0;
u8 EN_FIX_INSF=0;
u8 EN_FIX_HIGHF=0;
u8 tx_lock=1;
u8 EN_FIX_GPS=0;
u8 EN_FIX_LOCKW=0;
u8 EN_CONTROL_IMU=0;
u8 EN_FIX_INS=0;
u8 EN_FIX_HIGH=0;
u8 EN_TX_GX=1;
u8 EN_TX_AX=1;
u8 EN_TX_HM=1;
u8 EN_TX_YRP=1;
u8 EN_TX_GPS=1;
u8 EN_TX_HIGH=1;
u8 up_load_set=0;
u8 up_load_pid=0;
u8 key_rc={1,1,1,1,1,1};
u16 Yaw_sb_rc=0;
u8 cnt_rst=0,delta_pitch=0,delta_roll=0,delta_yew=0;
PID_STA HPIDt,SPIDt;
u16 ax,ay,az,gx,gy,gz,hx,hy,hz,YM,PWM1,PWM2,PWM3,PWM4,fix_pit,fix_rol;
u16 bat_fly=840,high_f;
float ypr;
double GPS_W,GPS_J;
u8 data_rate,fly_mode;
void Data_Receive_Anl(u8 *data_buf,u8 num)
{
vs16 rc_value_temp;
u8 sum = 0;
u8 i;
for( i=0;i<(num-1);i++)
sum += *(data_buf+i);
if(!(sum==*(data_buf+num-1))) return; //判断sum
if(!(*(data_buf)==0xAA && *(data_buf+1)==0xAF)) return; //判断帧头
if(*(data_buf+2)==0xAD) //判断功能字,=0x8a,为遥控数据
{
}
if(*(data_buf+2)==0X01) //CMD1
{
if(*(data_buf+4)==0Xa0)
lock_tx = 1;
else if(*(data_buf+4)==0Xa1)
lock_tx = 0;
else if(*(data_buf+4)==0Xa2)
up_load_set = 1;
else if(*(data_buf+4)==0Xa3)
up_load_pid = 1;
}
if(*(data_buf+2)==0X03) //CMD1
{//飞行模式写入
(EN_TX_GX)=*(data_buf+4);
(EN_TX_AX)=*(data_buf+5);
(EN_TX_HM)=*(data_buf+6);
(EN_TX_YRP)=*(data_buf+7);
(EN_TX_GPS)=*(data_buf+8);
(EN_TX_HIGH)=*(data_buf+9);
(EN_FIX_GPS)=*(data_buf+10);
(EN_FIX_LOCKW)=*(data_buf+11);
(EN_CONTROL_IMU)=*(data_buf+12);
(EN_FIX_INS)=*(data_buf+13);
(EN_FIX_HIGH)=*(data_buf+14);
}
if(*(data_buf+2)==0x10) //PID1
{
SPID.OP = (float)((vs16)(*(data_buf+4)<<8)|*(data_buf+5));
SPID.OI = (float)((vs16)(*(data_buf+6)<<8)|*(data_buf+7));
SPID.OD = (float)((vs16)(*(data_buf+8)<<8)|*(data_buf+9));
SPID.IP = (float)((vs16)(*(data_buf+10)<<8)|*(data_buf+11));
SPID.II = (float)((vs16)(*(data_buf+12)<<8)|*(data_buf+13));
SPID.ID = (float)((vs16)(*(data_buf+14)<<8)|*(data_buf+15));
SPID.YP = (float)((vs16)(*(data_buf+16)<<8)|*(data_buf+17));
SPID.YI = (float)((vs16)(*(data_buf+18)<<8)|*(data_buf+19));
SPID.YD = (float)((vs16)(*(data_buf+20)<<8)|*(data_buf+21));
}
if(*(data_buf+2)==0x11) //PID2
{
HPID.OP = (float)((vs16)(*(data_buf+4)<<8)|*(data_buf+5));
HPID.OI = (float)((vs16)(*(data_buf+6)<<8)|*(data_buf+7));
HPID.OD = (float)((vs16)(*(data_buf+8)<<8)|*(data_buf+9));
}
}
u8 TxBuffer;
u8 TxCounter=0;
u8 count=0;
u8 Rx_Buf; //串口接收缓存
u8 RxBuffer;
u8 RxState = 0;
u8 RxBufferNum = 0;
u8 RxBufferCnt = 0;
u8 RxLen = 0;
u8 com_data ;
static u8 _data_len = 0,_data_cnt = 0;
void Usart2_IRQ(void)
{
u8 com_data;
if(USART2->SR & USART_SR_ORE)//ORE中断
{
com_data = USART2->DR;
}
//接收中断
if( USART_GetITStatus(USART2,USART_IT_RXNE) )
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清除中断标志
com_data = USART2->DR;
if(RxState==0&&com_data==0xAA)
{
RxState=1;
RxBuffer=com_data;
}
else if(RxState==1&&com_data==0xAF)
{
RxState=2;
RxBuffer=com_data;
}
else if(RxState==2&&com_data>0&&com_data<0XF1)
{
RxState=3;
RxBuffer=com_data;
}
else if(RxState==3&&com_data<50)
{
RxState = 4;
RxBuffer=com_data;
_data_len = com_data;
_data_cnt = 0;
}
else if(RxState==4&&_data_len>0)
{
_data_len--;
RxBuffer=com_data;
if(_data_len==0)
RxState = 5;
}
else if(RxState==5)
{
RxState = 0;
RxBuffer=com_data;
Data_Receive_Anl(RxBuffer,_data_cnt+5);
}
else
RxState = 0;
}
//发送(进入移位)中断
if( USART_GetITStatus(USART2,USART_IT_TXE ) )
{
USART2->DR = TxBuffer; //写DR清除中断标志
if(TxCounter == count)
{
USART2->CR1 &= ~USART_CR1_TXEIE; //关闭TXE(发送中断)中断
}
//USART_ClearITPendingBit(USART2,USART_IT_TXE);
}
}
单片机上传上位机程序(注意飞控使用的参数是SPIDt,需要设置一个标志位将上位机写入的参数SPID赋给 SPIDt)!!!!!!!!!!!!!
void Usart2_Send(unsigned char *DataToSend ,u8 data_num)
{
u8 i;
for(i=0;i<data_num;i++)
{
TxBuffer = *(DataToSend+i);
}
if(!(USART2->CR1 & USART_CR1_TXEIE))
{
USART_ITConfig(USART2, USART_IT_TXE, ENABLE); //打开发送中断
}
}
void Send_Status(void)
{u8 i; u8 sum = 0,_temp3; vs32 _temp2 = 0; vs16 _temp;u8 data_to_send;
u8 _cnt=0;
data_to_send=0xAA;
data_to_send=0xAA;
data_to_send=0x01;
data_to_send=0;
_temp = (int)(ypr*100);//Pit
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = (int)(ypr*100);//Rol
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = (int)(ypr*100);//Yaw
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp3=is_lock;//是否上锁
data_to_send=_temp3;
_temp3=1;//未使用
data_to_send=_temp3;
_temp3=EN_FIX_GPSF;//一些飞控模式标志位
data_to_send=_temp3;
_temp3=EN_FIX_LOCKWF;
data_to_send=_temp3;
_temp3=EN_CONTROL_IMUF;
data_to_send=_temp3;
_temp3=EN_FIX_INSF;
data_to_send=_temp3;
_temp3=EN_FIX_HIGHF;
data_to_send=_temp3;
data_to_send = _cnt-4;
for( i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send=sum;
Usart2_Send(data_to_send, _cnt);
}
void Send_GPS(void)
{u8 i; u8 sum = 0;u8 data_to_send;
u8 _cnt=0;
vs32 _temp; u8 _temp4=0; float _temp2 =0; vs16 _temp3=0;
data_to_send=0xAA;
data_to_send=0xAA;
data_to_send=0x04;
data_to_send=0;
_temp = (vs32)(GPS_W*1000000);
data_to_send=BYTE3(_temp);
data_to_send=BYTE2(_temp);
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = (vs32)(GPS_J*1000000);
data_to_send=BYTE3(_temp);
data_to_send=BYTE2(_temp);
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
//hight
_temp=(vs32)((float)high_f/10.);//高度mm
data_to_send=BYTE3(_temp);
data_to_send=BYTE2(_temp);
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp2=0;//未使用
data_to_send=BYTE3(_temp2);
data_to_send=BYTE2(_temp2);
data_to_send=BYTE1(_temp2);
data_to_send=BYTE0(_temp2);
data_to_send=BYTE1(_temp3);
data_to_send=BYTE0(_temp3);
_temp3=0;
data_to_send=BYTE1(_temp3);
data_to_send=BYTE0(_temp3);
data_to_send=BYTE0(_temp4);
_temp4=0;
data_to_send=BYTE0(_temp4);
data_to_send = _cnt-4;
for( i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send=sum;
Usart2_Send(data_to_send, _cnt);
}
void Send_BAT(void)
{u8 i; u8 sum = 0;u8 data_to_send;
u8 _cnt=0;
vs32 _temp; u8 _temp4=0; float _temp2 =0; vs16 _temp3=0;
data_to_send=0xAA;
data_to_send=0xAA;
data_to_send=0x05;
data_to_send=0;
_temp3 = (int)(bat_fly);//飞控电量 请自己测试缩放比例
data_to_send=BYTE1(_temp3);
data_to_send=BYTE0(_temp3);
_temp3 = (int)(Rc_Get.AUX5);//手柄电量
data_to_send=BYTE1(_temp3);
data_to_send=BYTE0(_temp3);
_temp3 = (int)(bat_fly);//未使用
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
data_to_send = _cnt-4;
for( i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send=sum;
Usart2_Send(data_to_send, _cnt);
}
void Send_Senser(void)
{u8 i; u8 sum = 0;u8 data_to_send;
u8 _cnt=0;
vs16 _temp;
data_to_send=0xAA;
data_to_send=0xAA;
data_to_send=0x08;
data_to_send=0;
_temp = ax;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = ay;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = az;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = gx;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = gy;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = gz;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = hx;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = hy;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = hz;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = YM; //油门量0~1000
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = PWM1;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = PWM2;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = PWM3;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = PWM4;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
data_to_send = _cnt-4;
for( i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send = sum;
Usart2_Send(data_to_send, _cnt);
}
void Send_PID1(void)
{u8 i; u8 sum = 0;u8 data_to_send;
u8 _cnt=0;
vs16 _temp;
data_to_send=0xAA;
data_to_send=0xAA;
data_to_send=0x06;
data_to_send=0;
_temp = SPIDt.OP;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = SPIDt.OI;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = SPIDt.OD;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = SPIDt.IP;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = SPIDt.II;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = SPIDt.ID;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = SPIDt.YP;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = SPIDt.YI;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = SPIDt.YD;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
data_to_send = _cnt-4;
for( i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send = sum;
Usart2_Send(data_to_send, _cnt);
}
void Send_PID2(void)
{u8 i; u8 sum = 0;u8 data_to_send;
u8 _cnt=0;
vs16 _temp;
data_to_send=0xAA;
data_to_send=0xAA;
data_to_send=0x07;
data_to_send=0;
_temp = HPIDt.OP;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = HPIDt.OI;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = HPIDt.OD;
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = fix_pit; //微调角度
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
_temp = fix_rol; //微调角度
data_to_send=BYTE1(_temp);
data_to_send=BYTE0(_temp);
data_to_send = _cnt-4;
for( i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send = sum;
Usart2_Send(data_to_send, _cnt);
}
void Send_Check(u16 check)
{u8 i; u8 sum = 0;u8 data_to_send;
data_to_send=0xAA;
data_to_send=0xAA;
data_to_send=0xF0;
data_to_send=3;
data_to_send=0xBA;
data_to_send=BYTE1(check);
data_to_send=BYTE0(check);
for( i=0;i<7;i++)
sum += data_to_send;
data_to_send=sum;
Usart2_Send(data_to_send, 8);
}
void GOL_LINK_TASK(void)//调用50Hz
{ static u8 flag1=0;
static u8 cnt = 0;
switch(cnt)
{
case 1:
Send_Status();
break;
case 2:
if(flag1)
Send_BAT();
else
Send_PID1();
break;
case 3:
if(flag1)
Send_Senser();
else
Send_PID2();
break;
case 4:
Send_GPS();cnt = 0;
if(flag1)
flag1=0;
else
flag1=1;
break;
default:cnt = 0;break;
}
cnt++;
} golaced 发表于 2015-10-26 15:59
这几天比赛视频估计要11月分才有空录了
是国际空中那个吗? 怪侠封沉 发表于 2015-11-4 14:50
是国际空中那个吗?
中航工业杯
RE: 新飞控做好了--就叫老邢飞控吧(更新安卓上位机)
更新上位机下载 楼主厉害! 楼主厉害啊! 关注帖子,自组山寨M100 搭载 OLD-X飞控 更新 光流定位测试视频 ,死区有点大定位调整不足
http://pan.baidu.com/s/1ntIS4fn 光棍节更新 光流定点视频 http://pan.baidu.com/s/15bO2E golaced 发表于 2015-11-11 10:13
光棍节更新 光流定点视频 http://pan.baidu.com/s/15bO2E
这个双目是要做立体视觉么?另外,这个地方感觉怎么那么熟悉...北理工6号楼前空地? dxzky 发表于 2015-11-11 10:40
这个双目是要做立体视觉么?另外,这个地方感觉怎么那么熟悉...北理工6号楼前空地? ...
没 就是下面加了个电脑棒你也是北理的?
golaced 发表于 2015-11-11 11:02
没 就是下面加了个电脑棒你也是北理的?
恩,上上周吧,我路过天桥上看人调四轴,是这个么?感觉做的还是挺不错的啊 dxzky 发表于 2015-11-11 11:13
恩,上上周吧,我路过天桥上看人调四轴,是这个么?感觉做的还是挺不错的啊 ...
有可能吧现在学校搞四轴的挺多 你是自动化的吗 golaced 发表于 2015-11-11 11:28
有可能吧现在学校搞四轴的挺多 你是自动化的吗
不是,我是四系的 golaced 发表于 2015-11-11 10:13
光棍节更新 光流定点视频 http://pan.baidu.com/s/15bO2E
悬停只是使用的光流,还是光流加超声波?实话效果不错精灵3不过如此。 Shaopus 发表于 2015-10-25 20:04
图片感人!
shaodafu呃呃呃 nca1bd 发表于 2015-11-18 17:46
悬停只是使用的光流,还是光流加超声波?实话效果不错精灵3不过如此。
如果你每次都在同一个高度就可以不加超声波 ,但是那如何定高,悬停是没问题 ,但是移动后快速回到悬停比较难 golaced 发表于 2015-11-19 17:45
如果你每次都在同一个高度就可以不加超声波 ,但是那如何定高,悬停是没问题 ,但是移动后快速回到悬停比 ...
楼主实在高人,理念处处有超远前者的意思,超声波主要是蔽障概念要突出,我觉得现在的超声波应该是从回波的接受面入手,您可以取不同点比较,从反射波角度来判断障碍物的距离和大小,这样会更准确和有效性。我只是瞎想,不知道这样可行? 这个看起来真不错,就是图片差了点 棒!!!向楼主学习!
页:
[1]