SlideShare a Scribd company logo
1 of 41
Bluetooth通信の
仕組みと活用法紹介
   2012.Aug.5th Takehiko YOSHIDA
                        twitter: @chihayafuru
              URL: http://www.chihayafuru.jp
アジェンダ
通信ハードウェア構成
フロー制御
電文フォーマット
NXTブロック ハードウェア仕様
メインプロセッサ: Atmel 32bit ARM processor
  256KB FLASH / 64KB RAM / 48MHz
サブプロセッサ: Atmel 8bit AVR processor
  4KB FLASH / 512KB RAM / 8MHz
Bluetoothチップ:
   CSR BlueCore 4 v2.0 + EDR System
  シリアルポートプロファイル(SPP)サポート
  内部RAM 47KBytes
  外部FLASH 8MBit
  26MHz
NXT通信 ブロック図
                  PC                                  NXT
          User Program                          User Program
      (Communication Protocol)                   (nxtOSEK)
仮想                                                                     SIO
COM                                                                  (UART)
      Bluetooth
         OS             USB                   USB
      Interface        Driver                Driver
                                                        Bluetooth
      Bluetooth                                          Hardware
        Driver                                            Driver
                                   USB                  (BlueCore)
      Bluetooth
       Dongle                    Bluetooth
オシロスコープによる信号波形観測
最小のシリアル通信配線



データ送信        データ送信


データ受信        データ受信




グラウンド        グラウンド
『フロー制御』
 って何?
無手順(フロー制御なし)

              くそ、自分のペースで
                話しやがって!
 ちゃんと          メモし損ねたけど
メモしろよ!            諦めよ…




    送信ノード   受信ノード
フロー制御あり

              話していいぞ!




送信ノード                   受信ノード
        実は…
ハードウェアフロー制御配線

データ送信      データ送信


データ受信      データ受信


送信要求       送信要求


送信可能       送信可能


グラウンド      グラウンド
NxtLoggerキャプチャ画面

    “DSR”って何?
DCEを中継した通信
データ端末装置                          データ端末装置
  (DTE)                            (DTE)



                CTS / RTS



  DSR / DTR   公衆通信回線網            DSR / DTR




  データ回線終端装置                 データ回線終端装置
      (DCE)                     (DCE)
シリアル通信 I/O名称
短縮名   方向           英語名                   意味


TxD   OUT   Transmit Exchange Data     送信データ

RxD   IN    Receive Exchange Data      受信データ

RTS   OUT      Request To Send         送信要求

CTS   IN        Clear To Send           送信可

DTR   OUT    Data Terminal Ready     データ端末レディ

DSR   IN        Data Set Ready       データ・セット・レディ
NXTハードウェア インターフェース




       引用: LEGO Mindstorms NXT Bluetooth Developer Kit
【PC】H/Wフロー制御コード nxtLogger
                                              LogPort.cs
88.   // シリアルポート番号設定
89.   this.PortName = portName;
90.
91.   // ポートのオープン制御
92.   this.Open();
                                        初期状態は
93.                               false(送信禁止)のため、
94.   // 受信バッファの破棄                    このコードは必須
95.   this.DiscardInBuffer();
96.
97.   // ハードウェアフロー制御
98.   this.DtrEnable = true;
99.   this.RtsEnable = true;
【NXT】H/Wフロー制御コード nxtOSEK
                                                    bt.c
88. void bt_init(void)
89. {
90. U8 trash;
91. U32 trash2;
92. in_buf_in_ptr = out_buf_ptr = 0;
93. in_buf_idx = 0;
94.
95. *AT91C_PMC_PCER = (1 << AT91C_PERIPHERAL_ID_US1);
96.
97. *AT91C_PIOA_PDR = BT_RX_PIN | BT_TX_PIN |
    BT_SCK_PIN | BT_RTS_PIN | BT_CTS_PIN;
98. *AT91C_PIOA_ASR = BT_RX_PIN | BT_TX_PIN |
    BT_SCK_PIN | BT_RTS_PIN | BT_CTS_PIN;
電文
フォーマット
バイナリダンプ
サンプルコード 電文フォーマット
オフセット

 +0000   0x20   ヘッダー部
 +0001   0x00   (ペイロード長)
 +0002   0x3F
 +0003   0x10   ペイロード部
 途中省略           (データー本体)
 +0033   0x72
電文の生成

送信処理
【NXT】電文生成部コード nxtOSEK
                                                       ecrobot_interface.c
318. U32 ecrobot_send_bt_packet(U8 *buf, U32 bufLen)
319. {
320.     SINT i;

321.     if (bt_status == BT_STREAM && bufLen <= BT_MAX_TX_BUF_SIZE-2)
322.             {
323.             sendBuf[0] = (U8) (bufLen & 0xFF);
324.             sendBuf[1] = (U8) ((bufLen >> 8) & 0xFF);
325.             for(i = 0; i < bufLen; i++)
326.             {
327.                     sendBuf[i+2] = buf[i];
328.             }
329.             bt_write(&sendBuf[0], 0, bufLen+2);
330.             return bufLen;
331.             }
332.             return 0;                       ※ソースコードの一部を省略
333. }
リトル
エンディアン
 って何?
エンディアネスの説明
           10進数: 32

    Int型(2byte)16進数: 0x0020
                    バイト単位に分割
            0x00   0x20
オフセット

 +0000   0x20      +0000   0x00
 +0001   0x00      +0001   0x20
下位バイトマスク処理
  sendBuf[0] = (U8) (bufLen & 0xFF);

             16進数表記         2進数表記

 bufLen       0x1234   0001 0010 0011 0100

   0xFF       0x00FF   0000 0000 1111 1111

sendBuf[0]    0x0034   0000 0000 0011 0100
上位バイトマスク処理
sendBuf[1] = (U8) ((bufLen >> 8) & 0xFF);

             16進数表記         2進数表記

 bufLen       0x1234   0001 0010 0011 0100

bufLen>>8     0x0012   0000 0000 0001 0010

   0xFF       0x00FF   0000 0000 1111 1111

sendBuf[0]    0x0034   0000 0000 0011 0100
上位バイトマスク処理
sendBuf[1] = (U8) ((bufLen >> 8) & 0xFF);

             16進数表記         2進数表記

 bufLen       0x1234   0001 0010 0011 0100

bufLen>>8     0x0012   0000 0000 0001 0010

   0xFF       0x00FF   0000 0000 1111 1111

sendBuf[0]    0x0034   0000 0000 0011 0100
論理シフト(unsigned int)の場合

10進表記           16進数表記         2進数表記

43776            0xAB00   1010 1011 0000 0000

        1/256                        8ビット右シフト


 171             0x00AB   0000 0000 1010 1011
算術シフト(signed int)の場合

10進表記          16進数表記         2進数表記

-21760          0xAB00   1010 1011 0000 0000

       1/256                        8ビット右シフト


 -85            0xFFAB   1111 1111 1010 1011
コンテナ部データ構成
オフセット     データ    オフセット    データ   オフセット   データ    オフセット   データ



  0                8             16             24
                                                       ADC2
  1                9             17             25
        システム時刻           モータ0           モータ2
         (ミリ秒)           カウンタ           カウンタ
  2               10             18             26
                                                       ADC3
  3               11             19             27

  4      データ1     12             20             28
                                        ADC0
  5      データ2     13             21             29
                         モータ1
                                                       I2C
                         カウンタ
  6               14             22             30
        バッテリーレ
                                        ADC1
          ベル
  7               15             23             31
【NXT】コンテナ部生成部コード (nxtOSEK)
                                                                 ecrobot_interface.c
735. void ecrobot_bt_data_logger(S8 data1, S8 data2)
736. {
737.     U8 data_log_buffer[32];

738.     *((U32   *)(&data_log_buffer[0]))    =   (U32)systick_get_ms();
739.     *(( S8   *)(&data_log_buffer[4]))    =    (S8)data1;
740.     *(( S8   *)(&data_log_buffer[5]))    =    (S8)data2;
741.     *((U16   *)(&data_log_buffer[6]))    =   (U16)ecrobot_inputs.battery_state;
742.     *((S32   *)(&data_log_buffer[8]))    =   (S32)nxt_motor_get_count(0);
743.     *((S32   *)(&data_log_buffer[12]))   =   (S32)nxt_motor_get_count(1);
744.     *((S32   *)(&data_log_buffer[16]))   =   (S32)nxt_motor_get_count(2);
745.     *((S16   *)(&data_log_buffer[20]))   =   (S16)sensor_adc(0);
746.     *((S16   *)(&data_log_buffer[22]))   =   (S16)sensor_adc(1);
747.     *((S16   *)(&data_log_buffer[24]))   =   (S16)sensor_adc(2);
748.     *((S16   *)(&data_log_buffer[26]))   =   (S16)sensor_adc(3);
749.     *((S32   *)(&data_log_buffer[28]))   =   (S32)getDistance();
750.
751.     ecrobot_send_bt_packet(data_log_buffer, 32);
752. }
                                  『リトル・エンディアン』前提の移植性の低いコード
電文の解析

受信処理
【PC】コンテナ部解析部コード (nxtLogger)
                                                  LogMessage.cs
248.// パケットをフィールドに変換
249.this.sysTick = BitConverter.ToUInt32(packetPayload, 0);
250.this.dataLeft = (SByte)packetPayload[4];
251.this.dataRight = (SByte)packetPayload[5];
252.this.batt = BitConverter.ToUInt16(packetPayload, 6);
253.this.motorCnt0 = BitConverter.ToInt32(packetPayload, 8);
254.this.motorCnt1 = BitConverter.ToInt32(packetPayload, 12);
255.this.motorCnt2 = BitConverter.ToInt32(packetPayload, 16);
256.this.sensorAdc0 = BitConverter.ToInt16(packetPayload, 20);
257.this.sensorAdc1 = BitConverter.ToInt16(packetPayload, 22);
258.this.sensorAdc2 = BitConverter.ToInt16(packetPayload, 24);
259.this.sensorAdc3 = BitConverter.ToInt16(packetPayload, 26);
260.this.i2c = BitConverter.ToInt32(packetPayload, 28);
BitConverterクラス
• 基本データ型をバイト配列に、バイト配列を基本
  データ型に変換します。
• BitConverter.ToUInt16() unsigned型
• BitConverter.ToUInt16() signed型
• Intel系CPUはリトル・エンディアンのため
  BitConverterクラスもリトル・エンディアンで
  動作します。
• 非Intel系CPU(ビッグ・エンディアン)への移植の
  可能性があるのであれば、
  BitConverter.IsLittleEndianフィールドのTrue/False
  で判定してバイト列を反転しましょう!
Bluetooth通信の留意事項
        • 受信モードから送信モードに切り替わるとき約30ミリ秒の遅れが生じる
        • 大きなデータパケットを受信する場合、ARMプロセッサとの間に短時間の
H/W制約     遅延(small timing difference)が発生する。



        • 電文の途中にで送受信の一時停止が発生する。
        • 電文と電文の間のタイムラグ(休止時間)が短くなる。
 影響


        • 1つの電文を2回以上のデータ受信処理(APIコール)に分割して受信する。
        • 1回のデータ受信処理(API)で2つ以上の電文を受け取ってしまう。
 結果
電文受信 ステートマシン図
        [受信バイト == 開始コード(0x20, 0x00)]




       電文待ち                   電文受信
初期状態


            [受信バイト数 == 電文長]
電文受信 状態遷移表

     イベント              受信バイト
                                      受信バイト数
状態           開始コード                     == 電文長
                               その他
            (0x20, 0x00)


電文待ち         電文受信              電文待ち    電文待ち




電文受信         電文受信              電文受信    電文待ち
【PC】受信バイト列を1バイトに分割するコード
                                        Form1.cs
99. /// <summary>
100. /// (メインスレッドの)ログデータ受信
101. /// </summary>
102. /// <param name="mes">データ</param>
103. private void messegeReceive(Byte[] mes)
104. {
105.     for (int i = 0; i < mes.Length; i++)
106.     {
107.         log.Append(mes[i]);
108.     }     電文の先頭を見つけるために一旦、1バイトずつに分割
109. }            Byte[0]が電文の先頭とは限らない!!!
【PC】状態遷移(分岐)処理
                                                   LogMessage.cs
216.   public void Append(Byte dat)
217.   {
218.       // パケットヘッダー部
219.       if (byteNo < PacketHeaderLen)
220.       {
221.            // 順送りでパケットヘッダー配列へ保存              状態遷移の『電文待ち』
222.            packetHeader[byteNo++] = dat;
223.            // 中略
224.       }
225.       // パケットペイロード(ヘッダーを除いた本体部)
226.       else if (byteNo < PacketLen)
227.       {                                       状態遷移の『電文受信』
228.            // 中略
229.       }
230.       else     // byteNo >= PacketLenは設計の想定外
231.       {                                       状態遷移の設計外
232.            byteNo = 0;
233.       }
234.   }
                                                  ※ソースコードの一部を省略
【PC】電文ヘッダー判定処理
                                                      LogMessage.cs
211.   // 順送りでパケットヘッダー配列へ保存
212.   packetHeader[byteNo++] = dat;
213.
214.   if (byteNo == PacketHeaderLen)
215.   {
216.     // パケットヘッダー(パケットサイズ)のチェック
217.     // NXTから送信されるパケットサイズにはヘッダの2バイト分は含まれない
218.     UInt16 len = BitConverter.ToUInt16(packetHeader, 0);
219.
220.       if (len != PacketPayloadLen)
221.       {
222.         // パケット仕様: ヘッダー = ペイロードサイズ
223.         // 想定したヘッダー値でなければ1バイト分を読み捨てる
224.         packetHeader[0] = packetHeader[1];
225.         byteNo = 1;
226.       }
227.   }
ご静聴ありがとうございます

More Related Content

What's hot

プレゼンテーション用資料作成のプレゼンテーション資料
プレゼンテーション用資料作成のプレゼンテーション資料プレゼンテーション用資料作成のプレゼンテーション資料
プレゼンテーション用資料作成のプレゼンテーション資料hiroshioda
 
データサイエンティスト養成読本の解説+書き忘れたこと
データサイエンティスト養成読本の解説+書き忘れたことデータサイエンティスト養成読本の解説+書き忘れたこと
データサイエンティスト養成読本の解説+書き忘れたことTokoroten Nakayama
 
Power BI を提案してみた件
Power BI を提案してみた件Power BI を提案してみた件
Power BI を提案してみた件Teruchika Yamada
 
Slideshareで見つけた「読みやすい・見やすいスライド」に共通する4つのポイント
Slideshareで見つけた「読みやすい・見やすいスライド」に共通する4つのポイントSlideshareで見つけた「読みやすい・見やすいスライド」に共通する4つのポイント
Slideshareで見つけた「読みやすい・見やすいスライド」に共通する4つのポイントTaichi Hirano
 
ビビッド・パワポ・オペーレーション Revision 2015
ビビッド・パワポ・オペーレーション Revision 2015ビビッド・パワポ・オペーレーション Revision 2015
ビビッド・パワポ・オペーレーション Revision 2015Masahito Zembutsu
 
【de:code 2020】 Power Platform いまさら聞けないモデル駆動型アプリケーション
【de:code 2020】 Power Platform いまさら聞けないモデル駆動型アプリケーション【de:code 2020】 Power Platform いまさら聞けないモデル駆動型アプリケーション
【de:code 2020】 Power Platform いまさら聞けないモデル駆動型アプリケーション日本マイクロソフト株式会社
 
SharePoint vs Microsoft Teams vs Office 365 Groups: What Should I Use When?
SharePoint vs Microsoft Teams vs Office 365 Groups: What Should I Use When?SharePoint vs Microsoft Teams vs Office 365 Groups: What Should I Use When?
SharePoint vs Microsoft Teams vs Office 365 Groups: What Should I Use When?Nikkia Carter
 
ID管理/認証システム導入の理想と現実
ID管理/認証システム導入の理想と現実ID管理/認証システム導入の理想と現実
ID管理/認証システム導入の理想と現実Naohiro Fujie
 
Office 365 勉強会「いまさらきけない? SharePoint の基礎のキソ」
 Office 365 勉強会「いまさらきけない? SharePoint の基礎のキソ」 Office 365 勉強会「いまさらきけない? SharePoint の基礎のキソ」
Office 365 勉強会「いまさらきけない? SharePoint の基礎のキソ」Kazuhiko Nakamura
 
現場で役に立たないsudoの使い方
現場で役に立たないsudoの使い方現場で役に立たないsudoの使い方
現場で役に立たないsudoの使い方(^-^) togakushi
 
自己紹介スライドショー201606
自己紹介スライドショー201606自己紹介スライドショー201606
自己紹介スライドショー201606LEFT HAND RULE
 
なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論Tokoroten Nakayama
 
エンジニアのプレゼン資料作成/入門
エンジニアのプレゼン資料作成/入門エンジニアのプレゼン資料作成/入門
エンジニアのプレゼン資料作成/入門iKenji
 
SharePoint Hub Sites について学ぶ
SharePoint Hub Sites について学ぶ SharePoint Hub Sites について学ぶ
SharePoint Hub Sites について学ぶ Ai Hirano
 
今さら聞けないITエンジニアのための管理会計
今さら聞けないITエンジニアのための管理会計今さら聞けないITエンジニアのための管理会計
今さら聞けないITエンジニアのための管理会計Keisuke Tameyasu
 
パワーポイントの品質と生産性を向上させるデザイン・テンプレート
パワーポイントの品質と生産性を向上させるデザイン・テンプレートパワーポイントの品質と生産性を向上させるデザイン・テンプレート
パワーポイントの品質と生産性を向上させるデザイン・テンプレートShinichi Miyagi
 
Power Appsを使って映画の予約や履歴の管理をしてみた
Power Appsを使って映画の予約や履歴の管理をしてみたPower Appsを使って映画の予約や履歴の管理をしてみた
Power Appsを使って映画の予約や履歴の管理をしてみた桑田 紗耶加
 
続・PowerApps に Power BI を埋め込む
続・PowerApps に Power BI を埋め込む続・PowerApps に Power BI を埋め込む
続・PowerApps に Power BI を埋め込むTeruchika Yamada
 
PowerAppsの導入効果と運用化を阻む壁
PowerAppsの導入効果と運用化を阻む壁PowerAppsの導入効果と運用化を阻む壁
PowerAppsの導入効果と運用化を阻む壁Junichi Kodama
 

What's hot (20)

プレゼンテーション用資料作成のプレゼンテーション資料
プレゼンテーション用資料作成のプレゼンテーション資料プレゼンテーション用資料作成のプレゼンテーション資料
プレゼンテーション用資料作成のプレゼンテーション資料
 
データサイエンティスト養成読本の解説+書き忘れたこと
データサイエンティスト養成読本の解説+書き忘れたことデータサイエンティスト養成読本の解説+書き忘れたこと
データサイエンティスト養成読本の解説+書き忘れたこと
 
Markdownもはじめよう
MarkdownもはじめようMarkdownもはじめよう
Markdownもはじめよう
 
Power BI を提案してみた件
Power BI を提案してみた件Power BI を提案してみた件
Power BI を提案してみた件
 
Slideshareで見つけた「読みやすい・見やすいスライド」に共通する4つのポイント
Slideshareで見つけた「読みやすい・見やすいスライド」に共通する4つのポイントSlideshareで見つけた「読みやすい・見やすいスライド」に共通する4つのポイント
Slideshareで見つけた「読みやすい・見やすいスライド」に共通する4つのポイント
 
ビビッド・パワポ・オペーレーション Revision 2015
ビビッド・パワポ・オペーレーション Revision 2015ビビッド・パワポ・オペーレーション Revision 2015
ビビッド・パワポ・オペーレーション Revision 2015
 
【de:code 2020】 Power Platform いまさら聞けないモデル駆動型アプリケーション
【de:code 2020】 Power Platform いまさら聞けないモデル駆動型アプリケーション【de:code 2020】 Power Platform いまさら聞けないモデル駆動型アプリケーション
【de:code 2020】 Power Platform いまさら聞けないモデル駆動型アプリケーション
 
SharePoint vs Microsoft Teams vs Office 365 Groups: What Should I Use When?
SharePoint vs Microsoft Teams vs Office 365 Groups: What Should I Use When?SharePoint vs Microsoft Teams vs Office 365 Groups: What Should I Use When?
SharePoint vs Microsoft Teams vs Office 365 Groups: What Should I Use When?
 
ID管理/認証システム導入の理想と現実
ID管理/認証システム導入の理想と現実ID管理/認証システム導入の理想と現実
ID管理/認証システム導入の理想と現実
 
Office 365 勉強会「いまさらきけない? SharePoint の基礎のキソ」
 Office 365 勉強会「いまさらきけない? SharePoint の基礎のキソ」 Office 365 勉強会「いまさらきけない? SharePoint の基礎のキソ」
Office 365 勉強会「いまさらきけない? SharePoint の基礎のキソ」
 
現場で役に立たないsudoの使い方
現場で役に立たないsudoの使い方現場で役に立たないsudoの使い方
現場で役に立たないsudoの使い方
 
自己紹介スライドショー201606
自己紹介スライドショー201606自己紹介スライドショー201606
自己紹介スライドショー201606
 
なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論
 
エンジニアのプレゼン資料作成/入門
エンジニアのプレゼン資料作成/入門エンジニアのプレゼン資料作成/入門
エンジニアのプレゼン資料作成/入門
 
SharePoint Hub Sites について学ぶ
SharePoint Hub Sites について学ぶ SharePoint Hub Sites について学ぶ
SharePoint Hub Sites について学ぶ
 
今さら聞けないITエンジニアのための管理会計
今さら聞けないITエンジニアのための管理会計今さら聞けないITエンジニアのための管理会計
今さら聞けないITエンジニアのための管理会計
 
パワーポイントの品質と生産性を向上させるデザイン・テンプレート
パワーポイントの品質と生産性を向上させるデザイン・テンプレートパワーポイントの品質と生産性を向上させるデザイン・テンプレート
パワーポイントの品質と生産性を向上させるデザイン・テンプレート
 
Power Appsを使って映画の予約や履歴の管理をしてみた
Power Appsを使って映画の予約や履歴の管理をしてみたPower Appsを使って映画の予約や履歴の管理をしてみた
Power Appsを使って映画の予約や履歴の管理をしてみた
 
続・PowerApps に Power BI を埋め込む
続・PowerApps に Power BI を埋め込む続・PowerApps に Power BI を埋め込む
続・PowerApps に Power BI を埋め込む
 
PowerAppsの導入効果と運用化を阻む壁
PowerAppsの導入効果と運用化を阻む壁PowerAppsの導入効果と運用化を阻む壁
PowerAppsの導入効果と運用化を阻む壁
 

Viewers also liked

Qoncept iBeacon / Bluetooth LE
Qoncept iBeacon / Bluetooth LEQoncept iBeacon / Bluetooth LE
Qoncept iBeacon / Bluetooth LEQoncept, Inc.
 
Open the door of embedded systems to IoT! mruby on LEGO Mindstorms (R)
Open the door of embedded systems to IoT! mruby on LEGO Mindstorms (R)Open the door of embedded systems to IoT! mruby on LEGO Mindstorms (R)
Open the door of embedded systems to IoT! mruby on LEGO Mindstorms (R)Takehiko YOSHIDA
 
Tutorial for robot programming with LEGO mindstorms EV3
Tutorial for robot programming with LEGO mindstorms EV3 Tutorial for robot programming with LEGO mindstorms EV3
Tutorial for robot programming with LEGO mindstorms EV3 Hironobu Fujiyoshi
 
iBeacon を利用したサービス開発のポイント
iBeacon を利用したサービス開発のポイントiBeacon を利用したサービス開発のポイント
iBeacon を利用したサービス開発のポイントdaisuke-a-matsui
 
ブレッドボードの使い方と Arduino に簡単な回路をつける例
ブレッドボードの使い方と Arduino に簡単な回路をつける例ブレッドボードの使い方と Arduino に簡単な回路をつける例
ブレッドボードの使い方と Arduino に簡単な回路をつける例mitunaga
 

Viewers also liked (6)

Qoncept iBeacon / Bluetooth LE
Qoncept iBeacon / Bluetooth LEQoncept iBeacon / Bluetooth LE
Qoncept iBeacon / Bluetooth LE
 
Ibeacon hack4aizu
Ibeacon hack4aizuIbeacon hack4aizu
Ibeacon hack4aizu
 
Open the door of embedded systems to IoT! mruby on LEGO Mindstorms (R)
Open the door of embedded systems to IoT! mruby on LEGO Mindstorms (R)Open the door of embedded systems to IoT! mruby on LEGO Mindstorms (R)
Open the door of embedded systems to IoT! mruby on LEGO Mindstorms (R)
 
Tutorial for robot programming with LEGO mindstorms EV3
Tutorial for robot programming with LEGO mindstorms EV3 Tutorial for robot programming with LEGO mindstorms EV3
Tutorial for robot programming with LEGO mindstorms EV3
 
iBeacon を利用したサービス開発のポイント
iBeacon を利用したサービス開発のポイントiBeacon を利用したサービス開発のポイント
iBeacon を利用したサービス開発のポイント
 
ブレッドボードの使い方と Arduino に簡単な回路をつける例
ブレッドボードの使い方と Arduino に簡単な回路をつける例ブレッドボードの使い方と Arduino に簡単な回路をつける例
ブレッドボードの使い方と Arduino に簡単な回路をつける例
 

Similar to Bluetooth通信の 仕組みと活用法紹介

Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Shinichi Hirauchi
 
20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)Kentaro Ebisawa
 
RouterBOARD with OpenFlow
RouterBOARD with OpenFlowRouterBOARD with OpenFlow
RouterBOARD with OpenFlowToshiki Tsuboi
 
汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル
汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル
汎用LoRaWANセンサノード LSN50 -V2日本語マニュアルCRI Japan, Inc.
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519Yasuhiro Ishii
 
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015CODE BLUE
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
あるブートローダの話
あるブートローダの話あるブートローダの話
あるブートローダの話nullnilaki
 
Flexible 1.36 inch 16*128 SPI SSD1316 Monochrome OLED Screen Module Panel
Flexible 1.36 inch 16*128 SPI SSD1316 Monochrome OLED Screen Module PanelFlexible 1.36 inch 16*128 SPI SSD1316 Monochrome OLED Screen Module Panel
Flexible 1.36 inch 16*128 SPI SSD1316 Monochrome OLED Screen Module PanelShawn Lee
 
PBL1-v1-008j.pptx
PBL1-v1-008j.pptxPBL1-v1-008j.pptx
PBL1-v1-008j.pptxNAIST
 
第1回【CCNA】ネットワーク基礎講座‗なにわTECH道171208
第1回【CCNA】ネットワーク基礎講座‗なにわTECH道171208第1回【CCNA】ネットワーク基礎講座‗なにわTECH道171208
第1回【CCNA】ネットワーク基礎講座‗なにわTECH道171208Nobuaki Omura
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)ryos36
 
Arduino 習作工坊 - Lesson 5 機械之夜
Arduino 習作工坊 - Lesson 5 機械之夜Arduino 習作工坊 - Lesson 5 機械之夜
Arduino 習作工坊 - Lesson 5 機械之夜CAVEDU Education
 
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法LINE Corporation
 
Exploring the x64
Exploring the x64Exploring the x64
Exploring the x64FFRI, Inc.
 
M5Stack互換機を作った話
M5Stack互換機を作った話M5Stack互換機を作った話
M5Stack互換機を作った話Masawo Yamazaki
 

Similar to Bluetooth通信の 仕組みと活用法紹介 (20)

Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Windowsのパケットモニタ作成
Windowsのパケットモニタ作成
 
20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)
 
RouterBOARD with OpenFlow
RouterBOARD with OpenFlowRouterBOARD with OpenFlow
RouterBOARD with OpenFlow
 
汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル
汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル
汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
 
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
あるブートローダの話
あるブートローダの話あるブートローダの話
あるブートローダの話
 
Flexible 1.36 inch 16*128 SPI SSD1316 Monochrome OLED Screen Module Panel
Flexible 1.36 inch 16*128 SPI SSD1316 Monochrome OLED Screen Module PanelFlexible 1.36 inch 16*128 SPI SSD1316 Monochrome OLED Screen Module Panel
Flexible 1.36 inch 16*128 SPI SSD1316 Monochrome OLED Screen Module Panel
 
Interrupts on xv6
Interrupts on xv6Interrupts on xv6
Interrupts on xv6
 
PBL1-v1-008j.pptx
PBL1-v1-008j.pptxPBL1-v1-008j.pptx
PBL1-v1-008j.pptx
 
Kiso sekkei 01rev03
Kiso sekkei 01rev03Kiso sekkei 01rev03
Kiso sekkei 01rev03
 
第1回【CCNA】ネットワーク基礎講座‗なにわTECH道171208
第1回【CCNA】ネットワーク基礎講座‗なにわTECH道171208第1回【CCNA】ネットワーク基礎講座‗なにわTECH道171208
第1回【CCNA】ネットワーク基礎講座‗なにわTECH道171208
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)
 
Arduino 習作工坊 - Lesson 5 機械之夜
Arduino 習作工坊 - Lesson 5 機械之夜Arduino 習作工坊 - Lesson 5 機械之夜
Arduino 習作工坊 - Lesson 5 機械之夜
 
Delayの等価回路モデル
Delayの等価回路モデルDelayの等価回路モデル
Delayの等価回路モデル
 
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法
 
Exploring the x64
Exploring the x64Exploring the x64
Exploring the x64
 
Slide
SlideSlide
Slide
 
M5Stack互換機を作った話
M5Stack互換機を作った話M5Stack互換機を作った話
M5Stack互換機を作った話
 

More from Takehiko YOSHIDA

かるがもヘルメット/スキースクールIoTシステム
かるがもヘルメット/スキースクールIoTシステムかるがもヘルメット/スキースクールIoTシステム
かるがもヘルメット/スキースクールIoTシステムTakehiko YOSHIDA
 
RICOH THETAの全天球画像でペーパークラフト作成
RICOH THETAの全天球画像でペーパークラフト作成RICOH THETAの全天球画像でペーパークラフト作成
RICOH THETAの全天球画像でペーパークラフト作成Takehiko YOSHIDA
 
マイコンロボット実習
マイコンロボット実習マイコンロボット実習
マイコンロボット実習Takehiko YOSHIDA
 
RICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフトRICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフトTakehiko YOSHIDA
 
Mindstorms EV3におけるソフトウェア開発環境 2014年 師走版
Mindstorms EV3におけるソフトウェア開発環境 2014年 師走版Mindstorms EV3におけるソフトウェア開発環境 2014年 師走版
Mindstorms EV3におけるソフトウェア開発環境 2014年 師走版Takehiko YOSHIDA
 
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)Takehiko YOSHIDA
 
恋するクラウド ~ AWSへ個人ブログをお引っ越し ~
恋するクラウド ~ AWSへ個人ブログをお引っ越し ~恋するクラウド ~ AWSへ個人ブログをお引っ越し ~
恋するクラウド ~ AWSへ個人ブログをお引っ越し ~Takehiko YOSHIDA
 
ロボット組み立てのヒント ハイライト
ロボット組み立てのヒント ハイライトロボット組み立てのヒント ハイライト
ロボット組み立てのヒント ハイライトTakehiko YOSHIDA
 

More from Takehiko YOSHIDA (8)

かるがもヘルメット/スキースクールIoTシステム
かるがもヘルメット/スキースクールIoTシステムかるがもヘルメット/スキースクールIoTシステム
かるがもヘルメット/スキースクールIoTシステム
 
RICOH THETAの全天球画像でペーパークラフト作成
RICOH THETAの全天球画像でペーパークラフト作成RICOH THETAの全天球画像でペーパークラフト作成
RICOH THETAの全天球画像でペーパークラフト作成
 
マイコンロボット実習
マイコンロボット実習マイコンロボット実習
マイコンロボット実習
 
RICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフトRICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフト
 
Mindstorms EV3におけるソフトウェア開発環境 2014年 師走版
Mindstorms EV3におけるソフトウェア開発環境 2014年 師走版Mindstorms EV3におけるソフトウェア開発環境 2014年 師走版
Mindstorms EV3におけるソフトウェア開発環境 2014年 師走版
 
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
 
恋するクラウド ~ AWSへ個人ブログをお引っ越し ~
恋するクラウド ~ AWSへ個人ブログをお引っ越し ~恋するクラウド ~ AWSへ個人ブログをお引っ越し ~
恋するクラウド ~ AWSへ個人ブログをお引っ越し ~
 
ロボット組み立てのヒント ハイライト
ロボット組み立てのヒント ハイライトロボット組み立てのヒント ハイライト
ロボット組み立てのヒント ハイライト
 

Recently uploaded

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 

Recently uploaded (9)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 

Bluetooth通信の 仕組みと活用法紹介

  • 1. Bluetooth通信の 仕組みと活用法紹介 2012.Aug.5th Takehiko YOSHIDA twitter: @chihayafuru URL: http://www.chihayafuru.jp
  • 3. NXTブロック ハードウェア仕様 メインプロセッサ: Atmel 32bit ARM processor 256KB FLASH / 64KB RAM / 48MHz サブプロセッサ: Atmel 8bit AVR processor 4KB FLASH / 512KB RAM / 8MHz Bluetoothチップ: CSR BlueCore 4 v2.0 + EDR System シリアルポートプロファイル(SPP)サポート 内部RAM 47KBytes 外部FLASH 8MBit 26MHz
  • 4. NXT通信 ブロック図 PC NXT User Program User Program (Communication Protocol) (nxtOSEK) 仮想 SIO COM (UART) Bluetooth OS USB USB Interface Driver Driver Bluetooth Bluetooth Hardware Driver Driver USB (BlueCore) Bluetooth Dongle Bluetooth
  • 6. 最小のシリアル通信配線 データ送信 データ送信 データ受信 データ受信 グラウンド グラウンド
  • 8. 無手順(フロー制御なし) くそ、自分のペースで 話しやがって! ちゃんと メモし損ねたけど メモしろよ! 諦めよ… 送信ノード 受信ノード
  • 9. フロー制御あり 話していいぞ! 送信ノード 受信ノード 実は…
  • 10. ハードウェアフロー制御配線 データ送信 データ送信 データ受信 データ受信 送信要求 送信要求 送信可能 送信可能 グラウンド グラウンド
  • 11. NxtLoggerキャプチャ画面 “DSR”って何?
  • 12. DCEを中継した通信 データ端末装置 データ端末装置 (DTE) (DTE) CTS / RTS DSR / DTR 公衆通信回線網 DSR / DTR データ回線終端装置 データ回線終端装置 (DCE) (DCE)
  • 13. シリアル通信 I/O名称 短縮名 方向 英語名 意味 TxD OUT Transmit Exchange Data 送信データ RxD IN Receive Exchange Data 受信データ RTS OUT Request To Send 送信要求 CTS IN Clear To Send 送信可 DTR OUT Data Terminal Ready データ端末レディ DSR IN Data Set Ready データ・セット・レディ
  • 14. NXTハードウェア インターフェース 引用: LEGO Mindstorms NXT Bluetooth Developer Kit
  • 15. 【PC】H/Wフロー制御コード nxtLogger LogPort.cs 88. // シリアルポート番号設定 89. this.PortName = portName; 90. 91. // ポートのオープン制御 92. this.Open(); 初期状態は 93. false(送信禁止)のため、 94. // 受信バッファの破棄 このコードは必須 95. this.DiscardInBuffer(); 96. 97. // ハードウェアフロー制御 98. this.DtrEnable = true; 99. this.RtsEnable = true;
  • 16. 【NXT】H/Wフロー制御コード nxtOSEK bt.c 88. void bt_init(void) 89. { 90. U8 trash; 91. U32 trash2; 92. in_buf_in_ptr = out_buf_ptr = 0; 93. in_buf_idx = 0; 94. 95. *AT91C_PMC_PCER = (1 << AT91C_PERIPHERAL_ID_US1); 96. 97. *AT91C_PIOA_PDR = BT_RX_PIN | BT_TX_PIN | BT_SCK_PIN | BT_RTS_PIN | BT_CTS_PIN; 98. *AT91C_PIOA_ASR = BT_RX_PIN | BT_TX_PIN | BT_SCK_PIN | BT_RTS_PIN | BT_CTS_PIN;
  • 19. サンプルコード 電文フォーマット オフセット +0000 0x20 ヘッダー部 +0001 0x00 (ペイロード長) +0002 0x3F +0003 0x10 ペイロード部 途中省略 (データー本体) +0033 0x72
  • 21. 【NXT】電文生成部コード nxtOSEK ecrobot_interface.c 318. U32 ecrobot_send_bt_packet(U8 *buf, U32 bufLen) 319. { 320. SINT i; 321. if (bt_status == BT_STREAM && bufLen <= BT_MAX_TX_BUF_SIZE-2) 322. { 323. sendBuf[0] = (U8) (bufLen & 0xFF); 324. sendBuf[1] = (U8) ((bufLen >> 8) & 0xFF); 325. for(i = 0; i < bufLen; i++) 326. { 327. sendBuf[i+2] = buf[i]; 328. } 329. bt_write(&sendBuf[0], 0, bufLen+2); 330. return bufLen; 331. } 332. return 0; ※ソースコードの一部を省略 333. }
  • 23. エンディアネスの説明 10進数: 32 Int型(2byte)16進数: 0x0020 バイト単位に分割 0x00 0x20 オフセット +0000 0x20 +0000 0x00 +0001 0x00 +0001 0x20
  • 24. 下位バイトマスク処理 sendBuf[0] = (U8) (bufLen & 0xFF); 16進数表記 2進数表記 bufLen 0x1234 0001 0010 0011 0100 0xFF 0x00FF 0000 0000 1111 1111 sendBuf[0] 0x0034 0000 0000 0011 0100
  • 25. 上位バイトマスク処理 sendBuf[1] = (U8) ((bufLen >> 8) & 0xFF); 16進数表記 2進数表記 bufLen 0x1234 0001 0010 0011 0100 bufLen>>8 0x0012 0000 0000 0001 0010 0xFF 0x00FF 0000 0000 1111 1111 sendBuf[0] 0x0034 0000 0000 0011 0100
  • 26. 上位バイトマスク処理 sendBuf[1] = (U8) ((bufLen >> 8) & 0xFF); 16進数表記 2進数表記 bufLen 0x1234 0001 0010 0011 0100 bufLen>>8 0x0012 0000 0000 0001 0010 0xFF 0x00FF 0000 0000 1111 1111 sendBuf[0] 0x0034 0000 0000 0011 0100
  • 27. 論理シフト(unsigned int)の場合 10進表記 16進数表記 2進数表記 43776 0xAB00 1010 1011 0000 0000 1/256 8ビット右シフト 171 0x00AB 0000 0000 1010 1011
  • 28. 算術シフト(signed int)の場合 10進表記 16進数表記 2進数表記 -21760 0xAB00 1010 1011 0000 0000 1/256 8ビット右シフト -85 0xFFAB 1111 1111 1010 1011
  • 29.
  • 30. コンテナ部データ構成 オフセット データ オフセット データ オフセット データ オフセット データ 0 8 16 24 ADC2 1 9 17 25 システム時刻 モータ0 モータ2 (ミリ秒) カウンタ カウンタ 2 10 18 26 ADC3 3 11 19 27 4 データ1 12 20 28 ADC0 5 データ2 13 21 29 モータ1 I2C カウンタ 6 14 22 30 バッテリーレ ADC1 ベル 7 15 23 31
  • 31. 【NXT】コンテナ部生成部コード (nxtOSEK) ecrobot_interface.c 735. void ecrobot_bt_data_logger(S8 data1, S8 data2) 736. { 737. U8 data_log_buffer[32]; 738. *((U32 *)(&data_log_buffer[0])) = (U32)systick_get_ms(); 739. *(( S8 *)(&data_log_buffer[4])) = (S8)data1; 740. *(( S8 *)(&data_log_buffer[5])) = (S8)data2; 741. *((U16 *)(&data_log_buffer[6])) = (U16)ecrobot_inputs.battery_state; 742. *((S32 *)(&data_log_buffer[8])) = (S32)nxt_motor_get_count(0); 743. *((S32 *)(&data_log_buffer[12])) = (S32)nxt_motor_get_count(1); 744. *((S32 *)(&data_log_buffer[16])) = (S32)nxt_motor_get_count(2); 745. *((S16 *)(&data_log_buffer[20])) = (S16)sensor_adc(0); 746. *((S16 *)(&data_log_buffer[22])) = (S16)sensor_adc(1); 747. *((S16 *)(&data_log_buffer[24])) = (S16)sensor_adc(2); 748. *((S16 *)(&data_log_buffer[26])) = (S16)sensor_adc(3); 749. *((S32 *)(&data_log_buffer[28])) = (S32)getDistance(); 750. 751. ecrobot_send_bt_packet(data_log_buffer, 32); 752. } 『リトル・エンディアン』前提の移植性の低いコード
  • 33. 【PC】コンテナ部解析部コード (nxtLogger) LogMessage.cs 248.// パケットをフィールドに変換 249.this.sysTick = BitConverter.ToUInt32(packetPayload, 0); 250.this.dataLeft = (SByte)packetPayload[4]; 251.this.dataRight = (SByte)packetPayload[5]; 252.this.batt = BitConverter.ToUInt16(packetPayload, 6); 253.this.motorCnt0 = BitConverter.ToInt32(packetPayload, 8); 254.this.motorCnt1 = BitConverter.ToInt32(packetPayload, 12); 255.this.motorCnt2 = BitConverter.ToInt32(packetPayload, 16); 256.this.sensorAdc0 = BitConverter.ToInt16(packetPayload, 20); 257.this.sensorAdc1 = BitConverter.ToInt16(packetPayload, 22); 258.this.sensorAdc2 = BitConverter.ToInt16(packetPayload, 24); 259.this.sensorAdc3 = BitConverter.ToInt16(packetPayload, 26); 260.this.i2c = BitConverter.ToInt32(packetPayload, 28);
  • 34. BitConverterクラス • 基本データ型をバイト配列に、バイト配列を基本 データ型に変換します。 • BitConverter.ToUInt16() unsigned型 • BitConverter.ToUInt16() signed型 • Intel系CPUはリトル・エンディアンのため BitConverterクラスもリトル・エンディアンで 動作します。 • 非Intel系CPU(ビッグ・エンディアン)への移植の 可能性があるのであれば、 BitConverter.IsLittleEndianフィールドのTrue/False で判定してバイト列を反転しましょう!
  • 35. Bluetooth通信の留意事項 • 受信モードから送信モードに切り替わるとき約30ミリ秒の遅れが生じる • 大きなデータパケットを受信する場合、ARMプロセッサとの間に短時間の H/W制約 遅延(small timing difference)が発生する。 • 電文の途中にで送受信の一時停止が発生する。 • 電文と電文の間のタイムラグ(休止時間)が短くなる。 影響 • 1つの電文を2回以上のデータ受信処理(APIコール)に分割して受信する。 • 1回のデータ受信処理(API)で2つ以上の電文を受け取ってしまう。 結果
  • 36. 電文受信 ステートマシン図 [受信バイト == 開始コード(0x20, 0x00)] 電文待ち 電文受信 初期状態 [受信バイト数 == 電文長]
  • 37. 電文受信 状態遷移表 イベント 受信バイト 受信バイト数 状態 開始コード == 電文長 その他 (0x20, 0x00) 電文待ち 電文受信 電文待ち 電文待ち 電文受信 電文受信 電文受信 電文待ち
  • 38. 【PC】受信バイト列を1バイトに分割するコード Form1.cs 99. /// <summary> 100. /// (メインスレッドの)ログデータ受信 101. /// </summary> 102. /// <param name="mes">データ</param> 103. private void messegeReceive(Byte[] mes) 104. { 105. for (int i = 0; i < mes.Length; i++) 106. { 107. log.Append(mes[i]); 108. } 電文の先頭を見つけるために一旦、1バイトずつに分割 109. } Byte[0]が電文の先頭とは限らない!!!
  • 39. 【PC】状態遷移(分岐)処理 LogMessage.cs 216. public void Append(Byte dat) 217. { 218. // パケットヘッダー部 219. if (byteNo < PacketHeaderLen) 220. { 221. // 順送りでパケットヘッダー配列へ保存 状態遷移の『電文待ち』 222. packetHeader[byteNo++] = dat; 223. // 中略 224. } 225. // パケットペイロード(ヘッダーを除いた本体部) 226. else if (byteNo < PacketLen) 227. { 状態遷移の『電文受信』 228. // 中略 229. } 230. else // byteNo >= PacketLenは設計の想定外 231. { 状態遷移の設計外 232. byteNo = 0; 233. } 234. } ※ソースコードの一部を省略
  • 40. 【PC】電文ヘッダー判定処理 LogMessage.cs 211. // 順送りでパケットヘッダー配列へ保存 212. packetHeader[byteNo++] = dat; 213. 214. if (byteNo == PacketHeaderLen) 215. { 216. // パケットヘッダー(パケットサイズ)のチェック 217. // NXTから送信されるパケットサイズにはヘッダの2バイト分は含まれない 218. UInt16 len = BitConverter.ToUInt16(packetHeader, 0); 219. 220. if (len != PacketPayloadLen) 221. { 222. // パケット仕様: ヘッダー = ペイロードサイズ 223. // 想定したヘッダー値でなければ1バイト分を読み捨てる 224. packetHeader[0] = packetHeader[1]; 225. byteNo = 1; 226. } 227. }