ポイントは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); }