C言語でEV3開発(7)
どもです。
今回のエントリーでは、いよいよEV3を動かしていきます。
新しい環境に対して、最もよく作成されるプログラムは、コンソールアプリであれば"Hello,world."、組み込みマイコンであれば、"LEDの点滅"(Lチカ)です。
なので、ここでも、この基本的なプログラムから紹介します。
今回のエントリーでの"Lチカ"では、EV3のInteligentBox上のLEDを点滅させます。
また、単に点滅させるだけではなく、都度色を変更していきます。
なお、これまで紹介してきたUbuntu/Eclipseでのクロス開発環境を前提として、本文を作成します。
1. ポートのオープン
InteligentBoxのポートをオープンします。
ポートのオープンのためには、open関数を使用します。
このとき、ポート名には、"/dev/lms_ui"を指定します。これが、InteligentBoxのポートです。
コードは、以下。
fd = open("/dev/lms_ui", O_RDWR); // ポートを開く
2. LED
LEDを光らせるためには、以下のコードを実行します。
unsigned char Buf[2];
Buf[0] = color;
Buf[1] = 0;
write(fd, &Buf[0], 2);
変数 color で、表示する色とパターンを設定します。
設定できる色は、緑・赤・オレンジの3色。
また、パターンは、点灯・点滅・短時間での点滅の3種類になります。
3.ポートのクローズ
close関数を使用します。
これは、必ず実行しなければなりません。
※しかし、現状のInteligentBoxの動作では、問題があります。
それは、
「ポートを閉じても、InteligentBox本体のLEDの表示はリセットされない」
というものです。
つまり、close関数を実行する前のLED表示が「赤色」の「点滅」であった場合、close関数が呼ばれた後もInteligentBoxのLEDの表示状態は保持されてしまいます。
対策としては、プログラム終了時に必ず表示を消す、つまり黒に戻しておくようにします。
以上、これらの処理を行うプログラムを作成したので、全文を載せておきます。
#include
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
// InteligentBoxのLEDの色/パターン
#define BLACK ('0' + 0)
#define GREEN ('0' + 1)
#define RED ('0' + 2)
#define ORANGE ('0' + 3)
#define GREEN_FLASH ('0' + 4)
#define RED_FLASH ('0' + 5)
#define ORANGE_FLASH ('0' + 6)
#define GREEN_PULSE ('0' + 7)
#define RED_PULSE ('0' + 8)
#define ORANGE_PULSE ('0' + 9)
// InteligentBoxのポート名
#define UIFP_PORT_NAME ("/dev/lms_ui")
typedef unsigned int UINT;
typedef signed int SINT;
typedef unsigned char UBYTE;
typedef signed int SBYTE;
typedef void VOID;
SINT uifp; // InteligentBoxのファイルディスクリプター
SINT SetLed(UBYTE color) {
UBYTE Buf[2];
SINT ret;
Buf[0] = color;
Buf[1] = 0;
ret = write(uifp, &Buf[0], 2); // LEDの色/パターンの設定
return ret;
}
SINT main(VOID) {
UBYTE color_array[] = {
BLACK,
GREEN, RED, ORANGE,
GREEN_FLASH, RED_FLASH, ORANGE_FLASH,
GREEN_PULSE, RED_PULSE, ORANGE_PULSE };
SINT count;
uifp = open(UIFP_PORT_NAME, O_RDWR); // ポートを開く
if (uifp < 0) {
printf("ポートを開くことができませんでした。\n");
return (-1);
}
for (count = 0; count < 10; count++) {
SetLed(color_array[count]);
sleep(2); // 2秒間表示を保持する。
}
SetLed(BLACK); // 2015/03/29:追記
close(uifp);
return 0;
}
実際に動かした様子は…そのうち動画で載せたいなぁ…。
ではっ。
2015/03/29:追記
・ループを抜ける際に、LEDを黒に戻す処理をコードに追加。
・上記サンプルコードを実際に動作させた動画を追加↓
ディスカッション
コメント一覧
まだ、コメントがありません