C言語でEV3開発(7)

2021年1月30日

どもです。
今回のエントリーでは、いよいよ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を黒に戻す処理をコードに追加。
・上記サンプルコードを実際に動作させた動画を追加↓