体験的マイコン学習(PSoC編)


目次



第2回 Mruby/CでLチカしてみる


mrubyのプログラムをコンパイルして、cファイルを作成し、ボードのLEDを光らせてみます

※ <第1回 Lチカを試してみる> から続きの方は、mruby/cのファイルをコピーするの項目から進めてください


なお当記事は、「mruby/cをPSoC5で動かす」の記事を元に しまねソフト研究開発センター様の技術支援を受け、
上記記事の内容をmruby/c β版で動くように 修正したものです。


プロジェクト作成

① File → New → Projectをクリックします

プロジェクト作成1

② Target deviceからデバイスを選択します。今回は使用する機器が一覧にないので、Launch Device Selectorを選択します

プロジェクト作成2

③ Select Deviceの中から、今回使用する(CY8C5888LTI-LP097)を選択しOKボタンをクリックします

プロジェクト作成3

④ Target deviceが選択できていることを確認し、Nextボタンをクリックします

プロジェクト作成4

⑤ Empty schematicを選択し、Nextボタンをクリックします

プロジェクト作成5

⑥ Workspace nameとProject nameに名前を入力し、Finishボタンをクリックします

プロジェクト作成6
ページトップ

回路図の設定

① 右側のメニューにある(Cypress → Ports and Pins → Digital Output Pin[v2.20])を選択します

回路図の設定1

② Digital Output Pin[v2.20]を回路図の中央までドラッグしてセットします

回路図の設定2

③ セットしたピンをダブルクリックします(※回路図をズーム倍率200%で表示しています)

回路図の設定3

④ 設定画面が開いたら、一番上のName項目に名前を入力してください(今回はLEDと入力します)
  また、General → Type → HW connectionのチェックを外してOKボタンをクリックしてください

回路図の設定4
ページトップ

ピンの設定

① 左側のメニューにある「プロジェクト名.cydwr」ファイルをダブルクリックしてください」(今回はsample.cydwrとなっています)

ピンの設定1

② 設定画面が表示されたら、右側にあるPortをクリックし、P2[1]を選択してください

ピンの設定2
ページトップ

ビルドする

プロジェクトをビルドします(ビルドすることで、先ほど設定したLEDに関するコードが自動生成されます)

① メニューの Build → Build sample をクリックしてください

ビルド1

② ビルドが成功すると、左側のメニューにファイルが追加されます
  また下側にあるOutputに、Build Succeeded: [ ビルドした日付 ] が表示されます

ビルド2
ページトップ

mruby/cのファイルをコピーする

① mruby/c a版を解凍してsrcフォルダを開いて、すべてのファイル(xxx.cとxxx.h)をコピーします

コピー1

② PSoC Creatorのプロジェクトフォルダ(main.cがあるフォルダ)に貼り付けします

コピー2

③ 下図のようになればOKです

コピー3
ページトップ

プロジェクトにファイルを追加する

① Project → Existing Item をクリックします

追加1

② 先ほどコピーしたmruby/c α版のファイルxxx.c(main.c以外)を全て選択し、開くボタンをクリックします
  ※コピーしたファイルが表示されていない場合は、一度PSoC Creatorを再起動してください

追加2

③ 画面左側のSource Filesに追加したファイルが表示されていればOKです

追加3
ページトップ

メソッドの追加・修正

LED_Write関数とCyDelay関数を、mrubyから利用できるようにします
① 画面左側にある、class.cファイルをダブルクリックし、コード画面を開きます

追加1

② 下記のヘッダーファイルのコードを(#include "c_numeric.h")の下に追加します

#include "LED.h"
#include "CyLib.h"

追加後イメージ

追加2

③ 下記の関数を先ほど追加したコードの下に追加します

/* --add-- */
void c_led( struct VM *vm, mrb_value *v )
{
  LED_Write( GET_INT_ARG(0) );
}
void c_delay( struct VM *vm, mrb_value *v )
{
  CyDelay( GET_INT_ARG(0) );
}

追加後イメージ

追加3

④ mrb_init_class_object関数を、下記のコードに書き換えてください

static void mrb_init_class_object(void)
{
  // Class
  static_class_object = mrb_class_alloc("Object", 0);
  // Methods
  mrb_define_method(static_class_object, "led", c_led);
  mrb_define_method(static_class_object, "delay", c_delay);
}

修正後イメージ

追加4

mrb_init_class_object関数内のmrb_define_method関数により、Cの関数とmrubyのメソッドを対応付けます


ページトップ

mrubyプログラムの作成

今回はWindows環境で、Ubuntuを使用します

① mrubyのプログラムを sample.rb として作成します

mrubyプログラムの作成

sample.rb

led 1
delay 100
led 0
delay 900

ページトップ

mrbcによるコンパイル

sample.rb を mrubyでコンパイルして sample.c を作成します

① ターミナルから、mrbc ‐E ‐Bary sample.rb のコマンドを実行してください

mrubyコンパイル1

② sample.cが作成されていればOKです

mrubyコンパイル2
ページトップ

sample.cを書き換える

先ほど作成した sample.c のコードを書き換えます
① sample.c をエディタで開いてください

sample_c編集1

② 上図、4行目の const uint8_t のコードを、下記のコードに書き換えます

static const uint8_t

修正後イメージ

sample_c編集2
ページトップ

sample.cのファイルをコピーする

① sample.cをPSoCのプロジェクト内のmain.cと同じフォルダにコピーします
※ 今回、UbuntuからWindows間のデータ移行については、WinSCPのツールを使用しました

cファイルコピー1

② Project → Existing Item をクリックします

cファイルコピー2

③ sample.cを選択して、開くボタンをクリックします

cファイルコピー3

④ 画面左側のSource Filesに追加したsample.cファイルが表示されていればOKです

cファイルコピー4
ページトップ

main.cを書き換える

Cからmrubyプログラムを呼び出す為に、main.cを書き換えます
① 画面左側にある、main.cファイルをダブルクリックし、コード画面を開きます

main.c編集1

② 下記のヘッダーファイルのコードを(#include <project.h>)の下に追加します

#include "vm.h"
#include "load.h"
#include "errorcode.h"
#include "static.h"
#include "sample.c"

追加後イメージ

main.c編集2

③ 下記のmrubyc関数を先ほど追加したコードの下に追加します

int mrubyc(void)
{

    struct VM *vm;

    init_static();

    vm = vm_open();
    if( vm == 0 ){
        printf("VM open Error\n");
        return -1;
    }

    int ret = loca_mrb_array(vm, ary);
    if( ret != NO_ERROR ){
        printf("MRB Load Error (%04x_%04x)\n", ret>>16, ret&0xffff);
        return -1;
    }

    vm_boot( vm );

    int keep_execute = 1;
    while( keep_execute ){
        if( vm_run_step(vm) < 0 ){
            keep_execute = 0;
        }
    }

    vm_close( vm );

    return 0;

}

追加後イメージ

main.c編集3

③ main関数のfor文に、下記のコードを追加します

    for(;;)
    {
        /* Place your application code here. */
        mrubyc();
    }

追加後イメージ

main.c編集3
ページトップ

ビルドと実行

最後にビルドと実行を行います

① メニューのBuild → Build sampleをクリックして、ビルドを行ってください

ビルド3

② ビルドが完了したら、メニューの Debug → Program をクリックして実行してください

実行

③ ボード上のLEDが点滅すれば成功です

Lチカサンプル
ページトップ