C/C++
AVR
競技ロボット制御のためのC言語入門(書きかけ:2012/4/30) †
講習用ページ †
競技ロボット制御のためのC言語入門講習用ページ - C/C++/AVR
目次 †
第0章 はじめに †
この文書は、ロボット競技大会に興味があるものの、どのようにしてロボットを動かせばよいのかわからないという方に向けて書かれたものである。これから参加しようと思っている初心者、これまでは機械を担当していたが制御もできるようになりたいという方など、様々な方々にとって、マシン制御の第一歩につながるものとなることを願う。
なお、最も基本的な部分から、モーターの速度制御に必要となるであろう部分までのみを扱うこととする。この文書では、入門者向けにAVRをターゲットとして開発を行う。第2章までは導入、第3章から実践的な実装を行う。この文書の使い方としては、はじめに読む際は座学のつもりで、2度目以降は辞書のようにして使用することをおすすめする。
また、実際の講習では第3章までのみ(C言語の書き方、マイコンの簡単な導入)を扱うこととする。
この章についてコメント †
第1章 制御の目的と手段 †
ロボットを制御するためには、制御によって達成する目的と、その手段を明らかにする必要がある。ほとんどの競技用ロボットは目的の位置まで移動して何かしらのアクションをしてから次の目的地に移動するという作業を繰り返す。すなわちこれが目的である。
次にこの目的を達成するための手段を考える。移動をするためには車輪や足が必要になる。また、現在位置を知るためには車輪の状態や足の状態を知るためのセンサが必要になる。さらに、そのセンサからのデータをどう利用して車輪や足を動かすのか決めるプログラムも必要になる。
ロボットは、これら3つの要素―機構、回路、情報処理―の全てを利用して動作する。そして、この3つの要素をつなぐのが制御の世界である。このうちどれか一つでも欠落していては制御のしようがないのである。
また、制御をする際には制御する対象をよく知る必要がある。本講座では特にこだわらないが、実際に制御をすると実感できることが多い。実際にものを制御することを通して学んでもらいたい。
この章についてコメント †
第2章 この講座で使用する教材 †
この講座の前半はC言語の演習が主となる。C言語による開発環境の構築は手間がかかるため、便利なサイトを使用することにする。
この講座の最後では、AVRマイコンを利用して簡単な制御を学ぶ。そのため、以下のものを準備することをおすすめする。
- AVRマイコン(推奨:ATmega168)
- AVRライタ (部室に1台ある)
- AVR Studio 5(AVR向けの統合開発環境,登録が必要)
- LEDと抵抗470〜750Ω 各1〜3つずつ (部室で入手可能)
- タクトスイッチ 2〜3個 (部室で入手可能)
- ブレッドボード(小さいもので可)
ここから下に挙げるものは、講座では取り扱わないが本テキストで解説する内容に関係のあるパーツである。
- モーター1個もしくは2個 (部室のモータージャンクから入手可能)
- TA7291P(モータードライバ)
- RPR220(フォトリフレクタ)
入手方法等がわからない場合は、原則各自検索し、どうしても見つけられない場合はコメントに記入しよう。
この章についてコメント †
第3章 C言語の基礎 †
この章では、C言語に触れたことがない人を対象に、必要最小限の解説を行う。すでにC言語を使いこなせる人は次に進もう。この章の後半ではマイコン開発に特化した解説を行うため、C言語に触れたことがあっても不安がある人は後半を読み流してみると良いだろう。
3-1. プログラミング言語、C言語とは †
プログラミング言語とは、コンピュータに動作の命令をするための言語のことである。様々な種類があるが、今回はC言語を取り上げる。マイコン開発ではC言語が使われることが非常に多いため、ここで基本を押さえれば他のマイコンでの開発へもスムーズに移れることだろう。
さて、C言語の特徴としては、一般的な数式や英語を記述するときのような感覚でプログラムを書いていけることがあげられるだろう。例えば、10回 "Hello, World!"を表示するプログラムは以下のように書ける。
1
2
3
4
5
6
7
|
-
|
-
|
!
!
| #include "stdio.h"
int main(void){
int i;
for(i=0;i<10;i++){
printf("Hello, World!");
}
}
|
初めて見る場合はよくわからないかもしれないが、この章に書いてあることを習得すれば、この程度のプログラムであればスラスラと読めてスラスラと書けるようになるだろう。プログラミング言語の習得はなかなか時間のかかるものであるので、諦めずに、手で覚えるまで取り組めるような姿勢が重要となる。
例えば4行目は、iという変数に対して(for)、i=0からi<10の間iを1ずつ加算する(++)という構造になっている。そして、{ }の中身に対してこれを適用しているのである。このように、自然言語(日本語、英語など)と同様にして、プログラミング言語には言語としての構造、すなわち文法が存在する。プログラムを書く際は、この文法に従って記述しなければならない。誤った記述がある場合、のちに述べる「コンパイル」という段階でエラーが発生する。次は、このC言語の文法について説明していく。
3-2. C言語の文法 - 変数型と宣言 †
C言語では、数学の問題の解答と同様に、変数を定義しなければならない。変数の定義には、変数の型(数学で言う実数、複素数、自然数など)、変数の初期値、そして変数の属性を指定することができる。まずは変数の型について解説する。
C言語の変数の型には、標準的なものとして以下のようなものがある。
型の名前 | 型の説明 |
int | 整数型 |
float | 浮動小数点型 |
double | 浮動小数点数型(倍精度) |
char | 文字型 |
intは整数を表す変数型である。float,doubleは浮動小数点数型といって、小数点の位置が数値によって最適な位置に定められる小数である。基本的に実数と考えて支障はない。いずれの数値型も上限や下限(例えばintの場合、-32768〜+32767)が存在するため、それを超えないように注意する必要がある。
charは英数記号1文字(以下ASCII文字という)を表す型である。ASCII文字それぞれには文字コード(0〜255)が割り当てられているため、charは基本的に0か正の値(≦255)を取るものとして扱う。
競技ロボットのマイコンによる制御では、これらのうち頻繁に利用するものはint,double,char程度である。
また、変数型には属性を表す接頭辞をつけることができる。以下はその一例である。
属性の名前 | 属性の説明 |
unsigned | 非負 |
const | 定数 |
static | 静的(変数の値を記憶させる) |
extern | 外部の定義を呼び出し(複数のファイルにまたがって変数や関数を利用する) |
volatile | 「きまぐれ」な変数(外部で勝手に改変される変数に用いる) |
これらの属性は、曖昧なプログラムをより厳密に動作させるために利用することが多い。入門の段階ではほぼ間違いなく(自発的には)使わないので、これ以降の章で利用する際はプログラム中に注釈を示す。ただし、この属性の指定がないためにおかしな動作をするということは、開発していく上でよくあることなので、十分に気をつけたい。
実際にプログラム中に出現するとすると、以下のようなコードとなる。
3-3. C言語の文法 - 演算 †
(under construction)
3-4. C言語の文法 - 関数 †
数学の問題と同様に、プログラミングにおいても関数を利用して様々な数値計算を行う。C言語では、数値だけではなく、文字型(char)を関数に与えることもできる。
競技ロボットの基本的な制御においては、文字型を文字として扱うことはあまりないので、基本的にはint型を用いて書いていく。
関数とは、ある値に対して値を返すもののことを言う。f(x)=x+3として、f(4)=7となるようなfのことである。では、これをC言語で表現するとどうなるのであろうか。
-
|
|
|
!
| int f(int x) {
int y;
y=x+3;
return y;
}
|
先程説明した変数の型であるint型が3回登場している。このコードについて詳しく見ていこう。
- はじめのintは、関数がどの型の値を持つかを示す。例えば、ある関数g(x)=x+0.2でg(2)=2.2のように、小数の値をとるときは、
というように、double型を指定する必要がある。
- 2つめのintは、関数に与える変数xの型を表している。xが小数の値の場合は、
のように記述する。
- 3つめのintは、関数の内部で扱う変数yの宣言に用いられている。(→3-2参照)
このように、C言語の基本的な宣言(変数や関数の定義)は、
型 名前
という形式でできていることがわかる。
次に、関数の中身について見ていく。
関数の中には、その内部だけで使うことができる変数を宣言することができる。
コード中の変数yは、このように内部のみで扱える変数(ローカル変数)である。
プログラミング言語における関数は、中身の演算を順に行い、その結果を関数の値として返す、ということを行う。複雑な挙動を行う関数も容易に作成することができるのだ。