私は非常に奇妙な問題と思われるものに直面しています。問題を切り分けるために、スケッチと Ruby コードを非常に単純化しました。
Ruby のバージョンは 2.0.0、ruby-serialport のバージョンは 2.3.0 です。Mac OS X 10.9 (マーベリックス) を使用しています。
これが私のスケッチです。ご覧のとおり、シリアル データを受信すると、ピン 13 が 500 ミリ秒間点灯します。
serialtest.ino
void setup(){
Serial.begin(115200);
pinMode(13, OUTPUT);
}
void loop(){
while(Serial.available()){
byte x = Serial.read();
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}
}
これが私の Ruby コードです。
serialtest.rb
require 'serialport'
# This is the correct port file, don't worry
sp = SerialPort.new('/dev/tty.usbmodem411', 115200)
sp.write "a"
sp.flush
このコードは、単独で実行すると機能しません。例外や警告は表示されませんが、ピン 13 の LED は点灯しません (Arduino の RX ライトは短時間点滅しますが)。ただし、serialtest.rb
次の条件下での実行は機能します。
IRBを開いて実行
SerialPort.new('/dev/tty.usbmodem411', 115200)
し、IRBを開いたままにしておくと。ただし、IRB を閉じた瞬間に、実行してserialtest.rb
もピン 13 が点灯しなくなります。Arduinoのシリアルモニターを開いてそのままにしておくと. 閉じるとすぐに、再び、実行中にライト 13 が点灯しなくなります
serialtest.rb
。全体をIRBに入力すると。しかし、それは行ごとでなければなりません。コピーして貼り付けると、13番ピンが点灯しません(この場合、実行する必要はありません
serialtest.rb
)。
とても奇妙です。この質問で問題は解決すると思いましたが、そうではありませんでした (ご覧sp.flush
のとおり、ファイルの最後に配置しました。また、ファイルの最初とその間のすべての場所に配置しようとしました。また、接続を開いた直後に設定しようsp.sync = true
としましたが、それも機能しません)。sp.syswrite
バッファリングされていないはずの の呼び出しも行いません。動作する唯一のことは、別のプロセスでシリアル接続を開くことです。
serialport は実際にはファイル内から接続を確立できず、外部で接続する必要があるようです (SerialPort.new(...)
コードを内部にコピーしてThread.new
も機能しませんでした)。
どんな助けでも大歓迎です。
編集: この問題は、Ruby がシリアル接続を確立しようとするたびに Arduino がリセットされたことが原因のようです (一方、IRB とシリアル モニターは接続を開いたままにし、SerialPort.new
呼び出しserialtest.rb
が無視されるようにしました)。最終的に、私の解決策は、Arduino の RESET と GND の間に 10uF のコンデンサを配置することでした。