Arduinoからシリアルポートで取得した値をPythonからRに渡してリアルタイム描画する

ポイントはArduinoから取得した値をRpy2でRにアサインした後、numericに変換する

Pythonコード

from rpy2.robjects import r
import serial

#global parameters
window = 20
update = 0.5 

r.assign('window',window);
r.assign('update',update)
r('''
df <- data.frame();
i <- 0;
dat <- 0;
''')
ser = serial.Serial('/dev/tty.usbmodemfd121', 9600)
while True:
    value = ser.readline()
    r('flush.console()')
    r.assign('dat',value) 
    r('''
    dat <- as.numeric(dat)
    df <- rbind(df,data.frame(time=nrow(df)+1,y=dat))
    message(dat)
    if(nrow(df) > window){
      plot(df$time,df$y,type='l',xlim=c(i-window,i))
    } else {
      plot(df$time,df$y,type='l',xlim=c(0,window))    
    }   
    i <- i+1;
    Sys.sleep(update)
    ''')

Arduinoコード
参考:Arduino正規分布に従う乱数を発生させる
http://d.hatena.ne.jp/seinzumtode/20140422/1398147338

#include <Gaussian.h>
double val;

void setup(){
  Serial.begin(9600);
  Serial.println("\n\nStarting Random Gaussian Distribuition...");
  delay(20);
  randomSeed(analogRead(0));  
}

void loop(){
  Gaussian g1 = Gaussian(0, 1);
  val = g1.random();
  Serial.println(val);
  delay(1000);
}