*

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 追記
今エントリーのソースコード一式を公開しました。
ココからダウンロードできます。

関連記事

RasPi_Qt

QtでRaspberryPi/GUI開発(12)-gpioの状態をGUIに反映する

どもです。 今回は、gpioピンの状態(HIGH/LOW)の変化を画面上に即座に反映する方法につい

記事を読む

raspberry-pi

libpigpioでのRaspberryPi3とArduinoのSPI通信

どもです。 今回は、libpigpioを使用してRaspberryPi3とArduinoでSPI通

記事を読む

google_test

C言語でEV3開発(6)

どもです。 今回のエントリーは、前回のエントリーの続き、google testでの単体テスト環境に

記事を読む

eclipse-juno-logo

C言語でEV3開発(2)

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

記事を読む

raspberry-pi

RaspberryPiで物体検出(2)-白線検出への挑戦(2):輪郭検出による白線検出(実機編)

どもです。 今回は、前回に引き続きOpenCvを用いて道路の白線検出について、です。 1.今

記事を読む

eclipse_4.3_kepler

elicpse/CDTでのgdbでのソースを追従したデバッグができない問題

どもです。 今回のエントリーは、Eclipse上でgdbを利用したデバッグ中に発生する問題について

記事を読む

eclipse-juno-logo

C言語でEV3開発(1)

どもです。 2回目の投稿。 本格的な投稿としては、初めての投稿になります。 内容は、LEG

記事を読む

toppers

C言語でEV3開発(16)-TOPPERS/HRP2 EV3 で Bluetooth割込み

どもです。 今回は、EV3 の環境をTOPPERS/HRP2 EV3RT で作成したアプリをPC上

記事を読む

toppers

C言語でEV3開発(26)-EV3で機械学習(1)-QLearningをC#に委譲してみた

どもです。 前回の投稿では、Q-LearningをEV3本体に実装してみたら、メモリが足りなくて動

記事を読む

toppers

C言語でEV3開発(24)-APIの実行時間を測定してみた。

どもです。 今回、以前から気になっていた、開発環境/プラットフォームであるTOPPERS HRP2

記事を読む

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="">

RasPi_Qt
Rasbianの新しいバージョンが出たので、クロス環境を更新してみた。(その後)

どもです。 前回、Linux/RaspberryPiでのQt(Q

RasPi_Qt
Rasbianの新しいバージョンが出たので、クロス環境を更新してみた。

どもです。 RaspberryPiのOS:Raspbianの新し

no image
RaspberryPiのOS:RaspbianをNOOBSでセットアップしてみた

どもです。 今回の内容は、「今更!?」ですがNOOBSでRasp

GitHub
C/C++のスタブを自動生成するツールを公開しました

どもです。 突然ですが、C/C++の単体テストで使用する「スタブ

Arduino_Logo
フォトレジスタを使ってみた-Arduinoで光検出

どもです。 今回は、タイトル通り「フォトレジスタの使い方」です。

→もっと見る

PAGE TOP ↑