micro_mruby_for_arduino_uno を使った Arduino Uno 用アプリケーションの開発方法

# はじめに

@GORO_Nekoです。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

えーっと、先にお断りをば一言。

自分、仕事では一切 mruby や mruby/c を扱っておりません。

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

# micro_mruby_for_arduino_uno を利用したアプリケーションってどうつくればいいのだろうか？

ちょっとまえに micro_mruby_for_arduino_uno & Ruby スクリプトを使って Arduino Uno 用アプリケーションが作れるという[記事](https://qiita.com/GORO_Neko/items/8f78a212601669275948)を書きました。

が、よくよく記事を見直してみると、アプリケーションのビルド環境の構築方法の解説も、環境を使ったアプリケーションのビルド手順の解説もなにも書いておりませんでした。

公開している[ GitHub の URL ](https://github.com/kishima/micro_mruby_for_arduino_uno)は書いていたので、ピンと来た人はさっさと開発環境を構築したり色々されているかなとは思いますが、私なりに開発環境の構築方法と使い方の解説をしてみようと思います。

# 開発環境の構築方法

"micro_mruby_for_arduino_uno" は、所謂 VM です。

"micro_mruby_for_arduino_uno" 上で動くアプリケーションは、Ruby スクリプトを mruby コンパイラ（正しくは、mruby コンパイラ & "micro_mruby_for_arduino_uno" が提供する Tool ）でコンパイルして作成する必要があります。

また mruby をビルドするためには、CRuby と bison が必要です。

故に、開発環境の構築するためには、以下のそれぞれのインストールが必要になります。

1. CRuby
2. bison
3. mruby
4. micro_mruby_for_arduino_uno

# アプリケーションのビルド手順

アプリケーションのビルド手順は以下のようになります。

1. 開発リソースを配置するために所謂プロジェクト用のディレクトリを "mkdir" コマンドで作成する
2. 作成したディレクトリの直下に移動し "platformio init" コマンドを使って、ディレクトリ内を初期化する（ディレクトリ内に設定ファイルおよびサブディレクトリが生成される）
3. Ruby スクリプトを作成するためのディレクトリ（ここでは "ruby" と言う名前にする）をプロジェクトディレクトリの直下に "mkdir" コマンドで作成する
4. Ruby ディレクトリ直下に移動し、Ruby スクリプト（ここでは "test-001.rb" と言う名前にする）を作成する
5. スクリプト "test-001.rb" を mruby のコマンド "mrbc" で、コンパイルする（コンパイル結果としてバイナリファイル "test-001.mrb" が生成される）
6. micro_mruby_for_arduino_uno 提供コマンド "Transcode" により、コンパイル結果の "test-001.mrb" から同一内容のコードを含む C ソースコード（ "code.h" および "symbol_ids.h" ）を生成する（ 2 つのファイルはプロジェクトディレクトリの初期化時に自動生成された "src" ディレクトリ内に自動生成される）
7. プロジェクトディレクトり内の "src" ディレクトリに移動し、アプリケーションのスタートアップコードとなる Arduino 言語プログラム（後述の "main.ino"）を作成する
8. "platformio run" コマンドを使って、Arduino Uno 用のアプリケーション（バイナリ）をビルドする
9. "platformio run" コマンドを使って、Arduino Uno にビルドしたアプリケーションを転送する

```main.ino

#include "mmruby_arduino.h"
void setup()
{
	mmruby_setup();
	mmruby_run();
}
void loop(){}

```

上記の手順を行うコマンドを抜書きすると以下のようになります。

    #
    # mkdir examples
    # cd examples 
    # platformio init --board uno
    # mkdir ruby
    # cd ruby
    # vi test-001.rb
    # mrbc test-001.rb
    # Transcode test-001.mrb
    # cd ../src
    # platformio run
    # platformio run --target upload
    #

# 開発環境自動構築用の Dockerfile

「開発環境の構築方法」の章では、ざっと何をインストールすれば開発環境が構築できるか、インストールすべき言語等の列挙だけしました。

実際、一つ一つのものをターゲット環境上にインストールするのは、結構手間がかかります。

さっさとアプリケーションの開発に取り掛かれるように、開発環境入りの Docker コンテナを作成可能なイメージファイルを自動構築する Dockerfile を作成してみました。

Dockerfile から作成したイメージを使ってコンテナを生成する事で、コンテナに入るなり「アプリケーションのビルド手順」の章で説明した手順で、すぐさまアプリケーションの開発が出来ます。

```Dockerfile

#
# Last Updete: 2018/12/9
#
# Author: Yoshihiko Hara
#
# Overview:
#   Create a container with "micro mruby for arduino uno" installed.
#

# Specify the image (Ubuntu 18.04) to be the base of the container.
From ubuntu:18.04

# Specify working directory (/root).
WORKDIR /root

# Update applications and others.
RUN apt-get -y update
RUN apt-get -y upgrade

# Install network tools (ip, ping, ifconfig).
RUN apt-get -y install iproute2 iputils-ping net-tools

# Install working tools (vim, wget, curl, git, unzip).
RUN apt-get -y install apt-utils
RUN apt-get -y install software-properties-common
RUN apt-get -y install vim wget curl git
RUN apt-get -y install unzip

# Set the root user's password (pw = root).
RUN echo 'root:root' | chpasswd

# Install sshd.
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get -y install openssh-server
RUN mkdir /var/run/sshd

# Change the setting so that the root user can SSH login.
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

# Install build tools(g++、make、bison)
RUN apt-get -y install g++ make bison

# Install the library necessary for building CRuby.
RUN apt-get -y install zlib1g-dev libssl-dev libreadline-dev
RUN apt-get -y install libyaml-dev libxml2-dev libxslt-dev
RUN apt-get -y install openssl libssl-dev libbz2-dev libreadline-dev

# Install CRuby(Ruby 2.5.3).
# CRuby and bison are necessary when building mruby.
RUN wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.3.tar.gz
RUN tar xvzf ruby-2.5.3.tar.gz
WORKDIR /root/ruby-2.5.3
RUN ./configure
RUN make
RUN make install
WORKDIR /root

# Install mruby(mruby 1.3).
RUN wget https://github.com/mruby/mruby/archive/1.3.0.zip
RUN unzip 1.3.0.zip
WORKDIR /root/mruby-1.3.0
RUN ruby ./minirake
WORKDIR /root
ENV PATH $PATH:/root/mruby-1.3.0/bin
RUN echo "export PATH=$PATH:/root/mruby-1.3.0/bin" >> .bash_profile

# Install Python(Python 2.7).
# It is necessary to use "pip" to get the source of "micro mruby for arduino uno".
# And Build Tool(platformio) depends on python 2.7.
RUN apt-get -y install python2.7 python-pip python-setuptools python2.7-dev

# Get "PlatformIO Core"
# Install "PlatformIO Core" to build applications using "micro mruby for arduino uno".
RUN pip install platformio
RUN pip install --egg scons

# Get "micro mruby for arduino uno"
RUN git clone https://github.com/kishima/micro_mruby_for_arduino_uno.git

# Register "micro mruby for arduino uno" as a library of "PlatformIO Core".
WORKDIR /root
RUN mkdir -p ./.platformio/lib
RUN cp -rf ./micro_mruby_for_arduino_uno  ./.platformio/lib

# Build TransCoder
WORKDIR /root/.platformio/lib/micro_mruby_for_arduino_uno/tool
RUN make
WORKDIR /root
ENV PATH $PATH:/root/.platformio/lib/micro_mruby_for_arduino_uno/tool
RUN echo "export PATH=$PATH:/root/.platformio/lib/micro_mruby_for_arduino_uno/tool" >> .bash_profile

# Make example project
RUN mkdir /root/examples
WORKDIR /root/examples
RUN platformio init --board uno
WORKDIR /root/examples/src
RUN echo "#include \"mmruby_arduino.h\"" > main.cpp
RUN echo "void setup()" >> main.cpp
RUN echo "{" >> main.cpp
RUN echo "  mmruby_setup();" >> main.cpp
RUN echo "  mmruby_run();" >> main.cpp
RUN echo "}" >> main.cpp
RUN echo "void loop(){}" >> main.cpp

# Make example ruby script
RUN mkdir /root/examples/ruby
WORKDIR /root/examples/ruby
RUN echo 'puts "hello world"' > test-001.rb
WORKDIR /root

# Specify the locale.
RUN apt-get install -y locales
RUN echo "ja_JP UTF-8" > /etc/locale.gen
RUN locale-gen


```

上記 Dockerfile は [GitHub](https://github.com/YoshihikoHara/DockerfileFor_micro_mruby_for_arduino_uno) で公開しています。

Arduino Uno 上で動作させているアプリケーションの簡易モニタリング方法（ この例だと puts による標準出力へ書き出された情報の表示とか）としては platformio のシリアルポートモニタ機能を利用するという手があります。

利用例を以下に記載します。

なおモニタを中止する場合は、" Ctrl + ] " を入力します。

    $ platformio serialports monitor -p /dev/ttyACM0 -b 9600

Arduino Uno 用のアプリケーションを Ruby で作ろうと言う人が一人でも増えてくれるとうれしいです。

では、また。