トップページ > おもしろ科学実験室(工学のふしぎな世界) > マイコンボードによる車型ロボット制御のプログラミング

おもしろ科学実験室(工学のふしぎな世界)

マイコンボードによる車型ロボット制御のプログラミング

2024年12月5日
岐阜大学 機械工学科 知能機械コース 伊藤 聡

1.はじめに

 身の周りにある電子機器にはマイクロ・コンピュータ(マイコン)が内蔵されている製品がたくさんあります。それらの製品はプログラムにしたがって動いていますが、そのプログラムは別のコンピュータで開発された後、マイコンのメモリに書き込まれます。

 ロボットでも、その動作がマイコンによるプログラムで制御されているものが多くみられます。この実験では、車型ロボットを組立て、プログラムで動かしてみます。ロボットを動かすソフトウェア開発の一端を体験してみましょう。

 なお、本実験は岐阜大学オープンキャンパス2024で実験教室として実施した内容です。

実験の概要

 ブロックで組み立てた車型ロボットをパソコンのキーボード操作によって動かします。車型ロボットにはマイコンが組み込まれた制御ボードを搭載します。制御ボードは、パソコンからの命令を受信・処理し、必要な速度を計算して実際にモータを駆動します。

使用したもの

  • パソコン(x86系CPU:MS Windows OSが動作するPCなら概ね可)
  • ロボット教材(Artec社 アーテックロボ(ベーシック))
  • 全消去してもよいUSBメモリ(32GB以上)
  • 単3電池3本
注意点
  • PCではLinux(Lubuntu 22.04)をUSBから起動します。(WindowsOSは使用しません。)
  • アーテック社の制御ボードStuduinoはArduino互換です。開発環境やプログラムはArduino系の基板でも動作するはずです(未確認)。しかし、配線や端子が基板によって異なるため、本HPのプログラムはStuduinoでしか正常に動作しません。
  • Arduino IDEは使用せず、AVRライブラリを使用します。

実験のねらい

 この課題を通して、以下を学習しましょう。

(1)制御プログラムから制御情報の流れをつかもう

 実験で用いるプログラムはC言語というプログラミング言語で書かれています。制御の中心となる部分は単純なので、どのようにしてプログラムの処理が行われているのか理解しましょう。それを応用して、自分で新しい機能をプログラミングしてみましょう。

(2)機械設計のセンスを磨こう

 うまく動く車型ロボットを製作するには、構造・強度・重量などのバランスが重要です。設計はそのバランスをとり、決められた要求を満たすような機器を実現させるものです。ブロックによるたくさんの試作により、設計項目のバランスについて考えてみましょう。

(3)ソフトウェアとハードウェアの統合と実験よる改善

 車型ロボットをうまく動かすには、制御プログラムを入念にチューニングすることも必要ですが、制御しやすいように機体(機構)の方を調節することも重要です。ソフトウェアとハードウェアの統合の良し悪しは、実際に動かしてみて確認できます。多くの実験を通して改善を繰り返し、より良いものを製作していく過程を体験しましょう。

2.実験装置の準備

制御ボード

 制御ボードとして、上記ロボット教材に付属するStuduinoを利用します。

ロボット部品の接続

 上記のロボット教材から、制御ボード、モータ、LED、電池ボックス、USBケーブルを取り出し、以下のように接続します。

  • DCモータをM1、M2端子に接続
  • LEDをD12端子に接続
  • 電池ボックスには単三電池を3本取り付け、スイッチを「切」にして電源端子に接続
  • パソコンとStuduinoをUSBケーブルで接続

 接続例を以下に示します。

パソコン上開発環境の準備

 USBメモリからLinuxと呼ばれるOS(オペレーション・システム)を起動して、プログラム開発を行います。以下の手順②では、用意したパソコンのBIOSと呼ばれる設定を変更します。

注意点

    BIOSの設定によってはパソコンのMicrosoft Windowsが起動しなくなることもあります。もしパソコンでMicrosoft Windowsが起動しなくなってもこちらでは責任を負いかねます。よく理解した上で、自己責任において実施ください。

 なお、Microsoft Windowsを起動するには、変更したBIOS設定を元に戻して再起動してください。

(1)LinuxのブータブルUSB作成
  • Linuxのisoイメージファイルと呼ばれるものをダウンロード
  • ブータブルUSBメモリ作成用のアプリにより、ダウンロードしたisoイメージファイルを準備したUSBメモリにコピー(注:通常のコピーではブータブルUSBは作成できません。「ブータブルUSB」等でネット検索してください。USBメモリの内容はすべて消去されます。

 参考:機種によってかわりますが、所持しているパソコン(Windows10)でrufusというソフトを使用し、書き込み時間15-20分ぐらい。)

(2)USBメモリから起動可能とするようにパソコンBIOS設定画面を起動(自己責任で
  • パソコンの起動画面で、指定のキー(製品によって異なる。著者のPCでは「F2」キー)を押し、BIOS設定画面を起動
  • 以下の3か所を変更(製品によってことなるため、製造メーカのHPを参照)
    1. ①Windowsのセキュア・ブートをDisable(不可)に(注:Windows起動時にはEnableの戻す。このとき、Bit Locker回復キーを求められることがあるので、必ず記録しておくこと)
    2. ②SATAの設定
    3. ③起動優先順序をUSBが最初となるように設定
(3)USBメモリからのLinux起動
  • パソコンをシャットダウン
  • USBメモリをパソコンに接続
  • パソコンを(再)起動
  • 図のような画面が表示されれば起動成功です。

3.Linux環境

X Window System

 Linuxが起動すると、X Window SystemというGUIインターフェースが起動します。GUIとはGraphical User Interfaceの略で、グラフィック画面に表示されたアイコンをマウス/ペンなどのカーソルを動かして視覚的に操作して命令を実行するものです。

 これに対応するものとしてCUIインターフェースがあります。CUIはCommand User Interfaceの略で、キーボードよりコマンド名を入力して命令を実行するものです。

 この実験では、CUIを利用してプログラム開発を行います。

端末

 X Window Systemでは、コマンド入力を可能とする端末(Terminal)と呼ばれるアプリが用意されています。デスクトップのQTerminalというアイコンをクリックすると端末が起動します。

使用するコマンド

 使用するコマンドは6つです。このうちLinuxのコマンドである3つを説明します。(他の3つは後ほど)

(1)pwd

 現在のディレクトリを表示します。

 Linuxでのコマンド入力では、現在いる場所(ディレクトリ)を意識する必要があります。(ディレクトリとはMicrosoft Windowsでのフォルダに対応するもので、ファイルをまとめた入れ物のことです。)それはコマンド入力が、現在のディレクトリ内にあるファイルを対象とすることが多いためです。pwdは現在のディレクトリ名を表示するコマンドです。

(2)cd[ディレクトリ名]

 現在のディレクトリを変更するコマンドです。一つ上の階層のディレクトリに戻るときは、ディレクトリ名にピリオド2つを使用します。(つまり、cd ..)

(3)ls

 現在のディレクトリの中にあるファイルを表示するコマンドです。

ファイル編集

 ファイルの編集はプログラムの作成や修正に必要となります。本実験ではX Window System用に提供されているFeatherPadと呼ばれるテキストエディタ(編集ソフト)を利用します。

 デスクトップにあるフォルダ形状のアイコン「exp」をダブルクリックすると、ファイルマージャ(Microsoft Windowsでいうエクスプローラ)が起動します。するとホームディレクトリ(自分が所有するフォルダ)であるで/home/exp内のファイルが表示されます。

 その中のOpenCampusのディレクトリ内にkey-control.cというファイルがあります。こちらにカーソルを合わせダブルクリックすると、テキストエディタが起動します。

起動したテキストエディタの様子を下に示します。起動したテキストエディタの様子を下に示します。

4.プログラミング言語:C言語

 プログラミング言語の1つであるC言語の特徴や文法について簡単に説明します。

(1)いくつかの関数から構成
  • 定義(書き方):型名 関数名(引数){処理内容}
  • main()は特別な関数で、作成したプログラム(コマンド)はmain()関数から命令が実行されます。
(2)通常、文はセミコロン“;”で終了(複数文を;で区切る)
  • セミコロンがないとコンパイル時にエラー
  • 関数定義や構文終了時の}の後には不要(あってもよい)
(3)使用する変数は宣言
  • 宣言無しに使用するとエラー(誤り防止としても機能)
  • 宣言時に「型」を指定
    例  整数型 int、 文字型 char、 浮動小数点型 float、 指定なし void
  • 変数は宣言された関数内でのみ使用可(変数有効範囲の局所性)
    注意:宣言されずに使用されているように見えるものは以下のいずれか
    • 予約語:if...else、 for、 while など
    • マクロ定義: #define N 10 ←Nは10で置き換えられます
    • 別のファイルで定義
      →#include では、io.hというファイルを読み込んでいます。
(4)コメント・説明を挿入可

 “/* */”で囲まれた文字、“//”以降の文章はプログラムとして認識されません。

(5)switch文

 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;
}

5.プログラムの説明

 実験で使用するプログラムは,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:; キーボード入力がそれ以外の場合は何もしない
  }
}
  • 関数control()は、1ミリ秒ごとに呼び出されるように、プログラムの他の部分で設定されています。この関数内で、各モータをどのように動かすかなどを決定します。
  • 変数keyに、キーボードから入力された文字(1文字)の情報が入って来ます。
  • caseで場合分けし、それぞれの場合の命令をbreak文の前までに記述しましょう。
  • 関数motor()の使い方は以下を参考にしましょう。

関数 motor(n, v)
モータを駆動するために、関数(命令) motor(n, v)を用意しました。この関数によりモータの停止および回転方向が制御できます。設定する値を以下に示します。

n:制御するモータ(1 or 2)(M1端子に接続されたモータが1)
v:+:正回転、-:逆回転,絶対値0~4:回転速度(0は停止)

  • D12端子に接続したLEDが、命令LED_ONで点灯、LED_OFFで消灯します。
  • コマンドが与えられない限り、モータおよびLEDはこれまでの命令をそのまま継続させます。

6.プログラムの実行

(1)端末の起動

 デスクトップにある「QTerminal」をダブルクリックして、端末を立ち上げます。

(2)ディレクトリの変更

 key-control.cのあるディレクトリに移動します。

cd OpenCampus [Enterキー]

※「pwd」で現在のディレクトリを、「ls」でディレクトリの中身を確認してみましょう。※「pwd」で現在のディレクトリを、「ls」でディレクトリの中身を確認してみましょう。
(3)ビルド(コンパイル/リンク)

 C言語で書かれたファイル「key-control.c」を、機械が解釈できるマシン語のファイル「key-control.hex」に変換します。

make hex [Enterキー]

 プログラムに誤りがある場合は、エラーメッセージが出てビルドが中断するため、「key-control.hex」は作られません。“key-control.hex”ができているか、「ls」コマンドかファイル・マネージャで確認しましょう。

(4)アップロード

「key-control.hex」を制御ボードStuduino にアップロードします。

make install [Enterキー]

(5)プログラムの実行

 電源ボックスのスイッチをONにすると制御ボードで作成したプログラムが自動的に実行されます。

 ただし、今回作成したプログラムは、キーボードからの入力が無いと動作しません。そこで、パソコンと通信するコマンドを起動して、パソコンと制御ボードを接続します。

(6)シリアル通信

 パソコンと制御ボードをUSBケーブルで接続した状態で,以下のコマンドを入力します。

cu –l /dev/ttyUSB0 –s 9600 [Enterキー] (または cuusb[Enterキー])

接続するとConnected.と表示されます。接続するとConnected.と表示されます。
(7)コマンド入力

 キーボードの[q]キーを押すとモータが正転しLEDが点灯するか確認しましょう。次に[z]を押すとモータが逆転しLEDが消灯するか確認しましょう。

(8)終了

 電源ボックスのスイッチを「OFF」にして、以下のコマンドでシリアル通信を切断しましょう。

~.[Enterキー]

切断しないときは数回続けて入力してみてください。Disconnected.とでれば切断完了です。切断しないときは数回続けて入力してみてください。Disconnected.とでれば切断完了です。

課題1 キーボードの[a]を押すと、両方のモータの回転が停止するような機能を上のプログラムに追加し、動作を確認しなさい。

課題2 2つのモータに車輪を取り付けます。それらが左右の車輪となるよう車型ロボットを製作し、前進・後退をさせなさい。

7.機構

 課題2で製作した車型ロボットを、左右のDCモータの速度差を変えることで、左右に旋回できるようにプログラミングします。そのときよく曲がるように機構を工夫する必要も出てきます。工夫するポイントについてまとめました。

タイヤの滑りやすさ

 左右モータの速度差で旋回される場合、モータの付いていない車輪(非駆動輪)は横滑りする必要があります。したがって、モータが接続した駆動輪には輪ゴムを巻いて滑りにくく、非駆動輪は輪ゴムを巻かずに横滑りしやすくしてください。

重心の位置

 フィギュア・スケート競技を見ていると、スケータが体全体を縮めるとスピンの回転速度が速くなることに気が付きます。回転のしやすさは慣性モーメントと呼ばれ、質量の分布が回転軸に近いほうが小さくなって回りやすくなります。

 左右モータの速度差で車を旋回させる場合、回転中心は左右モータ回転軸上あたりに位置します。したがって、車の重心は駆動車輪の近くになるように製作しましょう。電池ボックスはDCモータの車輪近くに置いた方が回りやすくなります。

車両の長さ(車軸間距離)

 下のテコの例でも分かるように、回転する力は回転中心から離れた点に作用する方が大きくなります。回転力はモーメントやトルクと呼ばれ、図の場合では力と中心-作用点間距離の積で計算されます。

 左右モータの速度差で車を旋回させる場合、非駆動輪の横滑り時の摩擦が旋回を妨げる抵抗力として作用します。その作用点が回転中心から遠くなるように、車長(前後輪の車軸間の距離)は短く作ると旋回しやすくなります。

 課題3 下のような命令配列となるようにプログラムを修正し、車を操作しなさい。

BIOSの設定

8.実験

 各自で自由に車型ロボットを作成し、作成したプログラムで操作してみましょう。動きが悪い場合は機構とプログラムを調整し、試行錯誤を繰り返して動きを改善してみてください。その過程で何が悪かったかを分析するようにしましょう。

 以下の動画は、実験の様子を撮影したものです。

9.おわりに

 本実験内容は、岐阜大学オープンキャンパスの実験教室で実施した内容です。実験教室ではスタッフの補助があるため、パソコン環境でのトラブルが対処できますが、ホームページではそれができないため、実験の再現が難しいところもあると思います。他のホームページを参照するなど、自分の力でトラブルが解決できる力がつくと、その力は将来大きな力となるでしょう。

 なお、今後もオープンキャンパスでこの実験教室を開く予定もあります。興味のある方は岐阜大学オープンキャンパスにご参加ください。

※このページに含まれる情報は、掲載時点のものになります。

関連記事

2024-11-08

輝く工学女子!(Tech ☆ Style)

【vol.141】システムエンジニアを夢見て

宇都宮大学工学部

2014-08-28

生レポート!卒業生の声

興味を持って経験をする大切さ

静岡大学情報学部

2022-09-09

生レポート!大学教授の声

工学部で数学を研究する

静岡大学工学部

2024-09-27

輝く工学女子!(Tech ☆ Style)

【vol.137】将来やりたいことに向けて

弘前大学理工学部

2023-07-21

輝く工学女子!(Tech ☆ Style)

【vol.120】「文系」が「理系」を選んだ話

宮崎大学工学部

2021-03-19

輝く工学女子!(Tech ☆ Style)

自由な発想でつくりたいものをかたちにする

新潟大学工学部

岐阜大学
工学部

  • 社会基盤工学科(環境・防災デザインコース)
  • 電気電子・情報工学科(電気電子コース、情報コース、応用物理コース)
  • 化学・生命工学科(物質化学コース、生命化学コース)
  • 機械工学科(機械コース、知能機械コース)

学校記事一覧

おもしろ科学実験室(工学のふしぎな世界)
バックナンバー

このサイトは、国立大学56工学系学部長会議が運営しています。
(>>会員用ページ)
私たちが考える未来/地球を救う科学技術の定義 現在、環境問題や枯渇資源問題など、さまざまな問題に直面しています。
これまでもわたしたちの生活を身近に支えてきた”工学” が、これから直面する問題を解決するために重要な役割を担っていると考えます。