micro:bitをRubyでプログラミングする「rb:-:bit」（rbbit）ライブラリの紹介

（2021.12.2追記：アップグレードされた「[rbCanvas](https://rbcanvas.net/)」が発表されました。
　→ [micro:bitをRubyでブラウザだけでプログラミングするプログラミング環境「rbCanvas」の紹介](https://qiita.com/noanoa07/items/cdc9a2a8d832a6ca1fbf) ）


この記事は「[micro:bit Advent Calendar 2020 - Qiita](https://qiita.com/advent-calendar/2020/microbit?fbclid=IwAR0hmBgT5g1SVPBKZTdF85iOYpsMal0LKb0yPMocvlb-DpigNhR12r9smnw)」の9日目の記事です。

2020年クリスマスを前に、micro:bitをRubyでコーディングできるようにするライブラリ[rbbit](https://spoolkitamura.github.io/rbbit/index.html)が公開されました。（正式名は、Rubyとmicro:bitがつながっているイメージで rb:-:bit だそうです。）

<img width="600" alt="rbbit_site.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26536/6fd2e63f-014b-68e6-0841-4a3d0a0ff5bc.png">
（[rb:-:bit公式ページ](https://spoolkitamura.github.io/rbbit/index.html) より）



## 1. はじめに
micro:bitを使えるプログラミング言語としては、今までブロック（MakeCode）、JavaScript（MakeCode）、Python（MakeCode、MicroPython）、Scratch3、Smalruby3、C/ C++ などがありました。

そこに、今回 Rubyが加わることになりました。MakeCodeのブロックによるプログラミングからステップアップする選択肢が、また一つ広がったことになります。
また、Ruby on Railsなどで幅広く使われているRubyの初心者向けの学習ツールとして、micro:bitが使えるようになった意義は大きいと思います。



## 2. rb:-:bit とは
Rubyでmicro:bitを使えるようにするライブラリです。

仕組みとしては、micro:bitとパソコン（PC）をUSBケーブルで接続し、お互いがシリアル通信することでPCからmicro:bitに制御命令を送ったり、micro:bitからセンサーの情報をPCに送ることで、お互いのやりとりを可能にします。

これは、MakeCodeのようにmicro:bitにプログラムを転送して実行させる方式ではなく、Scratchで実行時にコマンドをScratch Linkによって送受信するイメージに近いです。



## 3. できること
### 対応
- LEDの点灯、消灯、文字の表示
- 音の出力※
- センサーの値の取得（加速度、傾き、明るさ、温度）
- ボタン押下状態の取得

※ micro:bit（v1.5）では、スピーカーの接続が必要

### 未対応
- 磁気センサー
- P0など入出力端子
- 無線通信
- タッチセンサー（v2.0）
- マイク（v2.0）

現状でも、micro:bitのほとんどの機能が使えるようになっています。



## 4. 使い方
micro:bitには、rb:-:bit用のシリアル通信を解釈する専用プログラムをあらかじめ書き込んでおきます。

PCには、Rubyとrbbitライブラリをインストールしておきます。そして、micro:bitを動かすプログラムをRubyで作ります。

micro:bitとPCをUSBケーブルで接続し、Rubyのプログラムを実行します。



## 5. 参考サイト
- rb:-:bit公式ページ
https://spoolkitamura.github.io/rbbit/index.html

- rbbit GitHubページ
https://github.com/spoolkitamura/rbbit

- rbbit RubyGemsページ
https://rubygems.org/gems/rbbit



## 6. 動作環境
### A. 対応PC OS
- Windows
- macOS
- Linux

（PCには、Ruby、rbbitライブラリをインストールしておく）


### B. 対応micro:bit
- micro:bit v1.5（従来のバージョン）
- micro:bit v2.0（2020.11.25 日本発売）

（micro:bitには、専用プログラムを書き込んでおく）


### C. 接続
- USBケーブルによる有線接続

（Bluetoothによる無線接続は今後対応予定）


### D. rb:-:bitバージョン
rb:-:bit(0.4.6) 2020.11.28


### E. Rubyバージョン
動作確認；Ruby 2.7.2

※ Ruby 3.0.0の場合、rbbitのインストールがエラーになることがあります。これは、同時にインストールされるserialportライブラリ（1.3.1）がRuby 3.0.0に未対応なためです。
その場合は、Ruby 2.7系列を使ってください。

## 7. 準備（インストール）
ここでは概要だけ述べていきます。
詳しいインストール手順は、[rb:-:bit公式ページ](https://spoolkitamura.github.io/rbbit/index.html) を見てください。

### 1) Rubyのインストール
PCにRubyがインストールされている必要があります。

※ Ruby 3.0.0の場合、依存ライブラリのserialport（1.3.1）が未対応のため、rbbitのインストールがエラーになることがあります。

### 2) rbbitのインストール
PCにRubyのライブラリrbbitをインストールします。


### 3) micro:bitへ専用プログラムの書き込み
micro:bit用の専用プログラムをPCにダウンロードします。（v1.5用とv2.0用があります。）

ダウンロードしたプログラムをmicro:bitに書き込みます。
micro:bitのLEDが以下のように点灯すると、正しく書き込めています。
<img width="250" alt="rbbit_logo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26536/997a8ef3-7f73-048d-7ce7-4a82ac4f8d36.png">


### 4） シリアルポート名の確認
micro:bitとPCをUSBケーブルをつないで、シリアル通信をするためのmicro:bitのポート（デバイス）名を確認します。
（USBケーブルを抜き差しすると、毎回シリアルポート名の確認が必要です。）


### 5) 環境変数の設定
#### a）環境変数に設定
確認したシリアルポート名を環境変数に設定しておきます。
（コンソールを終了するとこの設定は消えます。）

※ Windowsの場合、コマンドプロンプトとPowerShellでは環境変数の設定が違います。

- コマンドプロンプト（cmd.exe）

`> set MB_PORT=COM5`

- PowerShell

`> $env:MB_PORT="COM5"`

 
#### b）プログラム実行時に指定
あるいは、プログラム実行時に指定することも可能です。



## 8. rb:-:bitを使ってみる
rb:-:bitには3つの使い方があります。

※ micro:bit（v2.0）の場合、うまく動作しないときがあります。そのときは、micro:bitの`リセットボタン`を押してみてください。

### A. 簡易対話モード
1行ずつコマンドを実行するモードです。

起動するには、コンソール（ターミナル）で `rbbit`と入力します。

```
micro:bit>
```

と表示されたら、うまく起動しています。

`on`や `off`あるいは、`on 2 2`などとコンソールに打って、micro:bitがその通り動くか確認してみてください。

```
micro:bit> on
```

<img width="250" alt="rbbit_on.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26536/e429fafd-05a8-c5a6-91d4-395a45f8a1ee.png">
　

```
micro:bit> off
```

<img width="250" alt="rbbit_off.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26536/3bfb97e4-9244-437a-37d1-f82e4e0aab16.png">
　

```
micro:bit> on 2 2
```

<img width="250" alt="rbbit_on22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26536/13d2c9f4-8cea-ab72-d134-4085656622c5.png">

（※ 終了するには、`exit`と打ちます。）

コマンドの一覧は[こちらのページ](https://spoolkitamura.github.io/rbbit/index.html) に載っています。


### B. ブラウザ対話モード（WebSocketサーバ機能）
ブラウザを使って、GUIでセンサーの値を表示したり、制御したりします。

このモードを起動させる方法も簡易対話モードと同じで、コンソール（ターミナル）で `rbbit`と入力します。

```
micro:bit>
```

簡易対話モードと同じに見えますが、これでブラウザ対話モードも起動しています。（簡易対話モードとブラウザ対話モードは常に同時に起動します。）

[サンプルプログラムのページ](https://spoolkitamura.github.io/rbbit/sample_web.html) のリンクを直接クリックすると、ブラウザで新しいページが開いてサンプルの実行結果が表示されます。

（※ Safariなどではセキュリティの関係で、うまく表示されないことがあります。その場合は、Chromeを使うか、サンプルプログラムを一旦PCにダウンロードしてからダブルクリックしてブラウザを開いてください。）

- monitor.html
<img width="600" alt="web_monitor.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26536/939df12f-ea6e-39dc-bafd-8ff34dbf59ab.png">
micro:bitの各種センサーの値、ボタンの状態が表示されます。

- led.html
<img width="600" alt="web_led.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26536/3b5d99e4-2623-7f4b-de5a-cc71bbc6d620.png">
ブラウザを操作すると、micro:bitのLEDも同じく点灯します。

- sound.html
<img width="600" alt="web_sound.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26536/b269c3aa-8ad3-bc94-6bd5-2ac5d149f08a.png">
鍵盤をクリックすると、その通りにmicro:bitから音が鳴ります。
（v1.5ではスピーカーの接続が必要）

ブラウザ対話モードは、より正確にいうとWebSocketサーバが起動してmicro:bitからの情報をクライアントに配信するWebSocket通信モードです。そのため、プログラミング言語を問わずWebSocket通信のクライアントプログラムさえ書けばmicro:bitを操作することができるという、汎用的な用途を狙っているそうです。（よくわかってない…）


### C. プログラミングモード（Rubyクラスライブラリ）
実際に自分でmicro:bitを動かすプログラムを作るには、Rubyでプログラムを書くことになります。

やり方は通常のRubyのプログラムの作り方／実行の仕方と同じです。エディタでRubyのプログラムを書いて、保存したプログラムをコンソール（ターミナル）で実行することで、micro:bitが操作できます。

#### 1) rbbitライブラリを使えるようにする
Rubyのプログラム冒頭に、

```ruby
require 'rbbit.rb'
```

と1行書くことで、rb:-:bitの機能が使えるようになります。


#### 2) rb:-:bitの文法
- Rubyクラスライブラリ リファレンス
https://spoolkitamura.github.io/rbbit/man_console.html

を見てください。

#### 3) 実行方法
プログラムを実行するには、`7-4) シリアルポート名の確認`で行ったシリアルポートの指定が必要です。

`7-5) 環境変数の設定`で、あらかじめ行っておくか；

```
> set MB_PORT=COM5
> ruby s1_heart.rb
```

実行時にプログラム名と共に指定します；

```
> ruby s1_heart.rb COM5
```



## 9. rb:-:bitによるプログラミング例
最初は、[こちらのページ](https://spoolkitamura.github.io/rbbit/sample_console.html) のサンプルプログラムをダウンロードして実行してみるのが良いでしょう。

（※ [このページ](https://spoolkitamura.github.io/rbbit/sample_console.html) のサンプルプログラムのリンクをクリックしても、中身が見れるだけで実行はされません。）

サンプルプログラムの実行方法も[同じページ](https://spoolkitamura.github.io/rbbit/sample_console.html) で説明されています。
ただし、実行するにはサンプルプログラムを解凍して、コンソール（ターミナル）のカレントディレクトリをサンプルプログラムのあるディレクトリの場所に `cd` で移動しておかないといけません。

### 1) サンプルプログラム（[s1_heart.rb](https://github.com/spoolkitamura/rbbit/blob/main/sample_console/s1_heart.rb)）

```ruby
require 'rbbit.rb'

# 点滅するハート

=begin
  ・ハートマークが 5回点滅(操作不要)
=end

mb = Rbbit::Microbit.new(ARGV[0])

pattern = [
            [0, 1, 0, 1, 0],
            [1, 1, 1, 1, 1],
            [1, 1, 1, 1, 1],
            [0, 1, 1, 1, 0],
            [0, 0, 1, 0, 0]
          ]

5.times do
  mb.led_show(pattern)
  sleep 0.5
  mb.led_off
  sleep 0.5
end

mb.led_puts("OK!")
mb.close(5000)
```

`Rbbit:Microbit.new`でインスタンスを生成し、インスタンスメソッドを使ってmicro:bitを操作します。

メソッドは`led_show`、`led_off`や`sound_play`、`button_down?`など、分かりやすい名前になっています。

（※ 最後に`mb.close(5000)`（5秒後に通信切断）としているのは、macOSだとプログラムが終了すると、その時点でmicro:bitがリセットされてしまうのを防ぐためです。）


### 2) 実行結果
実行すると、ハートが5回点滅します。
<img width="250" alt="s1_heart_a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26536/f1072d7c-80e0-18b9-8855-432524c1745a.png">
<img width="250" alt="s1_heart_b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26536/de033177-eac2-7532-a5f3-b728f2256096.png">



## 10. 困ったときは
公式ページ＞マニュアル＞よくある質問
が用意されています。

- [よくある質問](https://spoolkitamura.github.io/rbbit/faq.html)



## 11. さいごに
micro:bitをRubyからも扱えるようになり、micro:bitの魅力が一段と増しました。Rubyによるmicro:bitプログラミングは、小学校以降の中学、高校、大学などでも、プログラミング教育に十分活用できる可能性があると思います。

rb:-:bitによって、かなり手軽にRubyのプログラミングが始められるようになりました。ぜひ試してみてみてください。