亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: 基于藍(lán)牙的遙控攝像車遙控通信設(shè)計 [打印本頁]

作者: 不要加香菜    時間: 2017-8-1 10:20
標(biāo)題: 基于藍(lán)牙的遙控攝像車遙控通信設(shè)計

摘要: 針對多變環(huán)境攝像的環(huán)境,遙控攝像車多為無線遙控,也需要對環(huán)境有一定檢測和處理。因此,遙控通信的復(fù)雜程度比較大。本文通過程序設(shè)計,依托藍(lán)牙的數(shù)據(jù)傳輸完成對攝像車的控制及其他多種功能。
關(guān)鍵詞:攝像車     遙控     藍(lán)牙    通信
目的
編寫通信程序,通過藍(lán)牙所發(fā)送的數(shù)據(jù)控制攝像車的運行,并且返回車子運行時的參數(shù)和環(huán)境狀態(tài)等參數(shù)到遙控器顯示屏顯示。
總體設(shè)計
通信設(shè)計分為硬件設(shè)計和軟件設(shè)計兩部分,硬件設(shè)計為藍(lán)牙設(shè)計,這里我們采用已有模塊使用;軟件設(shè)計為通信程序設(shè)計和協(xié)議設(shè)計。
藍(lán)牙設(shè)備
現(xiàn)有藍(lán)牙模塊的功能比較穩(wěn)定,設(shè)計技術(shù)成熟。我們根據(jù)設(shè)計需求,選擇要使用的藍(lán)牙模塊。通信時需要車子與遙控之間是雙向通信,互相發(fā)送數(shù)據(jù)。因此,選擇可以主從機(jī)一體化的藍(lán)牙模塊。所選藍(lán)牙傳輸距離:視距10米 ,F(xiàn)lash存儲容量:6-8Mbit,滿足當(dāng)前設(shè)計需求。藍(lán)牙模塊相應(yīng)參數(shù)過多,這里不做詳細(xì)介紹。
程序設(shè)計
通信設(shè)計主體在于通信協(xié)議的設(shè)計。之前介紹了遙控與車子之間是雙向通信,且通信數(shù)據(jù)復(fù)雜繁多。通過用藍(lán)牙發(fā)送簡單數(shù)據(jù)來完成通信任務(wù)是不可能。藍(lán)牙所傳輸數(shù)據(jù)在0-255之間,256個數(shù)據(jù)根本不能控制車子的各種精細(xì)動作和顯示車子運行參數(shù)和環(huán)境數(shù)據(jù)。因此,要通過設(shè)計通信協(xié)議將數(shù)據(jù)進(jìn)行擴(kuò)充,加大通信數(shù)據(jù)的大小,實現(xiàn)復(fù)雜數(shù)據(jù)的傳輸。
初步構(gòu)想,將數(shù)據(jù)拆分多個簡單數(shù)據(jù),依次發(fā)送。把復(fù)雜數(shù)據(jù)進(jìn)行拆分,拆分為高低位,這樣就可以把所發(fā)數(shù)據(jù)由256擴(kuò)充到65536。在65536的數(shù)據(jù)大小傳輸能夠分別完成攝像車的精細(xì)測量和操作(攝像頭三維度角度調(diào)整、車子舵機(jī)精度角度調(diào)節(jié)、環(huán)境參數(shù)精度分辨)。
上面我們能夠完成單一動作的高精度控制,但是需要控制或測量的對象不是一個,為此需要進(jìn)一步設(shè)計通信程序,來完成全局的控制和測量。進(jìn)一步設(shè)計,我們需要傳輸大量的數(shù)據(jù),要想數(shù)據(jù)能過不出錯的傳輸,就要對數(shù)據(jù)進(jìn)行分類分批發(fā)送。
先將所有的數(shù)據(jù)分類編號,按發(fā)送順序或發(fā)送頻率排好序,按照序列進(jìn)行編號并且做好記錄注明。但是多數(shù)據(jù)傳輸時,傳輸連接不穩(wěn)斷開或數(shù)據(jù)輸出跳變出錯后,重連數(shù)據(jù)傳輸會導(dǎo)致數(shù)據(jù)接收解算出現(xiàn)錯誤,導(dǎo)致車子不受控制。因此,設(shè)計時考慮到上述問題,需要將數(shù)據(jù)進(jìn)行打包處理,使得錯誤數(shù)據(jù)對程序應(yīng)降到最小。采用現(xiàn)有一些通信協(xié)議模型,我們設(shè)計了如圖1的程序流程,這樣一個錯誤的數(shù)據(jù)只會影響一個參數(shù)的大小,并且在下一次相同參數(shù)數(shù)據(jù)傳輸過來時被刷新替代。
簡述一下框圖流程,我們把最大數(shù)據(jù)255作為數(shù)據(jù)報頭,當(dāng)接受255時,數(shù)據(jù)接收正式開始接收存儲,之后依次會有數(shù)據(jù)類型、數(shù)據(jù)正負(fù)值、數(shù)據(jù)高低位的數(shù)據(jù)傳輸,最后接收完數(shù)據(jù)后進(jìn)入數(shù)據(jù)整合程序,完成數(shù)據(jù)的還原,發(fā)給控制程序和相應(yīng)程序運算使用。這個框架只是為了大數(shù)據(jù)量所開發(fā)的通用通信設(shè)計,我們實際最后整車所用的數(shù)據(jù)大體在30多個數(shù)據(jù),我們可以將流程簡化一步,將第二步數(shù)據(jù)類型和第三步數(shù)據(jù)正負(fù)值,整合在同一個數(shù)據(jù)內(nèi)發(fā)送出去。這樣系統(tǒng)在長周期內(nèi),控制頻率更高了,控制性能指標(biāo)提升了。

圖1
實驗過程
上面我們分析了理論設(shè)計思想,下面我們來用實踐來一步步完善程序調(diào)試。
藍(lán)牙連接調(diào)試
我們首先要連接藍(lán)牙保證通訊媒介的正常使用。藍(lán)牙調(diào)試主要有藍(lán)牙命名、密碼設(shè)定、工作頻率設(shè)定、主從機(jī)設(shè)定等。這些相關(guān)設(shè)定我們通過AT指令來完成,設(shè)定藍(lán)牙完成后,藍(lán)牙能過正常連接在一起。再連接完成后,我們進(jìn)行簡單數(shù)據(jù)的傳輸,測試通信能正常完成。調(diào)試完成進(jìn)入第二步。
數(shù)據(jù)接收調(diào)試
通過設(shè)計程序使得我們能控制此時發(fā)送數(shù)據(jù)的值,通過將發(fā)送數(shù)據(jù)顯示在顯示屏上,檢查數(shù)值與我們發(fā)送的數(shù)據(jù)相同。數(shù)據(jù)是相互對傳的,在接收進(jìn)行簡單計算返回數(shù)據(jù),進(jìn)行顯示對比數(shù)據(jù)沒有異常。要長時間通信,檢測通訊數(shù)據(jù)在長期工作下不出現(xiàn)錯誤。完成測試后,進(jìn)入下一步。
通信程序調(diào)試
編寫完整的通信程序,依次測試每個數(shù)據(jù)的傳輸和解算整合,并將每個數(shù)據(jù)發(fā)送到顯示屏,逐個檢查沒有出現(xiàn)錯誤傳輸或異常現(xiàn)象。在正常工作情況下完成測試后,進(jìn)行異常工作測試。將通訊設(shè)備移到通訊的極限距離外一段時間,再拿回連接,記錄設(shè)備重連后的接收數(shù)據(jù),對比數(shù)據(jù)能夠恢復(fù)正常通訊的數(shù)據(jù)。完成全部測試,證明程序設(shè)計沒有錯誤,可以使用該程序進(jìn)行工作。
總結(jié)
我們通過設(shè)計通信程序,對數(shù)據(jù)進(jìn)行分類、拆分等手段,并依次發(fā)送數(shù)據(jù)。從而,利用小數(shù)據(jù)發(fā)送的藍(lán)牙完成了大數(shù)據(jù)量的發(fā)送,完成對車子整體控制和相關(guān)環(huán)境因素的測量。
附錄:部分程序代碼
發(fā)送數(shù)據(jù)的選擇程序第一段無降頻處理
if(fangsongshunxu==0)
       {
          sci_int_send(sudu);
       }
       if(fangsongshunxu==1)
       {
          sci_int_send(zhuanxiang);
       }
       if(fangsongshunxu==2)
       {
          sci_int_send(sxtzuoyou);
       }
       if(fangsongshunxu==3)
       {
          sci_int_send(sxtfuyang);
       }
       if(fangsongshunxu==4)
       {
          sci_int_send(dangwei);
       }
       if(fangsongshunxu==5)
       {
          sci_int_send(sxtqijiang);
       }
       if(fangsongshunxu==6)
       {
          sci_int_send(canshutiaozheng);
          canshutiaozheng=0;
       }
       if(fangsongshunxu==7)
       {
          sci_int_send(moshi);
       }
       if(fangsongshunxu==8)
       {
          sci_int_send(shuzhijiao);
       }
       fangsongshunxu=fangsongshunxu+1;
       if(fangsongshunxu>8)
       {
         fangsongshunxu=0;
       }
通過fangsong變量的值降低發(fā)送頻率
if(fangsongshunxu==0&&fangsong==0)
       {
          sci_int_send(chejiao);
          fangsong=1;
       }
       if(fangsongshunxu==1&&fangsong==0)
       {
          sci_int_send(gdzxp);
          fangsong=1;
       }
       if(fangsongshunxu==2&&fangsong==0)
       {
          sci_int_send(gdzxd);
          fangsong=1;
       }
       if(fangsongshunxu==3&&fangsong==0)
       {
          sci_int_send(gdsudu);
          fangsong=1;
       }
       if(fangsongshunxu==4&&fangsong==0)
       {
          sci_int_send(jiaosuduyushe);
          fangsong=1;
       }
        if(fangsongshunxu==5&&fangsong==0)
       {
          sci_int_send(G);
          fangsong=1;
       }
       if(fangsongshunxu==6&&fangsong==0)
       {
          sci_int_send(zxzhongzhi);
          fangsong=1;
       }
       if(fangsongshunxu==7&&fangsong==0)
       {
          sci_int_send(yutaizhongzhi);
          fangsong=1;
       }
       if(fangsongshunxu==8&&fangsong==0)
       {
          sci_int_send(sxtfuyangzz);
          fangsong=1;
       }
       if(fangsongshunxu==9&&fangsong==0)
       {
          sci_int_send(wendu);
          fangsong=1;
       }

       if(fangsongshunxu>9)
       {
         fangsongshunxu=0;
       }
//串口發(fā)送//
//---------------------------------------------------------------------
// 函數(shù)功能:UART0_Init初始化
// 形式參數(shù):  無
// 函數(shù)返回值:無   
//---------------------------------------------------------------------
void UART0_Init(void)
{
  SCI0CR1 = 0x00;
  SCI0CR2 = 0x2C;     //接收中斷使能,發(fā)送接收使能
  SCI0BD  = 0x2b;     //波特率配置成115200
                      //When IREN = 0 then
                      //SCI baud rate = SCI bus clock / (16 x SBR[12:0])
}
//---------------------------------------------------------------------
// 函數(shù)功能:SCI0發(fā)送一個字節(jié)數(shù)據(jù)
// 形式參數(shù):  byte ch:發(fā)送的一個字節(jié)數(shù)據(jù)
// 函數(shù)返回值:無   
//---------------------------------------------------------------------
void UART0_SendByte(byte ch)
{
  while(!(SCI0SR1&0x80));
  SCI0DRL = ch;
}
//---------------------------------------------------------------------
// 函數(shù)功能:SCI0發(fā)送字符串?dāng)?shù)據(jù)
// 形式參數(shù):   byte *pBuff     發(fā)送緩沖區(qū)
//              int Length 發(fā)送字節(jié)的長度
// 函數(shù)返回值:無   
//---------------------------------------------------------------------
void UART0_SendPacket(byte *pBuf,int pBuf_Length)
{
  int i;
  for(i=0;i<pBuf_Length;i++)
  {
    while(!(SCI0SR1&0x80));
    SCI0DRL=*(pBuf+i);
  }
}
//---------------------------------------------------------------------
// 函數(shù)功能:SCI0接受字符串?dāng)?shù)據(jù)
// 函數(shù)返回值:無符號  
//---------------------------------------------------------------------
unsigned char SCI_0Read(void)
{
    if(SCI0SR1_RDRF==1)     
      {
        SCI1SR1_RDRF=1;   
        return SCI0DRL;     
      }
}
//---------------------------------------------------------------------
通信協(xié)議程序部分
拆分高低字節(jié),將位數(shù)較高的數(shù)據(jù)化為兩個低位數(shù)據(jù)
正負(fù)數(shù)判斷和處理(中間部分括號內(nèi)程序為數(shù)據(jù)類型選擇)
//---------------------------------------------------------------------
void sci_int_send(int num)
{
    unsigned char dath,datl;
    if(num<0)
    {
       datl=(uchar)(~num&0x00ff);//拆低字節(jié)
       dath=(uchar)(~num>>8);//拆高字節(jié)
       while(!(SCI0SR1&0x80));
           SCI0DRL=255;
       if(fangsongshunxu==0)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=2;
       }
       if(fangsongshunxu==1)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=3;
       }
       if(fangsongshunxu==2)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=4;
       }
       if(fangsongshunxu==3)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=5;
       }
       if(fangsongshunxu==4)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=6;
       }
       if(fangsongshunxu==5)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=7;
       }
       if(fangsongshunxu==6)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=8;
       }
       if(fangsongshunxu==7)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=9;
       }
       if(fangsongshunxu==8)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=10;
       }
       while(!(SCI0SR1&0x80));
           SCI0DRL=1;
       while(!(SCI0SR1&0x80));
           SCI0DRL=dath;
       while(!(SCI0SR1&0x80));
           SCI0DRL=datl;
    }
    else
    {
       datl=(uchar)(num&0x00ff);//拆低字節(jié)
       dath=(uchar)(num>>8);//拆高字節(jié)
       while(!(SCI0SR1&0x80));
           SCI0DRL=255;
       if(fangsongshunxu==0)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=2;
       }
       if(fangsongshunxu==1)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=3;
       }
       if(fangsongshunxu==2)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=4;
       }
       if(fangsongshunxu==3)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=5;
       }
       if(fangsongshunxu==4)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=6;
       }
       if(fangsongshunxu==5)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=7;
       }
       if(fangsongshunxu==6)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=8;
       }
       if(fangsongshunxu==7)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=9;
       }
       if(fangsongshunxu==8)
       {
         while(!(SCI0SR1&0x80));
             SCI0DRL=10;
       }
       while(!(SCI0SR1&0x80));
           SCI0DRL=0;
       while(!(SCI0SR1&0x80));
           SCI0DRL=dath;
       while(!(SCI0SR1&0x80));
           SCI0DRL=datl;
    }
}

終端部分通信逆運算,算出各種數(shù)據(jù)的值
/*************************中斷服務(wù)程序***************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 20 sci0(void)
{
   if(SCI0SR1_RDRF==1)     
      {
        SCI1SR1_RDRF=1;   
        shuju= SCI0DRL;     
      }
   if(shuju==255&&zhunbei==0)
  {
     kaishi=1;
     zhunbei=1;
  }
  if(kaishi==1)
  {
    if(shuju==2)
    {
      chezijiaodusj=1;
      zhengfu=1;
      kaishi=0;
    }
    if(shuju==3)
    {
      gdzxpsj=1;
      zhengfu=1;
      kaishi=0;
    }
    if(shuju==4)
    {
      gdzxdsj=1;
      zhengfu=1;
      kaishi=0;
    }
    if(shuju==5)
    {
      sudupsj=1;
      zhengfu=1;
      kaishi=0;
    }
    if(shuju==6)
    {
      suduisj=1;
      zhengfu=1;
      kaishi=0;
    }
    if(shuju==7)
    {
      sududsj=1;
      zhengfu=1;
      kaishi=0;
    }
    if(shuju==8)
    {
      zxzhongzhisj=1;
      zhengfu=1;
      kaishi=0;
    }
    if(shuju==9)
    {
      yutaizhongzhisj=1;
      zhengfu=1;
      kaishi=0;
    }
    if(shuju==10)
    {
      sxtfuyangzzsj=1;
      zhengfu=1;
      kaishi=0;
    }
    if(shuju==11)
    {
      wendusj=1;
      zhengfu=1;
      kaishi=0;
    }
  }
  if(chezijiaodusj==1&&dushu==1)//車子角度
  {
     if(diyici==1)
     {
       datal=shuju;
       diyici=0;
       zhenghe=1;
     }
     if(diyici==0&&zhenghe==0)
     {
        datah=shuju;
        diyici=1;  
     }
     if(zhenghe==1)
     {
        chezijiaodu=datah*256+datal;
        if(zhengshu==1)
        {
          chezijiaodu=0-chezijiaodu;
        }
        zhenghe=0;
        dushu=0;
        zhunbei=0;
        chezijiaodusj=0;
     }  
  }
  if(gdzxpsj==1&&dushu==1) //光電P
  {
     if(diyici==1)
     {
       datal=shuju;
       diyici=0;
       zhenghe=1;
     }
     if(diyici==0&&zhenghe==0)
     {
        datah=shuju;
        diyici=1;  
     }
     if(zhenghe==1)
     {
        gdzxp=datah*256+datal;
        if(zhengshu==1)
        {
          gdzxp=0-gdzxp;
        }
        zhenghe=0;
        dushu=0;
        zhunbei=0;
        gdzxpsj=0;
     }  
  }
  if(gdzxdsj==1&&dushu==1) //光電D
  {
     if(diyici==1)
     {
       datal=shuju;
       diyici=0;
       zhenghe=1;
     }
     if(diyici==0&&zhenghe==0)
     {
        datah=shuju;
        diyici=1;  
     }
     if(zhenghe==1)
     {
        gdzxd=datah*256+datal;
        if(zhengshu==1)
        {
          gdzxd=0-gdzxd;
        }
        zhenghe=0;
        dushu=0;
        zhunbei=0;
        gdzxdsj=0;
     }  
  }
  if(sudupsj==1&&dushu==1)//速度P
  {
     if(diyici==1)
     {
       datal=shuju;
       diyici=0;
       zhenghe=1;
     }
     if(diyici==0&&zhenghe==0)
     {
        datah=shuju;
        diyici=1;  
     }
     if(zhenghe==1)
     {
        sudup=datah*256+datal;
        if(zhengshu==1)
        {
          sudup=0-sudup;
        }
        zhenghe=0;
        dushu=0;
        zhunbei=0;
        sudupsj=0;
     }  
  }
  if(suduisj==1&&dushu==1)//速度P
  {
     if(diyici==1)
     {
       datal=shuju;
       diyici=0;
       zhenghe=1;
     }
     if(diyici==0&&zhenghe==0)
     {
        datah=shuju;
        diyici=1;  
     }
     if(zhenghe==1)
     {
        sudui=datah*256+datal;
        if(zhengshu==1)
        {
          sudui=0-sudui;
        }
        zhenghe=0;
        dushu=0;
        zhunbei=0;
        suduisj=0;
     }  
  }
  if(sududsj==1&&dushu==1)//速度P
  {
     if(diyici==1)
     {
       datal=shuju;
       diyici=0;
       zhenghe=1;
     }
     if(diyici==0&&zhenghe==0)
     {
        datah=shuju;
        diyici=1;  
     }
     if(zhenghe==1)
     {
        sudud=datah*256+datal;
        if(zhengshu==1)
        {
          sudud=0-sudud;
        }
        zhenghe=0;
        dushu=0;
        zhunbei=0;
        sududsj=0;
     }  
  }
  if(zxzhongzhisj==1&&dushu==1) //轉(zhuǎn)向中值
  {
     if(diyici==1)
     {
       datal=shuju;
       diyici=0;
       zhenghe=1;
     }
     if(diyici==0&&zhenghe==0)
     {
        datah=shuju;
        diyici=1;  
     }
     if(zhenghe==1)
     {
        zxzhongzhi=datah*256+datal;
        if(zhengshu==1)
        {
          zxzhongzhi=0-zxzhongzhi;
        }
        zhenghe=0;
        dushu=0;
        zhunbei=0;
        zxzhongzhisj=0;
     }  
  }
  if(yutaizhongzhisj==1&&dushu==1)//云臺中值
  {
     if(diyici==1)
     {
       datal=shuju;
       diyici=0;
       zhenghe=1;
     }
     if(diyici==0&&zhenghe==0)
     {
        datah=shuju;
        diyici=1;  
     }
     if(zhenghe==1)
     {
        yutaizhongzhi=datah*256+datal;
        if(zhengshu==1)
        {
          yutaizhongzhi=0-yutaizhongzhi;
        }
        zhenghe=0;
        dushu=0;
        zhunbei=0;
        yutaizhongzhisj=0;
     }  
  }
  if(sxtfuyangzzsj==1&&dushu==1) //攝像頭中值
  {
     if(diyici==1)
     {
       datal=shuju;
       diyici=0;
       zhenghe=1;
     }
     if(diyici==0&&zhenghe==0)
     {
        datah=shuju;
        diyici=1;  
     }
     if(zhenghe==1)
     {
        sxtfuyangzz=datah*256+datal;
        if(zhengshu==1)
        {
          sxtfuyangzz=0-sxtfuyangzz;
        }
        zhenghe=0;
        dushu=0;
        zhunbei=0;
        sxtfuyangzzsj=0;
     }  
  }
  if(wendusj==1&&dushu==1)//溫度
  {
     if(diyici==1)
     {
       datal=shuju;
       diyici=0;
       zhenghe=1;
     }
     if(diyici==0&&zhenghe==0)
     {
        datah=shuju;
        diyici=1;  
     }
     if(zhenghe==1)
     {
        wendu=datah*256+datal;
        if(zhengshu==1)
        {
          wendu=0-wendu;
        }
        zhenghe=0;
        dushu=0;
        zhunbei=0;
        wendusj=0;
     }  
  }
  if(shuju==0&&zhengfu==1)
  {
     zhengshu=0;
     zhengfu=0;
     dushu=1;
  }
  if(shuju==1&&zhengfu==1)
  {
     zhengshu=1;
     zhengfu=0;
     dushu=1;
  }
}







歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1