今回は実際にプログラムを書くにあたって知っておきたいことなどを書きます。
#①プログラムのファイル構成#
##基本構造##
[任意のフォルダ名]
┣app.c
┣app.h
┣app.cfg
┣Makefile.inc
≈≈≈≈≈≈
┗(任意のヘッダーファイル)
##それぞれの説明##
###[任意名のフォルダ]###
上記の4つ(もしくはそれ以上)のファイルを束ねるフォルダ。
ここでつけた名前がコンパイル時に必要となる。
###app.c###
根幹となるファイル。ここのmain_task()
内にプログラムを書き込む。
また、その他にも変数の定義、includeの処理、関数を書くなどする。
ここに書きすぎて長くなった場合は、ヘッダーファイルを利用して分けることができる。
EV3教育ソフトウェアでいうところの"マイブロック"みたいなもの
詳しくは後ほど。
###app.h###
プログラムを動かすために必要な裏方的存在のファイル。
新たなタスクやサイクルハンドラを作るときはこのファイルをいじる必要がある。
###app.cfg###
上記app.h以上に裏方感増し増しのファイル。
しかし同様に、新たなタスクやサイクルハンドラを作るときはこのファイルをいじる必要がある。
###Makefile.inc###
もはやなんのファイルかわからないくらいのファイル。
秘密の魔法みたいなもん。
いじることは基本的にない。
###ヘッダーファイル###
XXX.h
のような名前のファイル。
#include "XXX.h"
のように書くことで、app.c内にXXX.hのソースコードを導入できる。
#②プログラムを書く準備#
app.cを書くときに、絶対に書いておかないといけない情報があります。
##書かないとダメ度★★★★★##
#include "ev3api.h" //絶対必要
#include "app.h"//絶対必要
#include <stdio.h>
#if defined(BUILD_MODULE)
#include "module_cfg.h"
#else
#include "kernel_cfg.h"
#endif
#define DEBUG
#ifdef DEBUG
#define _debug(x) (x)
#else
#define _debug(x)
#endif
これですが、サンプルファイルからコピーしたときからあります。
どうも消してはいけないっぽいです。
これだけはmain_taskを書く前に必ず書きましょう。
##書かないとダメ度★★★★☆##
void main_task(intptr_t unused)
{
/* コンフィグゾーン */
ev3_motor_config (0, LARGE_MOTOR);
ev3_motor_config (1, LARGE_MOTOR);
ev3_motor_config (2, MEDIUM_MOTOR);
ev3_motor_config (3, LARGE_MOTOR);
ev3_sensor_config (0,COLOR_SENSOR);
ev3_sensor_config (1,COLOR_SENSOR);
ev3_sensor_config (2,COLOR_SENSOR);
ev3_sensor_config (3,COLOR_SENSOR);
このmain_taskが始まってすぐのところのコンフィグゾーン
ですが、ここではEV3に接続するセンサー・モーターを書き込んでおきます。ここに書いたセンサー・モーターの通りに接続しないと、ロボットは全く動きません。
今回の例では、
ポート | 接続物 |
---|---|
A | Lモーター |
B | Lモーター |
C | Mモーター |
D | Lモーター |
1 | EV3カラーセンサー |
2 | EV3カラーセンサー |
3 | EV3カラーセンサー |
4 | EV3カラーセンサー |
のように接続しています。 |
##書かないとダメ度★★☆☆☆##
これを知ったとき私は衝撃でしたが…
実はEV3rtでの標準Cライブラリは、変数型のboolを使うことができません!!
でも
#include <stdbool.h>
これで使えます。
##書かないとダメ度★☆☆☆☆##
もはや**「書いたら便利じゃね?」**くらいの提案みたいなもんです。
while (ev3_button_is_pressed (4)==false){//真ん中ボタンが押されるまで
sprintf(str,"%d",ev3_battery_current_mA());//バッテリーからmAの情報を取得
ev3_lcd_draw_string(str,0,0);//LCDに書き込む
sprintf(str,"%d",ev3_battery_voltage_mV());//バッテリーからmVの情報を取得
ev3_lcd_draw_string(str,0,20);//LCDに書き込む
}
これをコンフィグゾーンの直後に書くことで、プログラム開始前にバッテリー残量を確認できます。
#③コンパイルのやり方#
EV3でプログラムを動かすにあたって、人間語を機械語に変換する必要があります。
これをコンパイルといいます。
EV3rtは動的ローディング式とスタンドアローン式の2つがあります。
詳しい説明は長くなるので省略しますが、動的ローディングの方が扱いやすいので、今回はこちらでいきます。(詳しくは公式ページで確認)
さてまずはターミナル・Cygwinを起動します。
で、ディレクトリをev3rt/hrp2/sdk/workspace
に移動します。
そして、コンパイルしたいプログラムのフォルダ名を使ってコンパイルします。
$ cd 〜./ev3rt/hrp2/sdk/workspace/
$ make app=[フォルダ名]
これでworkspace
にappというフォルダが作られているはずです。
#まとめ#
今回はプログラムを本格的に書くにあたっての準備的なことをしました。
次回からは本題に入っていきたいと思います。