|
楼主 |
发表于 2015-11-4 14:07:22
|
显示全部楼层
本帖最后由 golaced 于 2015-11-4 14:54 编辑
2015.11.4 号更新 老邢 上位机和通信协议(施工中)
上位机下载楼主只测试过三星note3其他没有测试不知道能不能装上
登陆界面使用请先选择连接蓝牙模块,楼主使用的链接是https://item.taobao.com/item.htm ... amp;_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[6]={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[3];
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[256];
u8 TxCounter=0;
u8 count=0;
u8 Rx_Buf[256]; //串口接收缓存
u8 RxBuffer[50];
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[0]=com_data;
}
else if(RxState==1&&com_data==0xAF)
{
RxState=2;
RxBuffer[1]=com_data;
}
else if(RxState==2&&com_data>0&&com_data<0XF1)
{
RxState=3;
RxBuffer[2]=com_data;
}
else if(RxState==3&&com_data<50)
{
RxState = 4;
RxBuffer[3]=com_data;
_data_len = com_data;
_data_cnt = 0;
}
else if(RxState==4&&_data_len>0)
{
_data_len--;
RxBuffer[4+_data_cnt++]=com_data;
if(_data_len==0)
RxState = 5;
}
else if(RxState==5)
{
RxState = 0;
RxBuffer[4+_data_cnt]=com_data;
Data_Receive_Anl(RxBuffer,_data_cnt+5);
}
else
RxState = 0;
}
//发送(进入移位)中断
if( USART_GetITStatus(USART2,USART_IT_TXE ) )
{
USART2->DR = TxBuffer[TxCounter++]; //写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[count++] = *(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[50];
u8 _cnt=0;
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0x01;
data_to_send[_cnt++]=0;
_temp = (int)(ypr[0]*100);//Pit
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = (int)(ypr[1]*100);//Rol
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = (int)(ypr[2]*100);//Yaw
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp3=is_lock;//是否上锁
data_to_send[_cnt++]=_temp3;
_temp3=1;//未使用
data_to_send[_cnt++]=_temp3;
_temp3=EN_FIX_GPSF;//一些飞控模式标志位
data_to_send[_cnt++]=_temp3;
_temp3=EN_FIX_LOCKWF;
data_to_send[_cnt++]=_temp3;
_temp3=EN_CONTROL_IMUF;
data_to_send[_cnt++]=_temp3;
_temp3=EN_FIX_INSF;
data_to_send[_cnt++]=_temp3;
_temp3=EN_FIX_HIGHF;
data_to_send[_cnt++]=_temp3;
data_to_send[3] = _cnt-4;
for( i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send[_cnt++]=sum;
Usart2_Send(data_to_send, _cnt);
}
void Send_GPS(void)
{u8 i; u8 sum = 0;u8 data_to_send[50];
u8 _cnt=0;
vs32 _temp; u8 _temp4=0; float _temp2 =0; vs16 _temp3=0;
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0x04;
data_to_send[_cnt++]=0;
_temp = (vs32)(GPS_W*1000000);
data_to_send[_cnt++]=BYTE3(_temp);
data_to_send[_cnt++]=BYTE2(_temp);
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = (vs32)(GPS_J*1000000);
data_to_send[_cnt++]=BYTE3(_temp);
data_to_send[_cnt++]=BYTE2(_temp);
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
//hight
_temp=(vs32)((float)high_f/10.);//高度mm
data_to_send[_cnt++]=BYTE3(_temp);
data_to_send[_cnt++]=BYTE2(_temp);
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp2=0;//未使用
data_to_send[_cnt++]=BYTE3(_temp2);
data_to_send[_cnt++]=BYTE2(_temp2);
data_to_send[_cnt++]=BYTE1(_temp2);
data_to_send[_cnt++]=BYTE0(_temp2);
data_to_send[_cnt++]=BYTE1(_temp3);
data_to_send[_cnt++]=BYTE0(_temp3);
_temp3=0;
data_to_send[_cnt++]=BYTE1(_temp3);
data_to_send[_cnt++]=BYTE0(_temp3);
data_to_send[_cnt++]=BYTE0(_temp4);
_temp4=0;
data_to_send[_cnt++]=BYTE0(_temp4);
data_to_send[3] = _cnt-4;
for( i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send[_cnt++]=sum;
Usart2_Send(data_to_send, _cnt);
}
void Send_BAT(void)
{u8 i; u8 sum = 0;u8 data_to_send[50];
u8 _cnt=0;
vs32 _temp; u8 _temp4=0; float _temp2 =0; vs16 _temp3=0;
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0x05;
data_to_send[_cnt++]=0;
_temp3 = (int)(bat_fly);//飞控电量 请自己测试缩放比例
data_to_send[_cnt++]=BYTE1(_temp3);
data_to_send[_cnt++]=BYTE0(_temp3);
_temp3 = (int)(Rc_Get.AUX5);//手柄电量
data_to_send[_cnt++]=BYTE1(_temp3);
data_to_send[_cnt++]=BYTE0(_temp3);
_temp3 = (int)(bat_fly);//未使用
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
data_to_send[3] = _cnt-4;
for( i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send[_cnt++]=sum;
Usart2_Send(data_to_send, _cnt);
}
void Send_Senser(void)
{u8 i; u8 sum = 0;u8 data_to_send[50];
u8 _cnt=0;
vs16 _temp;
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0x08;
data_to_send[_cnt++]=0;
_temp = ax;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = ay;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = az;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = gx;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = gy;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = gz;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = hx;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = hy;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = hz;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = YM; //油门量0~1000
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = PWM1;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = PWM2;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = PWM3;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = PWM4;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
data_to_send[3] = _cnt-4;
for( i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send[_cnt++] = sum;
Usart2_Send(data_to_send, _cnt);
}
void Send_PID1(void)
{u8 i; u8 sum = 0;u8 data_to_send[50];
u8 _cnt=0;
vs16 _temp;
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0x06;
data_to_send[_cnt++]=0;
_temp = SPIDt.OP;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = SPIDt.OI;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = SPIDt.OD;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = SPIDt.IP;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = SPIDt.II;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = SPIDt.ID;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = SPIDt.YP;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = SPIDt.YI;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = SPIDt.YD;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
data_to_send[3] = _cnt-4;
for( i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send[_cnt++] = sum;
Usart2_Send(data_to_send, _cnt);
}
void Send_PID2(void)
{u8 i; u8 sum = 0;u8 data_to_send[50];
u8 _cnt=0;
vs16 _temp;
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0x07;
data_to_send[_cnt++]=0;
_temp = HPIDt.OP;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = HPIDt.OI;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = HPIDt.OD;
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = fix_pit; //微调角度
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = fix_rol; //微调角度
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
data_to_send[3] = _cnt-4;
for( i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send[_cnt++] = sum;
Usart2_Send(data_to_send, _cnt);
}
void Send_Check(u16 check)
{u8 i; u8 sum = 0;u8 data_to_send[50];
data_to_send[0]=0xAA;
data_to_send[1]=0xAA;
data_to_send[2]=0xF0;
data_to_send[3]=3;
data_to_send[4]=0xBA;
data_to_send[5]=BYTE1(check);
data_to_send[6]=BYTE0(check);
for( i=0;i<7;i++)
sum += data_to_send;
data_to_send[7]=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++;
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|