10月 262012
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()を呼ぶようになってる。