福野泰介の一日一創 - create every day

Python編に続いて、国産言語Rubyでも、IchigoJamを制御してみましょう!

まずは、IchigoJamにUSBシリアルをつなぐか、IchigoKamuyを準備。
RubyでUSBシリアルを使うには、serialport gem を使います。

$ gem install serialport

USBシリアルのポート(port)を /dev/tty.〜 または COM3 などで指定し、LEDをつけるプログラム(test.rb)はこちら

require 'serialport' port = '/dev/tty.SLAB_USBtoUART' ser = SerialPort.new(port, 115200) ser.puts("LED1\n") p ser.gets

動かしてみましょう

$ ruby test.rb OK

光りました!(USBシリアルの制御、PythonよりRubyの方が短くわかりやすく書けました)

クラス IchigoJam.rb を作って楽しましょう!

require 'serialport' class IchigoJam def initialize @port = '/dev/tty.SLAB_USBtoUART' @ser = SerialPort.new(@port, 115200) end def puts(s) @ser.puts(s) end def gets @ser.gets end end

あとはこのクラスを使い回せばOKです!(@portに設定する値は、お使いの環境に合わせて書き換えてください)

LEDを1秒光らせる、Ruby編はこちら。

require './IchigoJam' ser = IchigoJam.new ser.puts("LED1\n") puts ser.gets ser.puts("WAIT60\n") puts ser.gets ser.puts("LED0\n") puts ser.gets

コマンドラインで気軽に使える command.rb を用意して

require './IchigoJam' ser = IchigoJam.new ser.puts("#{ARGV[0]}\n") puts ser.gets

1行、かんたんハードウェア制御!

$ ruby command.rb LED1

ちょっと複雑な例、IchigoJam BASICのプログラムを転送し、PCの何かキーが押されたらESC信号を送って止めるRubyプログラム

require './IchigoJam' ser = IchigoJam.new ser.puts("1 LED1:WAIT10\n") ser.puts("2 LED0:WAIT10\n") ser.puts("3 GOTO1\n") ser.puts("RUN\n") require 'io/console' key = STDIN.getch ser.puts("\x1b") # ESC puts ser.gets

いろいろ自在にできますね!

IchigoJam 1.4βファームウェアを使えば、マイコン内蔵フルカラーLEDのまとめて制御もこのように簡単!(リファレンス

$ ruby command.rb 'LET[0],0,10,0:WS.LED1,50'


ネットで取得したデータと組み合わせれば、派手なお知らせが実装できますね!
その他、いろいろサンプルプログラム in Ruby はこちら。
IchigoJam/IchigoJam-control-by-ruby: IchigoJam control by Ruby

PythonでもRubyでもJavaScriptでも、得意な言語で楽しいハードウェアの世界をのぞいてみましょう!
Rubyなら、IchigoJamマイコン上でも動く、Ruby on Jam もあります。

links
- Pythonで操るフルカラーLED50コ、USBシリアル x IchigoJam x Python編!
- IchigoJamでパソコンとUSBシリアル通信。Node.jsを使うとキーボードとモニタいらず – しずかなかずし
- 実機転送実行まで1秒! Ruby on Jam でサクサク楽しい組み込みアジャイル開発

IchigoJam 1.4βが落ち着いてきたので、APIを使った Ruby on Jam を進めました!

早速デモをどうぞ!
ちゃんと動いた、かわくだりゲームと、USBシリアル経由で即時に転送実行しています。

IchigoJamで動くRuby版のかわくだりゲームのソースコードはこんな感じ

cls; x=15 while true lc x,5; p 79 lc rnd(32),23; p 42; p 10 wait 3 k=inkey() x=x-(k==28?1:0)+(k==29?1:0) if scr(x,5)!=0 break end end

pは1文字表示メソッドとしています。
mruby2.0でコンパイルしたmrbファイル、3kbyteまで対応。
そこそこ余裕ある組み込み開発が可能です。

IchigoJamのファイル領域として確保している後ろ8KBの内、前半を起動用BASICプログラム(entry.bas)とmrbファイル。後半を軽量 mruby VM を置いています。 一度本体にSAVEしてしまうとVM領域が壊れてRubyとして動かなくなってしまうので、また転送してご利用ください。

VM側をいじらなければ、C言語の知識も arm のコンパイル環境も不要です。


Rubyとアジャイル開発で有名な、永和システムマネジメント 平鍋さんと、福井出身つながりのNTTコミュニケーション 山下さん、鯖江のHana道場にてディスカッション! Rubyで作るIoTオープンデータ、福井発でやりましょう!

Ruby on Jam、今回はPCでの開発を基本としていますが、IchigoJam BASIC上で行番号付きで作ったRubyのプログラムをMixJuiceIchigoSodaなど、ネットで送信して、コンパイルしたものを受信して書き込むとかに対応するのもおもしろいかも。

転送は、セクター指定で書き込みができるように改造した lpc21isp を使用。部分書き込みでデバッグが早い!サクサク楽しい、組み込み開発が実現できました!

Let's play with Ruby on Jam!
IchigoJam/ruby4ij: Ruby for IchigoJam - src on GitHub」
1. Makerfile 内の環境設定 (IchigoJam は 1.4β9 以降にしておいてください)
2. make write で mruby VM for IchigoJam を書き込み
3. make mrbc で Rubyのプログラムをコンパイルして転送、自動的に起動します!

links
- 風船 Ruby 版 (ruby4ij)/Kidspod;
- そろそろ実用!? IchigoJamボードで動くRuby OS ver 0.2.0 – about yrm

Ruby on Jam を実現した、mrubyVMの軽量実装「mruby-l1vm
その軽さを生かして、WebAssembly化。web上クライアントサイド記述言語としての可能性を探ります。


mruby on web
アプリを開き、mruby 2.0 以降でコンパイルした、中間コード mrb ファイルをドロップ。
VMがバイトコードを実行し、最終値を表示します。

サンプルプログラムとお試しバイナリ sum.mrb

a = 100 sum = 0 while a>0 sum += a a -= 1 end sum

必要なメソッドなどは、emb_method内に実装すればOK!
DOM操作などをつければ、クライアントサイドのプログラムをRubyでサクサク書いちゃうことも可能ですね!

WebAssmeblyのバイナリである、wasmファイル、4KBを超える場合 Web Workers を使う必要があります。 その場合、Web Workers を使った「murby on web - over 4KB」を参考にどうぞ!

WebAssemblyのコンパイル、現在はこのようにしています (Mac)

PRJ=test-wasm clang -emit-llvm --target=wasm32 -S -I../ -Os $PRJ.c llc $PRJ.ll -march=wasm32 s2wasm --allocate-stack 100000 $PRJ.s > $PRJ.wast wast2wasm -o $PRJ.wasm $PRJ.wast

mruby、いろいろ活用方法探ってみます!

mruby で、Ruby on Jam、Windows環境でもコンパイルと転送、できたとのこと!
mrubyがIchigoJamで動くらしい 第4回戦 - Qiita

ついに動いた、かわくだりゲーム in Ruby on Jam!

ひとまず画面出力のみ接続して、いろいろ試験中です。
mruby-L1VM、クラス対応した level 2(?) でも2.5KBで実装できました!(mruby VM level 1 in 2KB

LPC1114 IchigoJam OSが24KB、BASICプログラムの保存領域の余り3KBにmruby VMと、IchigoJam OS用のマシン語コードが収まっています。

4KBごとの書き換えに対応しているLPC1114、OSの後ろ、sector6だけ書き換えられたら速くて、OSを用意する必要もなく便利そう。

お世話になっている、lpc21ispというオープンソースな書き込みツールに、-sector オプションを追加して、プルリクも送ってみました。
taisukef/lpc21isp: lpc21isp - Portable command line ISP for Philips LPC family and Analog Devices ADUC70xx
(おまけに、うちの環境ではうまく動かない -control 用に、-controlwithoutwait オプションも追加)

バイナリデータにした軽量mrubyVM「mruby.bin」を sector6 に書き込み、IchigoJam で、LOAD0、RUNで、かわくだりゲームっぽいものを見ることができます。(カーソルがまだ効きません)

また、こちらのRubyのコード、mruby2.0.1のmrbcでコンパイルし、

cls lc 5,10 print "Hello Ruby on Jam!"

bin2basでPOKE文に変換

10 POKE#700,82,73,84,69,48,48,48,54,51,70,0,0,0,133,77,65,84,90,48,48,48,48,73,82,69,80,0,0,0,103,48,48 20 POKE#720,48,50,0,0,0,182,0,1,0,5,0,0,0,0,0,29,16,1,46,1,0,0,16,1,11,2,3,3,10,46,1,1 30 POKE#740,2,16,1,79,2,0,46,1,2,1,55,1,103,0,0,0,1,0,0,18,72,101,108,108,111,32,82,117,98,121,32,111 40 POKE#760,110,32,74,97,109,33,0,0,0,3,0,3,99,108,115,0,0,2,108,99,0,0,5,112,114,105,110,116,0,69,78,68 50 POKE#780,0,0,0,0,8

これをUSBシリアル経由でIchigoJamへ書き込み、RUNすると、画面にでます!

Let's play with Ruby on Jam!

I implemented mruby VM level 1 in 2KB ROM! Also runs on IchigoJam.
ROM2KBで動く極小 mruby-L1VM を作りました! IchigoJam でも動きます。


C言語で拡張するIchigoJam BASIC」と組み合わせて Ruby on Jam! IcihgoJam上でもこのRubyプログラムのバイナリ版、ROM容量2KBで動きました。
Ruby on Jam in ROM2KB! with bas2bin for 3KB asm

a = 100 sum = 0 while a > 0 sum += a a -= 1 end sum

sum.rb として保存したRubyファイル。mruby-2.0.1 のコンパイラ、mrbc を使って、mrbファイルを作って、mruby-L1VMへセットすればOK。(localvariableは不要なので、 --remove-lv オプションを付けて軽量化しておきましょう)
make mrb by mrbc (mruby 2.0.1), and set to mruby-L1VM.

mrbc --remove-lv sum.rb

とっても短いので、VMやコンパイラ学習用にもオススメ! メモリはすべてスタック管理なので組込の長時間運用にも向いてます。
I recommend you to learn about the VM and the compiler. No dynamic alloctations.

src on GitHub
mruby-L1VM: mruby VM implementation in 2KB ROM

人気のかわくだりゲームのRuby版はVM的には動作OK! IchigoJamと接続トライしてみます。
"Kawakudari (Rafting game)" famous game on IchigoJam also works it. I'll try to connect to IchigoJam.

cls; x=15 while true lc x,5; print "O" lc rnd(32),23; print "*" wait 3 k=inkey() x=x-(k==28?1:0)+(k==29?1:0) if scr(x,5)!=32 break end end

まったさん、スタンドアローン型Rubyの第一バージョン公開!
Mr. Matta publish the Ruby on Jam standalone edition!

- IchigoJam機で動く Ruby 、Lチカ成功! – about yrm

links
- Ruby on Jam! IchigoJamで動くROM8KBのミニ Ruby VM と、mruby ver2.0対応はじめのいっぽ - mmruby for LPC1114

平成最後の一日一創、ついにIchigoJamで動いた Ruby on Jam!

IchigoJamでかんたんなRubyのコードをmrubyで中間コードにしてLPC1114用に改造したmmrubyを転送して実行! プログラムサイズが8KBしかないので、転送もサクサク。

Rubyのプログラム、転送から実行まで!

led 1 while btn()==0 end led 0 while true out 2,1; wait 10 out 3,1; wait 10 out 4,1; wait 10 out 4,0; wait 10 out 3,0; wait 10 out 2,0; wait 10 end

LEDを付けて、ボタンが押されるまで待つ。
押されたらLEDを消して、PCN金沢フルカラーLEDアクセサリーをOUT2/OUT3/OUT4でコントロール!


プログラムはパソコン上で編集する、パターン2(パソコンを持っている人向けの Ruby on Jam)


ボタン押さなくても光らせたい?
Rubyを編集して、再度コンパイルして、転送すれば、電源オンですぐに動く Ruby on Jam のできあがり!

mmruby IchigoCakeで動いたバージョンでは、52KBあったROMをダイエットして、8KBに!(主に標準ライブラリや、浮動少数ライブラリでした)

ただし、ちょっと複雑なコードになると動かなくなってしまうので、Ruby VMの理解を深めることと併せて、mruby 2.0 対応VMを作りかけてみました。 コンパクトで、コンパイラとかアセンブラとか言語とか、いろいろ勉強になって楽しいです。

src on GitHub
taisukef/micro_mruby_for_lpc1114: micro mruby VM implementation for LPC1114

links
- Ruby on Jam!? micro mruby VM for LPC1114, ひとまずIchigoCakeで動かしてみよう
- IchigoJamでRubyは動くのか?2つのアプローチとPC上試作 kawakudari.rb

IchigoJamでRubyを動かす2つ目のアプローチ、mrubyの中間コードをIchigoJamで動かすトライ、ひとまずプログラムサイズが50KB程度だったので、ROM56KB/RAM8KBのIchigoCakeで動作確認!

点滅しました!

Rubyのコードはこちら

while true led 1; wait 10; led 0; wait 10 led 1; wait 30; led 0; wait 30 end

国産プログラミング言語 Ruby の組込版 mruby、そのサブセット mruby/c を更に削った mmruby for Arduiono One を Arm Cortex-M0 のLPC1114に移植したものです。この連携連鎖こそ、オープンライセンスなオープンソースの真骨頂!

ちょっと複雑なコードにすると落ちてしまうので、まだまだ試験段階ですが、PC/Macでコンパイルして転送する基本的なところ、動きました! どこまで切り詰めてIchigoJamで動くようにするか、どういう機能を盛り込むか、削るかのバランス調整へと進みます。

VM側のコードはそのままに、中間コード(mrbファイル)やそれを変換したものだけを転送すればすばやく試せて便利そう。 使う機能に合わせてVM側のコードが自動的に生成され、小さければIchigoJamでOK、大きければIchigoCakeと変われば便利かも。 さくらインターネットのIchigoSodaと合わせて、RubyでかんたんIoTというプログラミング中級者向け大人向けワークショップも楽しいかも?

名付けて、Ruby on Jam!
Rubyで広げよう楽しいマイコン開発!

src on GitHub
taisukef/micro_mruby_for_lpc1114: micro mruby VM implementation for LPC1114

ちなみに、IchigoJam BASIC でつくるIoTは超簡単。シンプルな実装なら、その場で数行書いてデプロイ可!
大人も手軽にIoT! IchigoJam ver 1.3 は何が違うのか?>」
こどもプログラミング+IoT=大人プログラミング! 総務省 デジタル活用共生社会実現会議 ICT地域コミュニティ創造部会にて情報提供&体験会

Rubyのまつもとさん、Ruby on IchigoJamを思案!

IchigoJamのCPU、LPC1114FN28/FDH28は、Flash32KB, RAM4KB、mrubyがターゲットとするRAM400KBとは100倍の開きあり。
でも、ぎゅっとプログラミングの楽しさにフォーカスすれば、きっと、大丈夫!

まずは、IchigoJamで人気の「かわくだりゲーム」をRubyでコンパクトに書いていてみて、コンソールで動かしてみました。

「かわくだりゲーム in Ruby」 ターミナルのフォントはIchigoJamフォントに!
できたRubyのプログラムはこんな感じ。

require "./ichigoruby" cls; x=15 while true lc x,5; print "O" lc rnd(32),23; print "*" wait 3 k=inkey() x=x-(k==28?1:0)+(k==29?1:0) if scr(x,5)!=32 break end end

こちらIchigoJam BASIC版と比べてみてください。簡単にステップアップできそうですね!

10 CLS:X=15 20 LC X,5:?"O" 30 LC RND(32),23:?"*" 35 WAIT 3 36 X=X-BTN(28)+BTN(29) 37 IF SCR(X,5) END 40 GOTO 20

かわくだりゲームを手軽に動かすために、エスケープシーケンスから探し始めましたが、リアルタイムなキー入力や、画面表示場所のチェックなどで、行き詰まり、Cursesというライブラリを使いました。

gem install curses

で、cursesをインストールし、なんちゃってIchigoJam風ライブラリ「ichigoruby.rb」と共にお試しください!
IchigoRuby src on GitHub

IchigoJamでRubyを動かす、2つのアプローチ
1. IchigoJam BASIC や、IchigoLatte 同様、スタンドアローンで動かす。
2. PCでコンパイルした中間言語をIchigoJamへ転送して、動かす。

1は、エディタやコンパイラも含めて実装する必要があるので、制限が強めのRuby。 2は単純にLPC1114を使い切るC言語より手軽な中規模組み込み開発まで使えるくらいを目指せるかも?

なんと、IchigoJam / IchigoLatte でForthが動く!
LED Blinking with Forth!? Do you want “IchigoLatte Forth” which is uncompromising programming environment for IchigoJam machine? / ForthでLチカ!?IchigoJam用 超絶硬派プログラミングOS「IchigoLatte Forth」はいかが? – about yrm

きっと、まったさんが1をやってくれそうな気がするので、こちらは2の実装、やってみます!

links
- 100円マイコンを使い倒そう!たった28byteから始めるマシン語アプリ開発
- Create Happy! Ruby City Matsue 三度目の訪問

OculusでWebVRがうまくいったので、RICHO THETAで撮った全球写真(360度写真)&全球動画(360度動画)のビューワーをつくってみました。


カーソルの左右で写真または動画を送れます。臨場感抜群すぎて、酔ってしまうほど。


ハコスコなど、スマホでもそこそこ見られるかもしれませんが、ぜひOculusでも体感ください!

- 使い方 for Mac
THETAで撮った写真や動画をパソコンにいれる(動画はコンバートしておく)
panorama viewer packをダウンロードして同じディレクトリに置く
コンソールで「ruby makelist.rb > list.js」を実行(ファイルの生成順に並んだ list.js ができる)
Oculusをつなぐ(設定方法)
panoramaviewer.html を、FirefoxNightly で開く
VRモードに切り替える
カーソル左右でシーン切り替え(上で一番最初に戻る)

A-Frameのa-videoshere機能を使っただけで簡単にできました!
ファイル名変換用に初のRuby使用!
※Macに標準でランタイムが入っているため配布して使ってもらいやすい!?

print "var list = [" f = Dir.entries(".") f.sort! do |a, b| File.stat(a).mtime <=> File.stat(b).mtime end f.each do |name| if name.end_with?(".JPG") || name.end_with?(".jpg") || name.end_with?(".MP4") || name.end_with?(".mp4") p name print "," end end print "];"

RubyはIchigoJam BASICと同じインタプリタ型のプログラミング言語、こういうファイル操作などのプログラムをパパっとつくるのにいい感じです!

2月のオープンデータデイに続いて、今年2度目の島根県松江市、「オープンデータ活用セミナー in 松江」に参加しました。


成功事例、人にも機械にもわかりやすく、オープンデータをルーチン化、産学官問わずにどんどんオープンデータに!と、Ruby City Matsue 松江市役所、花形さん。垣根を超え、みんなが向かえるシンプルなゴール、大事です。


Data City Sabae から「オープンデータ利活用の現状とビジネスの可能性」をテーマに、オープンデータを推進するための5つのアプローチ「Web標準・課題解決・創る人を創る・ウェアラブル・コラボレーション」をご紹介。新しい、または、深い人と人のつながりが連鎖するだけでなく、人とデータ、データとデータのつながりを通してどんどん広がります!


松江オープンソースラボに行く前、島根大学にてRubyを学ぶ学生さんに、オープンデータをレクチャー。知られていなかったオープンデータ、講義後、半分近くの学生さんから Code for Matsue に興味ありと挙手もらいました。便利で楽しい街、つくっちゃいましょう!(オープンソースWebアプリ for オープンデータ「データシティ鯖江アプリ」はこちら)


懇親会後の記念写真。Ruby City Matsue と Data City Sabae がまたさらに近くなりました。

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像