身の周りにある電子機器にはマイクロ・コンピュータ(マイコン)が内蔵されている製品がたくさんあります。それらの製品はプログラムにしたがって動いていますが、そのプログラムは別のコンピュータで開発された後、マイコンのメモリに書き込まれます。
ロボットでも、その動作がマイコンによるプログラムで制御されているものが多くみられます。この実験では、車型ロボットを組立て、プログラムで動かしてみます。ロボットを動かすソフトウェア開発の一端を体験してみましょう。
なお、本実験は岐阜大学オープンキャンパス2024で実験教室として実施した内容です。
ブロックで組み立てた車型ロボットをパソコンのキーボード操作によって動かします。車型ロボットにはマイコンが組み込まれた制御ボードを搭載します。制御ボードは、パソコンからの命令を受信・処理し、必要な速度を計算して実際にモータを駆動します。
この課題を通して、以下を学習しましょう。
実験で用いるプログラムはC言語というプログラミング言語で書かれています。制御の中心となる部分は単純なので、どのようにしてプログラムの処理が行われているのか理解しましょう。それを応用して、自分で新しい機能をプログラミングしてみましょう。
うまく動く車型ロボットを製作するには、構造・強度・重量などのバランスが重要です。設計はそのバランスをとり、決められた要求を満たすような機器を実現させるものです。ブロックによるたくさんの試作により、設計項目のバランスについて考えてみましょう。
車型ロボットをうまく動かすには、制御プログラムを入念にチューニングすることも必要ですが、制御しやすいように機体(機構)の方を調節することも重要です。ソフトウェアとハードウェアの統合の良し悪しは、実際に動かしてみて確認できます。多くの実験を通して改善を繰り返し、より良いものを製作していく過程を体験しましょう。
制御ボードとして、上記ロボット教材に付属するStuduinoを利用します。
上記のロボット教材から、制御ボード、モータ、LED、電池ボックス、USBケーブルを取り出し、以下のように接続します。
接続例を以下に示します。
USBメモリからLinuxと呼ばれるOS(オペレーション・システム)を起動して、プログラム開発を行います。以下の手順②では、用意したパソコンのBIOSと呼ばれる設定を変更します。
BIOSの設定によってはパソコンのMicrosoft Windowsが起動しなくなることもあります。もしパソコンでMicrosoft Windowsが起動しなくなってもこちらでは責任を負いかねます。よく理解した上で、自己責任において実施ください。
なお、Microsoft Windowsを起動するには、変更したBIOS設定を元に戻して再起動してください。
参考:機種によってかわりますが、所持しているパソコン(Windows10)でrufusというソフトを使用し、書き込み時間15-20分ぐらい。)
Linuxが起動すると、X Window SystemというGUIインターフェースが起動します。GUIとはGraphical User Interfaceの略で、グラフィック画面に表示されたアイコンをマウス/ペンなどのカーソルを動かして視覚的に操作して命令を実行するものです。
これに対応するものとしてCUIインターフェースがあります。CUIはCommand User Interfaceの略で、キーボードよりコマンド名を入力して命令を実行するものです。
この実験では、CUIを利用してプログラム開発を行います。
X Window Systemでは、コマンド入力を可能とする端末(Terminal)と呼ばれるアプリが用意されています。デスクトップのQTerminalというアイコンをクリックすると端末が起動します。
使用するコマンドは6つです。このうちLinuxのコマンドである3つを説明します。(他の3つは後ほど)
現在のディレクトリを表示します。
Linuxでのコマンド入力では、現在いる場所(ディレクトリ)を意識する必要があります。(ディレクトリとはMicrosoft Windowsでのフォルダに対応するもので、ファイルをまとめた入れ物のことです。)それはコマンド入力が、現在のディレクトリ内にあるファイルを対象とすることが多いためです。pwdは現在のディレクトリ名を表示するコマンドです。
現在のディレクトリを変更するコマンドです。一つ上の階層のディレクトリに戻るときは、ディレクトリ名にピリオド2つを使用します。(つまり、cd ..)
現在のディレクトリの中にあるファイルを表示するコマンドです。
ファイルの編集はプログラムの作成や修正に必要となります。本実験ではX Window System用に提供されているFeatherPadと呼ばれるテキストエディタ(編集ソフト)を利用します。
デスクトップにあるフォルダ形状のアイコン「exp」をダブルクリックすると、ファイルマージャ(Microsoft Windowsでいうエクスプローラ)が起動します。するとホームディレクトリ(自分が所有するフォルダ)であるで/home/exp内のファイルが表示されます。
その中のOpenCampusのディレクトリ内にkey-control.cというファイルがあります。こちらにカーソルを合わせダブルクリックすると、テキストエディタが起動します。
プログラミング言語の1つであるC言語の特徴や文法について簡単に説明します。
“/* */”で囲まれた文字、“//”以降の文章はプログラムとして認識されません。
C言語のもつ命令文の一つで、命令の分岐をあつかいます。使い方(構文)は次のようです。
switch(n){
case 1: 命令文A1;
命令文An;
break;
case 2: 命令文B1;
命令文Bn;
break;
…
case 35:命令文C1;
命令文Cn;
break;
default: 命令文X1;
命令文Xn;
break;
}
整数型の変数nの値によって実行される命令を切換
n=1 のときA1~An
n=2 のときB1~Bn
n=35のときC1~Cn
それ以外X1からXn
例題:くじ(kuji)の賞金(prize)は1等10,000円、2等5,000円、3等1,000円、それ以外なし、
switch (kuji) {
case 1: prize = 10000; break;
case 2: prize = 5000; break;
case 3: prize = 1000; break;
default: prize = 0; break;
}
実験で使用するプログラムは,key-control.cにすべて記述されています。したがって、key-control.cの内容を理解すれば、マイコンボードでモータを駆動する仕組みが分かります。しかし、その中には大学レベルの内容もあり,これらは大学に入ってから学習するようにしてください。
ここでは、キーボード入力でモータの動作を決める部分のみを取り出して解説し、この部分を加筆・修正することで、思い通りのキー操作ができるように実験を進めます。
制御に関係ある部分は、関数control()の中のswitch文です。
※それ以外のプログラムは変更しないでください。
void control()
{
switch(key) { キーボードの文字が,変数keyに入ってきます
case ‘q’: キーボード入力が[q]の場合の処理
motor(1, 3); モータ1を速度3で正回転
motor(2, 3); モータ2を速度3で正回転
LED_ON; LEDを点灯
break; キーボード入力が[q]の場合の処理終了
case ‘z’: キーボード入力が[z]の場合の処理
motor(1, -2); モータ1を速度2で逆回転
motor(2, -2); モータ2を速度2で逆回転
LED_OFF; LEDを消灯
break; キーボード入力が[z]の場合の処理終了
default:; キーボード入力がそれ以外の場合は何もしない
}
}
関数 motor(n, v)
モータを駆動するために、関数(命令) motor(n, v)を用意しました。この関数によりモータの停止および回転方向が制御できます。設定する値を以下に示します。
n:制御するモータ(1 or 2)(M1端子に接続されたモータが1)
v:+:正回転、-:逆回転,絶対値0~4:回転速度(0は停止)
デスクトップにある「QTerminal」をダブルクリックして、端末を立ち上げます。
key-control.cのあるディレクトリに移動します。
cd OpenCampus [Enterキー]
C言語で書かれたファイル「key-control.c」を、機械が解釈できるマシン語のファイル「key-control.hex」に変換します。
make hex [Enterキー]
プログラムに誤りがある場合は、エラーメッセージが出てビルドが中断するため、「key-control.hex」は作られません。“key-control.hex”ができているか、「ls」コマンドかファイル・マネージャで確認しましょう。
「key-control.hex」を制御ボードStuduino にアップロードします。
make install [Enterキー]
電源ボックスのスイッチをONにすると制御ボードで作成したプログラムが自動的に実行されます。
ただし、今回作成したプログラムは、キーボードからの入力が無いと動作しません。そこで、パソコンと通信するコマンドを起動して、パソコンと制御ボードを接続します。
パソコンと制御ボードをUSBケーブルで接続した状態で,以下のコマンドを入力します。
cu –l /dev/ttyUSB0 –s 9600 [Enterキー] (または cuusb[Enterキー])
キーボードの[q]キーを押すとモータが正転しLEDが点灯するか確認しましょう。次に[z]を押すとモータが逆転しLEDが消灯するか確認しましょう。
電源ボックスのスイッチを「OFF」にして、以下のコマンドでシリアル通信を切断しましょう。
~.[Enterキー]
課題1 キーボードの[a]を押すと、両方のモータの回転が停止するような機能を上のプログラムに追加し、動作を確認しなさい。
課題2 2つのモータに車輪を取り付けます。それらが左右の車輪となるよう車型ロボットを製作し、前進・後退をさせなさい。
課題2で製作した車型ロボットを、左右のDCモータの速度差を変えることで、左右に旋回できるようにプログラミングします。そのときよく曲がるように機構を工夫する必要も出てきます。工夫するポイントについてまとめました。
左右モータの速度差で旋回される場合、モータの付いていない車輪(非駆動輪)は横滑りする必要があります。したがって、モータが接続した駆動輪には輪ゴムを巻いて滑りにくく、非駆動輪は輪ゴムを巻かずに横滑りしやすくしてください。
フィギュア・スケート競技を見ていると、スケータが体全体を縮めるとスピンの回転速度が速くなることに気が付きます。回転のしやすさは慣性モーメントと呼ばれ、質量の分布が回転軸に近いほうが小さくなって回りやすくなります。
左右モータの速度差で車を旋回させる場合、回転中心は左右モータ回転軸上あたりに位置します。したがって、車の重心は駆動車輪の近くになるように製作しましょう。電池ボックスはDCモータの車輪近くに置いた方が回りやすくなります。
下のテコの例でも分かるように、回転する力は回転中心から離れた点に作用する方が大きくなります。回転力はモーメントやトルクと呼ばれ、図の場合では力と中心-作用点間距離の積で計算されます。
左右モータの速度差で車を旋回させる場合、非駆動輪の横滑り時の摩擦が旋回を妨げる抵抗力として作用します。その作用点が回転中心から遠くなるように、車長(前後輪の車軸間の距離)は短く作ると旋回しやすくなります。
課題3 下のような命令配列となるようにプログラムを修正し、車を操作しなさい。
各自で自由に車型ロボットを作成し、作成したプログラムで操作してみましょう。動きが悪い場合は機構とプログラムを調整し、試行錯誤を繰り返して動きを改善してみてください。その過程で何が悪かったかを分析するようにしましょう。
以下の動画は、実験の様子を撮影したものです。
本実験内容は、岐阜大学オープンキャンパスの実験教室で実施した内容です。実験教室ではスタッフの補助があるため、パソコン環境でのトラブルが対処できますが、ホームページではそれができないため、実験の再現が難しいところもあると思います。他のホームページを参照するなど、自分の力でトラブルが解決できる力がつくと、その力は将来大きな力となるでしょう。
なお、今後もオープンキャンパスでこの実験教室を開く予定もあります。興味のある方は岐阜大学オープンキャンパスにご参加ください。
掲載大学 学部 |
岐阜大学 工学部 | 岐阜大学 工学部のページへ>> |
※このページに含まれる情報は、掲載時点のものになります。
私たちが考える未来/地球を救う科学技術の定義 | 現在、環境問題や枯渇資源問題など、さまざまな問題に直面しています。 これまでもわたしたちの生活を身近に支えてきた”工学” が、これから直面する問題を解決するために重要な役割を担っていると考えます。 |