...

[多脚自律クラス攻略ガイド](PDF/約1.2MB)

by user

on
Category: Documents
6

views

Report

Comments

Transcript

[多脚自律クラス攻略ガイド](PDF/約1.2MB)
カメ型ロボット 02 を自律化する際のメモ
本資料では,近藤科学製カメ型ロボット 02 にマイコンを搭載することにより自律ロボット化する際に必要と
なる情報(小ネタ)を提供しています.あくまで「小ネタ」ですので,各製品に付属のマニュアルや参考文献も
あわせてお読みください.
1.mbed の練習と開発環境の準備
カメ型ロボットの頭となるマイコンには,手軽に使うことができる mbed を使用します.mbed のプログラム
を開発する方法は 2 種類に分けられます.
①web ブラウザー上での開発(クラウド環境)
利点:パソコン(PC)に開発ソフトをインストールする必要が無い
欠点:インターネットに接続していないと開発ができない
②PC 上での開発(ローカル環境)
利点:インターネットに接続していなくても開発が可能
欠点:開発ソフトのインストールが必要
バイナリファイルのサイズが大きくなる
競技会場などでは,インターネット接続が確保できるとは限りませんので,本章では「クラウド環境」での開
発手順を説明した後に,
「ローカル環境」へ持ち出す手順の説明を行います.
1-1.クラウド環境で開発を行う時の準備 (初回のみ)
クラウド環境で mbed のプログラムを開発するには,ユーザー登録を行う必要があります.ユーザ登録の手順
は下記の通りです.
①mbed を PC へ接続(USB メモリーに見えます)
②mbed を接続した時に追加されるディスク内の「MBED.HTM」を使って,mbed.org にアクセス
③mbed.org にアカウントを作成
まず,mbed を USB ケーブルを使って PC と接続します.自動的にドライバーがインストールされ,リムーバ
ブルディスクが追加されます(mbed ドライブ)
. 追加されたディスク内の MBED.HTM をダブルクリックする
とブラウザーが自動的に起動し,mbed のログインページが開きます(図 2).
初めて使う際には,ユーザー登録が必要ですので,
「Signup」をクリックし,ユーザ登録ページ(図 3)に進
みます.
図 1 mbed ドライブ(初めて接続した時)
1/22
図 2 mbed.org のログインページ
ユーザ登録ページでは,
メールアドレス
: メールアドレスを入力
ユーザ名
: ログインする際に使用する名前
パスワード
: ログインする際に使用するパスワード
ファーストネーム : 利用者の名前 (アルファベットで)
姓
: 利用者の名字 (アルファベットで)
「ファーストネーム」や「姓」は,他のユーザ
にも公表されますので,本名を公開したくない
場合はハンドル・ネームを入力してください.
「私がすることに同意」の横のチェックボックスにチェックを入れます.
全て入力したら「Signup」ボタンを押して,登録を完了させます.
図 3 ユーザ登録ページ
1-2.プログラミングを行う時の手順(クラウド環境)
ユーザ登録が完了しましたので,いよいよプログラムの作成です.「クラウド環境」でmbedの開発を行う手
順は下記の通りです.
①mbed を PC へ接続
②Webブラウザを起動し mbed.org にログイン
③Webブラウザ上でプログラムを作成
④プログラムをコンパイル(成功するとダウンロードされます)
⑤ダウンロードされたプログラムを mbed にコピー
⑥書き込んだプログラムの起動
図 4 mbed.org トップページ
mbed.org のトップページにて「Login or signup」リンクをクリックします.
図 2 のログインページに移動しますので,登録した「ユーザ名」と「パスワード」を入力して「Login」を押し
ます.
「ユーザページ」に移動しますので,
「Compiler」をクリックします.図 6 の Compiler ページが開きます
ので,
「New」をクリックして,新しいプログラムの作成を開始します.
2/22
図 5 mbed.org ユーザページ
図 6 Compiler ページ
プログラム名入力ダイアログ(図 7)が表示され
ますので,プログラム名を入力します.
ここでは,プログラム名として,
「LedTest」
と入力してみましょう.
LedTest と入力する
プログラム名を入力し終わったら,
「OK」ボタン
を押します.
図 7 プログラム名入力ダイアログ
3/22
自動的にソースファイル
「 main.cpp 」 と ラ イ ブ ラ リ
「mbed」が生成され,ファイ
ルリスト(図 8)に登録されま
す.
ソースファイルを編集する場
合は,ファイルリスト上で対象
のファイル名をダブルクリック
し,
編集プログラム編集画面
(図
9)へ切り替えます.
図 8 ファイルリスト
図 9 プログラム編集画面
新規にプログラムを作成すると,LED を点滅させる C++言語で記述されたプログラムが main.cpp に書き込ま
れます.別のプログラムを作成する場合は,main.cpp の中身を修正するわけですが,今回は修正をせずに次の
手順へ進みます.
C++言語のプログラム(ソースファイル)から mbed(Arm プロセッサー)が理解できる機械語で記述された
バイナリー・ファイルへ変換するには,編集画面の「Compile」ボタンを押します.プログラム中にエラーが無
ければ(今回は無いはずです)
,バイナリー・ファイルのダウンロードを促すダイアログが表示されますので,都
合が良いフォルダーに保存します(ブラウザーの設定で,ダウンロード先をその都度尋ねない様にしてある場合
は,既定のフォルダーにダウンロードされます)
.
保存したバイナリー・ファイルを mbed ドライブにコピーした後,mbed のリセットボタン(mbed 基板上の
プッシュスイッチ)を押すと,プログラムが起動し LED1 の点滅が開始されます.
ステータス LED
LED4
LED1
リセットボタン
図 10 mbed 基板
4/22
1
2
3
4
5
6
7
8
9
10
11
12
#include "mbed.h"
mbed基板に搭載された機能を使用するための
「おまじない」が記入されたファイルを読み込む
DigitalOut myled(LED1);
LED1 をディジタル出力として使用する
int main() {
while(1) {
myled = 1;
wait(0.2);
myled = 0;
wait(0.2);
}
}
無限に下記の処理を
myled を 1 にする(HIGH にする)
0.2 秒休む
myled を 0 にする(LOW にする)
0.2 秒休む
繰り返す
リスト 1 サンプルプログラム
プログラムを新規作成した際に,書き込まれたプログラムで行っている処理の概要は,下記の通りです.
1 行目の「# include "mbed.h"」は,mbed 基板に搭載された機能(ディジタル入出力,アナログ入出力,シリ
アル通信等々)を使用するために必要な事が書かれたファイルを読み込む処理(インクルード)になります.そ
のため mbed 基板の機能を使用する場合には非常に重要な記述になります.書き忘れると「Compile」を行った
時に開発ツールから非常にたくさんのお叱りを受けます.
3 行目の「DigitalOut myled(LED1) ;」は「LED1」と名前を付けられた「ピン」をディジタル出力として設
定し,呼び名を「myled」に設定するという意味を持っています.
mbed のプログラム中には
「LED1」
や
「p5」
等のピン番号を表す文字列が良く出てきます.
「LED1」
から
「LED4」
は,それぞれ基板上に搭載された 4 個の LED へ接続されている「ピン」を示しています.一方「p5」から「p30」
は,mbed 基板上の該当する「ピン」を示しています.
7 行目と 9 行目の「myled = 1;」,「myled = 0;」は,それぞれディジタル出力端子からの出力を設定する働き
を持っています.ディジタル出力に「1」を代入(書き込む)と「ピン」の状態が ON(3.3[V])となり,「0」を代
入すると「ピン」の状態が OFF(0[V])となります.
8 行目及び 10 行目の「wait(0.2);」によってプログラムが「0.2 秒間処理を停止」します.括弧の中に与える数
値が休む時間(秒単位)を示しています.
5/22
1-3 ローカル環境での開発
「クラウド環境」では PC へ開発ソフトをインストールする必要がありませんので手軽で良いのですが,競技
会場でインターネット接続が確保できなかった場合,お手上げになってしまいます.
そこで,競技会へ参加した場合にも安心して開発を行うために,本節では「ローカル開発環境」の準備と「ク
ラウド環境」からの持ち出し方法を説明します.
ローカル環境での開発を行う手順は
①開発ソフトの準備(1 回だけ)
②「クラウド環境」で使用していたファイルを「ローカル環境」用にエクスポート
③「ローカル環境」での開発
となります.
①開発ソフトの準備
開発に必要なソフトは下記の 2 点です.
(a)Arm プロセッサー用クロスコンパイラ(Sourcery G++ Lite)
(b)テキストエディタ(Programmer’s Notepad)
(a)Arm プロセッサー用クロスコンパイラ(Sourcery G++ Lite)のインストール
まず,Sourcery G++ Lite 配布ページ https://sourcery.mentor.com/sgpp/lite/arm/portal/release1802 上の
「IA32 Windows Installer」をクリックし、
「arm-2011.03-42-arm-none-eabi.exe」をダウンロードします.
ダウンロードしたファイル(arm-2011.03-42-arm-none-eabi.exe) をダブルクリックしてインストールを行い
ます.ほとんど設定を変更する必要がありませんので,各ダイアログで「Next」ボタンを押してインストール作
業を進めてください.インストールの途中で環境変数について尋ねられますので(図 11)
,好みに応じて「Modify
PATH for current user.」か「Modify PATH for all users.」を選択して,クロスコンパイラへのパスを追加して
おいてください.
どちらか一方を選択
図 11 環境変数(パス)の追加についての質問ダイアログ
(b)Programmer’s Notepad のインストール
http://code.google.com/p/pnotepad/downloads/list より「portable-pn2342350.zip」をダウンロードします.
ダウンロードした圧縮ファイルを任意のフォルダへ展開します.以下では「pnotepad」フォルダと呼びます.
「pnotepad」フォルダ内の「pn.exe」をダブルクリックし「Programmer’s Notepad」を一旦起動します.
起動した際に「pnotepad」フォルダ内に「settings」フォルダが作成されますので,確認を行ってください.
「settings」フォルダが作成されたのを確認して,
「Programmer’s Notepad」を終了します.
次に,添付ファイル「pnote_userTool.zip」を任意のフォルダへ展開します.次に展開したフォルダ内の
「make.bat」,「copyTombed.bat」,「rm.cmd」を「pnotepad」フォルダへコピーしてください.さらに
「UserTools.xml」を「pnotepad¥settings」フォルダへコピーしてください.
以上で Programmer’s Notepad のインストール及び準備は完了です.
6/22
②「クラウド環境」で使用していたファイルを「ローカル環境」用にエクスポート
「クラウド環境」で使用していたファイルを「ローカル環境」用にエクスポートする手順は
(a)ファイルの複製(省略可)
(b)基本ライブラリの入れ替え
(c)プログラムのエクスポート(Sourcery G++ Lite 向け)
となります.
(a) ファイルの複製(省略可)
「ローカル環境」用に変換する際には,次の手順で示すように「基本ライブラリ」の入れ替えが必要になりま
す.そのため同じプログラムを引き続き「クラウド環境」でも使用する場合は,プログラムの複製を作成します.
ここでは,プログラム「LED」をエクスポートする例を用いて具体的な手順を示します.
図 13 複製後のプログラム名の指定
図 12 「Save As」メニュー
まず「Program Workspace」上で,複製したいプログラム名(ここでは「LED」
)を右クリックし,
「Save As…」
を選択します(図 12).次に「Save as」ダイアログ(図 13)において,複製後のプログラム名(
「LDE_gcc」
)を設
定します.この操作によって「Program Workspace」に複製後のプログラム(
「LDE_gcc」
)が追加されます.
(b) 基本ライブラリの入れ替え
今回使用する Arm プロセッサー用クロスコンパイラは「クラウド環境」で使用しているクロスコンパイラと
は異なる開発ツールですので(同じものはとても高価です!!)
,基本ライブラリの入れ替えが必要になります.
まず,複製後のプログラムに含まれているライブラリ「mbed」を右クリックし,
「Delete Library…」を選択
します(図 14).削除しても良いかの確認(
「Confirm delete」
)ダイアログが表示されますので,
「OK」ボタンを
押して削除します.
図 14 mbed ライブラリの削除
図 15 ライブラリーの取り込み
7/22
次に,プログラム名(
「LED_gcc」
)を右クリックし,
「Import Library…」を選択してください(図 15)
.取り
込むライブラリーに関する設定を行う画面(図 16)に切り替わりますので,
「Source URL:」欄に「http://mbed.org/projects/libraries/svn/mbed/export/trunk」と入力した後
「Target Name:」欄をクリックし「export」が入力されたのを確認して,
「Import!」ボタンを押してください.
「export」用のライブラリを取り込んだ後の状態は図 17 のようになります.
図 16 取り込むライブラリーに関する設定画面
図 17 取り込み後の状態
(c) プログラムのエクスポート
プログラム名(
「LED_gcc」
)を右クリックし,
「Export Library…」を選択します(図 18).エクスポートの設
定を行うダイアログ(図 19)が表示されますので,
「Export To:」は「GCC(Code Sourcery)」を選択し,
「Export Target:」が「mbed NXP LPC1768」になっていることを確認して「Export」ボタンを押します.エ
クスポート処理を行ったファイル(zip 形式圧縮ファイル)のダウンロードを促すダイアログが表示されますの
で,都合が良いフォルダーに保存します.
図 18 プログラムのエクスポート
図 19 エクスポートの設定
エクスポートの種類
本資料ではエクスポートの設定で「GCC(Code Sourcery)」を選択しましたが,エクスポートをする際に他の
ツールチェーン(μVision4 , Code Red , GCC(ARM Embedded) )を選択することもできます.既に Code
Sourcery 以外の開発環境を導入済みであれば,お使いの開発環境向けのエクスポートを行ってください.その場
合は「ローカル環境」での開発手順が本資料の説明と異なりますので,お使いの開発環境のマニュアル等をご参
照ください.
8/22
③「ローカル環境」での開発
「ローカル環境」での開発手順は,下記の通りです.
(1)エクスポートしたファイルの展開
(2)エディター(Programmer’s Notepad)の起動
(3)ソースファイルの読み込み
(4)プログラムのコンパイル(ビルド処理)
(5)mbed への転送
(6)プログラムの起動
○まずエクスポートした際にダウンロードした圧縮ファイル(zip 形式)を任意のフォルダへ展開します.ただ
し,展開先のフォルダを示すパス内に日本語が含まれないようにしてください.
○次に「Programmer’s Notepad」を起動します.
「Programmer’s Notepad」の「File」→「Open」を選択し,
先程展開したフォルダ内の「main.cpp」を開きます.
プログラムのコンパイル
mbed への転送
図 20 「Tools」メニュー
○プログラムのコンパイル
「Tool」→「make」を選択し,プログラムのコンパイルを開始します.エラーが無ければ「Output」欄に「Process
Exit Code: 0」と表示されます.
○mbed への転送
mbed と PC を接続した状態で「Tool」→「copyTombed」を選択し,バイナリー・ファイルを mbed へ転送し
ます.
○プログラムの起動
mbed のリセットボタンを押すと,プログラムの実行が開始されます.
「ローカル環境」での開発を行う際の補足事項
○Code Sourcery(Lite 版)や他の開発環境の評価版を使用した場合にはバイナリー・ファイルのサイズが,
「オ
ンライン環境」で生成した時と比べて大きくなります(タダですので許してあげましょう)
.
○本資料では使用していませんが,USB Host や EtherNet の機能を使用したプログラムを「ローカル環境」で
開発する場合は,コンパイラごとの方言を修正する必要があります.
○コマンドプロンプト上での作業が苦にならない場合は,下記のページで紹介されている gcc4mbed
http://mbed.org/users/AdamGreen/notebook/gcc4mbed/
を導入することで,
「エクスポート処理の省略」や「基本ライブラリーが占めるディスクスペースの削減」などの
恩恵にあずかることができます.
9/22
2.mbed で計測したデータを PC で表示する
2-1 仮想シリアルポートを使用する準備
mbed は USB シリアル変換(仮想シリアルポート)機能を持っていますので, PC とシリアル通信を行うこ
とができます.また, printf 関数の出力をシリアル通信を用いて PC へ送る機能も準備されていますので,
「セ
ンサデータの確認」や「プログラム中の計算結果の確認」を手軽に行うことができます.
ただし,Windows が動作している PC において mbed の仮想シリアルポートを使用する際には,
①ドライバーのインストール
②端末ソフトのインストール(Windows XP の場合はハイパーターミナルで代用可)
が必要になります.
①ドライバーのインストール
仮想シリアルポートドライバー配布ページ(http://mbed.org/handbook/Windows-serial-configuration)にア
クセスします.同ページ上の「Download latest driver」をクリックし,ドライバーをダウンロードします.
mbedをPCと接続した状態で,ダウンロードしたインストーラを起動します.「セキュリティの警告」が出る
場合がありますが,出所がはっきりしていますので「実行」します.インストーラが起動した後「Install」ボタ
ンを押してください.インストールに成功すると「The driver was installed successfully」と書かれたダイアロ
グが出ますので,「Finish」を押しインストーラを終了します.
②端末ソフトのインストール
Tera Term配布ページ(http://www.forest.impress.co.jp/lib/inet/servernt/remote/utf8teraterm.html)
にアクセスし,端末ソフトTera Termをダウンロードします.ダウンロードしたインストーラを起動してインス
トールを行います.
今回は端末ソフトのみが必要ですので,インストールするコンポーネントの選択画面で,「コンパクトインス
トール」を選びインストールを行います.
2-2 計測データを表示する
ここでは,測距センサ(シャープ製:GP2Y0A21YK)から出力される距離データ(アナログ電圧)を,mbed
の A/D 変換機能を用いて取り込み,PC 上で動作している Tera Term で表示してみたいと思います.
測距センサと mbed 基板は表 1 の様に接続します.
表 1 測距離センサと mbed の接続
GP2Y0A21YK 側端子名 mbed 基板端子名
備考
測距センサの出力を mbed のアナログ入力端子へ
VO
p18
GND
GND
USB ケーブルから供給された 5V を測距センサへ
Vcc
VU
サンプルプログラム
測距センサで計測した値を PC へ送信するプログラムをリスト 2 に示します.
1
#include “mbed.h”
2
仮想シリアルポートを使用する.
3
Serial
pc(USBTX, USBRX) ;
mbed の p18 をアナログ入力として使用する.
4
AnalogIn
ain(p18) ;
5
6
int main() {
7
unsigned short adVal = 0;
8
シリアル通信の速度を 115200[bps]に設定する
9
pc.baud ( 115200 ) ;
10/22
10
11
12
13
14
15
16
17
18
19
20
21 }
while(1) {
adVal = ain.read_u16() >> 4 ;
pc.printf( “ adVal = %d ¥r¥n “ , adVal ) ;
wait(0.2) ;
if ( pc.readable() ) {
char c = pc.getc() ;
if( c == ‘q’ ) break ;
}
}
pc.printf( “Finish!!¥r¥n” ) ;
下記の処理を
測距センサの値を読み取る.
測距センサの値を表示する.
データを受信していた場合は
一文字取得
入力が q の場合は while ループを抜ける
繰り返す
リスト2 測距センサ出力値の表示
3 行目の「Serial pc(USBTX, USBRX) ;」は,仮想シリアルポート(USB 経由でのシリアル通信)の使用を
開始するという意味を持っています.また仮想シリアルポートの呼び名を「pc」に設定しています.
4 行目の「AnalogIn ain(p18) ;」は,mbed の p18 をアナログ入力として設定し,呼び名を「ain」に設定す
るという意味を持っています.
12 行目の「adVal = ain.read_u16() >> 4 ;」では,p18 に印加されているアナログ信号を「A/D 変換」した
結果を 16 ビットの整数として取得し,4 ビット右にシフトした値を adVal へ代入しています.
mbed の A/D 変換器は 12 ビットの分解能を持っているのですが,
「ain.read_u16()」で取得される 16 ビット
のデータは左詰されています.
従って,アナログ電圧と「ain.read_u16()の戻り値」や「4 ビット右シフトした値」との対応は
アナログ電圧[V]
read_u16()の戻り値
read_u16()の戻り値を 4 ビット右シフトした値
0
0
0
3.3/4096
16
1
2*3.3/4096
32
2
・
・
・
・
・
・
・
・
・
3.3
65535
4095
となります.
「ain.read_u16()」の結果をそのまま使用しても良いのですが,16 飛びの値になりますので,
「4 ビ
ット右へシフトした値」を使用しています.
15 行目の「pc.readable()」は,PC からシリアル通信で何かデータが送られてきていないかのチェックを行っ
ています.データを受信していた場合は「pc.readable()」の戻り値が「1」となり,受信データが無い場合は「0」
となります.
受信データが存在していた場合は,16 行目の「pc.getc()」で 1 文字受信を行っています.受信データの有無を
確認せずに「pc.getc()」を実行してしまうと,データを受信するまでプログラムがブロック(先に進まなくなる)
してしまいますので,今回のプログラムのように「いつ送られてくるかが不明」なデータを受信する処理を記述
する場合には,
「pc.readable()」でデータの有無を確認してからデータの取り込み動作を行うようにプログラムを
組むと良いです.
11/22
プログラムの実行
図 21 通信ポートの選択
図 22 シリアルポート設定
mbed を PC に接続した状態で,2-1②でインストールした Tera Term を起動します.
「ファイル」→「新
しい接続」を選択します.シリアルポート欄のラジオボタンにチェックを入れ,ポートリストの中から「COM** :
mbed Serial Port (COM**)」を選択し(図 21)
,
「OK」を押してください.
「COM**」の「**」の部分はご使用
の環境によって異なります.
シリアル通信を行う際にはお互いに(PC と mbed)通信の設定をあわせておく必要がありますので,
Tera Term の「設定」→「シリアルポート」を選び,
ボー・レートを 115200
データ
を 8 bit
パリティ
を none
ストップ
を 1 bit
フロー制御 を none
と設定してください(図 22)
.
シリアル通信の設定が完了した後に,mbed のリセットボタンを押し mbed 上のプログラムを起動します.
測距センサから取得した値が Tera Term 上に表示されれば成功です.
mbed の仮想シリアルポートによる通信を利用することで,
(a) printf 関数を用いた表示
(b)キーボード用いた入力
を行うことが可能となります.そのため,ロボット制御プログラムの作成やテストを行う上で強力な道具となり
ます.
12/22
3.mbed を使ってカメ型ロボットを動かす
3-1 カメ型ロボットとの接続回路
3 章および4 章では,
図23 に示す回路を使用してカメ型ロボットを制御するプログラムの作成をしていきます.
同回路で使用している主な部品は表2のとおりです.
5V
SIOの空きポート
またはバッテリー
から電源を供給
D2
D1
3.3V
GND
Vbat
GND
VIN
VB
nR
p5
p6
p7
p8
p9
p10
p11
p12
p13
p14
p15
p16
p17
p18
p19
p20
DC/DC
コンバータ
M1
RCB4の
COMポートへ
接続
5V
黒
赤
白
R1
Tr1
R2
5V
3.3V
R3
Tr2
R4
(3.3v) VOUT
(usb 5v) VU
IFIF+
RDRD+
TDTD+
DD+
mbed
p30
p29
p28
p27
p26
p25
p24
p23
p22
p21
押しボタンスイッチ
R5
図 23 カメ型ロボットとの接続回路
表2 主な部品リスト
部品番号
品名
D1,D2
ショットキー・バリア・ダイオード
Tr1,Tr2
トランジスタ
R1,R5
抵抗
抵抗
R2
R3,R4
抵抗
DC/DC コンバータ
M1
型番
1S3
2SC1815
1KΩ
100Ω
2KΩ
12V 以上の入力電圧,出力電圧 5V
例:enRoute 製スイッチング BEC 3A)
接続回路の主な目的は mbed と RCB-4 とのシリアル通信を行う際の「論理反転」です.特殊な部品を使用し
ているわけではありませんが,
「製作するのは大変そう」という場合は「ロボットゆうえんち」までお問い合わせ
ください.
また,本資料では mbed の端子を表 3 に示す用途に使用しています.
13/22
表3 mbed の端子の用途
ピン番号
用途
シリアル通信(送信)
p13
シリアル通信(受信)
p14
アナログ入力 ,測距センサ(シャープ製:GP2Y0A21YK)を接続
p18
アナログ入力 ,超音波受信機(近藤科学製:USRX-1)を接続
p19
アナログ入力 ,超音波受信機(近藤科学製:USRX-1)を接続
p20
ディジタル入力 , 押しボタンスイッチを接続
p21
3-2.カメ型ロボットの設定変更
mbed を使ってカメ型ロボットを制御するために,RCB-4 のシリアル通信速度の設定を変更する必要がありま
す.まず,カメ型ロボットと PC を接続し,HeartToHeart4 を起動します.
カメ型ロボットのプロジェクトを読み込んだ後に,
「プロジェクト」→「プロジェクトの設定」と選択し「RCB4
プロジェクト設定ウィンドウ」を表示します.次に「プロジェクト設定ウィンドウ」において「COM 通信速度」
を「1250000」から「115200」へ変更します.設定変更後に「ROM へ保存」→「全て保存」と選択し,プロジ
ェクトの設定を RCB-4 の ROM へ保存します.
図 24 RCB-4 プロジェクト設定
3-3.キーボード入力でカメ型ロボットを操縦する
リスト3のプログラムを用いて Tera Term を使用してカメ型ロボットを操縦してみましょう.
動作させるまでの手順は下記の通りです.
(a)リスト3のプログラムを mbed に書き込む
(b)一旦 USB ケーブルを mbed から外す
(c)カメロボの電源を ON にする
(d) 再び USB ケーブルを mbed に接続する
(e) Tera Term を起動する.
(f) Tera Term から mbed にシリアル回線を接続する
(g)カメ型ロボットを操縦する.
キーボードの「8」を押すとロボットが「前進」
キーボードの「2」を押すとロボットが「後退」
キーボードの「4」を押すとロボットが「左旋回」
キーボードの「6」を押すとロボットが「右旋回」
キーボードの「0」を押すとロボットが「停止」
キーボードの「x」を押すとプログラムが「終了」
リスト 3 のプログラムでは,キーボード入力に応じて「無線対応モーション」の再生をカメ型ロボットへ指示
していますので,製品付属のサンプルモーションを書き込んでおいてください.
14/22
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "mbed.h"
#include "rcb4.h"
#define MOT_FW
#define MOT_BK
#define MOT_RT
#define MOT_LT
1
2
4
8
ボタンデータの定義:前進
ボタンデータの定義:後退
ボタンデータの定義:右旋回
ボタンデータの定義:左旋回
DigitalOut activity( LED1 ) ;
Serial pc( USBTX , USBRX ) ; // tx, rx
RCB4 rcb4( p13 , p14 ) ; // tx, rx
LED1 を使用(生存確認点滅用)
PC との通信用モジュールを使用する
RCB-4 との通信用モジュールを使用する
int main() {
pc.baud( 115200 ) ;
wait(4.0);
メイン関数
PC との通信速度を 115200[bps]に設定
4 秒休止
while (1) {
if (pc.readable()) {
char c = pc.getc( ) ;
if (c == '8') {
rcb4.SendCtrlData(MOT_FW, 0, 0, 0, 0) ;
}
else if (c == '2') {
rcb4.SendCtrlData(MOT_BK, 0, 0, 0, 0) ;
}
else if (c == '6') {
rcb4.SendCtrlData(MOT_RT, 0, 0, 0, 0);
}
else if (c == '4') {
rcb4.SendCtrlData(MOT_LT, 0, 0, 0, 0);
}
else if (c == '0') {
rcb4.SendCtrlData(0, 0, 0, 0, 0);
}
else if (c == 'x' ) break;
}
wait(0.1);
activity = !activity;
}
activity = 0;
pc.printf("finish ¥r¥n");
while ループ
キー入力があった場合の処理
キーボードから入力された文字を取得
入力文字が 8 の場合
前進モーションを発動
入力文字が 2 の場合
後退モーションを発動
入力文字が 6 の場合
右旋回モーションを発動
入力文字が 4 の場合
左旋回モーションを発動
入力文字が 0 の場合
モーションを停止
入力文字がxの場合はループを抜ける
キー入力があった場合の処理の終端
0.1 秒休む
LED1 の論理を反転(点滅処理)
while ループの終端
LED1 を消灯
文字列" finish "を表示
メイン関数終端
}
リスト3 キーボード入力でカメ型ロボットを操縦するプログラム
「rcb4.SendCtrlData(BtnData, PA1, PA2, PA3, PA4)」関数は RCB-4 に対してコントロール入力値を送信す
る働きを持っています.第 1 引数が無線コントローラのボタンデータに対応していて,第 2 引数から第 5 引数は
無線コントローラのアナログスティック情報に対応しています.
リスト3のプログラムでは PA1~PA4 に「0」を指定していますが,HeartToHeart4 の Ver.2 では PA1~PA4
を使ったミキシング機能が追加されていますので,スラローム動作を作成する際に役に立つと思います.
15/22
4.自律機能を組み込む
4-1 押しボタンスイッチが押されるまで待機する
自律機能を組み込む第一歩として,押しボタンスイッチ(スタートボタン)が押されるまで待機するプログラ
ムを作成します.
リスト4のプログラムでは,16 行目から 19 行目の while ループがスタートボタンが押されるまで待機する処
理を担当し,LED1 を 1 秒周期で点滅させています.一方,21 行目から 24 行目の while ループがスタートボタ
ンを押した後の処理を担当し,LED1 を 200[ms]周期で点滅させています.
1
#include "mbed.h"
2
3
DigitalOut activity(LED1) ;
p21 を割り込み機能付きディジタル入力として使用する
4
InterruptIn startSW(p21);
5
6
bool start = false;
7
割り込み関数
8
void swIRQ() {
変数 start に true を代入
9
start = true;
10 }
11
12 int main() {
p21 をプルアップする
13
startSW.mode(PullUp);
p21 の立ち下がりを検出した際に呼び出す関数の登録
14
startSW.fall(&swIRQ);
15
変数 start が false である間
16
while( start == false ) {
LED1 の状態を反転
17
activity = !activity;
500[ms]休止
18
wait_ms(500);
を繰り返す
19
}
20
永遠に
21
while(1) {
LED1 の状態を反転
22
activity = !activity;
100[ms]休止
23
wait_ms(100);
を繰り返す
24
}
25 }
リスト4 押しボタンスイッチが押されるまで待機するプログラム
3.3V
プルアップ抵抗
押しボタンスイッチ
p21
押しボタンスイッチ
p21
(a)
(b)
図25 プルアップ抵抗
4 行目の「InterruptIn startSW(p21);」は,mbed の p21 を割り込み機能付きディジタル入力として設定し,
呼び名を「startSW」に設定するという意味を持っています.
13 行目の「startSW.mode(PullUp);」は,p21 に対して mbed 内部でプルアップ抵抗を取り付けると言う意味
です.この記述をしない場合は,図 25(a) に示すように mbed 外部にプルアップ抵抗を取り付けて,スイッチが
16/22
押されていない状況での p21 の状態を「1(3.3[V])」に確定する必要があります.たかが抵抗 1 本ですが,付けず
に済む方が回路作成が楽になりますので,
「startSW.mode(PullUp);」によって mbed 内部のプルアップ抵抗を使
用する設定にしています.これによって,図 25(b)のように外付け抵抗を省略することができます.
16 行目から 19 行目の while ループを脱出する方法ですが,今回は割り込み機能を使用して実装しています.
まず 14 行目の「startSW.fall(&swIRQ);」によって p21 の状態が「1」から「0」へ変化した(立ち下がり)時に,
実行して欲しい処理(関数)の登録を行っています.
待機処理中に p21 の立ち下がりを検出した際には,関数 swIRQ(8 行目~10 行目で定義)が呼び出され,変
数 start の中身が true に変更されます.そのため,スタートボタンを押した瞬間に 16 行目から 19 行目の while
ループの継続条件が成立しなくなり,21 行目から 24 行目の while ループへ処理が移行します.
同様の処理を,割り込みを使わずに記述するとリスト5のプログラムになります.
1
#include "mbed.h"
2
3
DigitalOut activity(LED1) ;
p21 をディジタル入力として使用する
4
DigitalIn
startSW(p21);
5
6
int main() {
7
startSW.mode(PullUp);
8
p21 の状態が「1」に等しい時,下記の処理を繰り返す
9
while( startSW == 1 ) {
1 秒周期で LED1 を点滅
10
activity = !activity;
11
wait_ms(500);
12
}
13
スイッチが押された後は,下記の処理を繰り返す
14
while(1) {
200[ms]周期で LED1 を点滅
15
activity = !activity;
16
wait_ms(100);
17
}
18 }
リスト5 押しボタンスイッチが押されるまで待機するプログラム(割り込みを使用しないバージョン)
リスト5のプログラムは「割り込み」を使用していない分,プログラムの見た目がすっきりしていますが,p21
の状態の調査は 500[ms]ごとにしか行われませんので,スイッチを押したタイミングが悪いと待機状態(9 行目
~12 行目)から抜けることができなくなります(スイッチを長押しすればヒットしますが)
.
いざスタートラインに着いた時に,
「スイッチを押したタイミングが悪くてロボットがスタートしない」状況に
なると精神衛生上良くありませんので,
「人が機械に合わせる」のではなく,
「スイッチが押された瞬間」を確実
に捉えてくれるようにプログラムを組んでおいた方が良いと思います(割り込み処理のために増えている行数は
5 行だけですし)
.
4-2 対象物との距離に応じて動作を切り替える①
次は,自律機能らしく測距センサの値に応じて動作を切り替えるプログラムを作成してみます.リスト 6 のプ
ログラムを実行すると,測距センサのデータがある一定の値以下である(対象物との距離が遠い)場合は,カメ
型ロボットが前進を行い,対象物との距離が近くなるとカメ型ロボットが停止します.
1
#include "mbed.h"
2
#include "rcb4.h"
3
4
#define MOT_FW 1
5
#define MOT_BK 2
6
#define MOT_RT 4
17/22
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#define MOT_LT 8
DigitalOut
InterruptIn
AnalogIn
RCB4
activity( LED1 ) ;
startSW(p21);
psd(p18);
rcb4( p13 , p14 ) ; // tx, rx
p18 をアナログ入力として使用する.
bool start = false;
void swIRQ() {
start = true;
}
int main() {
startSW.mode(PullUp);
startSW.fall(&swIRQ);
unsigned short psd_data;
unsigned int ctrlData;
while( start == false ) {
activity = !activity;
wait_ms(500);
}
while (1) {
psd_data = psd.read_u16() >> 4;
if( psd_data < 1500 ) ctrlData=MOT_FW;
else
ctrlData=0;
rcb4.SendCtrlData(ctrlData, 0, 0, 0, 0);
wait(0.1);
activity = !activity;
測距センサのデータを取得
psd_data が 1500 以下の時は,ボタンデータを前進に
それ以外は,ボタンデータを停止に
RCB-4 へコントロール入力値を送信
}
}
リスト6 距離に応じて動作を切り替えるプログラム①
4-3 対象物との距離に応じて動作を切り替える②
対象物との距離が近くなった時に停止するプログラムが出来上がりましたので,少し改造を施し「対象物との
距離が遠い時は前進」
,
「近くなったら後退」するプログラムにしてみましょう.
リスト6の 34 行目を「else ctrlData = MOT_BK;」に修正すれば完成に思えます.では実際にプログラムを修
正して実行してみましょう.予想に反してカメ型ロボットは対象物に突進し激突したと思います.
修正後のプログラムが予想通りの動作を行ってくれなかった要因は,
「無線対応モーション」の繰り返し持続条
件にあります.サンプルモーションを書き込んだ状態では,受信した「ボタンデータ」に対応するモーションの
再生が始まった後に,
「ボタンデータ」として「0」を受信しない限りモーションの繰り返しが終了しないように
なっています.
サンプルモーションをそのまま使用する場合は,カメ型ロボットに再生させたいモーションが切り替わる状況
において,一旦「ボタンデータ」として「0」を送信し,現在再生中の繰り返しモーションを終了させた後に,
新しいモーションに対応する「ボタンデータ」を送信する必要があります.
例えば,カメ型ロボットが前進している最中に測距センサの値が設定値を上回った時には,一旦「ボタンデー
18/22
タとして「0」を送信してから,後退に対応する「ボタンデータ」として「2」を送信します.プログラムとして
はそれ程難しい訳ではありませんが,出来る限りプログラムの構造を簡単にするため,ここではモーションの修
正を行います.
前進モーション(無線対応)を例に,モーション修正のポイントを説明します.無線対応の前進モーションは
図 26 に示す内容になっています.
図26 無線対応前進モーション
(a)修正前
(b)修正後
図27 無線対応モーション中の CompareButton
無線対応モーション中で繰り返しを持続するかどうかの判別を行っているコントロールは 2 個の
「CompareButton」になります.サンプルモーションでは「CompareButton」は図 27 の(a)のように「ボタン
データ」が「0 でない」場合に繰り返しを持続する経路へ分岐するように設定されています.mbed 側のプログ
ラムを簡単にするために「CompareButton」の条件を図 27 の(b)のように「ボタンデータ」が「1 と等しい」場
合に繰り返しを持続するように修正します.
この修正を施すことによって,前進モーションは「ボタンデータ」として「1」を受信した時に再生が始まり,
「1 以外のボタンデータ」を受信した時に繰り返しから抜けるモーションになります.
つまり,
「前進」の繰り返しから「後退」への切り替えを行いたい状況において,mbed から「ボタンデータ」
として「2」を送信するだけで,
「前進」の繰り返しが終了し「後退」の繰り返しへの切り替えが行われます.
モーションの修正を行った後では,カメ型ロボットは対象物との距離が設定値よりも近くなった時に無事「後
退」したと思います.
19/22
次の節で作成するプログラムで使用しますので,「無線対応の右旋回」や「無線対応の左旋回」も
「CompareButton」の分岐条件を修正しておいてください.
○「無線対応の右旋回」の繰り返し条件:
「ボタンデータ」が「4 と等しい」場合に繰り返し経路へ分岐
○「無線対応の左旋回」の繰り返し条件:
「ボタンデータ」が「8 と等しい」場合に繰り返し経路へ分岐
4-4 ビーチフラッグの基本動作(方向修正を行いながら超音波送信機へ近づく)
本資料のまとめとして,方向修正を行いながら超音波送信機へ近づくプログラムをリスト7に示します.
1
#include "mbed.h"
2
#include "rcb4.h"
関数 abs を使用するため
3
#include <math.h>
4
5
#define MOT_FW 1
6
#define MOT_BK 2
7
#define MOT_RT 4
8
#define MOT_LT 8
9
直進と旋回の切り替え用閾値
10 #define COND_DIFF 300
超音波データの和に対する閾値
11 #define COND_SUM 3700
測距センサ値の閾値
12 #define COND_PSD 2300
13
14 DigitalOut activity( LED1 ) ;
15 InterruptIn startSW(p21);
p18 に測距センサを接続
16 AnalogIn
psd(p18);
p19 に超音波受信機(右)を接続
17 AnalogIn
usR(p19);
p20 に超音波受信機(左)を接続
18 AnalogIn
usL(p20);
19 RCB4
rcb4( p13 , p14 ) ; // tx, rx
20
21 bool start = false;
22
23 void swIRQ() {
24
start = true;
25 }
26
27 int main() {
28
startSW.mode(PullUp);
29
startSW.fall(&swIRQ);
30
unsigned short psd_data , usR_data , usL_data;
31
unsigned int ctrlData;
32
int
us_Diff , us_Sum;
33
34
while( start == false ) {
35
activity = !activity;
36
wait_ms(500);
37
}
38
39
while (1) {
測距センサのデータを取得
40
psd_data = psd.read_u16() >> 4;
超音波受信機(右)のデータを取得
41
usR_data = usR.read_u16() >> 4;
超音波受信機(左)のデータを取得
42
usL_data = usL.read_u16() >> 4;
20/22
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
}
66 }
us_Diff = usL_data - usR_data;
us_Sum = usL_data + usR_data;
超音波データの差を計算
超音波データの和を計算
if( ( psd_data > COND_PSD ) || (us_Sum > COND_SUM) ) {
ctrlData = 0;
}
else {
if( abs(us_Diff) < COND_DIFF ) {
ctrlData = MOT_FW;
}
else if( us_Diff > COND_DIFF ) {
ctrlData = MOT_LT;
}
else {
ctrlData = MOT_RT;
}
}
フラッグに近い場合は
ボタンデータを停止に設定
rcb4.SendCtrlData(ctrlData, 0, 0, 0, 0);
wait(0.1);
activity = !activity;
RCB-4へコントロール入力値を送信
0.1 秒休む
LED1 の状態を反転(生存確認)
フラッグに近くない場合で
差の絶対値が閾値より小さい時
ボタンデータを前進に設定
それ以外で,差が閾値以上の時
ボタンデータを左旋回に設定
どの条件も満たさない時
ボタンデータを右旋回に設定
リスト7 方向修正を行いながら超音波送信機へ近づくプログラム
リスト7のプログラムでは,左右の超音波受信機データの差を用いて,
○差の絶対値が閾値(例では 300)よりも小さい(左右の超音波データが近い数値)の時に「前進」
○差の値が閾値よりも大きい(左方向から超音波が強く聞こえる)時に「左旋回」
○それ以外の場合に「右旋回」
を行わせることで,超音波送信機へカメ型ロボットを移動させています.
フラッグの近くに到着した状態では,
「左右の超音波データが両方とも大きい」か「測距センサの値が大きい」
状態になりますので,47 行目の条件式を使用してカメ型ロボットの動作を停止させています.
超音波受信機の取り付け方によっては「超音波送信機へ上手く近づかない」または「停止条件を満たす前にフ
ラッグと接触してしまう」場合があるかと思います.その際は 10 行目~12 行目の閾値を調整してください.
リスト7のプログラムでは,フラッグへ接近する時に「前進」と左右の「旋回」を使い分けていますが,カー
ブを行うモーションを追加し,条件を細分化することでビーチフラッグ競技のタイムを縮めることができると思
います.
本資料では取り上げていませんが,mbed はシリアル通信ポートを 3 セット持っていますので,RCB-4 との通
信に使っていないシリアルポート(p9(tx)と p10(rx)のペア,p28(tx)と p27(rx)のペア)に ZigBee モジュールな
どを取り付けることで,自律動作中のセンサ値を離れた場所にある PC 上で確認しながら条件の調整を行うこと
も可能になり,調整時間を短くできます.
さらに,
「到達確率」や「到達時間」を向上する際のポイントとしては,
○「モーションの特性(旋回角度等)
」と「動作切り替え値」のすり合わせ:
すり合わせが上手くできていないと,左右の旋回を永遠に繰り返してしまったりします.
○センサの数を増やす:苦手な領域が減り,迷子になりにくくなります.
○センサデータからノイズを取り除く(移動平均処理など)
:不必要なモーション切り替えが減ります.
○センサ値の変化履歴から予測値を算出する:状況変化への対応が早くなるためタイムが向上します.
などが挙げられます.
21/22
添付ファイルリスト
①pnote_userTool.zip : Programmer’s Notepad 用ユーザコマンドファイル
②Sample2.zip
: リスト 2 のサンプルプログラム(
「クラウド環境用」
)
③Sample3.zip
: リスト 3 のサンプルプログラム(
「クラウド環境用」
)
④Sample4_1.zip
: リスト 4 のサンプルプログラム(
「クラウド環境用」
)
⑤Sample4_2.zip
: リスト 6 のサンプルプログラム(
「クラウド環境用」
)
⑥Sample4_4.zip
: リスト 7 のサンプルプログラム(
「クラウド環境用」
)
②~⑥のサンプルグログラムは「クラウド環境」へインポートしてお使いください.
参考文献
[1] 勝純一,
「超お手軽マイコン mbed 入門」
,CQ 出版社,2011 年
[2] エレキジャック編集部編,
「mbed/ARM 活用事例」
,CQ 出版社,2011 年
[3] 近藤科学,
「RCB-4 コマンドリファレンス」
,近藤科学,2010 年
配布ページ:http://kondo-robot.com/sys/archives/category/command-reference
22/22
Fly UP