目標
Arduino Sketch や Mindstorm NXC がCと同じ文法構造をしているとは言っても、前者は「機械制御」を目的とした言語であり、後者は「汎用」言語である。条件分岐やループといったソフトウエアの基本的制御構造以外の部分では少し異なる。
このページでは主に「異なる部分」についての記述を行うこととする。。
C言語
《プログラム例》
#include <stdio.h>
main()
{
float a, b, c;
printf("三角形の3辺 a, b, c ==> ") scanf("%f %f %f",&a , &b , &c );
if(a==b && b==c){
printf("%f %f %f 正三角形である\n",a, b, c);
}
else {
printf("%f %f %f 正三角形でない\n",a, b, c);
}
return(0);
}
|
stdio.h というライブラリを読み込む
メイン関数(必ず1つ必要)
メイン関数定義開始
変数 a, b, c を単精度実数と定義
モニターに表示
キーボードからの入力を受け取る
(条件分岐)a=b かつ b=c のとき
正三角形である と表示
(真の時の処理終了)
そうでないなら(偽の時)
正三角形でない と表示
(偽の時の処理終了)
メイン関数の終了を宣言
メイン関数の定義終了
|
Cの最も大きな特徴は「ライブラリの読み込み」にある。stdio.h ( Standard Input Output ) は必須として、math.h や conio.h , malloc.h のような様々なライブラリを読み込むことで様々に命令体系を拡張することができる。
また、こちらの方がより本質的ではあるが、Cはコンパイラ型の言語であり高速に実行できる。加えてビットシフトなどのアセンブラに似た命令を持っているため「OSの開発言語」としても利用されている。
Arduino Sketch
《プログラム例》
#define LED 13
#define BUTTON 7
int val = 0;
void setup(){
pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT);
}
void loop(){
val = digitalRead(BUTTON);
if (val == HIGH) {
digitalWrite(LED, HIGH)
}
else {
digitalWrite(LED, LOW)
}
}
|
定数 LED を 13 に定義(LEDの接続位置を指定)
定数 BUTTON を 7 に定義(スイッチの接続位置を指定)
整数値変数 val を 0 に定義
setup関数の開始
13番ピンは「出力」に定義
7番ピンは「入力」に定義
setup関数の定義範囲はここまで
一番外側の無限ループの定義開始
7番ピンの読み取り値を変数 val に代入
valの値が HIGH なら次の処理を実行
13番ピンを HIGH にあげる。(LEDが点灯)
「真の時」の処理の定義終了
「偽の時」は以下の処理を実行
13番ピンを LOW にさげる。(LEDが消灯)
「偽の時」の処理の定義終了
無限に繰り返す範囲はここまで
|
#define で定数とその初期値を定義することはCでも行うことができる。また、#include は、Ardeino Sketch でも外部ライブラリを読み込む際に使用する。stdio.h
を読み込まないと始まらないCと違って、最低限度のライブラリは初めから含まれている点が違いのひとつではある。
Arduino は1本1本の信号線が裸になっているため、これらをどう使用するかを定義しなければならない。これは、setup 関数として Sketch
の最初に記述をすることになる。
また、Arduino Sketch の場合、プログラムはUSBを通じて転送されると自動的に実行され、電源を切るまで停止しない。このためメインルーチンの部分は main() と定義するのではなく、loop() で定義される。
Mindstorm NXC
《プログラム例》
#define MOVE_TIME 500
#define TURN_TIME 360
task main()
{
while(true)
{
OnFwd(OUT_AC, 75);
Wait(MOVE_TIME);
if (Random() >=0){
OnRev(OUT_C, 75);
}
else{
OnRev(OUT_A, 75);
}
Wait(TURN_TIME);
}
}
|
定数 MOVE_TIME の値を 500 に定義
定数 TURN_TIME の値を 360 に定義
メインタスクの定義
メインタスク開始点
エラーがなければ繰り返す(無限ループ)
+無限ループの範囲はここから
| 75% の速度で直進
| そのままで0.5秒走行
| 乱数を1つ発生して、正の時以下を実行
| | + 左のモーターを逆転させる
| | +(正の時の処理範囲終了)
| 負の時の処理
| | + 右のモーターを逆転させる
| if 文の有効範囲はここまで
| 0.36秒回す。Robot が旋回する。
+無限ループの繰り返し範囲の後端
メインタスクの後端
|
Robotを動かすプログラムだけに、変数名などは「動作」と一致するようにつけてある。しかし、#define で定数を定義するところ、メインの if 文の表現などが変わっていないところに注目する。
各サププログラムをタスクとよび、その中で最も重要なものを task main() で表す。これはプログラム中にただひとつだけ存在する。
まとめ
命名された言語の名前が異なるので違う言語のように見えるが、プログラムの「手続き」部分が異なるだけでアルゴリズムを表現する部分に大きな相違が無いことがわかった。ただ、NXCは複数のセンサーからの入力を受けてロボットの動きをコントロールするために複数のプログラムが同時に走る(ラインの色を読み取る<>左右のモーターの出力を変える など)マルチタスク固有の命令を持ち、その部分はCとは明らかに異なる。
|