*

C言語でEV3開発(19)-コマンド通信処理でEchoBackしてみた

公開日: : 最終更新日:2017/07/15 マインドストーム/EV3, 開発

どもです。
前回は、Bluetoothの接続状態の変化に伴う、状態遷移について書きました。
今回は、BluetoothでPCとEv3を接続してコマンドの送受信をしてみます。

1.コマンド
送受信するコマンドは、一番基本(と、考えている)の「EchoBack」コマンドです。
このコマンドでは、コマンドデータに乗せたデータがそのまま返されます。
コマンドフォーマットは、特に何かの規格に準拠する、というものではなく、完全に独自仕様としています。
具体的には、以下のように設計しています。

コマンドフォーマット

2.通信設計
通信をする場合には、送信側と受信側が存在します。
(当たり前ですね。)
そのため、通信を設計する際には、どちらを送信側にして、どちらを受信側にするかを決める必要があります。
「適宜切り替える」というのが、「もっともよい、あるべき姿」です。しかし、この方式を実装するとなると、通信の制御がとても難しくなる。「送信の衝突」を「0」から設計、実装することはできません。スキルが足りません。
なので、今回は以下のように固定します。

  • PC:送信
  • Ev3:受信

PC側からEv3にコマンドを送信し、対応する処理を実施した後に結果/レスポンスを返すようにします。
コミュニケーション図は、下図の通りです。
コマンドシーケンス

送信側は、送信間隔を10msecに設計します。
従って、送信側は、コマンドを送信、レスポンスを受信後、10msec待ってから次のコマンドを送信します。

受信側は、受信したデータを、そのままレスポンスデータに乗せて返します。
コマンドデータを受信してからレスポンスを受信するまでは、特に間隔を設けません。受信した先から、返信していきます。
ただし、次のコマンドを受信するまでは、少~し間隔を設けています。
また、Ev3では受信したデータをデバッグできません。
そのため、その代わりにコマンドを受信した回数をモニターするようにしました。

3.コマンド処理
実際にコマンドを受信、処理して返すまでの実装は、以下の通りです。

処理の概要を説明すると、port_check_connectoin()でBluetoothの接続を確認し、port_read_data()でデータの読出しを行います。
データを受信していた場合には、cmd_sequence()で内容の確認とレスポンスデータの作成を行います。
cmd_sequence()の実装は、下記の通りです。

cmd_latch_buff()、cmd_reset_snd_buff()は、それぞれ関数名通りの処理を実施します。
で、cmd_handle_main()の中で実際にデータの処理を行います。
そのコードが、以下です。

4.実際に動かしてみた
実際に動かしている様子の動画は、以下の通りです。

映像の後ろの方に映っているのは、PCツールで送信/受信しているデータです。
Ev3では、BLT_TSK_CNT、CMD_HDL_CNTの値が増加しています。この値は、コマンドの受信/送信タスクと、実際に受信/送信(返信)したコマンドの数です。
PCツールからコマンドを送信、レスポンスを受信するタイミングと、Ev3の画面上のこれらの値が更新されるタイミングが一致しています。
このようにして、PCツールからEv3に対してコマンドデータを送信することが可能になりました。

今回のエントリーでは、実際にコマンドを送受信する機能を紹介しました。
今後は、今回紹介した通信機能を用いて、Ev3で組み立てた車を制御していく仕組みを紹介します。

2017/07/15 追記
今エントリーのソースコード一式を公開しました。
ココからダウンロードできます。

関連記事

MindStormControl_SprachScreen

EV3開発サポートツール(2)-C#のユーザーコントロール開発(2つ目)

どもです。 前回に引き続き、今回もC#/WPFでの独自UI(ユーザーコントロール)の作成についての

記事を読む

no image

C言語でEV3開発(11)-opOUTPUT_STEP_POWERコマンド

どもです。 今回のエントリーでは、再びモーターを動かすためのコマンドについて書きます。 コマンド

記事を読む

toppers

C言語でEV3開発(20)-超音波センサと安全状態

どもです。 前回は、BluetoothでPCとEv3を接続してコマンドの送受信について書きました。

記事を読む

google_test_top

C言語でEV3開発(5)

どもです。 今回のエントリーは、前回のエントリーでちくっと触れた、「単体テスト」について、です。

記事を読む

toppers

C言語でEV3開発(22)-ロギング機能

どもです。 前回は、モーターの出力を制御する方法について記載しました。その際に、モータ/車体が期待

記事を読む

no image

C言語でEV3開発(17)-コマンドによるTOPPERS/HRP2 EV3RT アプリケーションの制御(コントロール)

どもです。 今回は、TOPPERS/HRP2 EV3RT で作成したアプリをPC上から操作するため

記事を読む

no image

C言語でEV3開発(7)

どもです。 今回のエントリーでは、いよいよEV3を動かしていきます。 新しい環境に対して、最もよ

記事を読む

no image

C言語でEV3開発(9)-opOUTPUT_SPEEDコマンド

どもです。 今回のエントリーでは、前回に引き続きEV3のモーターを動かしていきます。 ただし、単

記事を読む

no image

C言語でEV3開発(21)-モーター出力の制御

どもです。 前回は、超音波センサから前方障害物との距離を取得し、それを元に安全状態を判断する、とい

記事を読む

eclipse-juno-logo

C言語でEV3開発(2)

どもです。 今回のエントリーの内容は、前回に引き続き「EV3の開発環境の構築」の追記です。

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

PAGE TOP ↑