XBeeを用いた無線通信 dsPIC入門講座06
開発環境
基盤
- SPPBoard(dsPIC30F3014使用)
コンパイラ
- C30
XBee
- XB24-Z7PIT-004
はじめに
XBeeの通信方式はシリアル通信なのでdsPICのUARTに直結することができます。
そこで、今回はXBeeによるdsPIC/PC間通信を題材にUARTを用いてシリアル通信を実装する方法について解説したいと思います。
dsPIC - XBee(A) <--> XBee(B) - PC
XBeeはXB24-Z7PIT-004(PCBアンテナタイプ)を使用します。
UARTとは
単位時間あたり1bitずつ送られてくるシリアルデータをその都度シフトして適当なパラレルデータに変換する回路のことです。
回路の基礎知識
RX: 受信
TX: 送信
dsPIC側のXBee
UART2の端子を使用します。

PC側のXBee
PCからXBeeへの接続方法はUSBで接続するだけで済むようにしたいと思います。
そのために今回はFT232RL_MODULEという変換モジュールを使用します。
これはUSBの信号をXBeeに接続可能なTLLレベルに変換してくれるものです。
FT232RL_MODULE  <-->  XBee
1  TXD          <-->  3  DIN/-CONFIG
5  RXD          <-->  2  DOUT
24 GND          <-->  10 GND
19 3V3          <-->  1  VCC
XBeeの設定
PC側のXBee
ボーレート  115200bps
FunctionSet ZIGBEECOORDINATOR AT
PANID       500
DH          13A200
DL          406E8886
dsPIC側のXBee
ボーレート  115200bps
FunctionSet ZIGBEEROUTER AT
PANID       500
DH          13A200
DL          40625D41
サンプルプログラム
C30コンパイラのバグでUARTで使用するピンはこちら側で定義する必要があります。
#define UART_RX_TX 0xFBE7
#define UART_ALTRX_ALTTX 0xFFE7
(注)dsPIC30F3014はuart.hに上の定義がありません。
送信完了待ち関数
void WaitSendString(const short UartChannel){
    switch(UartChannel){
        case UART1:
            while(BusyUART1());
            break;
        case UART2:
            while(BusyUART2());
            break;
    }
}
- BusyUARTx() - 送信中なら1、送信完了なら0を返す 
データ送信関数
void SendString(const short UartChannel, unsigned int *string){
    switch(UartChannel){
        case UART1:
            putsUART1(string);
            break;
        case UART2:
            putsUART2(string);
            break;
    }
    WaitSendString(UartChannel);
}
受信完了待ち関数
void WaitGetString(const short UartChannel){
    switch(UartChannel){
        case UART1:
            while(!DataRdyUART1());
            break;
        case UART2:
            while(!DataRdyUART2());
            break;
    }
}
- DataRdyUARTx() - 受信中なら0、受信完了なら1を返す 
コマンド受信関数
char *GetCommand(const short UartChannel){
    unsigned char moji;
    int count = 0;
    static char string[MAX_UARTWORD];
    WaitGetString(UartChannel);
    switch(UartChannel){
        case UART1:
            moji = ReadUART1();
            break;
        case UART2:
            moji = ReadUART2();
            break;
    }
    while((moji != '\r') && (count < MAX_UARTWORD)){
        string[count] = moji;
        count++;
        WaitGetString(UartChannel);
        switch(UartChannel){
            case UART1:
                moji = ReadUART1();
                break;
            case UART2:
                moji = ReadUART2();
                break;
        }
    }
    string[count] = 0x00;
    return string;
}
- ReadUARTx() 1文字の受信関数
UART初期化関数
void UartInitFunc(void){
    unsigned int config1 = UART_EN & UART_IDLE_CON & UART_ALTRX_ALTTX & 
        UART_NO_PAR_8BIT & UART_1STOPBIT & UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD;
    unsigned int config2 = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE & 
        UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;
    OpenUART1(config1, config2, 10);
    OpenUART2(config1, config2, 10); //115kbps
    /*受信割り込み禁止、送信割り込み禁止*/
    ConfigIntUART1(UART_RX_INT_DIS & UART_TX_INT_DIS);
    ConfigIntUART2(UART_RX_INT_DIS & UART_TX_INT_DIS);
}
- OpenUARTx(unsigned int config1, unsigned int config2, unsigned int ubrg) - ubrg(UxBRG) = FCY / (16 * BaudRate) - 1 - FCYとはFOSCを1/2倍したものです。 - FOSCは実際の命令周波数なので、クロック生成部分で出力される周波数の1/2となります。(PICは2つのクロックで1個の命令が実行されるため) - システムクロック80MHzで115kbpsのボーレートを得たい場合 UxBRG = 20000 / (16 * 115) - 1 UxBRG = 0.987 ubrgに10を渡せば良いことがわかります。
- UART_EN or UART_DIS - UARTモジュールを有効/無効 
- UART_IDLE_CON or UART_IDLE_STOP - アイドル中動作継続/停止 
- UART_ALTRX_ALTTX or UART_RX_TX - 代替/通常ピンを使用 
- UART_NO_PAR_9BIT or UART_ODD_PAR_8BIT or UART_EVEN_PAR_8BIT or UART_NO_PAR_8BIT - 9ビットデータ + パリティなし - 8ビットデータ + 奇数パリティ - 8ビットデータ + 偶数パリティ - 8ビットデータ + パリティなし - 念のためパリティビットについての復習 パリティビットとはデータが正常に送られたかを検査するために使用されるビットです。 偶数パリティ、奇数パリティの2種類が存在し、これは送信するデータの1の数が偶数または奇数になるようにパリティビットで調整されます。 (例) 1000 0010 'A'というASCIIコードを送信する 偶数パリティ 1000 00100 奇数パリティ 1000 00101
- UART_2STOPBITS or UART_1STOPBIT - ストップビット長を2ビット/1ビットに設定 
- UART_DIS_WAKE - SLEEP中にスタートビットが来た時のウェイクアップを有効化 
- UART_EN_LOOPBACK or UART_DIS_LOOPBACK - ループバックモード(送信したデータを自分に戻してテストする機能)を有効/無効 
- UART_EN_ABAUD or UART_DIS_ABAUD - ボーレートの自動検出を有効/無効 
- UART_INT_TX_BUF_EMPTY or UART_INT_TX - 送信バッファが完全に空になったら/空きがあれば割り込む 
- UART_TX_PIN_NORMAL or UART_TX_PIN_LOW - 通常動作/ブレーク - ブレーク信号とは中断信号のことです。 通信を強制的に中断して初期状態に戻したりする際に用いられます。
- UART_TX_ENABLE or UART_TX_DISABLE - 送信有効/無効 
- UART_INT_RX_CHAR - 文字を受信する度に割り込む 
- UART_ADR_DETECT_DIS - アドレス文字を検出しない 
- UART_RX_OVERRUN_CLEAR - オーバーランした場合はビットクリアする 
以上でUARTを用いたシリアル通信のサンプルプログラムの完成です。
blog comments powered by Disqus
Published
Category
SPPBoardTags
Profile
千葉工大産のロボットナビゲーションエンジニア
ros-jpの勉強会の主催やロボカップ世界大会優勝チームのリーダをやってました。
badge_description about badge's
総訪問者数
ツイート