PD実践:センサ演習1.LCDの使い方


リアルタイムOSであるEV3RTのC言語のAPIを学んでいきます。まずは、LCDのAPIを学びます。なお、シミュレータは文字のAPIしか対応していません。

  • LCDに関するAPI
    •  デォルトのフォントを設定する。シミュレータは標準フォントのみ対応。
      •  ER ev3_lcd_set_font (lcdfont_t font)
        • 引数
          • font フォントの番号
          • 戻り値
            • E_OK 正常終了
            • E_ID         不正ID番号
        • 小さいフォントを設定する:ev3_lcd_set_font(EV3_FONT_SMALL);
        • 標準のフォントを設定する:ev3_lcd_set_font(EV3_FONT_MEDIUM);
    • 指定位置に文字列を表示する(x=0,y=10)に”HELLO”を表示する。
      • ER  ev3_lcd_draw_string (const char *str, int32_t x, int32_t y)
        • 引数
          • x 左上隅の水平方向の位置[ピクセル, px]
          • y 左上隅の垂直方向の位置[ピクセル, px]
          • str 文字列
        • 戻り値
          • E_OK 正常終了
        • 位置(x=0,y=10)に”HELLO”を表示する
          • ev3_lcd_draw_string(“HELLO”, 0, 10);
    •  LCD画面全体を白く塗り潰す(クリアする)
      • ev3_lcd_fill_rect(0, 0, EV3_LCD_WIDTH, EV3_LCD_HEIGHT, EV3_LCD_WHITE);

サンプルプログラム

  • /lcd_1/app.c:”hello, world”とLCDに表示するプログラム。
    • 始めの2行はEV3RTのC言語に必要なインクルードファイル。これがないとビルドに失敗する。普通のC言語はmain関数から始まるが、EV3RTのC言語はmain関数の代わりにmain_task関数で始まり、戻り値はvoidでない。
    • また、main関数の最後はreturn 0で終了するが、EV3RTのC言語はext_tsk()関数で終了する。リアタイムOSでは複数の処理を並列して実行させる機能があり、その処理単位をタスクとよぶ。この関数はタスクの終了処理を行うわけだ。
    • LCDに文字列を表示するにはev3_lcd_draw_string関数を使う。始めの引数は文字列、2番目の引数はLCDの横方向の位置、3番目の引数はLCDの縦方向の位置で減点は画面左上隅。このサンプルではC言語バイブル「プログラング言語C」 (カーニハン&リッチー著)の最初の例と同じ”hello, world”とLCDに表示する。
#include "ev3api.h" 
#include "app.h"    

void main_task(intptr_t exinf) {
    ev3_lcd_draw_string("hello, world", 0, 10); /* 指定位置に文字列を表示 */
    ext_tsk();   /* タスク終了処理 */                                    
}
  • /lcd_2/app.c:カウンタを表示するプログラム。
    • 変数をLCDに表示する方法を学ぶ。ev3_lcd_draw_stringは文字列しか表示できないので、sprintf関数を使い、変数countを2番目の引数の書式で文字列strに書いている。
      なお、シミュレータの制約で文字列のサイズは最大32で、浮動小数はfloat型しか使えない。
#include "ev3api.h"
#include "app.h"

void main_task(intptr_t exinf) {
    int count;
    char str[16];                        /* カウントを表示するための文字列 */
	
    ev3_lcd_set_font(EV3_FONT_MEDIUM);   /* LCDに表示するフォントの設定 */
    while(1){
	sprintf(str, "COUNT:%d", count); /* カウントを表示用の文字列作成 */	
        ev3_lcd_draw_string(str, 30, 60); /* 指定した位置にカウントを表示 */
	tslp_tsk(10000);                 // シミュレーションのみ必要
	tslp_tsk(1000000);               /* 100000us(1000ms) 刻みで実行 */
	count++;
    }

    /* LCD画面全体を白く塗り潰す(クリアする)*/
    ev3_lcd_fill_rect(0, 0, EV3_LCD_WIDTH, EV3_LCD_HEIGHT, EV3_LCD_WHITE);
    tslp_tsk(5000000);	

    ext_tsk();   /* タスク終了処理 */                                    
}
  • 演習
    • サンプルプログラムlcd_2を改造し、以下の機能を実現する。なお、サンプルプログラムは変数countが0に初期化されていないので、まず、0に初期化すること。
      • countが100になったら、LCDに“Game Over!”と表示してタスクを終了する。
  • 参考
    • LCD API (EV3RT C API Reference)
    •  LCD画面の幅は178[px]、高さは128[px]である。
    •  LCD画面の左上隅が、座標(x=0,y=0)である。
    •  フォントサイズは以下の2通り。シミュレータは普通サイズのフォントのみ使用可能。
      • EV3_FONT_SMALL 小さいサイズのフォント:幅6[px]×高さ8[px]
      • EV3_FONT_MEDIUM 普通サイズのフォント:幅10[px]×高さ16[px]

終わり

コメント

Folding@home Kanazawa (ID 257261)

みんなのためにおうちで新型コロナウイルスを解析しよう!

タイトルとURLをコピーしました