KCBサポート » シリアル通信 »


■シリアルUSBアダプターをLinuxで使うには

関連カテゴリー:サポート, シリアル通信, テクニカルガイド

準備

弊社製シリアルUSBアダプターシリーズはWindows OS以外での動作保証をしておりませんが、適切なドライバーを使うことで、Linuxでも使用できます。 Linuxで使用するときはusbserial.ko、ftdi_sio.koという2つのドライバー(正式にはカーネルモジュールと言います)が必要となります。このドライバーはUbuntu Linuxなどでは標準でインストールされています。例えばUbuntu Linux 10.04では「/lib/modules/2.6.32-21-generic/kernel/drivers/usb/serial」にインストールされています。

次にシリアルUSBアダプターHSを取り付け、下記コマンドでドライバーをセットしてください。modprobeコマンドでftdi_sioドライバーを取り付けると、自動的にusbserial.koドライバーも取り付けられます。

<rootユーザーの場合>

# modprobe ftdi_sio vendor=0x165C product=0007

<Ubuntu Linuxなど、sudoコマンドが必要な場合>

$ sudo modprobe ftdi_sio vendor=0x165C product=0007

 

テスト

上記コマンドを実行後、dmesgコマンドで確認をします。

-----
$ dmesg

...
[18188.873370] USB Serial support registered for FTDI USB Serial Device
[18188.874223] ftdi_sio 2-1:1.0: FTDI USB Serial Device converter
detected
[18188.875151] usb 2-1: Detected FT232RL
[18188.875154] usb 2-1: Number of endpoints 2
[18188.875156] usb 2-1: Endpoint 1 MaxPacketSize 64
[18188.875159] usb 2-1: Endpoint 2 MaxPacketSize 64
[18188.875161] usb 2-1: Setting MaxPacketSize 64
[18188.892767] usb 2-1: FTDI USB Serial Device converter now attached to ttyUSB0
[18188.892794] usbcore: registered new interface driver ftdi_sio
[18188.892796] ftdi_sio: v1.5.0:USB FTDI Serial Converters Driver
-----

上記出力例のように「FTDI USB Serial Device converter now attached to ttyUSB0」というような表示が出ましたら、シリアルUSBアダプターHSはデバイス「/dev/ttyUSB0」として使用することが可能です。最近のLinuxではデバイスファイルは自動的に作成されますが、自動作成されなかった場合は次のようにデバイスファイルを作成する必要があります。 # mknod /dev/ttyUSB0 c 188 0 デバイスファイルに対してechoコマンドを使って適当な文字列を出力すると、シリアルUSBアダプターHSから文字列が出力されます。

$ echo "Hello World!" > /dev/ttyUSB0

標準状態でのパリティやボーレートの変更はsttyコマンドなどを使用してください。なおC言語でのプログラムではプログラム内でボーレートなどを設定してください。

 

その他

その他のドライバーを使用する場合

システムにドライバーがない場合やチップメーカーのFTDI社純正ドライバーを使用する場合は、FTDI社からドライバーをダウンロードしてインストールするか、カーネルをアップデートする必要があります。ドライバーは下記URLよりダウンロードしてください。FTDI社のドライバーにつきましては上記ドライバーと使い方が違います。また弊社では未検証ですので注意してご利用ください。

http://www.ftdichip.com/Drivers/D2XX.htm

その他のドライバーにつきましては、下記のようなものがあります。こちらも弊社では未検証です。

FTDI Linux USB full speed char driver http://sourceforge.jp/projects/sfnet_ftdifullspddrv/

FTDI USB Serial Converter Driver http://sourceforge.jp/projects/sfnet_ftdi-usb-sio/

その他のシリアルUSB変換器を使う場合

近藤科学株式会社のシリアル変換アダプターを使うには、生産者ID(VID)と製品ID(PID)番号が必要です。modporobeコマンドのオプションを下記リストを参考にして、適宜入れ替えて使用してください。

VID:165C (近藤科学USB製品共通)
-------------------------------------------------------------
PID  = デバイス名           (日本語でのデバイス名)
-------------------------------------------------------------
0001 = ICS USB ADAPTER     (ICS USB アダプター)
0002 = SERIAL USB ADAPTER  (シリアルUSBアダプター)
0006 = ICS USB ADAPTER HS  (ICS USB アダプター High Speed)
0007 = SERIAL USB ADAPTER HS(シリアルUSBアダプター High Speed)

 

その他の情報

KCB-3WLに付属のSDKにはシリアル通信でRCB-4やRCB-3を動かすライブラリとサンプルプログラムがあります。LinuxでRCB-4などを動かすシリアル通信プログラムをやってみたい人は、参考にしてみてはいかがでしょうか。

■この記事へのリンクはこちらです。

■KRS-403xHVシリーズ サポート情報

関連カテゴリー:ICS, シリアルサーボ

 ロボット用サーボ KRS-403xシリーズのサポート情報です。

従来機種KRS-4014SHV、KRS-4013HVと置換する際のご参考にしてください。

 

1) 対になる箇所ではサーボの種類を揃える

メンテナンスなどでKRS-4014SHV、KRS-4013HVと交換する場合、対になるサーボの種類は揃えてください。

 KRS-4034HVはKRS-4014SHVの、KRS-4033HVはKRS-4013HVのそれぞれ後継機種にあたりますが、動作特性等を改良していますので同一条件下で動かしても動作結果が異なる場合があります。

手や脚の左右で対になる箇所には同じ種類のサーボをご使用ください。

 

2) 中くらいの数値領域で「ストレッチ」(保持力)を若干緩めにしてあります

  出荷設定の状態ではKRS-4014SHV、KRS-4013HVとストレッチの数値は同じでも保持力は若干緩めになっています。

これは静止状態で変な挙動が出にくいよう最適化したためです。

サーボの開発に用いた3kg級のロボットでは、従来ストレッチ40で動かしていた歩行モーションがストレッチ60で同じように動きました。

KRS-4014SHV、KRS-4013HVから置換した場合、若干ストレッチを高めに設定するのがコツと覚えてください。

なお、上記はストレッチの数値が中くらい(30~90くらい)の場合に適用され、ストレッチ127を設定した場合の保持力はKRS-4014SHV、KRS-4013HVと変わりません。

ですのでジャンプなどストレッチを最大にして使用するモーションには大きな影響はありません。

  

3)新機能「レスポンス」を使ってみる

 新しいICS設定項目レスポンス(出荷設定:3)はサーボの挙動に大きな影響を与えるパラメータです。巧く使えばロボットのそれぞれの箇所に最適な動作設定を求めることが出来ます。

例:

 レスポンスを小さくした → 補間スピード(フレーム数)の値が大きいとき(ゆっくり動くとき)に動作がなめらかになるので、頭や腕など負荷が小さく表現力が求められる関節の動作がキレイに見える。反面、下半身など負荷がかかる箇所ではトルクが十分に出なくなる。

 

 レスポンスを大きくした → サーボ動作の立ち上がりが鋭くなるので瞬発的な動作に最適。反面、ハンチングが出やすくなるのとゆっくり動かしたときに動作がカクカクする。

 

 動きの美しさやハンチングなどの挙動が出ない事を求められる場合はレスポンスを小さく、瞬発的な動作が必要な場合はレスポンスを大きくと覚えてください。   

 

4) ギヤ交換時のご注意(ファイナルギヤ(出力軸ギヤ)の互換性)

 KRS-403xHVシリーズではファイナルギヤだけが従来品と互換がありません。製品改良のためにとった処置ですのでご了承ください。

 

5)RCB-3HV(HTH3)でストレッチとスピードを読み込むと「1」と表示される

 RCB-3HV(HTH3)のパソコンでのモーション編集時、POSオブジェクト内でICS3.0およびICS3.5サーボのストレッチとスピードの現在値を取得すると「1」と表示されます。

それ以外は従来と同じで、任意のストレッチとスピードの値を書き込んだ場合はその値はそのままサーボに反映されます。

これはHTH3のソフトウェアの仕様上の都合ですが現在修正の予定はありません。

 

  

 

■この記事へのリンクはこちらです。

■コントロールコード再生 モーション終了を知る方法

関連カテゴリー:サポート, シリアル通信, ソフトウエア, 自律ロボット

 コントロールコードでモーションを再生したときに、一番ネックになるのがモーションの終了がわからないということです。モーションによって再生時間が違うため、モーションごとにwaitを調整しなくてはいけません。waitの調整がうまくいっていないとロボットが停止する可能性もあります。

 そこで、RCB3のモーションを工夫して擬似的にモーションの終了フラグを作りたいと思います。

 

  (画像1 クリックで拡大)

 画像1が、終了の返事をもらう仕組みです。モーション開始時に、KCB-1のADとつないでいるRCB-3の空いているサーボ端子をHighにします。モーション終了時にHighにしていた端子をLowに落とします。こうすることで、ADがHighの間はモーション中、Lowになればモーションは終了ということがわかるようになります。

 

・KCB-1とRCB-3を接続する

 次に設定したサーボ端子とKCB-1の接続です。接続ケーブルでRCB3のサーボ端子とKCB-1のアナログ端子を接続してください。この際、必ず真ん中の赤い電源ラインはコネクタからはずしてくださいRCB-3のハイボルテージをアナログ端子に接続してしまうとマイコンが発熱し、破損します。はずしたコネクタはビニールテープなどを巻いてショートしないように気をつけてください。

 

 ・Heart to Heartでモーションを変更する

Heart to Heartで適当なモーションを読み出してください。

 最初のPOSの空いているポートをHighに設定します(例ではCH5)。次にPOS7のコピーでPOS8を作ります。POS8では、さっきHigh出力にしたCH5をLowに設定します。Lowに設定する最後のPOSのSPEEDは1で十分です。(画像2)

  

 (画像2 クリックで拡大)

 

・KCB-1のプログラム

 コントロールコード再生のプログラムを変更します。



rcb3_put_7Bcode (BTN7B_RR);

 while(ad_read(3) >= 500){}   //RCB3がHighの間ここで待機

 rcb3_put_7Bcode (BTN7B_NP);  //ニュートラルコマンド送信

 wait (300000);               //完全に停止するまで少し待つ

 

 上記は、以前公開したAutonomous_system_ccのモーション再生部分を一部変更したです。以前waitでタイミングを取っていた部分がwhile(ad_read(3) >= 500){}となっています。これは、AD3の値が500以上の間何もしないという処理です。モーションが終わってADポートがLowになったとき、条件を抜けてニュートラルを送ることができます。

以上の作業をすれば、モーションが確実に終了した後に次の命令に移れるため、モーション同士がぶつかって停止するなどのトラブルを避けやすくなります。お試しください。

■この記事へのリンクはこちらです。

■インサイド・KRS40XX

関連カテゴリー:サポート, シリアルサーボ

KCB-1でシリアルサーボモーターの制御をしているときに、時々動かなくなってしまうことがありませんか?これはサーボモーターに命令を立て続けに送ったときなどに起きる現象です。

KRS-40XXシリーズなどの弊社製サーボモーターは、単に位置制御を行っているだけではなく、デイジーチェーンで接続する場合は信号線を全てのモーターと共有しますので、自分への信号なのかどうかを調べたりしています。もちろんKCB-1からだけではなく、他のサーボモーターが出した返事についても調べなくてはなりません。

このような内部処理を正しく行うために、KRS-40XXシリーズではデータの受け渡しを行った後に若干の時間を必要としています。その時間は約300~400[us]。KRS-40XXは115kbpsでデータの送受信を行いますので、位置制御(set_pos)に必要な6バイトの送受信時間を合わせると、一台のモーターあたり1[ms]程度の余裕が必要です。

--- 例 ---
while (1) {
  ...
  sio1_set_pos (1, 目標位置); // 送受信に約600[us]を使用している
  wait (200);                 // 若干の待ち時間(300~400[us])待つ
  sio1_set_pos (1, 目標位置); // 再度目標位置を送信
  wait (200);
  sio1_set_pos (2, 目標位置); // IDが変わっても、同じSIO端子を使う場合はちょっと待つ
  ...
}

KCB-1では、このデータ送受信時間以外に必要な300~400[us]をさらに詰めるために、SIO端子を2つもうけています。SIO1,2に交互にデータを送信することで、たくさんのサーボモーターを短い(約半分の)時間で動かすことができるようになります。または処理が完全に終わるだけの間隔を持ったタイマーを使う方法もありますよ。

■この記事へのリンクはこちらです。

■KHR-1自律ロボット作例

関連カテゴリー:サポート, シリアル通信, センサー, ソフトウエア, ハードウエア, 自律ロボット

今回はKHR-1での自律ロボットを紹介します。

画像のKHR-1には前後左右に計4つのPSDセンサーを実装しています。これらのセンサーの値を読み取り、最も近い物体へKHR-1が向かうようにプログラムを組みました。

 

 <画像 クリックして拡大>

写真は「KCB-1でKHR-1を動かす①」でKCB-1を実装したKHR-1にPSDを取り付けた画像です。頭部のフレームの前後と、両肩にPSDセンサーをひとつずつ取り付けました。

 

<ムービー (2.31 MB)>

画像のKHR-1を実際に動かした動画です。それぞれのPSDセンサーに手をかざすと、KHR-1が近づいてきます。

 

<サンプルプログラム ダウンロード>

サンプルプログラムは動画のKCB-1に書き込まれているものと同じです。以下はこのプログラムを説明します。

・サンプルプログラムの流れ:

①. ボードの初期化、RCB-1と通信開始。通信の準備ができたら赤LEDが点灯する

②. スイッチが押されるまで(AD2がHになるまで)待機している間、ニュートラル信号を流し続ける

③.スイッチが押されると、お辞儀モーションを一回再生

④ 無限ループ開始。ループ内では1回ループする度に必ずニュートラル信号を送信すること

⑤. 前後左右に取り付けたセンサーの値を読み取り、グローバルで宣言した配列に代入

⑥. センサーの値をバブルソートして、最も高い値を求める

⑦. バブルソートで求められた値を元に、モーション再生分岐

⑧. ④~⑦の処理を繰り返す

 

・解説:

②、④のように、モーションを再生していないときはなるべくニュートラル信号を送信するようにしてください。ニュートラル信号なしにモーションを再生すると、うまく動作しません。

⑥のバブルソートは複数の値の中で最も大きい値、または小さい値を求める処理です。詳しくは「センサーで目標を探す(KRS788使用)③」の解説をご覧ください。

■この記事へのリンクはこちらです。

■シリアルサーボの簡易位置制御

関連カテゴリー:サポート, シリアルサーボ, ソフトウエア, 自律ロボット

シリアルサーボモーターを回す場合は、sio_set_pos関数などで指定した目標角度に到達するまでには時間がかかります。かといって次のようなプログラムでは、むだ時間が発生します。

while (1) {
  pos == sio1_set_pos(id, 目標)

  if ((pos <= 目標 + 5) && (pos >= 目標 - 5) {
      //目標位置に到達した(誤差付き)と見なして、何か処理をする
  }
  else {
      wait (100000);  // モーターが目標に到達するまでちょっと待つ
  }
}

シリアルサーボモーターは目標位置へ到達すると停止しますので、現在位置を数回調べても移動していない場合は、目標へきちんと到達したと判断します。

while (1){
    wait (300);                    // タイミング調整
    現在位置 = sio1_set_pos(ID, 目標); //シリアルサーボに目標位置を送って現在位置を取得
   
    if (前回位置 == 現在位置) {   // もし、現在位置が前回位置と同じだったら
        cnt = cnt + 1;             // cntが一つ増える
    }
    if (cnt == 適当な数){          // cntが適当な数になったら、目標位置で停止したと判断して
        break;                     // ループを抜ける
    }
    前回位置 = 現在位置;          //現在の値を保持
}

sio_set_posは、処理の後に現在の位置を返します。その現在の位置前回の位置を比べて変化が無かった場合は、サーボが目標の位置に到着していると判断してcntを増やします。数回命令を送って同じ位置にいた場合は、サーボが完全に目標の位置にいると判断し、ループを抜けて次の処理に移ることができます。

同一サーボに連続して命令を送るときには、ある程度間隔をあける必要があるので、ここでは約500us(wait(300))待ちます。

ビーチフラッグロボットでは8回一致したら目標に到達したと判断しています。

■この記事へのリンクはこちらです。

■KCB-1でKHR-1を動かす方法(2)

関連カテゴリー:RCB-1, サポート, シリアル通信, ソフトウエア

前回の続きです。

 このプログラムでは2バイトコントロールコード再生のプログラムを、RCB-1対応に変更をしています。2バイトコントロールコード再生は、KCB-1からKRCと同じ再生コマンドをRCB-1へ送信し、モーションを再生する方法です。モーションを再生するには、モーションを各ボタンに割り付ける必要があります。

  なお、コントロールコード再生を行う際は、更新プログラム「KCB1Update20080510.exe」をダウンロードする必要があります。詳しくは「KCB-1 SDK更新(Rev.20080510)」をご覧ください。

 

・ プログラム

#include <ad.h>
#include <rcb3.h>
#include <led.h>

// プログラム中で実行するモーションをHTHで割付してください
#define FORWARD   BTN2B_LU // 前進
#define LEFTSTEP BTN2B_LL // 左サイドステップ
#define RIGHTSTEP BTN2B_LR // 右サイドステップ
#define LEFTTURN BTN2B_LL | BTN2B_LD // 左ターン
#define RIGHTTURN BTN2B_LR | BTN2B_LD // 右ターン
#define BOW BTN2B_RU // あいさつ

#define NP_WA 1200000 //停止後の待機時間(前に再生したモーションとかぶらないために余裕を持って設定する)

void khr_2Bmotion(int cc) //2BYTEcodeモーション再生関数
{
    rcb3_put_2Bcode (cc); //2BYTEcodeでモーション再生
    while (ad_read(1) > 500) {} //モーションが終了するまで待つ
    rcb3_put_2Bcode (BTN2B_NP); //モーション終了後ニュートラルを送信
    wait (NP_WA); //少しだけ待つ
}

void main(void)
{
    cpu_init (); // CPUの初期設定を行う
    ad_oneshotmode (); // ADはワンショットモードで読み込む
    ledgrn_on (); // 起動確認用LEDを点灯する

    rcb3_rx_open (); // RCBのRXポートを接続します
    wait (5000000); // RCBの起動が安定するまで待ちます
    ledred_on(); // 赤LED点灯後、モーション再生可能

    while(1){
        rcb3_put_2Bcode (BTN2B_NP); //何もしていないときはニュートラルを送信
        if (ad_read(2) > 500) { //もしスイッチが押されたら
           khr_2Bmotion(BOW); //モーション再生
           khr_2Bmotion(FORWARD);
           khr_2Bmotion(RIGHTSTEP);
        }
    }
}

 

 

・解説

 ▼変更点① 

通常の2バイトコントロールコード再生のプログラムと違うところは、モーションを再生していないときに、常にニュートラル信号を送信していることです。これは、通常、KRCの電源を入れて何も操作していない場合に、KRCからはニュートラル信号が送信されているためです。

 ▼変更点②

 1)コントロールコード再生

 2)再生終了待ち

 3)ニュートラル送信

 4)ニュートラル状態に戻るまで待つ

以上の④項目を今回はkhr_2Bmotionという関数にまとめました。

■この記事へのリンクはこちらです。

■KCB-1でKHR-1を動かす方法(1)

関連カテゴリー:RCB-1, サポート, シリアル通信, ソフトウエア

今回は、KCB-1のコントロールコード再生でKHR-1(RCB-1)を動かす方法を紹介します。

(※RCB-1とKCB-1では、コマンド再生、7バイトコントロールコード再生はできません。また、RCB-1に接続された6VバッテリーでKCB-1を動かすため、シリアルサーボはお使いになれません)

①ではKCB-1の実装やケーブルの配線などの準備、②ではプログラムの紹介をします。

 

・ 通信の準備

RCB-1をKRCで操作できるように設定し、再生するモーションをKRCの各ボタンに割り付けてください。RCB-1のKRRに接続するポートとKCB-1のCOMポートを接続ケーブルでつなぎます。

電源は空いているRCB-1のサーボ接続端子とKCB-1の空いているシリアルポートを接続します。その際、白線は外してください。

 

・ モーション終了を知るための準備

モーション終了後、RCB-1を1度ニュートラルに戻す必要があります。モーション終了をwaitでタイミングを取ることもできますが、モーションごとに調整が必要になり、不便です。そこで、RCB-1の空いているサーボ端子をモーション中は「H」、モーション終了後は「L」に設定し、その信号をKCB-1のADポートで受け取ります。②で紹介するプログラムでは、RCB-1のCH4とKCB-1のAD1を接続し、モーションの終了を受け取っています。これは以前紹介した「コントロールコード再生 モーション終了を知る方法」と同じ方法です。

なお、モーション再生を手動でスタートさせるため、AD2の信号ラインと電源ラインにスイッチを接続してください。

 

KCB-1との接続は、全てRCB-1のID0に行います。

 

(画像 クリックで拡大)

・ KHR-1へのKCB-1実装

KHR-1では腹部にネジ止めをします。このとき、ボード裏とボディーが接触するとショートする恐れがあるので、6mm程度のスペーサーをはさみます。また、ボードがむき出しのままだと転倒したときに破損する可能性があるため、KHR-HVシリーズのフロントカウルをかぶせることをお勧めします。例はテープで固定しました。

 

(画像 クリックで拡大)

 ②へ続く

■この記事へのリンクはこちらです。

■センサーで目標を探す(KRS788使用)④

関連カテゴリー:KHR4thアニバーサリー, サポート, シリアル通信, ソフトウエア, 自律ロボット

前回からの続きです。

4) ロボットを物体の方向に歩かせる

前回までで、目標の位置を特定することができました。今回は、ロボットが見つけた目標に向かって歩くためのモーションの分岐方法を紹介します。

・switch文でモーションを分岐

 上記は、モーション分岐のプログラムです。読み取ったアナログ値の最大値の位置の番号は、前回説明したバブルソートによってadk[0]に代入されています。このadk[0]を元にどのモーション再生するか決めます。

 switch (adk[0]){
       case 0:
       case 1:
       case 2:
       rcb3_motion_play(9);     //左旋回2回
       rcb3_motion_play(9);
       break;

       case 3:
       ・・・(中略)
       case 8
       rcb3_motion_play(9);     //左旋回1回
       break;

       case 9:
       rcb3_motion_play(3);     //左サイドステップ
       break;

       case 10:
       ・・・(中略)
       case 14:
       rcb3_motion_play(1);     //前進
       break;
       ・・・(中略)
}
 

画像は、それぞれにモーション割り当てを図式化したものです。0~24までの数字は、adk[ ]に代入したモーションを読み取った位置の番号で、Left turnなどは再生するモーションの名前です。

(画像 クリックで拡大)

 上記のプログラムと画像を見て、adk[0]が「3」だった場合を考えてみます。「3」は左側の緑のエリアの番号です。目標に向かうためには、記述のLeft turn(左旋回)を1回再生すれば、ロボットは目標へ向くことになります。

 

 以上で「センサーで目標を探す(KRS788使用)」の説明を終わります。この方法を応用すれば、いろいろ自律ロボットを作ることができると思います。お試しください!

■この記事へのリンクはこちらです。

■センサーで目標を探す(KRS788使用)③

関連カテゴリー:KHR4thアニバーサリー, サポート, シリアル通信, ソフトウエア, 自律ロボット

 前回のプログラムの続きです。 

3) どの物体が一番近いのかを求める

void search(void){    // アナログ値の読み取りとバブルソート

    unsigned int i;
    int s, t, tmp;

    rcb3_motion_play(37);      // 正面から左に向くモーション再生
    wait(300000);          // サーボが動ききるまで少し待つ
    rcb3_motion_play(38, mesure_distance); // 180度旋回中にアナログ値を読む
    wait(600000);           // サーボが動ききるまで少し待つ
    rcb3_motion_play(39);        // 右から方面に向くモーション再生
    wait(300000);           // サーボが動ききるまで少し待つ

}

// ここからバブルソート開始

for(s = 0; s <= 7; s++){
    for (t = s+1; t <= 8; t++){
        if (adj[t] > adj[s]){ //adj[t]の値がadj[s]よりも大きかったら順番を入れ替える
            tmp = adj[t];
            adj[t] = adj[s];
            adj[s] = tmp;
    
            tmp = adk[t];  //adj[t] > adj[s]だったらadkも同じ処理を行う。
            adk[t] = adk[s]; //最大値のアナログ値の場所はadk[0]に代入される。
            adk[s] = tmp;
        }
    }
}

 この関数では首を旋回する一連のモーションの再生と、最大値を求めるためのバブルソートの処理を行います。

・コマンド再生の特殊な使い方

 rcb3_motion_play(38, mesure_distance) は、「モーション番号38を再生している間に関数mesure_distanceの処理を行う」という命令です。モーション番号38は頭部を180度旋回させるモーションなので、前回紹介したmesure_distanceの処理を同時に行うと、弧を描くように正面全体のアナログ値を検出することができます。

 ・バブルソートについて

 バブルソートとは、複数の数値の中でどの数値が最も大きいかを求めるための処理です。rcb3_motion_play(38, mesure_distance)で読み取ったアナログ値をバブルソートにかけて最大値を求め、どこに目標があるのかを割り出します。

 配列に代入されたアナログ値を2つずつ比べます。もし、ひとつ前の値より今の値のほうが大きかったら順番を入れ替えます。その際、そのまま大きい値を小さい値の配列番号に入れてしまうと、小さい値が消えてしまいます。そこで、小さい値は別の変数(tmp)に一時保存して、大きい値が移動した後に、大きい値がいた配列のところにもう一度小さい値を代入します。これを繰り返すと、最も大きな値が配列の先頭に来て、最も小さな値が配列の一番後ろに来ることになります。 (画像1)

 

(画像1 クリックで拡大)

アナログ値(adj[ ])が移動すると、読み取った番号(adk[ ])も同時に移動するので、adk[0]には最も高いアナログ値を読み取ったときの番号が代入されます。あとは、この番号にモーションを割り当て、分岐すれば、ロボットは目標に向かって歩き出します。

④へ続く

■この記事へのリンクはこちらです。