RubyからSerialPortをたたく.
SerialPortを使えばRubyからSerialPortをたたくことができます.
マイコン側のプログラムを考えてやればシリアル通信の内容によってLEDとかを操作することもできます.
とりあえず
$ sudo gem install serialport
する.
とりあえず標準入力から入力した数字に応じてLEDが光る回数をコントロールするプログラムを作ってみる.
Arduino使いましょう.
Ruby側のプログラムは,
require "rubygems" require "serialport" port = "/dev/tty.usbserial-*********" mySerial = SerialPort.new(port, 9600, 8, 1, SerialPort::NONE) while true print( "enter number(1..9) : ") if((incomingByte = gets.chomp).to_s == "q") break; else mySerial.putc incomingByte end end mySerial.close
こんな感じ.
Arduino側は,
int rcv = 0; void setup(){ Serial.begin(9600); pinMode(13, OUTPUT); } void loop(){ if(Serial.available() > 0){ rcv = Serial.read(); rcv -= 48; Serial.print(rcv); for(int i = 0; i < rcv; i++){ Serial.print("*"); digitalWrite(13, HIGH); delay(300); digitalWrite(13, LOW); delay(300); } } delay(1000);
こんな感じ.お手軽.<追記>
Arduino.ccのPlaygroundより, ( http://www.arduino.cc/playground/Interfacing/Ruby )<追記101104>
Ruby側のプログラムでArduinoからのデータを受信するとき
{ while true #処理 if(rcv = mySerial.getc) if (rcv == 'c') #処理 elsif (rcv == 'd') #処理 end end}
みたいにループの中で処理(例えば時間を計ったりするとき.)を行うとき.
mySerial.getcの部分は何かデータが来るまで待ち続けるようなので処理がここで止まってしまう.
とりあえずの解決策としては,マイコンなどのデータ送信する側で意味のないデータ(ここで言えば'c'や'd'以外)を送ってやればデータ受信待ちを抜けるし,意味のないデータなので特に処理もしない.
なんかいい方法あるとは思うんだけどなー.