SU-1201 Library Manual v-1

モータードライバーシールド
ライブラリ使用説明書
はじめにはじめにこの説明書は、当社製品モータードライバーシールド(SU-1201)と Arduino を使って、当社製品KIROBO(MR-9132)を動作させるときに便利な「ライブラリ」の使い方について説明しています。
Arduino のプログラム開発環境「Arduino-IDE」はあらかじめパソコンにインストールしてあり、Arduino とモータードライバーシールドの接続、動作確認はできているものとしています。
※本書では、
モータードライバーシールドのことを「SU-1201」、または、「SU-1201 基板」、
Arduino 基板のことを「Arduino」、
Arduino プログラム開発環境のことを「IDE」、または、「Arduino-IDE」、KIROBO(MR-9132)のことを「KIROBO」、
SU-1201 と Arduino と KIROBO で作ったロボットのことを「ロボット」と表記しています。

ライブラリとはライブラリとはArduino でロボットを動作させるプログラムを作成するためには、Arduino で使う命令を知る必要があります。その命令を使って、例えば Arduino でモーターを動かそうとしたとき、例えば「ピン 4 を HIGH に、ピン 5を LOW にして、ピン 9 から HIGH と LOW を交互に出力する。」というように決まった手続きの命令を書きます。1 回だけ動かすのであれば特に気になりませんが、ロボットのように色々な動きをさせたいときは、何度も何度も同じような命令を書くことになります。ここでその「決まった手続き」を一つの命令にまとめたものがあれば、プログラムの作成が便利になり、間違いも少なくなります。
■ロボットを前進させる例
ライブラリなし

ライブラリ使用時
FWD.H(0);analogWrite(9,255);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
analogWrite(9,255);

シンプル 便利digitalWrite(4,LOW);

分かりやすいdigitalWrite(5,HIGH);

プログラムを書くときの、決まった手続きや、似たような手続きをまとめて専用の命令としていつでも使えるようにしたものを「ライブラリ」と呼んでいます。
ここで使用するライブラリは、SU-1201+Arduino と KIROBO で作ったロボットを制御するときの専用の命令が入ったものと考えればよいでしょう。
ここでは、主にライブラリ命令の使い方を説明しています。ただし、ライブラリ命令は、プログラムの作成を便利にしてくれますが、それだけでは不十分ですので Arduino で使う命令や文法も知っておく必要があります。
Arduino の命令や文法を知ると、もっと便利にロボットを制御できるようになります。
Arduino の命令や文法については、インターネットや書籍などを参考に学習することをお勧めいたします。
(1/14)(c) EK JAPAN 2012

SU-1201 Library Manual v-1

ロボットの準備ロボットの準備
この説明書で使うロボットは、以下の「組み立てた状態」の写真のように、センサーやモーターを配置して、接続されているものとします。
なお、SU-1201 と Arduino の接続方法は、SU-1201 の説明書をご覧ください。
組み立てた状態

上から見た状態

上ボディ部分
ヨコから見た状態
SU-1201
Arduino上ボディ
下ボディ※タイヤは外しています

タッチセンサー１

前から見た状態

下ボディ部分光センサー1モーター１光センサー2モーター2

タッチセンサー2

KIROBO の電池ボックスやネジ付きスペーサー、モーターの位置を調整して、写真のように組み立ててください。

(2/14)(c) EK JAPAN 2012

SU-1201 Library Manual v-1

配線
KIROBO のセンサー類やモーター、電池ボックスのコネクターは、写真の場所に差し込んでください。

光センサー1 端子

モーター1 端子タッチセンサー1 端子
電池ボックス端子

タッチセンサー2 端子
光センサー2 端子

モーター2 端子ライブラリを使用する準備

ライブラリを使用する準備
1.まず、当社ホームページ(http://www.elekit.co.jp/)にアクセスします。
ソフトウェアダウンロードのページを表示し、ソフトウェア一覧の中から、「SU-1201 用ライブラリ」を選択すると、ソフトウェア詳細の画面が表示されます。画面下方の「ダウンロードする」ボタンをクリックします。
2.ソフトウェアダウンロードフォーム画面が表示されますので、必要事項を入力してダウンロードを開始し、ファイルを適当なフォルダーに保存します。
3.ダウンロード後、保存したフォルダー内に、EKJ_ROBOT_LIB_XXX が作成されます。このファイルは圧縮されているので、解凍ソフトで解凍してください。
※ XXX はバージョンによって異なります。
4.ファイルを解凍すると EKJ_ROBOT_LIB_100 のように、バージョン番号が書かれたフォルダーが作成されます。

5.フォルダー内に、elekitKIROBO というフォルダーがあることを確認します。

(3/14)(c) EK JAPAN 2012

SU-1201 Library Manual v-1

6.次に、Arduino-IDE をインストールしたときに作成されたフォルダー（arduino-1.0.1 というようなバージョン番号が書かれたフォルダーです。）をダブルクリックして開きます。
7.フォルダー内に libraries というフォルダーがあることを確認します。
8.この libraries フォルダーの中に、6.で確認した elekitKIROBO フォルダーを移動します。

9.Arduino-IDE を起動します。
10.IDE 画面のツールバーから、スケッチ→ライブラリを使用を選択して出てくるメニューに、elekitKIROBOが表示されていることを確認してください。

これでライブラリを使用する準備は完了します。

(4/14)(c) EK JAPAN 2012

SU-1201 Library Manual v-1

ライブラリ使用時に使える専用命令の一覧
ライブラリ使用時に使える専用命令の一覧
ライブラリを使用すると、ロボットを動かすために便利な 15 種類の命令が使えるようになります。
移動命令
高速

中速

低速

前進

FWD.H(数値)FWD.M(数値)FWD.L(数値)

左旋回

LFWD.H(数値)

LFWD.M(数値)LFWD.L(数値)

右旋回

RFWD.H(数値)

RFWD.M(数値)

RFWD.L(数値)後退

BACK.H(数値)

BACK.M(数値)BACK.L(数値)

左後ろ旋回

LBACK.H(数値)LBACK.M(数値)LBACK.L(数値)

右後ろ旋回

RBACK.H(数値)

RBACK.M(数値)RBACK.L(数値)左回転

LSPIN.H(数値)

LSPIN.M(数値)

LSPIN.L(数値)

右回転

RSPIN.H(数値)

RSPIN.M(数値)

RSPIN.L(数値)

数値は、0～30000 の範囲の数値を設定します。この数値がモーターの動く時間になります。
単位はミリ秒で設定します。例えば、1 秒は 1000 ミリ秒です。
数値に、1～30000 を設定したときは、設定した時間経過後、自動的にブレーキを掛けてモーターが停止します。数値に、0 を設定したときは、自動的にブレーキは掛からず、次の移動用の命令までモーターが動き続けます。
停止命令
ブレーキあり停止

MOT.BRAKE(数値);

電気的ブレーキでピタッっと停止。

ブレーキなし停止

MOT.OFF(数値);

電気をカットするだけなので、空転気味に停止。

数値は、0～30000 の範囲の数値を設定します。この数値がブレーキを掛けておく時間になります。
単位はミリ秒で設定します。例えば、1 秒は 1000 ミリ秒です。
※ブレーキを掛ける時間が短すぎるとモーターを止めることができませんので、最低でも 500 ミリ秒くらいの時間ブレーキを掛けるようにしたほうが良いでしょう。

(5/14)(c) EK JAPAN 2012

SU-1201 Library Manual v-1

センサー・スイッチ チェック命令

光センサーチェック

タッチセンサーチェック

プッシュスイッチチェック

CHECK.LIGHT(1);センサーが光を検出していたら 1 になります。

CHECK.LIGHT(2);光を検出していないときは 0 になります。

CHECK.TOUCH(1);センサーが押されていたら 1 になります。

CHECK.TOUCH(2);押されていないときは 0 になります。

CHECK.SW(1);SU-1201 基板上の SW1 が押されていたら 1 になります。

押されていないときは 0 になります。

使い方の例
value = CHECK.LIGHT(1);光センサー(1)が光を検出していたら、変数「value」の値は 1 になります。
光を検出していなければ「value」の値は 0 になります。

ブザー出力命令
ブザー出力

BUZZ.H();

SU-1201 基板上のブザーを鳴らします。

BUZZ.M();

音色は 3 段階(H/M/L)で設定します。

BUZZ.L();

LED 出力命令
LED 出力LED.ON();KIROBO の光センサー基板上の投光用 LED をLED.OFF();点灯/消灯します。

(6/14)(c) EK JAPAN 2012

SU-1201 Library Manual v-1

プログラムを始める

プログラムを始める
ライブラリを使って始めるためには、プログラムの中に「このプログラムではライブラリを使用します。」と宣言するための決まった命令を書く必要がありますが、手早く便利に始めることができるようにテンプレート（定型の書式）を用意しています。プログラムを作成するときは、テンプレートを使って始めましょう。
テンプレート画面の説明
テンプレート画面の説明
最初に、IDE 画面のツールバーから、ファイル→開くを選択し、先ほど解凍したフォルダー内にあるMY_ROBOT_PROGRAM というファイルを選んで開きます。ファイルを開くと、下のような画面が開きます。
ロボット初期値設定エリア：
ここは応用編で説明します。書き換えたり、消したりしないでください。
ライブラリ設定エリア：
ライブラリを使用するために必要な命令です。書き換えたり、消したりしないでください。
ユーザープログラム作成エリア：
ここにロボットを動かすためのプログラムを書きます。

基本的にプログラムは、Arduino の命令を使い、Arduino のプログラム作成のルールに従って作成します。
ここでは、簡単な説明のみを行っています。Arduino でプログラムするときの詳しい命令の内容や IDE の使い方は書籍などで学習を行ってください。
ユーザープログラム作成エリアの説明
ユーザープログラム作成エリアの説明
ここには例えば int [変数];のように、新しく作成する変数を宣言します。
SU-1201 基板上の SW1 を押すと、ここにactKirobo｛
書かれたプログラムの実行が始まり、スイッチを切るか、リセットスイッチ(SW2)を押すまで、くり返し実行します// の後に続く文は「コメント」といい、プログラムの実行には関係ありません。何をしている命令なのか忘れないように書いておくメモのように使うことができます。

(7/14)(c) EK JAPAN 2012

SU-1201 Library Manual v-1

ロボットのプログラム

ロボットのプログラム

プログラムの作成
プログラムの作成
ここではライブラリ用の命令を使ってロボットを動かすプログラム例を解説しています。
実際に Arduino(ロボット)にプログラムをアップロードし、動きを確認しながら Arduino のプログラムと、ライブラリ命令の使い方を練習してください。
テンプレートを開き、ユーザープログラム作成エリアにプログラムを書きますが、そのときに、テンプレートを上書きしてしまわないように、プログラムを書き始める前に「名前をつけて保存」をしておくと良いでしょう。

プログラムの実行
プログラムの実行
本書で説明しているライブラリを使ったプログラムを実行するための手順は以下の通りです。
①SU-1201 基板の SW3 を OFF にします。（ロボットには乾電池をセットしておきます。）②USB ケーブルで Arduino とパソコンを接続し、プログラムをアップロードします。
③「マイコンボードへの書き込みが完了しました。」と表示されたら、USB ケーブルを外します。
④SU-1201 基板の SW3 を ON にして、数秒待ちます。
⑤ブザーが「ピッピッ」と鳴った後に、SW1 を押すと、プログラムが実行されます。
Step1 移動Step1 移動
移動命令には使い方が 2 つありますので、それぞれについて説明します。
①自動ブレーキありの移動命令を使う場合。
以下のプログラムをアップロード後、SW1 を押して実行すると、「中速で 3 秒間（自動ブレーキありで）前進して、2 秒その状態を続ける。」という動作を繰り返します。
void actKirobo(){
FWD.M（3000）;delay(2000);}
SW1 を押すと、FWD.M(3000)が実行され、中速で前進が始まり、3 秒間経過すると、自動的にブレーキが掛かり停止します。その後、delay(2000)が実行され、2 秒間停止状態を続けます。
actKirobo の中はくり返し実行されますので、2 秒間経過すると、actKirobo の先頭に戻り、再び前進を始めます。
②自動ブレーキなしの移動命令を使う場合。
以下のプログラムをアップロード後、SW1 を押して実行すると、「高速で（自動ブレーキなしで）右回転を始め、3 秒後にモーターへの電気をオフ。」を繰り返します。
void actKirobo(){
RSPIN.H(0);delay(3000);
MOT.OFF(2000);}(8/14)(c) EK JAPAN 2012

SU-1201 Library Manual v-1

RSPIN.H(0);で、自動ブレーキなしの右回転を高速で始めます。
delay(3000);で、その状態のまま（回転状態のまま）3 秒待ちます。
MOT.OFF(2000);で、モーターをオフにした状態で 2 秒待ちます。
その後は actiKrobo の先頭に戻り、プログラムを繰り返します。
移動命令について移動に関係する命令は 8 種類あり、それぞれスピードを 3 段階に設定できます。

ワンポイント
自動ブレーキ「あり」と「なし」は、ロボットにさせたい動きによって使い分けます。
例えば、前進しながらブザーを鳴らす場合は、「ブレーキなし」を使います。前進動作を終わらせてロボットが停止したあとにブザーを鳴らす場合は、「ブレーキあり」を使うといった具合です。
ワンポイントFWD.H(1000);と書くと、「自動ブレーキあり前進」になります。この命令は、1 秒間モーターが回転するように電気を流し、その後、電気的ブレーキを掛ける信号を出します。ただしそのブレーキを掛ける時間は 1 ミリ秒程度です。つまり、移動命令のすぐに後に次の移動命令があるときは、ブレーキ動作がほんの一瞬で、次の移動が始まるので、ロボットはほとんど停止せずに動き続ける動作になります。
以下のプログラムをアップロードして、違いを確認しておきましょう。
void actKirobo(){

void actKirobo(){

LSPIN.M(1000);

LSPIN.M(1000);

LSPIN.M(1000);delay(500);}

LSPIN.M(1000);delay(500);}(9/14)(c) EK JAPAN 2012

SU-1201 Library Manual v-1

Step3 投光用
Step2 LED
投光用 LEDKIROBO 用光センサー接続端子に接続した、投光用 LED を使う場合の例です。
以下のプログラムをアップロード後、SW1 を押して実行すると、「投光用 LED が 1 秒間隔で点灯、点滅を繰り返す。」という動作を行います。
void actKirobo(){LED.ON();delay(1000);
LED.OFF();
delay(1000);}
LED.ON();命令は、投光用 LED を点灯します。
LED.OFF();命令は、投光用 LED を消灯します。
（※投光用 LED は、SW1 を押す前の状態では点灯しています。これはライブラリにあらかじめ書かれているプログラムの動作であり、異常ではありません。）
Step3 ブザー
Step3 ブザー
SU-1201 基板上のブザーを使う場合の例です。
アップロード後 SW1 を押してこのプログラムを実行すると、「1 秒ごとに、ブザーの音が高→中→低と変化して鳴る。」という動作を繰り返します。
void actKirobo(){
BUZZ.H();
delay(1000);
BUZZ.M();
delay(1000);
BUZZ.L();delay(1000);}
BUZZ.H();命令は、ブザーを高音で短く 1 回鳴らします。
BUZZ.M();命令は、ブザーを中音で短く 1 回鳴らします。
BUZZ.L();命令は、ブザーを低音で短く 1 回鳴らします。

(10/14)(c) EK JAPAN 2012

SU-1201 Library Manual v-1

Step4Step4
タッチセンサー入力
タッチセンサー入力
タッチセンサーを使う場合の例です。
以下のプログラムをアップロード後、SW1 を押して実行すると、「タッチセンサー(1)が押されていたら、0.5 秒後進して向きを変える。押されていなければ前進する。」という動作をします。
int touchval;
void actKirobo(){touchval = CHECK.TOUCH(1);if(touchval == 1){
BACK.L(500);
RSPIN.L(1000);}else{
FWD.L(0);}}CHECK.TOUCH(1);を実行すると、SU-1201 の Touch1 に接続されているタッチセンサーの状態をチェックします。タッチセンサーが押されていると、実行結果が「1」に、タッチセンサーが押されていないと実行結果は「0」になります。この結果の数値のことを「戻り値」呼び、「戻り値は 1」、「戻り値は 0」といいます。
この戻り値を使うために「変数」に記憶させます。
touchval = CHECK.TOUCH(1);と書くと、touchval に戻り値が記憶されます。つまり、タッチセンサー1 が押されていたら touchval は１に、押されていなければ touchval は 0 になります。
ここで、touchval という「変数」を使うために、プログラムの中で「これは変数ですよ。」と宣言する必要があります。 その宣言のために int touchval; と書きます。この変数の宣言は、プログラムの最初に書きます。テンプレートの「新しく作る変数はここに書きます」と書いてあるエリアに書くと良いでしょう。
タッチセンサーの状態が分かれば、あとは「if 文」で戻り値に対応したロボットの動作を書けば OK です。
「if 文」の基本的な使い方は、以下のようになります。
if （ 条件 ）{条件に一致する動作} else {条件に一致しないときの動作}
例の中の touchval == 1 が条件になります。 （“=”が２個あることに注意しましょう。）
条件に一致したら、BACK.L(500); RSPIN.L(1000);を実行、条件に一致しなかったら、FWD.L(0);を実行して、actKirobo の先頭に戻ります。

(11/14)(c) EK JAPAN 2012

SU-1201 Library Manual v-1

Step5Step5
プッシュスイッチ入力
プッシュスイッチ入力
プッシュスイッチ入力も考え方はタッチセンサーと同じです。プッシュスイッチを使った例です。
以下のプログラムをアップロード後、SW1 を押して実行すると、「プッシュスイッチを押すと、ブザーが 2 回鳴る。」という動作をします。
int pushval;
void actKirobo(){pushval = CHECK.SW(1);if (pushval == 1){
BUZZ.H();
BUZZ.H();
delay(500);}}
pushval == 1 が条件になります。条件に一致したときはブザーを鳴らす命令を実行します。
一致しないときは、何もしませんので else｛ ｝の部分が省略されています。
CHECK.SW (1);を実行すると、SU-1201 の SW1 状態をチェックします。SW1 が押されていると、戻り値が 1 になり、押されていないときは戻り値が 0 になります。
Step5 光センサー
Step6 光センサー
光センサーも考え方はタッチセンサーと同じです。
以下のプログラムをアップロード後、SW1 を押して実行すると、「光センサー(1)が光を検出していたら前進、光センサーが光を検出していなければ、0.5 秒後進して向きを変える。」という動作をします。
int lightval;
void actKirobo（）{LED.ON();
lightval = CHECK.LIGHT(1);if(lightval == 1){
FWD.L(0);}else{
BACK.L(500);
LSPIN.L(100);}}
このプログラムでは、光センサーが光を検出しやすいように、LED.ON();命令を使って、最初に投光用LED を点灯させています。
(12/14)(c) EK JAPAN 2012

SU-1201 Library Manual v-1

CHECK.LIGHT(1)を実行すると、SU-1201 の PTR1 に接続された光センサーの状態をチェックします。光センサーが光を検出していると、戻り値が 1 に、検出していなければ戻り値が 0 になります。
具体的な例としては、ロボットが（光センサーが）白い床の上にあれば、投光用 LED の光が反射してセンサーが光を検出するので戻り値が 1 になり、ロボットが黒い床の上にあれば、投光用 LED の光が吸収されてセンサーが光を検出しないので戻り値が 0 になります。

応用編

応用編
ロボット初期値設定エリアの初期値の意味と設定方法を説明しています。
①左右モータースピード微調整
int MOTOR2_PWM = 100;//左モーター出力割合 0-100%

int MOTOR1_PWM = 100;//右モーター出力割合 0-100%

モーターの回転スピードを調整します。
MOTOR1_PWM の値を小さくすると、モーター1 のスピードが遅くなります。
MOTOR2_PWM の値を小さくすると、モーター2 のスピードが遅くなります。
例えばロボットが前進するときに、少しずつ右側に曲がるように進んでしまうような場合があります。
これは左モーターより右モーターの回転が少しだけ遅いこということになります。曲がって進んでしまうクセを改善するために、左モーターの回転だけを少し遅くする方法があります。
そこで、右に曲がるクセがあったときは、
int MOTOR2_PWM = 80;//左モーター出力を 80％

int MOTOR1_PWM = 100;//右モーター出力はそのまま 100%と設定すれば、常に左モーターの回転が少しだけ遅くなり、曲がるクセが少し小さくなります。
ただし、あくまで簡易的な改善方法なので、いつも上手くいくとは限りません。床の状態や、電池の消耗具合なども影響します。高速移動するときは改善しても、低速移動のときは改善しないことやその逆なども考えられます。色々実験しながら、ロボットに合った動かし方を見つけてください。
②光センサー感度調節
int THRESHOLD = 700;//光センサーしきい値

0-1023光センサーの感度を調節します。ここで設定する値のことを「しきい値」と言います。
光センサーの戻り値は、ここで設定したしきい値を境に変わります。
光センサーは、センサーの真下の色（反射している光の強さ）を 0～1023 という数値に置きかえて測定しています。光が強ければ 0 で、光が弱ければ 1023 になります。
例えば、真っ白な紙だと、光の反射も強くなるので、測定した数値は 0 に近くなります。
逆に、真っ黒な紙だと、光が吸収されてしまい、測定した数値は 1023 に近くなります。

(13/14)(c) EK JAPAN 2012

SU-1201 Library Manual v-1

その測定した数値と、先ほどの「しきい値」を比較して、しきい値より小さければ戻り値は 1 になり、しきい値より大きければ戻り値は 0 になります。
イメージ

床

測定結果

しきい値

しきい値

しきい値

1023=700=500=300

750

700

戻り値=0の色

500
250

500
戻り値=1300

0

サンプルプログラム

サンプルプログラム

ライブラリ命令を利用したサンプルプログラムを用意しています。サンプルプログラムは、「ライブラリを使用する準備」で当社サイトからダウンロードして解凍したフォルダーEKJ_ROBOT_LIB_100 に入っています。
サンプルプログラムを使ってロボットを動かし、自分でプログラムを作成するときの参考にしてください。
サンプルと内容
1.

SU1201LIB_MOVE_FWD_BACK

前進と後進

2.

SU1201LIB_MOVE_Direction

方向転換

3.

SU1201LIB_MOVE_Brake_OFF

ブレーキとオフ

4.

SU1201LIB_Touch_LED_ONOFF

タッチセンサーで LED を ON・OFF する

5.

SU1201LIB_Touch_Back

タッチセンサーを使って向きを変える

6.

SU1201LIB_Touch_use2Sensor

タッチセンサーを２つ使う

7.

SU1201LIB_Light_StopOnBlack光センサーを使って、黒い床を検出

8.

SU1201LIB_Light_DarkBuzzer

光センサーを使って、ブザーを制御

9.

SU1201LIB_Light_ValueCheck_PC

光センサーの計測した値をパソコンで見る。

10. SU1201LIB_Variable_CountDownBuzzer タッチセンサーが押された回数を数える。
11. SU1201LIB_buzzer_DoReMi

ブザーを使って、ドレミ・・・の音を出す。

12. SU1201LIB_Game_Denai

白い床に書いた黒枠から出て行かない。

13. SU1201LIB_Game_LineTrace

ライントレース動作

14. SU1201LIB_Game_CompassSensor

コンパスセンサー（別売）を使った動作例※Arduino-IDE のバージョンによっては動作しないことがあります。バージョン(1.0.1)をご確認ください。
(14/14)(c) EK JAPAN 2012