momo-mruby 実行環境を使って Ruby 言語で記述したプログラムを実行してみる( GPS ロガーモドキを作るぞ編)

# はじめに

@GORO_Neko です。毎度の挨拶ではありますが、ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

いつもの決まり文句、まずお断りをば一言。

ボク、仕事では「未だ」一切 mruby 扱っておりません（趣味の時間には、結構弄っておりますが … ）。

以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

# GR-PEACH 上で Ruby プログラムを動かそう

[GR-PEACH](http://gadget.renesas.com/ja/product/peach.html) は [mruby](http://forum.mruby.org/doc/mruby-141121135812-conversion-gate01.pdf)「も」動くマイコンボードです。


![gr-peach-full.jpg](http://gadget.renesas.com/ja/product/images/gr-peach-full.jpg)

GR-PEACH のファーム代わりに [momo-mruby](http://forum.mruby.org/download/index6.html) を書き込むことで、mruby のバイナリを動作させることが可能となります。

まず mruby の開発環境をセットアップした適当な PC 上で mruby を使った実行バイナリ（ファイル名: autorun.mrb ）を作成します。

実行バイナリの元ネタとなるソースコードを書き込んだファイル名が "helloworld.rb" だった場合、大抵の場合、以下のコマンドを実行することで実行バイナリを作ることができます。

    $ cd [helloworld.rb が存在するディレクトリ]
    $ mrbc -o autorun.mrb helloworld.rb

出来上がった実行バイナリを、適当な microSDカード のルートディレクトリ直下に書き込みます。

microSDカード を ファーム代わりに momo-mruby を書き込んだ GR-PEACH に装着の上、GR-PEACH のリセットボタンを押下すると、microSDカード に書き込まれた mruby 実行バイナリが、GR-PEACH 上で操作します。

GR-PEACH のファーム代わりに書き込むための momo-mruby の作成方法は、以下を参照してください。

* 作成環境の OS が Windows or Mac → https://github.com/mimaki/momo-mruby
* 作成環境の OS が Linux（Ubuntu）→ 【非公式・ご参考まで】https://qiita.com/GORO_Neko/items/42d39b5800a60bf01a77

Windows or Mac をご利用の場合は、[公式提供の作成済みのもの](https://github.com/mimaki/momo-mruby-bin/blob/master/README_ja.md)を入手して、即 GR-PEACH に書き込む手もあります。

さて、mruby 実行バイナリを動作させられる GR-PEACH が出来たところで、実際にその上で Ruby 製のプログラムを動かしてみましょう。 

たとえば、以下のソースコードを mruby でコンパイルし、microSDカード 経由で GR-PEACH に読み込ませたとします。

    loop do
      puts "Hello world!"
    end

プログラミングした内容は、永久ループの中で延々と、文字列 "Hello World!" を標準出力にし続けるものなので、適当な PC と GR-PEACH を USB ケーブルで接続の上、PC 上で USB シリアル通信をサポートしたターミナルソフト（Windows および Mac の場合は、[公式](https://github.com/mimaki/momo-mruby)推奨の CoolTerm を使うのが良いと思います。Linux OS 上でアレコレやっているボクは、今のところ [CuteCom](http://cutecom.sourceforge.net/) を利用しています）を立ち上げて GR-PEACH に接続すれば、ひたすら  "Hello World!" の文字列が出力されていることが確認できます。

# マイコンボードの機能を利用した Ruby プログラムを動かそう

せっかくマイコンボード上で、mruby 実行バイナリを動かせるようになったのですから、マイコンボードならではの機能を利用した Ruby プログラムを作ってみましょう。

マイコンボードの特徴の一つとして、色々な機器（温度センサーとか、湿度センサーとか、音響センサーとか、重力センサーとか、GPS ロガーとか、とかとか！）を GPIO 経由でを接続して利用できるというものがあります。

GPIO 経由でセンサー等機器と情報をやり取りする場合、いくつかの方法が考えられます。

* GPIO に実装されたピン（アナログピン/デジタルピン）に対し、直接データを読み書きする
* I2C（Inter-Integrated Circuit、I-squared-C）や SPI（Serial Peripheral Interface, SPI）を利用したシリアル通信でやり取りする
* ...

今回は、~~ソフトウェアはそこそこかけるけど、ハンダ付けが大の苦手なボクの弱点をさらけ出さないように~~ GR-PEACH が Arduino uno と互換の外部接続 pin を持っていることを利用して、Arduino 用の GPS ロガー・シールドである [MCS01107S](https://www.elecrow.com/wiki/index.php?title=GPS_shield) を GR-PEACH にくっつけて、ここからシリアル通信を利用して GPS のデータを引っ張り出すプログラムを書いてみました。

まずハードの作成。

こんな具合に、GR-PEACH と MCS01107S をくっつけます。

![DSC_0077.jpg](https://qiita-image-store.s3.amazonaws.com/0/89832/9bdb529f-ab11-e9a9-5df2-78c786efed34.jpeg)

シリアル通信実現に利用している [plato](http://plato.click/) の[ライブラリ](http://plato.click/doc/ja/reference/serial/)の都合から、RX → pin #0、TX → pin #1 で行えるように、MCS01107S 上のジャンパを切り替えます。

続いてソフトの作成。

以下の 2 個のスクリプトを書きます。

**[MCS01107S.rb]**

    # GPL class (MCS01107S)
    class MCS01107S
      include Plato
    
      def initialize
        @ser = Serial.open(9600)
      end
    
      # get data from MCS01107S
      def get_rawdata
        rsp = ""
        while rsp[0] != "$"
          rsp = @ser.gets
        end
        return rsp
      end
    end

**[main.rb]**

    gps = MCS01107S.new
    
    loop do
      puts gps.get_rawdata
    end

上記のようなソースコードを書いて、mrbc コマンドで実行バイナリ化し、microSDカード 経由で GR-PEACH に送り込めば、以下のように、GPS から降ってくるデータの表示があっさり実現できます。

    $ mrbc –o autorun.mrb MCS01107S.rb main.rb

見難い画像で恐縮ですが、ターミナルソフト上に、受信した GPS のデータが表示される様子を以下に載せておきます。

![view2.jpg](https://qiita-image-store.s3.amazonaws.com/0/89832/da4accb6-7bd8-0fd0-2752-3d1ed3167c9c.jpeg)

GPS から取得したデータを読みときたい人は、[ここ](http://www.hiramine.com/physicalcomputing/general/gps_nmeaformat.html)あたりをご参照ください。

ファームを書き換えていないすっぴんの GR-PEACH & 公式開発言語で、同じ機能のプログラムを実現させることもできます。

が、「 Ruby 言語に慣れた人」であれば、上記のようなプログラミングで、マイコンボードを操る方が楽なのではないでしょうか。

ボクにとっては楽だし、生産性も高めることが出来たと感じています。

この記事をご覧になっているあなたも GR-PEACH & センサー機器で、何か作ってみませんか？

では、また。