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

0

hugeurlをアップデートした

twitterのURL展開隠しAPIを使っていたのだがいつの間にかなくなっていたので、HTTP-HEADしてresponseのlocationを見るようにした。

gem install hugeurl
gemの使い方はここに書いたのと同じ

 

今回は新たにhugeurlコマンドを付けておいた。gem installするだけで使えるようになっているはず。
% hugeurl http://t.co/abcde
で展開したり
% cat foo.txt | hugeurl
でファイルまるごと展開できる。

0

webブラウザから印刷できるサーバー作った

webブラウザでファイルをアップロードしたり、URLをHTTP-POSTしたら印刷できる奴を作った。研究室のwebサーバーに設置したらわりとウケてた。

出力デバイスとしてプリンタがより手軽に使えるようになる。
例えばメッセージをプリンターから出したりとか、Ethernetにつながったハードウェアから印刷したりとか、いろいろなARマーカーをどんどん吐き出すとかできるのできっと便利。


SinatraからMac/Linuxのlprコマンドを呼び出して印刷する感じの実装をした。
URLをpostされたら、content_typeをチェックしてから、html以外ならダウンロードして印刷、htmlの場合はxvfbとwebkitを起動してキャプチャしてPDFを作って印刷するとかがんばった実装をした。


https://github.com/shokai/print-server




■セットアップ
Sinatraなのでローカルですぐ起動させられる。

git clone git@github.com:shokai/print-server.git
cd print-server
brew install qt imagemagick
gem install bundler
bundle install
cp sample.config.yaml config.yaml
config.yamlにデフォルトプリンタの指定などが書いてある。
Linuxの人はREADME.mdを見ろ。


■起動
ruby development.rb
http://localhost:8080で起動する


■印刷
HTTP POSTで印刷できる
curl -d 'url=http://shokai.org/blog/' http://localhost:8080/url

multipart/form-dataでデータ入稿もできる。


■その他memo
このへんの事をするツールをhelperディレクトリにまとめてある


lprとlpstatで印刷している
ターミナルから印刷する – 橋本詳解


xvfbとwebkit起動してスクリーンショットを撮る
capybara-webkitでwebページのスクリーンショットを撮る – 橋本詳解


ImageMagickをmini_magickから使って、縦長のスクリーンショットを分割した
mini_magickとImageMagickで画像を切り取る – 橋本詳解


Prawnで画像を1つのPDFにまとめる
画像をpdfファイルにまとめる – 橋本詳解