「Arduino買ったのでRubyとDinoでLチカした」を試してみた。

Arduino買ったのでRubyとDinoでLチカしたを見て久しぶりにArduinoを触ってみた。

インストール等は簡単にできたんだけど、肝心のRubyのプログラムが動かない・・・
Windows8のせいでArduinoに書き込みが上手くいってないのかと思ったけど、サンプルのBlinkは動くのでOSのせいでは無さそうだ。

ためしに、シリアルコンソールから以下のようにLEDを光らせる命令を送ってみる。

0113  1.

この場合は、LEDがちゃんと光った。と言うことはArduinoにDinoのプログラムは書き込めている事がわかる。
ということは、問題はRubyのプログラム側にありそうだ。
次に、シリアルのプログラムを書いてみる。*1

require 'serialport'

s = SerialPort.new("COM4", 115200)
s.write("0113  1.")

あれ?ちゃんと付くぞ。
どうやら、Dinoのサンプルがおかしいようだ。
blink.rbをみてみると以下の様な記述がある。

board = Dino::Board.new(Dino::TxRx.new)

Arduinoを操作する基本クラスBoardに通信用のオブジェクトTxRxを渡してるんだけど、TxRxが怪しい。
中をみてみるとSerialPortクラスのオブジェクトを作ってるみたいだけど、どうもここのようだ。
実際にはDino::TxRxからDino::TxRx::USBSerialが作られているのでそのソースをみてみると使用するデバイスをあとから指定できる様子。
なので上記のコードを以下のように書き換えてみる。

txrx = Dino::TxRx.new
txrx.io = "COM4"
board = Dino::Board.new(txrx)

これで、無事blink.rbが動きました。

あとから分かったことだけど、DinoはCOM1〜COM4をループで回して(Windows版のRubyの場合)最初に引っかかったデバイスを使用しているようだ。
自分のマシンはデバイスマネージャでは見えなかったが実はCOM3が存在していて、そちらを使ってシリアル通信をしていたので動かなかったみたいです。
ちゃんとソース読めってことなんだろうね。

Arduinoをはじめようキット
スイッチサイエンス
売り上げランキング: 494

*1:この間にLEDをオフにしたりする作業があるけど端折ってます