タグ「anyevent」が付けられているもの

Arduino: Playground のCode for using the Arduino with the P*rall*x RFID readerのサンプルを利用し
Parallax brand RFID readerのデータをUSBシリアル接続されたArduinoで取得してみます。

1. 配線
Parallax RFID Reader Serialを以下のように接続します。
Arduino             RFID Reader
Arduino GND              -  GND
Arduino 5V                  -  VCC
DIGITAL2     -  ENABLE
DIGITAL8     -  SOUT

写真でみると以下のようになります。 Arduino RFID

2. Arduinoのプログラムを書く
読み込んだ値をmacにUSBシリアルで転送させたいので
0(RX),1(TX)のピンは利用できないので、
他のポートをソフトウェアでシリアル化して読み込みます。
ここでは、Arduino: Playground のCode for using the Arduino with the P*rall*x RFID readerのサンプルを利用します。
// RFID reader for Arduino 
// Wiring version by BARRAGAN  
// Modified for Arudino by djmatic
// Modified by Worapoht K.
// http://www.arduino.cc/playground/Learning/PRFID のサンプルを利用
 
#include 

int  val = 0; 
char code[10]; 
int bytesread = 0; 

#define rxPin 8
#define txPin 9
// RFID reader SOUT pin connected to Serial RX pin at 2400bps to pin8

void setup()
{ 
  Serial.begin(9600);  // Hardware serial for Monitor 9600bps

  pinMode(2,OUTPUT);       // Set digital pin 2 as OUTPUT to connect it to the RFID /ENABLE pin 
  digitalWrite(2, LOW);    // Activate the RFID reader 
}


void loop()
{ 
  SoftwareSerial RFID = SoftwareSerial(rxPin,txPin); 
  RFID.begin(2400);

  if((val = RFID.read()) == 10)
  {   // check for header 
    bytesread = 0; 
    while(bytesread<10)
    {  // read 10 digit code 
      val = RFID.read(); 
      if((val == 10)||(val == 13))
      {  // if header or stop bytes before the 10 digit reading 
        break;                       // stop reading 
      } 
      code[bytesread] = val;         // add the digit           
      bytesread++;                   // ready to read next digit  
    } 

    if(bytesread == 10)
    {  // if 10 digit read is complete 
      Serial.print(code);            // print the TAG code 
    }
    bytesread = 0; 
    delay(500);                       // wait for a second
  } 
} 

Arduinoにスケッチを転送して、シリアルモニタで確認すると
以下のようにRFIDをリーダにかざした時に値が取得できる事が確認できます。
serial rfid

3. Device::SerialPortを利用してRFIDの値を読み込みます。
Quick & Easy Temperature Logging with the Arduinoのサンプルを参考に以下のように書いてみます。
#!/usr/bin/perl                                                                     
use strict;
use warnings;
use Device::SerialPort;

my $dev = tie (*FH, 'Device::SerialPort', "/dev/tty.usbserial-A8004JhW")
    || die "Can't tie: $!";

$dev->baudrate(9600);
$dev->databits(8);
$dev->parity("none");
$dev->stopbits(1);

# wait for arduino to boot                                                          
while (1) {
    my $val = <FH>;
    last if $val;
}

while (1) {
    my $val = <FH>;
    next unless $val;
    chomp $val;
    print $val . "\n";
    #sleep 1;                                                                       
}

実行すると以下のように値を受け取ります。
arduino RFID

値が読み込める事が確認できました。
ただしwhileで回していてCPUの負荷が高いようです。

試しにAnyEventを利用してみます。
AnyEventでtail -fを参考にし、AnyEvent::Handleを利用して書き直しました。
serialからの入力の読み込み方法がよく理解できてないので
無理矢理 IO::Handle Object を取り出してます。
ソースが正しいか分かはわからないですが、
以下のようにRFIDの値が読み込める事は確認できました。
perl serial anyevent
ソースはこちら、
#!/usr/bin/perl                                                                            
use strict;
use warnings;
use Device::SerialPort;

use AnyEvent;
use AnyEvent::Handle;

my $dev = tie (*FH, 'Device::SerialPort', "/dev/tty.usbserial-A8004JhW")
    || die "Can't tie: $!";

$dev->baudrate(9600);
$dev->databits(8);
$dev->parity("none");
$dev->stopbits(1);

# wait for arduino to boot                                                                 
while (1) {
    my $val = <FH>;
    last if $val;
}

# make anyevent loop                                                                       
my $fh = $dev->{'HANDLE'}; #IO::Handle Object                                              
$| = 1;

my $cv = AE::cv;
my $handle = create_handle();

sub create_handle {
    new AnyEvent::Handle
        fh => $fh,
        on_error => sub {
            my ($handle, $fatal, $message) = @_;
            $handle->destroy;
            undef $handle;
            $cv->send("$fatal: $message");
    },
    on_read => sub {
        my $handle = shift;
        $handle->push_read(line => sub {
            my ($handle, $line) = @_;
            print "$line\n";
                           })
    };
}

$cv->recv;

selectで待ち受けしてるみたいですが、
RFIDカードを読み取るとなんかエラーでてるような。
時間があるときに追ってみます。。。
anyevent

参考にさせていただいたサイト
Code for using the Arduino with the Parallax RFID reader
Quick & Easy Temperature Logging with the Arduino
[Arduino XBee Processing] RFIDタグを無線でPCに取り込む
AnyEventでtail -f