More Related Content
More from Kindai University
More from Kindai University (20)
Fukuoka rubykaigi01 yamasaki lt
- 3. Fukuoka Ruby Kaigi 01 2012 December 1
AC電源周波数
検知アンテナ
電源コンセントの周波数を測定できます。
50Hz 東日本
60Hz 西日本
- 4. Fukuoka Ruby Kaigi 01 2012 December 1
電力の需要と供給
需要が増えると 発電機のトルクが増える
おもいなあ
モーター
手回し発電機
電球
LED
- 5. Fukuoka Ruby Kaigi 01 2012 December 1
電力の需要と供給
需要が増えると 発電機のトルクが増える
mortar
電力需要
発電所
周波数変動で瞬時に需給関係がわかる!
- 6. Fukuoka Ruby Kaigi 01 2012 December 1
午前8時20分ごろの電源周波数
で、ちょんと でも、また
需要が増えると アクセル 下がる
周波数が下がる
ふかす
- 8. 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台で運転している。
- 10. Fukuoka Ruby Kaigi 01 2012 December 1
BeagleBoneでやってみた
arduinoみたいなオープンハードウェア
普通にLinuxが動く Ruby1.9.3 Rails3 OK
- 11. 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!
Fukuoka Ruby Kaigi 01 2012 December 1
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!
- 13. Fukuoka Ruby Kaigi 01 2012 December 1
周波数成分の分布
25!
20!
15!
10!
5!
0!
1!
59.93
2!
59.94 59.96
3! 4!
59.97 59.98
5! 6!
59.99
7!
60.00
8!
60.01
9!
60.02
- 14. Fukuoka Ruby Kaigi 01 2012 December 1
Rubyでやる?
はっきり言ってむいていない!
mrubyとも???!
!
でも、makersな人々!
• オープンハードウェアをRubyで
フィジカルコンピューティングで
きると楽しいぞ!
- 15. Fukuoka Ruby Kaigi 01 2012 December 1
Rubyでがんばった事
!
正確な時間間隔でサンプリング!
• 8.3ミリ秒以下(1/60秒の半分以下)!
収集途中でGCが入ってはだめ!!
• しかも何日も動き続けないとだめ!
- 16. 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)}
- 17. 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)}
- 18. Fukuoka Ruby Kaigi 01 2012 December 1
正確な時間間隔で動作
リアクタパターンを利用!
マルチスレッドを使わずに!
軽量にノンブロッキングIO
- 20. Fukuoka Ruby Kaigi 01 2012 December 1
gemsの
event machine
ユーザ定義のイベント
IOやイベント駆動
リアクタ
プログラム
- 21. Fukuoka Ruby Kaigi 01 2012 December 1
gemsの
event machine
ユーザ定義のイベント
定期発生イベント
リアクタ
プログラム
- 22. 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
} }
- 23. 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 } } }
- 24. Fukuoka Ruby Kaigi 01 2012 December 1
サンプリング中は素早く
ウィンドウ関数もメモ化して再利用
hamming=->i{m={}
m[i]||=(0.54-0.46*cos(2*PI*i/N-1))}