mrubyがIchigoJamで動くらしい 第2回戦

# あらすじ

[mrubyがIchigoJamで動くと聞いて試したらできなかった。](https://qiita.com/miyatama/items/26a113e8be9576f68a48?fbclid=IwAR1IpjaYNqrtNViP3kKB4fWoZhmmmGkuxvk7gL4VhSwKfB1Ozv5YvFDPgZA)を
出来なかったなりに公開したら、本家の方から''armコンパイラ使うといい''との情報をいただいた。
本家の方のページがコチラ

[Ruby on Jam! IchigoJamで動くROM8KBのミニ Ruby VM と、mruby ver2.0対応はじめのいっぽ - mmruby for LPC1114](https://fukuno.jig.jp/2473?fbclid=IwAR1MjE9ssjzFvsZJ9WQcfFNJ3xh4Hx2JTIruoEbsoVThTza_iVzz1ycj6q8)

また、別の有識者の方から下記ページも教えていただいた。

 + [STM32等のARMマイコンをGCCでビルドする(2017年度後期版)](http://nemuisan.blog.bai.ne.jp/?eid=188089&fbclid=IwAR3Ip7lSjfD0NV3zwJjFuvTlFsK8YQQ-9HKJkOJ0wKnptYOjNXLvwjplbbY)

早速やってみる。

以下が前提の環境

 + IchigoJam: くまモン型IchigoJamを持っているのでそれを利用
 + 電子工作用具
   + はんだごて
   + はんだ
   + USBシリアル変換モジュール(後述)
   + ジャンパーピン
   + ブレッドボード
   + USBケーブル
 + Windows 10 PC
   + Visual Studio Code
   + GnuMake

一応アジェンダ

 + [PC環境構築](#building_pc_env)
 + [IchigoJamをシリアル接続する](#connect_itigojam)
 + [IchigoJamでmrubyを動かす](#i_wish_running)
 + [mruby2.0への対応](#apply_mruby20)
 + [ふりかえり](#furikaeri)

# 結果

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/223afc73-5da2-f5b5-b294-9437f9b093de.png)


# <a name="building_pc_env">PC環境構築</a>

## micro mruby for lpc1114を取得

[taisukef/micro_mruby_for_lpc1114](https://github.com/taisukef/micro_mruby_for_lpc1114)からコードを取得し、ローカルに展開する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/fbc995da-493a-81e5-7b8d-9ca78a2200cc.png)

<font color="dark_pink">こんな感じ</font>

## Make for Windowsをインストール

[Make for Windows](http://gnuwin32.sourceforge.net/packages/make.htm)からバイナリを落としてインストールする。
パスにbinディレクトリを追加し、makeコマンドが使える事を確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/62651f73-4d91-227a-92db-d7329272fb7d.png)

<font color="dark_pink">こんな感じ</font>

## GNU Arm Embedded Toolchainをインストール

ARM用コンパイラ。[arm Developper](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm)のサイトを参考にバイナリを取得する。
2019.05.03現在だと[GNU Tools for ARM Embedded Processors 7-2018q2-update Release](https://launchpad.net/gcc-arm-embedded/+announcement/15015)が最新っぽいのでここからダウンロードして展開する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/59533267-8217-a0b2-a5b3-6703c64af6f1.png)

<font color="dark_pink">こんな感じ</font>

さらに、arm-none-eabi-objcopy,objcopyのみ昔のバージョンから更新する。ちょろっと問題があって、

```text
It's definitely a problem with the latest toolchain. If you want something more recent: 
On Windows, the toolchain 6-2017-q1-update (6.3.1) doesn't have this problem (and I'm 
pretty sure 7.3.1 doesn't either). Otherwise I'm hitting the same problem on Windows with 
gcc-arm-none-eabi-8-2018-q4-major (8.2.1), but it works on my Linux system. Using the 
6.3.1 release of objcopy on the 8.2.1 output seems to work too.
```

とのこと。興味のある方は自分で調べるだろうから詳細は差し控える。

パスを通して完了。

## CoreUtilsをインストールする

[CoreUtils for Windows](http://gnuwin32.sourceforge.net/packages/coreutils.htm)から環境にあったものをダウンロードしてパスを通す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/151e6305-10b1-76e4-9cfc-bde8fac9c498.png)

<font color="dark_pink">こんな感じ</font>

## GCCをインストールする

MSys2経由で設定を行う。[MSYS2 installer](http://www.msys2.org/)からMinGWをインストールしてパッケージを同期させる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/0bf69034-a349-5e39-a346-44cadd87b611.png)

続けてGCCインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/b3a071b6-975d-f4bb-eb5b-d3cdf1ba69c6.png)

gccのパスを見つけてパスに追加する。

# <a name="connect_itigojam">IchigoJamをシリアル接続する</a>

さて、PCの環境が整ったら今度はIchigoJamとPCを接続する準備に入る。
まずは何となくどんな作業が必要になるか。

 + PCにターミナルソフト入れる
 + シリアル接続用の回路を組む
 + ターミナルでIchigoJamにアクセスする

## PCにターミナルソフト入れる

TeratermでもCoolTermでも好きなものを入れる。今回はCoolTermにした。

 + [CoolTerm](https://coolterm.en.lo4d.com/)

無事に入ったら起動してみる。
最初にシリアルがどうたらこうたら行ってくるけど、レートを115200にしておくだけでいい。
起動出来たらこんな感じの画面が出るはず

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/3824b67c-1904-e764-4005-df529a99b32d.png)

<font color="dark_pink">こんな感じのやつ</a>

## シリアル接続用の回路を組む

本家サイトに[USB-シリアル](https://15jamrecipe.jimdo.com/%E5%91%A8%E8%BE%BA%E6%A9%9F%E5%99%A8/%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%81%A8%E6%8E%A5%E7%B6%9A/usb-%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB/)と言うジャストな記事があるのでその通りできる方はその通りしていただいたほうがいい。
自分は手持ちにシリアル変換基盤があるのでそれを利用する。

ちなみに自分の手元になったのはコレ。

[超小型USBシリアル変換モジュール](http://akizukidenshi.com/catalog/g/gM-08461/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/7e650fd8-4488-4e31-92f0-fed2bbba6834.png)
<font color="dark_pink">超小型って処に惹かれて買った奴</font>

とりあえず足([*1](#reference_01))を付ける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/b44cac1e-d51e-2c25-7970-44b3896087af.png)

尚、電子工作一切やったことない方は下記の様なよく分からないトラップが盛りだくさんなので、
知っている人に力を借りたほうがいい。

 + 太ピンかったら細ピン用の穴ではんだ付けすらムズイ問題
 + ブレッドボードに挿したけどぐらついてて不安がすごい問題
 + シリアル変換とかでググったら大量に候補が出てくる問題
 + etc

足がついたらブレッドボードで回路を組んでゆく。
回路って言ってもジャンパーでつないでゆくだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/45aca8c3-bf76-8cbc-c4ed-7f37eb725c9e.png)

<font color="dark_pink">光りまくってて全然わからん</font>

接続する足の対応

| USBシリアル変換モジュール | IchigoJam |
| :----- | :----- |
| VCC | 無視 |
| GND | GND |
| TXD | RXD |
| RXD | TXD |

## ターミナルでIchigoJamにアクセスする

USBシリアル変換モジュールを利用する場合、PC側にデバイスドライバをインストールする必要がある。
MacとかLinuxとかならいらないこともあるだろうか、今回はWindowsなのでしっかり入れる。

[FTDI Chip](https://www.ftdichip.com/Drivers/VCP.htm)からダウンロードして好きな所に展開する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/93e20029-e0a6-7ca7-966f-af0b281acba1.png)

<font color="dark_pink">こんな感じ</font>

USBシリアル変換モジュールをPCに接続して、デバイスドライバをインストールするだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/294362e9-9e27-3824-fcd4-536e64647a5b.png)

<font color="dark_pink">こんな感じになってればOK</font>

ついでにプロパティを開いてレートを115200に変更しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/5ba1da5a-0050-e31a-40e9-c0a574803e46.png)

ここまでくれば、PC,USBシリアル変換モジュール,IchigoJamが全部つながった状態になる。
早速IchigoJamを起動(*2)して、CoolTermからアクセスする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/e9532158-abaa-b483-b56a-e375c15db4ff.png)

なぜか打った文字が見えないけど、''LED 1''とか''LED 0''とか打ち込んでIchigoJamのLEDが光ったりすればOK。

# <a name="i_wish_running">IchigoJamでmrubyを動かす</a>

さぁ、いよいよ最終局面。
これ以降は、PC,USBシリアル変換モジュール,IchigoJamが全部つながった状態にして、IchigoJamを起動しておく。

## micro mruby for lpc1114をビルドする

Visual Studio Codeでmicro mruby for lpc1114を開く。
まずはMakefileがlinuxっぽくなっているので、Windowsっぽくする。

 + ''/''を''\\''へ変更
 + USBSERIALをCOM4へ変更

objディレクトリを作成したら、ターミナルからmake all writeを叩く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/25eabd26-733b-954a-1488-4e0f4b971c40.png)

<font color="dark_pink">もちろん失敗</font>

どうやらlpc21ispなるものが必要らしい。

## lpc21ispをインストールする

[Ladvien/LPC21ISP_Win](https://github.com/Ladvien/LPC21ISP_Win/blob/master/lpc21isp.exe)からダウンロードして好きな場所に配置する。
Ladvienさんに一礼したらパスを通す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/45d16882-07d2-67d7-add1-858f1228e427.png)

## micro mruby for lpc1114をビルドする(2回目)

lpc21ispを入れたので、Makefileを修正する

 + LPC21ISPをlpc21ispへ変更

変更したら''make all write''

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/5af23294-9a63-7a9d-4ad6-9da93e63edef.png)

<font color="dark_pink">Synchronizingが終わらない。。。</font>

これはあれだな制御信号的なアレだな。
と言うわけで、ISPをGNDに接続してみてもう一回やる。

接続する足の対応

| USBシリアル変換モジュール | IchigoJam |
| :----- | :----- |
| VCC | 無視 |
| GND | GND |
| GND | ISP <- New!! |
| TXD | RXD |
| RXD | TXD |

さらに手順変更。

 + 今まで
   + 全部繋げる
   + IchigoJamの電源入れる
   + make all write
 + これから
   + 全部繋げる
   + make all write
   + IchigoJamの電源入れる

レッツトライ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/5f9478ab-d886-fc52-bcf1-7ae826e1f196.png)

<font color="dark_pink">でき...た...？</font>

## 書き込むプログラムを作る

とりあえず[本家サイト](https://github.com/taisukef/micro_mruby_for_lpc1114)を見る限り、下記手順で進っぽい。

 + Rubyのコードを書く
 + mrbcコマンドでコンパイルする
 + transcodeコマンドでコードをIchigoJam用に変える(srcディレクトリ配下にコード出力される)
 + makeする
 + make writeする

rubyのコードはとりあえずOUT1,2,3をチカチカするだけにする。

```ruby:code.rb
while true
  led 1
  wait 10
  led 0
  wait 10
end
```

コードの配置場所はここ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/3df9fe22-0f03-d8d1-a48e-f19795f7602c.png)


mrbcで早速コンパイルする前に[mruby 1.4.1 released](http://mruby.org/releases/2018/04/27/mruby-1.4.1-released.html)からmrbcを取得する。
mruby2.0はサポート外っぽいので1.4.1を使う。ダウンロードしたらビルドしてパス通す。

``後述となりますが、2.0でも(実行まで行けてないので)問題ないです。``

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/eadd0c86-87de-cb84-6d1e-3b707851ff84.png)

<font color="dark_pink">Ruby要るってさ...</font>

と言うわけで[Ruby Installer](https://github.com/oneclick/rubyinstaller2/releases)からRubyいれる。
よく分からんけどdevelopperだからdevelopper的なの入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/793d06c9-ad90-6c19-d63c-4cd97fa9f8ac.png)

なんかよく分からんけどもう一回聞かれるので、developperだからdevelopper的なの入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/1cf665ae-1fe9-dba6-bc05-9d7f8a7a4d61.png)

何も行う事ないらしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/c05fac22-b137-5a7a-42af-0c4e896e915d.png)

<font color="dark_pink">どうすりゃいいんだコレ</font>

とりあえずctrl+cで強制的に終了させる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/38eab058-04fa-dc3c-9a0d-a5b09d176d91.png)

コマンドプロンプトで叩いてみたら無事入ってるみたいなのでよしとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/aed84b2a-898a-dc66-55ec-8596cf8f1316.png)

いざ、mrubyをビルド

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/8696dbc4-9906-a924-1f75-dc0032aa131f.png)

<font color="dark_pink">bison要るってさ...</font>

と言うわけでbison入れる。
[Bison for Windows](http://gnuwin32.sourceforge.net/packages/bison.htm)からBinariesをダウンロードして展開 -> coreutilsに上書き。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/a4d23208-16bd-a69c-4285-b77f9bd233b9.png)

<font color="dark_pink">よし入った</font>

いざ、mrubyをビルド

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/8e85d89e-9bda-5deb-465f-b289aaa09db1.png)

<font color="dark_pink">regex2要るってさ...</font>

と言うわけでregex入れる。
[Regex for Windows](http://gnuwin32.sourceforge.net/packages/regex.htm)からBinariesをダウンロードして展開 -> coreutilsに上書きして、いざmrubyビルド

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/72929795-bc9b-9a4b-321c-94175bf43da6.png)

<font color="dark_pink">しゃおらぁ!</font>

後はパスを通す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/3418659a-aa3b-5dee-715c-94d581a71f17.png)

ようやっと本命のビルド''mrbc code.rb''

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/9ded79ef-7480-0fe4-303c-444072f0750c.png)


続けて上位ディレクトリにsrcディレクトリを作って''.\tool\TransCoder.exe code.mrb''

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/26ee4e64-de72-3b6c-d050-a74a78f70311.png)

<font color="dark_pink">お、</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/d01bf9c7-a889-a423-1ee1-7e21d755afba.png)

<font color="dark_pink">できた!</font>

ここまで来たら下記手順でOK

 + ''..\src\*''を''.\src\''へコピー
 + makeコマンド
 + IchigoJam,USBシリアル変換モジュール,PCをつなぐ(IchigoJamの電源はまだ入れない)
 + make writeコマンド
 + IchigoJamの電源を入れる
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/ff9659ac-8e7d-0f91-f0ca-ece4e3d3eb87.png)

<font color="dark_pink">makeが通って</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/32dbdae0-4cfe-b2e8-e583-5c1af834c60a.png)

<font color="dark_pink">Now lanching the brand new codeですって！</font>

いざ、実行。あぁ、長い戦いがもうすぐ終わる...。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/378797ad-99e3-a926-ad6b-de4eaf2aa621.png)

<font color="dark_pink">終わらなかったよね</font>

# <a name="apply_mruby20">mruby2.0への対応</a>

できないなぁーってツイッターでつぶやいていたら、
本家の方から``mruby2.0に対応したのでそちらで試してみるとよい``とのこと。

 + [taisukef/mruby-L1VM](https://github.com/taisukef/mruby-L1VM)

と言うわけで、

 + mrubyを2.0へバージョンアップ
 + mrby-L1VMをビルドする
 + mrbcを作った後にmrby-L1VMを実施する

をやって動かしてみる。

## mrubyを2.0へバージョンアップ

[mruby - downloads](http://mruby.org/downloads/)からcurrentの2.0.1をダウンロードする。
ダウンロードしたら展開してビルドする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/31a299f3-1c5f-68f4-c859-7582248a070a.png)

<font color="dark_pink">mrubyをビルドするの慣れたよね</font>

無事ビルドできたのでパスを通す。mruby-1.4.1は消す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/d5966f78-e116-44db-35b5-760ae52e58bd.png)

<font color="dark_pink">はい。無事に2.0.1が入りました。</font>

## mrby-L1VMをビルドする

[taisukef/mruby-L1VM](https://github.com/taisukef/mruby-L1VM)をダウンロードしてビルドする。
Visual Studio Codeで開いてターミナルで``gcc *.c``を実行。a.exeができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/502f5070-7b6b-df6a-31f8-6f3eefc2571d.png)

a.exeをmruby-l1vm.exeとして、coreutils\\bin配下に移動。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/5162475e-7f71-915e-dc2a-d319150cbb05.png)

## mrbcを作った後にmrby-L1VMを実施する

さて、今までの手順は

 + code.rb書く
 + mrbcでビルド(code.rb -> code.mrb)
 + TransCoderで変換(code.mrb -> code.h,symbol_ids.h)
 + ``..\src\*``を``.\src\``へコピー
 + makeコマンド
 + IchigoJam,USBシリアル変換モジュール,PCをつなぐ(IchigoJamの電源はまだ入れない)
 + make writeコマンド
 + IchigoJamの電源を入れる

でも、これからは

 + code.rb書く
 + mrbcでビルド(code.rb -> code.mrb)
 + mruby-l1vmでいい感じにする(code.mrb -> code.mrb) <- New
 + TransCoderで変換(code.mrb -> code.h,symbol_ids.h)
 + ``..\src\*``を``.\src\``へコピー
 + makeコマンド
 + IchigoJam,USBシリアル変換モジュール,PCをつなぐ(IchigoJamの電源はまだ入れない)
 + make writeコマンド
 + IchigoJamの電源を入れる

となる。

では早速

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/cc1493f5-e683-94fd-eddb-32c9cd335c54.png)

<font color="dark_pink">mrbc!</font>

からの、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/890f3acf-2d24-c926-15fc-5fa3b7d6fa24.png)

<font color="dark_pink">失敗!</font>

それを無視してのTransCoder!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/8e484303-dc5e-9e42-abac-349e5bb5ddd4.png)

<font color="失敗!"></font>

# <a name="furikaeri">ふりかえり</a>

この手順をこなすまでに様々なエラーと立ち向かった。とにかく色んな所でエラーが出た。
Makefile、パス、配線、etc。
結局動いてないが、他の誰かが環境を構築する際に、全く情報入れずにやるよりかは楽になると信じたい。

# 注釈

<a name="reference_01">*1</a>: 足って勝手に言ってるだけで多分正式名称は別にあると思う。虫っぽいからいいかなと思ってる。
<a name="reference_02">*2</a>: IchigoJamには別途電源が必要