0

PhidgetsのサーボモーターをHTTPサーバー化した

phidgets-servo-serverというのを作った。

上のリンク先のgithubにphidgets関連のライブラリのインストール方法は書いてある。準備すると、

phidgets-servo-server --port 8901
でサーバーが起動する。
eventmachine_httpserverでphidgets-ffiをHTTPから使えるようにしただけ。

使い方は簡単で、HTTP-GETでサーボモーターの現在の角度が取得できる
% curl http://localhost:8901
HTTP-POSTで指定角度に回転する。
% curl -d '90' http://localhost:8901
 

 

リポジトリのWebUIディレクトリにHTML+JSでサーボを回すサンプルがある。

phidgets-servo-serverを起動したマシンのディスク上でWebブラウザで開けば、警告がでるがスライダーを回す毎にサーボが回る。
サーバーに置いたらcross domain問題があるのでそのままでは使えない。
Webブラウザ →(ajax)→ サーバー →(HTTP-POST)→ phidgets-servo-server のように中継するwebアプリをSinatraかなんかで書いて使う。


 

 

このような1つのマシンのUSBポートに接続する特殊なデバイスは、同時に複数のプログラムからアクセスする事ができなかったり、ハードウェアと同じマシン上でプログラムを実行しないとならないんだけどサーバー化してしまえばどこからでも使えるようになる。格段に実装しやすくなる。

特殊デバイスはどんどんサーバー化しよう。

他にも
なんかがある。

0

RubyでPhidgets Servoを動かす

Macに最初から入ってるRubyで、サーボモーターが簡単に動かせるってすごい(^q^)

前:RubyでPhidgets InterfaceKitのセンサーを使う

サーボモーターが接続されていたら1.5秒毎にランダムな角度に回す。
回すとon_position_changeイベントが起こるので、そこでサーボの角度を取得して表示してみている。

ffi-servo.rb

#!/usr/bin/env ruby
require 'rubygems'
require 'phidgets-ffi'

servo = Phidgets::Servo.new

servo.on_attach do |device, obj|
puts "#{device.device_class} attached"
device.servos[0].engaged = true
device.servos[0].type = Phidgets::FFI::ServoType[:default]
end

servo.on_position_change do |device, motor, position|
puts "servo[#{motor.index}] => #{position}"
end

sleep 5
if servo.attached?
loop do
servo.servos[0].position = rand(servo.servos[0].position_max)
sleep 1.5
end
else
puts 'device not found'
end
 

結果
servo attached
servo[0] => 50.031
servo[0] => 131.969
servo[0] => 23.969
servo[0] => 86.969
servo[0] => 28.0
servo[0] => 98.969
servo[0] => 86.031
servo[0] => 193.0
servo[0] => 26.969
servo[0] => 211.0
servo[0] => 101.031
servo[0] => 206.031
servo[0] => 34.0
servo[0] => 116.031
servo[0] => 170.031
servo[0] => 80.969

0

RubyでPhidgets InterfaceKitのセンサーを使う

前に書いたphidgets-ffiを使う。ボリュームとスライダーと明るさとタッチセンサーを使ってみた。
Mac+Ruby+Phidgets簡単すぎてヤバイ。多少高いが、金をうならせれば誰でも電子工作的なものとWeb的なものを合体できる。箱から出して接続してすぐ使えるってすごいなー

 

■インストール

Phidget21をインストールしてからgemをいれる

gem install ffi phidgets-ffi
 

■プログラムを書く

ffi-ifkit.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'phidgets-ffi'

ik = Phidgets::InterfaceKit.new

ik.on_attach do |device, obj|
puts "#{device.device_class} attached"
end

ik.on_sensor_change do |device, input, value, obj|
puts "sensor[#{input.index}] => #{value}"
end

sleep 5
if ik.attached?
loop do end
else
puts 'device not found'
end
 

■動かす

Phidgets InterfaceKitにセンサーつないでいじるとon_sensor_changeイベントが起こる
interface_kit attached
sensor[0] => 508
sensor[1] => 0
sensor[2] => 488
sensor[3] => 986
sensor[4] => 0
sensor[5] => 0
sensor[6] => 0
sensor[7] => 0
sensor[3] => 998
sensor[2] => 473
sensor[2] => 489
sensor[2] => 479
sensor[2] => 469
sensor[2] => 486
ちなみにon_sensor_changeイベントを使わなくても自分でPhidgets::InterfaceKit#sensorsを参照すれば読める。
raw_valueは12bitADコンバータの値で、0〜4095の値を返すようだ。to_iすると0〜999が得られる。
puts ik.sensors[0].raw_value
puts ik.sensors[0].to_i

0

MacのRubyでPhidgets RFIDリーダーを使う

PhidgetsをRubyから使う方法は去年も調べたのだが、良いrubygemが無かったのでPhidgets Serverを立てるしかないかなと思っていたけど、
最近リリースされたphidgets-ffiを使うとRubyスクリプト単体で使えた。

他にも”phidgets”や”phidgets4r”などのgemもあるが、OSの判別のコードがSnow Leopardに対応していなかったりonAttachなどのイベントを発行してくれなかったりAPIがRubyっぽくなかったりする。
phidgets-ffiが一番対応デバイス数多くてドキュメントもしっかりしていて良い。


■インストール
まずPhidgets 21 Installerをインストールする。Cで書かれたライブラリと、Macにはコントロールパネルがインストールされる。

次にgemを入れる

gem install ffi phidgets-ffi


■テスト
自分でプログラムを書く前に、システム環境設定にPhidgetsコントロールパネルが増えているのでそこから動かしてみる。
PhidgetsデバイスをUSBポートに挿すとGeneralのタブに名前が増えるので、ダブルクリックすればそれぞれのデバイスに合わせたGUIが出てくる。


■phidgets-ffiを使う
RFIDリーダーを動かしてみた。これだけでRFIDタグをのせた・どけた事がイベントで取れて、タグのIDも読める。
ffiなので多分Linuxでも動くはず。

ffi-rfid.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'phidgets-ffi'

rfid = Phidgets::RFID.new

puts 'waiting RFID Reader'

rfid.on_attach do |device, obj|
puts "#{device.device_class} attached"
device.antenna = true
device.led = true
sleep 1
end

rfid.on_tag do |device, tag, obj|
puts "tag : #{tag}"
end

rfid.on_tag_lost do |device, tag, obj|
puts "tag lost : #{tag}"
end

sleep 5
if rfid.attached?
loop do
end
else
puts 'device not found'
end