...

第 2 回 組み込み機器である m3pi ロボットカーの基本的なプログラミング

by user

on
Category: Documents
16

views

Report

Comments

Transcript

第 2 回 組み込み機器である m3pi ロボットカーの基本的なプログラミング
この資料は次回以降も必要です。忘れないように持参してください
情報工学実験 I 配付資料
(2012/04/18)
第 2 回 組み込み機器である m3pi ロボットカーの基本的なプログラミングと動作
1. m3pi ロボットカー
1.1. m3pi ロボットカーとは
・
mbed を制御用のコンピュータ(マイコン)として使用する。
・
mbed で簡単なプログラムを作成するだけで、色々と動きを実現できる。また、音を出したり、液晶表示
(8 桁 x2 行で英数字キャラクター表示のみ)などもできるようになっている。
・
正確には、下半分の基板(モーターや LCD 等が付いている部分)は 3pi ロボットと呼ばれ、上半分に
mbed に直結された LED やセンサが載った基板を組み合わせて、その全体を m3pi と呼んでいる。
【参考リンク】
1.
3pi ロボットの詳細 http://www.pololu.com/catalog/product/975
2.
m3pi ロボットの説明 http://www.pololu.com/catalog/product/2151
3.
m3pi の API 一覧 http://mbed.org/users/chris/libraries/m3pi/lr20a4/docs/classm3pi.html
1.2. ロボットカーの制御(コントロール)方法
・
#include "m3pi.h" として、m3pi m3pi; にて m3pi というインスタンスを作ることで、
例えば m3pi.forward(0.1) とすれば ロボットカーは速度 0.1 で前進し、
m3pi.left(0.2) とすればロボットカーは速度 0.2 で左に回転(左折)する。
なお、m3pi.forward()のような処理はすぐに戻ってくるので、例えば 0.5 秒間前進する場合は
m3pi.forward(0.1); wait(0.5); のように時間待ちの関数と組み合わせて使う。
・
速度(モータの回転速度)の指定は、最初は 0.1 などの小さめで試すこと。1.0 はとても速い!
1
情報工学実験 I 配付資料
絶対に、机から落とさないように注意すること(たいてい壊れる)。
・
LCD への表示や音を出すには、専用の関数(正確にはメソッド)を呼び出すだけでよい。
詳しくは次節にまとめる。
・
10 分の 1 の速度でモータを動かして、前進 → 左折 → 後退 → 右折 → 停止、を行うサンプルは次
のようになる。
#include "mbed.h"
#include "m3pi.h"
#define SP 0.1
// motor speed
m3pi m3pi;
// m3pi instance
int main() {
wait(0.5);
m3pi.forward(SP);
wait (2.5);
m3pi.left(SP);
wait (2.5);
m3pi.backward(SP);
wait (2.5);
m3pi.right(SP);
wait (2.5);
}
m3pi.stop();
1.3. m3pi でできることと、その関数(メソッド)
m3pi.XXXX()の XXXX の部分にあたる。
メソッド
void forward(float speed)
説明
前進。2 つのモーターを同時に動かす。
備考
speed は 0~1.0 の
間
void backward(float speed)
後退。2 つのモーターを同時に動かす。
同上
void left(float speed)
左回転(左折)。左のモーターを後退方向に、右の 同上
モーターを前進方向に動かす。
void right(float speed)
右回転(右折)。左のモーターを前進方向に、右の 同上
モーターを後退方向に動かす。
void stop(void)
2 つのモーターを停止させる。
void left_motor(float speed)
左のモーターだけを動かす(マイナスで後退)
speed は -1.0~
1.0 の間
void right_motor(float speed)
右のモーターだけを動かす(マイナスで後退)
void cls(void)
8x2 の LCD(液晶表示器)の表示をクリアする。
void locate(int x, int y)
LCD のカーソル(表示開始場所)を指定した位置
x: 0~7
に移動させる。
y: 0~1
2
同上
情報工学実験 I 配付資料
int printf(char *format, ...)
LCD に指定した文字列を表示する(1)。
int print(char *text, int length) LCD に指定した文字列を表示する(2)。
float pot_voltage(void)
3pi 背面にあるポテンションメーター(半固定抵抗、
小型ボリューム)の値を読み出す。
float battery(void)
3pi のバッテリー(電池)の電圧を読み出す。
float line_position(void)
ラインセンサーが読みとった位置の情報を返す。
char sensor_auto_calibrate(void)
ラインセンサーのキャリブレーション(較正)を行う。
-1.0~1.0 を返す
【参考リンク】
1.
m3pi の API 一覧 http://mbed.org/users/chris/libraries/m3pi/lr20a4/docs/classm3pi.html
2. m3pi の組み立てと動作確認
2.1. mbed の取り付け
透明のケースから、m3pi の一式を取り出し、上部の無線 LAN コンバータとバッテリーが載ったプラスチック部
分をゆっくりと取り外す。取り外した上部部分は、透明の箱に戻しておく(ネジの入る柱を折らないように注意)。
mbed を写真の通りに慎重に取り付け、奥まで差し込む。
この段階で、教員か TA のチェックを受けて、次に進むこと。
3
情報工学実験 I 配付資料
2.2. m3pi の分解と電池の装着
上部の基板と、下部のモーターなどがある部分の 2 つに分ける。少しこじりながら、ゆっくりと外すこと。
LCD(液晶)モジュールを取り外す。単 4 充電池 4 本を用意し、正しい向きで装着する。
2.3. 再組み立て
LCD モジュールを白い線が入ったコネクタに差し込む。ピンが余らないように正確に入れること。
次の 2 つの写真を参考にして、上下の基板をつなぐ 3 つのコネクタと、4 本のネジを正確に合わせて、m3pi
を合体させる。
ここまでできたら、教員か TA のチェックを受けて、次に進むこと。
4
情報工学実験 I 配付資料
2.4. 電源 ON での mbed の動作確認
電源を入れる前に、教員か TA のチェックを受けること。誤って電源を入れると壊れる。
m3pi をプラスチックの箱を使った台の上に置く。これでモーターが回っても動き出さない。
USB ケーブルは接続せずに、m3pi の電源ボタンを押し、mbed の LED が点灯することを確認する。
何もしなければ、mbed に先週入れたプログラムが動作しているはずである。
5
情報工学実験 I 配付資料
2.5. 単体モードでの m3pi ロボットカーの動作確認
3pi は、起動後しばらく mbed からの指令がないと、自動的に単体モードで動作する。
LCD と A,B,C ボタンで指示できるので、適当にデモプログラムを操作してみる。(音がでるので注意!)
2.6. プログラムを書き込んでの m3pi ロボットカーの動作確認
m3pi の電源を切る(重要!)。PC と USB で接続するときは、必ず電源を切ること。
「1.2. ロボットカーの制御(コントロール)方法」で示したサンプルプログラムを、mbed の IDE に入力し、コンパ
イルした結果を mbed に転送し、USB ケーブルを外してから m3pi の電源を入れて実行してみる。
m3pi 用のライブラリを Import する必要があるので、下図のとおりに行う(m3pi のプログラム全てで必要)。
【注意事項】
1. 自席では、m3pi は必ず車輪を浮かせるための台の上に置いておく。
2. m3pi の電源を入れるときは、mbed から USB ケーブルを抜いておく。
3. USB ケーブルが接続されているときは、m3pi の電源を入れない。
6
情報工学実験 I 配付資料
付録 A mbed の開発で使うプログラミング言語 C++の簡単な説明
教科書 P.18~22 を参照のこと。
参考になる Web サイト:
・エレキジャック 「<1>mbed 入門 ~mbed を始めましょう!~」の連載記事
○ ほぼ C 言語
実験で使う範囲では、ほぼ C 言語と思ってよいが、正確には C++言語である。
Java 言語と同様に、クラスという概念を使い、関数や変数を(ピリオドをはさんで)構造化できる。例えば、m3pi
というクラスで変数(正確にはインスタンス)を作れば、m3pi.forward(1)で m3pi のモーターを前進
させることができ、m3pi.printf("ABC")で m3pi の液晶表示器に文字を出したりできる。この点は、む
しろ C 言語よりもわかりやすい。
また、C 言語に比べて引数の型を(余り)気にしなくて良い。例えば、wait(1); と wait(1.0); のいずれも意図し
たとおりに動作する(1 は整数型、1.0 は実数型につき、C 言語であれば違う関数にしなければいけない)。さら
に、引数の型に応じて処理を変えたり、演算子の意味を再定義できる(オーバーライド)が、ここでは触れない。
○ 基本と復習(キーワードを示すのみとする)
・プログラムの全体構造
1.
#include <mbed.h> を最初に行う。mbed 関係の定数やクラス、ライブラリが使えるようになる。
2.
プログラム内の定数(#define)やグローバル変数の宣言
3.
main() メインルーチン
4.
main から呼び出すサブルーチンや関数
・変数の型(mbed のコンパイラでの仕様)
変数型
char
signed char
short
ビット長
8
8
16
表現可能な範囲(float, double 以外は整数のみ)
0 ~ 255
-128 ~ 127
-32,768 ~ 32,767
unsigned short
16
0 ~ 65,535
int
unsigned int
long long
unsigned long long
32
32
64
64
-2,147,483,648 ~ 2,147,483,647
0 ~ 4,294,967,295
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
0 ~ 18,446,744,073,709,551,615
float
double
32
64
-3.4E38 ~ 3.4E38 (小数も扱える)
-1.7E308 ~ 1.7E308 (小数も扱える)
・制御文
if/else, for, while, switch/case
・I/O ポートの操作(I/O = アイオー)
クラス DigitalOut で宣言した変数は、I/O ポートと結びつけられるので、その変数に書き込むと、実際には
I/O ポートに電圧が出力される。1 であれば CPU の電源電圧である 3.3V が、0 であれば 0V が出力される。
11
情報工学実験 I 配付資料
付録 B C/C++言語の演算子の機能と優先度
使うときは表を見てよいので、大体の優先度の順番と意味を覚えておくこと。不安なときは括弧で囲めばよい。
また、0x0a1e ➜ 16 進数、012 ➜ 8 進数、の数値の表現となる。
(mbed では使えないが 0b1001011 の 2 進数表記が使えるものもある)
背景に色が付いたものは、実際に使えるようになって欲しいもの。
また、8~10 のビット演算は、== と != よりも優先度が低いので、
条件文中では必ず括弧で囲む癖を付けた方が良い。
例: if ((e & 0x10) != 0) {
// e の下位から 5 ビット目は 1 である
if (((e >> 4) & 0x1) == 1) {
優先度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// e の下位から 5 ビット目は 1 である
演算子
機 能
()
[]
->
.
!
~
++
-+
(type)
*
&
sizeof
*
/
%
+
<<
>>
<
<=
>
>=
==
!=
&
^
|
&&
||
? :
= *= /= %= += -=
<<= >>= ^= &= |=
,
括弧
配列要素
構造体へのポインタ
構造体メンバ
論理否定 (真と偽を反転する)
1の補数 (ビットを反転する)
インクリメント(一単位増加)
デクリメント(一単位減少)
プラス符号
マイナス符号
キャスト(強制型変換)
ポインタの間接指定
アドレスを求める
演算数のバイト数
乗算
除算
剰余(モジュロ)
加算
減算
左シフト(ビット単位)
右シフト(ビット単位)
より小さい
より小さいか等しい
より大きい
より大きいか等しい
等しい
等しくない
ビット論理積
ビット排他的論理和
ビット論理和
論理積
論理和
条件式
【例】
次の数値は、表現が違うが全て同じ値。
i = 42;
// 10 進数
i = 0x2a;
// 16 進数
i = 052;
// 8 進数(要注意)
int a = 1;
int b = 16; // = 0x10 (10000(2))
int c = 3;
int e = 0x97; // = 10010111(2)
の時、定番のビット演算の書き方を示す。
評価順序
--->
左から右
<--右から左
--->
--->
--->
--->
--->
--->
--->
--->
--->
--->
<---
代入演算子
<---
コンマ
--->
x
x
x
x
x
x
x
=
=
=
=
=
=
=
a
a
a
c
b
b
b
<<
<<
<<
<<
>>
>>
>>
1;
2;
3;
2;
1;
4;
5;
//
//
//
//
//
//
//
=
=
=
=
=
=
=
2 (2 の 1 乗倍)
4 (2 の 2 乗倍)
8 (2 の 3 乗倍)
12
8
1
0
x = ~e; // = 01101000(2) (1 の補数)
➜ 全ビットを反転した。ただし、
e が 32 ビット変数であれば、実際は
11111111111111111111111101101000(2)
x = e & 4;
// = 100(2)
x = e & 0x4; // 同じ意味
x = e & (1 << 2); // 同じ意味
➜ 下位から 3 ビット目だけを残した
x = (e & 0x4) >> 2; // = 1
x = (e & (1 << 2)) >> 2; // 同じ意味
➜ 下位から 3 ビット目だけを取りだした
x = (e & 0x20) >> 5; // = 0
x = (e & (1 << 5)) >> 5; // 同じ意味
➜ 下位から 6 ビット目だけを取りだした
e |= 0x8; // = 10011111(2)
e |= (1 << 3); // 同じ意味
➜ e の下位から 4 ビット目を 1 にした
e &= ~0x4; // = 10010011(2)
e &= ~(1 << 2); // 同じ意味
➜ e の下位から 3 ビット目を 0 にした
e ^= 0xc; // = 10011011(2)
e ^= (0x3 << 2); // 同じ意味
➜ e の下位から 3,4 ビット目を反転した
x = e & 0xf; // = 0111(2)
➜ 下位 4 ビットを取り出した
x = (e >> 4) & 0xf; // = 1001(2)
➜ 上位 4 ビットを取り出した
x = e | 0xf; // = 10011111(2)
➜ 下位 4 ビットを全て 1 にした
x = e | 0xf0; // = 11110111(2)
➜ 上位 4 ビットを全て 1 にした
x = (a != 0); // = 1
x = !x;
// = 0 (x が 1 のとき)
➜ 論理値は内部的には 0 とそれ以外の値
12
Fly UP