fukuoka rubykaigi01 yamasaki lt

28
Fukuoka Ruby Kaigi 01 2012 December 1 Rubyで フィジカル コンピューティング Rubyist九州 山崎重一郎

Upload: shigeichiro-yamasaki

Post on 22-May-2015

4.375 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

Rubyで フィジカル

コンピューティング Rubyist九州!山崎重一郎!

Page 2: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

 

今年の夏休みの発明品

Page 3: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

AC電源周波数 検知アンテナ

電源コンセントの周波数を測定できます。 50Hz 東日本 60Hz 西日本

Page 4: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

電力の需要と供給 需要が増えると   発電機のトルクが増える

手回し発電機 モーター

電球 LED

おもいなあ

Page 5: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

電力の需要と供給

mortar

電力需要

周波数変動で瞬時に需給関係がわかる!

需要が増えると   発電機のトルクが増える

発電所

Page 6: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

午前8時20分ごろの電源周波数

  需要が増えると 周波数が下がる

で、ちょんと アクセル ふかす

でも、また 下がる

Page 7: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

九州電力の電力需給状況 今年の夏 93% までいった 100%超えると大停電

Page 8: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

苅田火力発電所新二号機  今年の1月に廃止予定だった40歳の火力発電機!

(2012年8月20日 読売新聞) 苅田発電所新2号機が故障、出力半減  九州電力は20日、石油火力の苅田発電所新2号機(福岡県苅田町、出力37万5000キロ・ワット)で17日に燃料ポンプが故障し、出力を約

19万キロ・ワットに下げて運転していると発表した。17日に故障で止まった液化天然ガス(LNG)火力の新小倉発電所5号機(北九州市、出

力60万キロ・ワット)は20日夜にも運転を再開する。  九電では他電力会社などからの調達量を増やし、20日の電力使用率は92%の見通しで、「当面の需給に問題はない」としている。

 苅田新2号機は17日午前、ボイラーに燃料を送るポンプ2台のうち1台で振動や異音が起き、予備機に切り替えて運転。同日夕に予備機も同じ故障で止まり、ポンプ1台で運転している。

Page 9: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

   来年の夏も発電所長と一緒にはらはらしよう!

Page 10: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

BeagleBoneでやってみた arduinoみたいなオープンハードウェア

普通にLinuxが動く Ruby1.9.3 Rails3 OK

Page 11: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

アナログポートに刺したアンテナからの生データ うわあ~ノイズだらけ

0!

500!

1000!

1500!

2000!

2500!

3000!

3500!

4000!

4500!

1! 5! 9! 13!

17!

21!

25!

29!

33!

37!

41!

45!

49!

53!

57!

61!

65!

69!

73!

77!

81!

85!

89!

93!

97!

101!

105!

109!

113!

117!

121!

125!

129!

133!

137!

141!

145!

149!

153!

157!

161!

165!

169!

173!

177!

181!

185!

189!

193!

197!

201!

205!

209!

213!

217!

221!

225!

229!

233!

237!

241!

245!

249!

253!

系列1!

Page 12: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

FFT  高速フーリエ変換ってやつ

Page 13: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

周波数成分の分布

0!

5!

10!

15!

20!

25!

1! 2! 3! 4! 5! 6! 7! 8! 9! 59.93 59.94 59.96 59.97 59.98 59.99 60.00 60.01 60.02

Page 14: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

Rubyでやる?  はっきり言ってむいていない! mrubyとも???!! でも、makersな人々!• オープンハードウェアをRubyでフィジカルコンピューティングできると楽しいぞ!

Page 15: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

Rubyでがんばった事 ! 正確な時間間隔でサンプリング!•  8.3ミリ秒以下(1/60秒の半分以下)!

 収集途中でGCが入ってはだめ!!• しかも何日も動き続けないとだめ!

Page 16: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

FFTは2行 fft=->a{n=a.size! (n==1 ? a : fft[(0...n/2).map{|i|a[i]+a[i+n/2]}].zip(fft[(0...n/2).map{|i|(a[i]-a[i+n/2])*((Complex.polar(1,-2*PI/n))**i)}]).flatten)}

Page 17: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

FFTは2行(拡大版)

fft=->a{n=a.size

(n==1 ? a : fft[(0...n/2).map{¦i¦a[i]+a[i+n/2]}].zip(fft[(0...n/2).map{¦i¦(a[i]-a[i+n/2])*((Complex.polar(1,-2*PI/n))**i)}]).flatten)}

Page 18: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

正確な時間間隔で動作  リアクタパターンを利用!

マルチスレッドを使わずに!軽量にノンブロッキングIO

Page 19: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

Rubyで リアクタパターン

Page 20: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

gemsの event machine

ユーザ定義のイベント

リアクタ

プログラム

IOやイベント駆動

Page 21: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

gemsの event machine

ユーザ定義のイベント

リアクタ

プログラム

定期発生イベント

Page 22: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

5ミリ秒ごとに駆動されるプログラム (実際は微調整が必要!)

require 'eventmachine' EM.run {n=1 EM.add_periodic_timer(0.005){ センサーチェックプログラム n+=1 EM.stop if n==N } }

Page 23: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

サンプリング中はGCを入れない  バッファ(ウィンドウ)をFiberのコルーチンにして領域を繰り返し再利用!

window=Fiber.new{i=0;buf=Array.new(SIZE) File.open(ANALOG_IN){¦f¦ loop{r=Fiber.yield(buf) if r==0 then i=0 else #センサーチェック buf[i]=f.gets.chomp.to_f*hamming[i] f.rewind;i+=1 end } } }

Page 24: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

サンプリング中は素早く  ウィンドウ関数もメモ化して再利用

hamming=->i{m={} m[i]¦¦=(0.54-0.46*cos(2*PI*i/N-1))}

Page 25: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

びっくりするくらい正確になった  

Page 26: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

九州電力の送電系統図

Page 27: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

SNSで周波数を共有

Page 28: Fukuoka rubykaigi01 yamasaki lt

Fukuoka Ruby Kaigi 01 2012 December 1

実験協力者募集中!  BeagleBone 貸し出します!!• 全部で15台ほどあります