Raspberry Pi 3 で mruby を動かす

DSC_0193
DSC_0193

Raspberry Pi 3 が届きました!

発売より半年ほど出遅れましたが、ようやく Raspberry Pi 3 Model B を購入したので、組み込み向け軽量 Ruby である mruby を動かしていきたいと思います。

RPi3 は 1.2GHz クアッドコア 64bit ARM と 1GB の RAM を搭載したコンピュータです。私が4年ほど前まで使っていたネットブック LaVie Light PC-BL300 が Intel Atom N280 (1コア、1.66GHz) の 1GB RAM 構成でしたので、単純比較はできないものの35ドルで購入できるのはスゴいですね。

(おっと、mruby が想定している組み込み機器と比較してもはるかに高性能な上、MRI そのものも RPi で動いているので意味ないなんて言わないでください! mruby を ARM でセルフビルド・実行してみたかったんだよー!)

数年前に購入した初代 RPi Model B+ と比べても、Wi-Fi や Bluetooth 搭載であることはありがたいです。

RPi3 は Zero のように価格高騰もしていなかったので、普通に Amazon で購入しました。ソニーの英国工場で生産されているらしい RS 版と、中国で生産されている element14 版がありますが、ちょっとだけ安い element14 版、ケースとヒートシンク2個付きを購入しました。5,980円でした。購入時のレートで35ドルは3,722円。日本の Amazon で購入ができる本体のみは4,200円。差額は1,780円ですが、ケースが1,200円、ヒートシンクが2個で580円と考えると妥当な値段だと思います。

DSC_0184
DSC_0184

上が初代 Model B、下が購入した Pi 3 です。緑色のケースが「アリの巣コロリ」っぽくて気に入っています。 このケースがかもし出す昆虫採集感のおかげで、ラズパイを縁の下に設置しなければならなくなった時も安心です。

環境の確認

Raspbian の大きい方のディスクイメージを入れて、最初から色々とプログラミング環境が入っていました。

pi@raspberrypi:~ $ which ruby python perl node lua
/usr/bin/ruby
/usr/bin/python
/usr/bin/perl
/usr/bin/node
/usr/bin/lua

lua まで入っているんですねー。さすが教育用といったところか、私は使わないけど軽量 IDE の Geany もプリインストール済みです。X 環境が入っていない Raspbian LITE 版もありますが、ここまでは充実してないのかな。

pi@raspberrypi:~ $ ruby --version
ruby 2.1.5p273 (2014-11-13) [arm-linux-gnueabihf]
pi@raspberrypi:~ $ git --version
git version 2.1.4
pi@raspberrypi:~ $ gcc --version
gcc (Raspbian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
pi@raspberrypi:~ $ make --version
GNU Make 4.0
このプログラムは arm-unknown-linux-gnueabihf 用にビルドされました
Copyright (C) 1988-2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 以降 <http://gnu.org/licenses/gpl.html>
これはフリーソフトウェアです: 自由に変更および配布できます.
法律の許す限り、 無保証 です.

基本的なものはすべて入っているようです。バージョンは念の為 apt upgrade した後のものです。

mruby の取得→セルフビルド

git で clone します。鍵ファイルを RPi に転送してないので、SSH ではなく HTTPS 経由で clone してます。

pi@raspberrypi:~ $ git clone https://github.com/mruby/mruby.git
Cloning into 'mruby'...
remote: Counting objects: 34141, done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 34141 (delta 3), reused 0 (delta 0), pack-reused 34117
Receiving objects: 100% (34141/34141), 7.02 MiB | 951.00 KiB/s, done.
Resolving deltas: 100% (21335/21335), done.
Checking connectivity... done.
pi@raspberrypi:~ $ cd mruby/
pi@raspberrypi:~/mruby $ ls
AUTHORS          Makefile   appveyor.yml        doc       mrbgems               test
CONTRIBUTING.md  NEWS       appveyor_config.rb  examples  mrblib                travis_config.rb
ChangeLog        README.md  benchmark           include   mruby-source.gemspec
LEGAL            Rakefile   bin                 lib       src
MITL             TODO       build_config.rb     minirake  tasks

無事 clone できました。 minirake でビルドしてみます。

pi@raspberrypi:~/mruby $ ./minirake

できるかな…!

....
YACC  mrbgems/mruby-compiler/core/parse.y -> build/host/mrbgems/mruby-compiler/core/y.tab.c
sh: 1: bison: not found
sh: 1: bison: not found
rake aborted!
Command Failed: [bison -o "/home/pi/mruby/build/host/mrbgems/mruby-compiler/core/y.tab.c"
  "/home/pi/mruby/mrbgems/mruby-compiler/core/parse.y"]

bison がないって怒られてしまいました。さすがにないか~、ということは flex もなさそうですね。ささっと入れます。

pi@raspberrypi:~/mruby $ sudo apt install bison flex

私の環境では関連ライブラリも含めて3.7MBのファイルが入りました。さあ、気を取り直して再ビルドに挑戦です。

pi@raspberrypi:~/mruby $ ./minirake

結構時間がかかったものの、エラーなくビルドできました!

pi@raspberrypi:~/mruby $ ls bin/
mirb  mrbc  mrdb  mruby  mruby-strip
pi@raspberrypi:~/mruby $ bin/mruby --version
mruby 1.2.0 (2015-11-17)
pi@raspberrypi:~/mruby $ bin/mruby -e 'puts "hello, mruby on pi!"'
hello, mruby on pi!

わあい。ビルドが想像以上に長かったので、早いマシン上の mruby-cli でクロスビルドした方が良さそうです。

ビルド設定を変更

mruby-cli でのクロスビルドは後日として、とりあえずすぐに手元でできるビルド設定を変更していきます。 build_config.rb を開いて、enable_debug をコメントアウトします。念の為、MRuby::Build.new()host-debug, test, bench のところもブロックまるごとコメントアウト。(ここのところ触ってなかったのでもうちょっと良い方法があるのかもしれません)

mrbgems/default.gembox に次の使いたいライブラリを追加しました。

conf.gem :github => "mattn/mruby-xquote"
conf.gem :github => "matsumoto-r/mruby-sleep"
conf.gem :github => "iij/mruby-io"
conf.gem :github => "iij/mruby-regexp-pcre"
conf.gem :github => "iij/mruby-require"
conf.gem :github => "iij/mruby-dir"
conf.gem :github => "iij/mruby-env"

再度、

pi@raspberrypi:~/mruby $ ./minirake

すると、ビルドすることができました。

需要があるかどうか分かりませんが、上の構成でビルドして strip した mruby, mrib, mrbc, mrdb, mruby-strip のバイナリをこちらに置いておきます。Raspberry Pi と Raspbian があれば、ダウンロードして解凍するだけで使える…かもしれません。

次回は GPIO を制御して L チカをやってみたいと思います。

Raspberry Pi と Ruby で「Lチカ」をやってみました

ラズパイを何年も前に購入して Raspbian を入れて ssh できて、X も動いてふぅ…と、ひと落ちつきした後、全然触っていませんでした。

せっかくラズパイを持っているんだからと思い立ち、ヤフオクで売っているキットを購入。子供の頃からやってみたかった電子工作に初挑戦です。

設計

Fritzing というソフトが GUI でブレッドボード上にいろいろ乗せてみることができるようだったので、ダウンロードして使ってみました。初心者でも分かりやすくて良いソフトですね!

Windows 版を使ってみたんですが、GLESとかQtといった香ばしそうなライブラリが同梱されていました。

それで、作ってみたのは下の図です。自分の持っている初代の Model B までパーツ一覧に入ってて嬉しい。

raspi_Lchika_map

これは回路図とは呼ばない気がします。呼び方すら分かりません。

とりあえず、GPIO#x → 抵抗 → LED → GND としとけば良さそうなので、単純に5組配線してみました。

コマンド

ラズパイで LED 制御っていうのは、もはや散々語り尽くされた感があるので、自分の覚書としてすら書いておく意味があまりない気もするのですけれど、一応書いておきます(・ω・`)

export GPIONO=27 # 制御したいGPIOの番号

echo $GPIONO > /sys/class/gpio/export            # これで制御可能状態になる
echo out > /sys/class/gpio/gpio$GPIONO/direction # たぶん電流の流れる方向だこれ

echo 1 > /sys/class/gpio/gpio$GPIONO/value       # 電流ON
echo 0 > /sys/class/gpio/gpio$GPIONO/value       # 電流OFF

echo $GOIONO > /sys/class/gpio/unexport          # これで制御可能状態をやめる

Raspbian には、最初から入っているかどうか分かりませんが、自分が使っているバージョンでは入っていた gpio というコマンドが使えるようです。

export GPIONO=27
gpio 27 export out
gpio 27 unexport

なんとなく触っただけですが、export と unexport、direction の設定がこれで出来るようです。

配線が終わり、まずはシェルスクリプトで

while :; do echo 1 > /sys/class/gpio/gpio$GPIONO/value; sleep 1; echo 0 > /sys/class/gpio/gpio$GPIONO/value; sleep 1; done

してみると、LED 一つを1秒ごとにチカチカすることができました!

どうせなので Ruby でやる

他所のラズパイを使ったLチカの記事は、大抵シェルスクリプトや Python を使ってますが、どうせなので Ruby でやります。…と言っても、↑のコマンドを呼び出すだけのものですが ;)

追記

記事を書きながらラズパイ上の mruby でLチカしてる人はいないかな、いるだろうなっと検索したところ、松本亮介さんが3年以上前にされていました。

人間とウェブの未来 – Raspberry PiのGPIOをmod_mrubyで操作してブラウザからLEDを光らせてみた

しかも自分のラズパイと同じモデルっぽいし、mruby-WiringPi を使ってちゃんと…!さ、さすが!

動かすぞい

キットについていた説明書やネットの情報を頼りに組んだら、すごく簡単にできました。

ソフトウェアからハードウェアを見える形で制御できるって魅力的ですね!

電流やらΩやら、その辺の計算は全然分かりません。とりあえず、最終的に GND に落とし込めばいい…という程度ですが、必要に応じて触っていければいいなぁと思いました。

駆逐艦の模型の探照灯に LED を埋め込んだりできたら楽しそう。