Arduino Firmata on Ruby

前:RubyからArduinoを操作できるようにFirmataプロトコルを移植した



動くようになった。
PWMが出せるDigital 11ピンに接続したサーボをランダムに1秒おきに動かす例

#usr/bin/env ruby
require 'rubygems'
require 'arduino_firmata'

arduino = ArduinoFirmata.connect

loop do
angle = rand 180
puts "servo angle #{angle}"
arduino.servo_write 11, angle
sleep 1
end

Arduino#servo_write(pin, angle)が使えるようになった。
Arduino#analog_write(pin, value)を使えば動かせたんだけど、FirmataがServo.hを読み込んでてArduino本体と同じく角度指定で動かせるAPIをだしていたので、そっちを使うようにした。


analog_writeととservo_writeの違い

FirmataとServo.hのコードを読んでみると、Firmataプロトコルでanalog_write 0~180を送って、そのピンがPWMモードではなくSERVOモードだった場合は0~180をPWM出力値ではなく角度指定値として扱うようになってた。
通信だけ見ると0~180までのanalog_write指令を送っているのに、Arduino側でモードに合わせて0~255にマッピングして動くという面白い仕様だった。

servo_writeは最終的にArduinoのServo.hのServo.write()を呼ぶようになってる。