
Ubuntu日本語フォーラム
ログインしていません。
ubuntu+ruby+arduinoで開発を行なっています。
SerialPortを使った通信は、期待通り動作しています。
さらに複雑な処理を行うために、ソースコードをPC&arduinoで管理するのを避けるためFirmataを導入しようとして苦戦しています。
ruby -v #-> 1.8.7
gem -v #-> 2.0.0
gem list --local
*** LOCAL GEMS ***
arduino_firmata (0.2.3)
args_parser (0.1.4)
event_emitter (0.2.2)
serialport (1.1.0)
こんな環境で、最初のテストでつまずいています。
$ arduino_firmata "analog_read 1"
Resource temporarily unavailable
と表示され、動作しない状況です。
このubuntuはVirtualBox上で動かしているので、Host側のiMacで同じバージョンのものでテストすると、アナログポートの値を取ることができます。
そこで、ノートPCに入っているubnutu 12.04でテストすると、先と同じエラーを吐いて読み取れない状況です。
このことから、ubuntu側に問題があるのではと疑っているのですが…。
logには、特にエラーが残っておらず、困っている状況です。
ちなみに12.10でもテストしましたが、Resource temporarily unavailableが表示されるのみで…。
まだスクリプトを書く前の段階で、止まっている状況ですので、ヒントだけでも得られればと思い投げさせてもらいました。
気になる点や、確認した方がという点が有りましたら、教えていただけると嬉しいです。
オフライン
Ubuntu12.04(64bit版)でArduino_Firmataを試したことがありますが、同じエラーで動かなかったです。ArduinoはUnoR3,USBで接続してます。
----
$ ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
$ gem -v
1.8.15
----
エラーメッセージ
/var/lib/gems/1.8/gems/arduino_firmata-0.2.3/lib/arduino_firmata/arduino.rb:163:in `write_nonblock': Resource temporarily unavailable (Errno::EAGAIN)
from /var/lib/gems/1.8/gems/arduino_firmata-0.2.3/lib/arduino_firmata/arduino.rb:163:in `write'
from /var/lib/gems/1.8/gems/arduino_firmata-0.2.3/lib/arduino_firmata/arduino.rb:64:in `initialize'
from /var/lib/gems/1.8/gems/arduino_firmata-0.2.3/lib/arduino_firmata/main.rb:14:in `new'
from /var/lib/gems/1.8/gems/arduino_firmata-0.2.3/lib/arduino_firmata/main.rb:14:in `connect'
arduinoやRubyをほぼ使ったことがないので「64bit版のUbuntuだから動かないのかなー」と思ってました
オフライン
こんにちは
arduino_firmataの開発者です
手元にあった32bitのUbuntu10.04やRaspberry PiDebian + Arduino UNOでは起こらないエラーなので、
64bitのUbuntu12.04マシンを用意して確認します。
少々お待ちくださいませ
オフライン
その後もう少し調査して見ましたが、どうもarduinoをUSBにさしてしばらくしてから実行するとエラーが出にくいみたいです
A.テスト環境
Ubuntu 12.04(64bit)+Arduino Uno R3(USB接続)
$ ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
$ gem list --local
*** LOCAL GEMS ***
arduino_firmata (0.2.3)
args_parser (0.1.4)
event_emitter (0.2.2)
serialport (1.1.0)
$ ls -al /dev/ttyACM0
crw-rw-rw- 1 root dialout 166, 0 3月 9 22:51 /dev/ttyACM0
B.テストプログラム
----
require "rubygems"
require "arduino_firmata"
arduino = ArduinoFirmata.connect # use default arduino
#arduino = ArduinoFirmata.connect "/dev/ttyACM0"
#arduino = ArduinoFirmata.connect "/dev/ttyACM0", :bps => 57600
arduino.digital_write 13, true
sleep 2
arduino.digital_write 13, false
sleep 2
arduino.digital_write 13, true
sleep 2
arduino.digital_write 13, false
arduino.close
----
↑上のプログラムをledblink.rbとして保存
C.コマンド実行
$ ruby ledblink.rb
・100%エラーではなく、4回に1回ぐらい成功する
・USB接続してしばらくたってarduinoが落ち着いて?からだと、エラーが出にくい
気がします。
あと、自分はRaspberry Piも持っていて、Raspberry Pi(Raspbian)上ではArduino_Firmataはエラーなく動作しました。
オフライン
UNO以降は接続してから使えるようになるまで数秒の待ち時間が必要です。
というのも、UNOからはUSBシリアル通信の変換チップがFTDI社のFT232という専用チップから、汎用チップであるAVRマイコン上のソフトウェアエミュレーションに変更されました。前者は電源が入った瞬間に動き出しますが、後者はブートに数秒かかるようです。
詳しくはこちらにまとまっています
http://learn.adafruit.com/arduino-tips-tricks-and-techniques/arduino-uno-faq
最近のArduinoは Duemillanove -> UNO -> Leonard & Micro とバージョンアップしているのですが、UNO以降のUSBシリアル変換機はマイコン上のソフトウェアエミュレーションです。
UNOではわかりにくいのですが、LeonardやMicroではブートするまで基板上の13番LEDがホタルのようにボヤーンと光るのでわかりやすいです。だいたい6秒ぐらいかかります。
もしかすると、このブートするまでの時間が問題なのでは?と思ったのですが、私のMacではUNOは接続してすぐに使えるようになるので、やっぱり64bit Ubuntuを用意して試してみようと思います。
--
エラー確認のためにVMWare上にUbuntu 12.04 64bitをインストールしたのですが、VMWareのエラーのためデバイス自体が認識されずarduino_firmataを動かす所までたどりつけませんでした。
http://gyazo.com/4167657b88a6af45370b1696e68d0345
そこで実機に64bit Ubuntuをインストールすべく古いMacbook Proを取り出したのですが、長い間使っていなかったので電池を復活させるのに時間がかかっています。
インストールでき次第こちらでも試しますのでもう少々お待ちください。。。
オフライン
お手数をお掛けしています。
こちらは ubuntu 12.04/12.10 ともに32bit版で検証を行なっていますが、どちらも動作していない状況です。
macだとサクッと動くのですがねぇ…。
もう少し、条件を洗い出してみます。
オフライン
ちなみに ledblink.rb を実行してみた結果です。
MEGA2560 + ubuntu 12.04(32bit)を利用しています。
$ ruby ledblink.rb
/usr/lib/ruby/gems/1.8/gems/arduino_firmata-0.2.3/lib/arduino_firmata/arduino.rb:163:in `write_nonblock': Resource temporarily unavailable (Errno::EAGAIN)
from /usr/lib/ruby/gems/1.8/gems/arduino_firmata-0.2.3/lib/arduino_firmata/arduino.rb:163:in `write'
from /usr/lib/ruby/gems/1.8/gems/arduino_firmata-0.2.3/lib/arduino_firmata/arduino.rb:64:in `initialize'
from /usr/lib/ruby/gems/1.8/gems/arduino_firmata-0.2.3/lib/arduino_firmata/main.rb:14:in `new'
from /usr/lib/ruby/gems/1.8/gems/arduino_firmata-0.2.3/lib/arduino_firmata/main.rb:14:in `connect'
from ledblink.rb:4
と同様のエラーを吐きます。
ひょっとして思い、最初にsleepを入れて確認しましたが、変わらないですね。
require "rubygems"
require "arduino_firmata"
arduino = ArduinoFirmata.connect # use default arduino
#arduino = ArduinoFirmata.connect "/dev/ttyACM0"
#arduino = ArduinoFirmata.connect "/dev/ttyACM0", :bps => 57600
sleep 10
arduino.digital_write 13, true
sleep 2
arduino.digital_write 13, false
sleep 2
arduino.digital_write 13, true
sleep 2
arduino.digital_write 13, false
arduino.close
こちらの環境では、何度やっても上手くいかないです。
オフライン
先ほど修正した最新版(v.0.2.5)をリリースしました。
% gem install arduino_firmata
でインストールしなおしてみてください。
私の環境では動くようになりました。
オフライン
先程arduino_firmataをインストールしなおし、ledblink.rbを試してみたところうまく動作しました。Arduino UNO(R3)+Ubuntu12.04(64bit)上です。
これでarduinoとRubyを使った連携がUbuntu上でもうまく行きそうです。
素早い修正、ありがとうございました。
オフライン
対応有難う御座いました。
% gem install arduino_firmata
で入れた所、すでにバージョンが上がっているようですね。
$ gem list --local
*** LOCAL GEMS ***
arduino_firmata (0.2.6, 0.2.3)
args_parser (0.1.4)
event_emitter (0.2.2)
serialport (1.1.0)
この状況で、テストを行いました。
ubuntu(12.04)+ruby(1.8.7)+arduino_firmata(0.2.6)+arduino MEGA2560
コマンドラインおよびledblink.rbで動作検証しました。
【問題点】
$ ruby ledblink.rb
$ arduino_firmata "analog_read 1"
reset後は値が取れるのですが、その後実行すると、動作する時としない時がほぼ半数で発生します。
値が得られないときは、終了しない状態です。
【確認】
$ time arduino_firmata "analog_read 1"
174
real 0m15.154s
user 0m0.036s
sys 0m0.056s
値が取れた時の、実行時間ですが、この程度でしょうか?
オフライン