74
Ruby講座 メイカーを目指す人のための mruby にむけた試み 事例(ソーシャル電力需給センサーネットワーク) CACAnet Fukuoka/近畿大学 山崎重一郎

メイカーRuby講習会2013

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: メイカーRuby講習会2013

Ruby講座

メイカーを目指す人のためのmruby

にむけた試み

事例(ソーシャル電力需給センサーネットワーク)

CACAnet Fukuoka/近畿大学

山崎重一郎

Page 2: メイカーRuby講習会2013

Ruby講座

 

mrubyで ゴールドラッシュに 参加しよう!

Page 3: メイカーRuby講習会2013

Ruby講座

799円のイケアのテーブル

Page 4: メイカーRuby講習会2013

Ruby講座

人件費競争フリーな製造業 p 中国製はなぜ安いの?(理由:人件費が安いから) p レーザカッター+CADデータの製造業

•  レーザーカッターの価格は中国でも日本でも同じ

•  IKEAは原材料に最適化した国で製造

Page 5: メイカーRuby講習会2013

Ruby講座

じゃあ、自分も IKEAになれるんじゃない?

p レーザカッターがどんどん安くなっている p デザイン=CADデータが勝負!

Page 6: メイカーRuby講習会2013

Ruby講座

ひょっとして、IKEAより 上いけるんじゃない?

p 大量生産しなくてもメーカになれる •  顧客の家のスペースに最適化した家具

p ネットの人々の力を利用できる •  世界一のデザインを採用(世界一の階段とか)

Page 7: メイカーRuby講習会2013

Ruby講座

Page 8: メイカーRuby講習会2013

Ruby講座

サプライチェーンの個人利用 p もとは日本の自動車メーカが作ったシステム

•  ジャストインタイム方式

p 「個人メーカー」も利用可能 •  ネット仕入れのアリババとか

Page 9: メイカーRuby講習会2013

Ruby講座

サプライチェーンの個人利用 p もとは日本の自動車産業が作ったシステム

•  ジャストインタイム方式

p 個人もネット経由で利用可能になった •  ネット仕入れのアリババとか

Page 10: メイカーRuby講習会2013

Ruby講座

クラウドファウンディング p ネットで資金調達

•  銀行 ×(利息が必要) •  ベンチャーキャピタル×(上場しろって言われる) •  キックスターター ○ • 開発中の製品の「予約」=「投資」

• 最低調達目標金額を設定 + 募集期間は30日

• 目標額が集まらなければ、予約はなしになる

• 集まれば、カードから引落されて開発資金になる

Page 11: メイカーRuby講習会2013

Ruby講座

 

Page 12: メイカーRuby講習会2013

Ruby講座

僕が予約=投資したもの

Page 13: メイカーRuby講習会2013

Ruby講座

arduinoで制御する3Dプリンタ 15万円!

福岡市西区にある株式会社ホットプロシード(夫婦でメーカー) 制御ソフトは「超高性能」オープンソースを利用(原価は極秘)

Page 14: メイカーRuby講習会2013

Ruby講座

 

ゴールドラッシュ!

Page 15: メイカーRuby講習会2013

Ruby講座

ビットからアトムへ p いまやソフトを商品にするのは難しい

•  スマフォアプリで一攫千金?

p ものにすれば、値段を付けて売りやすい •  「~装置」と言い張ればいい

Page 16: メイカーRuby講習会2013

Ruby講座

予約=投資 p ゲームみたいに沢山小さな失敗ができる

•  期限内に目標額が集まらなければなしになる

p 予約=市場調査 •  資金が集まれば、売れることはわかっている

p コメントで客のニーズが直接わかる •  製品化までにどんどん改良できる

Page 17: メイカーRuby講習会2013

Ruby講座

自分で製造しないメーカー クワーキィ社が製品化、製造、販売を受け持つ  企画やアイデアを投稿した人に売り上げから還元  試作は3Dプリンタ  予約が目標まで集まったら製品化はキックスタータと同じ

デザイン

キャッチフレーズ

商品企画 値付け

Page 18: メイカーRuby講習会2013

Ruby講座

Page 19: メイカーRuby講習会2013

Ruby講座

  p  

Page 20: メイカーRuby講習会2013

Ruby講座

で、本題 p mruby(組み込み用軽量Ruby)       + p メーカーズムーブメントの文脈

Page 21: メイカーRuby講習会2013

Ruby講座

mruby p 軽量Ruby

•  コンパクト、高速、モジュラリティがすごく高い •  コア以外のクラスはmrbgem で組み込む • mrbgemは、make で静的に組み込む仕組む仕組み

mruby VM

http Regexp Socket

アプリ

mrbgem

Page 22: メイカーRuby講習会2013

Ruby講座

組み込みソフトとしての mrubyの使い方

p C言語が適しているところはCで書く p mrubyが便利なところ

•  テキスト処理、Web接続とか

httpアクセス テキスト処理 リモコン

Page 23: メイカーRuby講習会2013

Ruby講座

mrubyボード登場 p Enzi、EAPL-Trainer p arduinoピン互換(シールドが使える)

Page 24: メイカーRuby講習会2013

Ruby講座

enziの宣伝 p 福岡CSKさん

•  予約だと5980円! •  4月に届く予定~

p PDFfile://localhost/Users/yamasaki/Desktop/enzi.pdf

Page 25: メイカーRuby講習会2013

Ruby講座

  ということで 僕の発明品

Page 26: メイカーRuby講習会2013

Ruby講座

フクオカRuby大賞優秀賞

Page 27: メイカーRuby講習会2013

Ruby講座

  それがこれ

Page 28: メイカーRuby講習会2013

Ruby講座

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

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

Page 29: メイカーRuby講習会2013

Ruby講座

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

手回し発電機 モーター

電球 LED

おもいなあ

Page 30: メイカーRuby講習会2013

Ruby講座

電力の需要と供給

mortar

電力需要

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

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

発電所

Page 31: メイカーRuby講習会2013

Ruby講座

BeagleBoneでやってみた   アナログポートにアンテナを刺すだけ

Page 32: メイカーRuby講習会2013

Ruby講座

#!/usr/local/bin/ruby Process.daemon(nochdir=true,noclose=true) require 'rest_client' require 'eventmachine' include Math ANALOG_IN='/sys/devices/platform/omap/tsc/ain1' SERVER="http://yamalabo.joho.fuk.kindai.ac.jp/logs" SITE="http://yamalabo.joho.fuk.kindai.ac.jp/sites" SNAME='/home/root/ruby/id' C=60.0 N=2**12 DT=0.005 RANGE=0.25 W=N*DT addr=`ifconfig eth0`.split("\n")[1].split(' ')[1].split(':')[1] name=File.open(SNAME).gets.chomp if name=="999" name=rand(10000000).to_s p name p addr begin File.open(SNAME,'w'){|h|h.puts name} RestClient.post(SITE,{:site=>{:name=>name,:ip_address=>addr}}) ensure end end fft=->a{n=a.size c=Complex.polar(1,-2*PI/n) b=a[0...(n/2)].map (n==1 ? a : fft[b.with_index{|x,i|x+a[i+(n/2)]}].zip(fft[b.with_index{|y,i|(y-a[i+(n/2)])*(c**i)}]).flatten)}

cycle=->list{r=fft[list][0...(N/2)].map.with_index{|v,i|h=(i*(1/W)).round(2) [h,(v.abs/(N/2)).round(2)] } } hamming=->i{m={};m[i]||=(0.54-0.46*cos(2*PI*i/N-1))} window=Fiber.new{i=0 buf=Array.new(N) File.open(ANALOG_IN){|f| loop{r=Fiber.yield(buf) if r==0 i=0 else buf[i]=f.gets.chomp.to_f*hamming[i] f.rewind i+=1 end } } } ave=->sfh{(sfh.map{|x|x[0]*x[1]}.reduce(:+))/(sfh.map{|x|x[1]}.reduce(:+))} loop {GC.disable t0=Time.now window.resume 0 EM.run {n=1 EM.add_periodic_timer(DT){ t1=Time.now m=((t1-t0)/DT).round(0) if m>n (m-n).times{window.resume} n=m end window.resume n+=1 EM.stop if n>=N+1 } } GC.enable begin r=cycle[window.resume[0..N-1]] fh=r.select{|d|((C-RANGE)..(C+RANGE)).member?(d[0])} sfh=fh.sort_by{|x|x[1]}.reverse c=ave[sfh[0..3]].round(2) RestClient.post(SERVER,{:log=>{:site_id=>name,:cycle=>c}}) ensure GC.start end

}

Rubyで75行

Page 33: メイカーRuby講習会2013

Ruby講座

苅田

松浦

新小倉

豊前

大分新大分

唐津

相浦

苓北

川内

玄海

川内

大平

福岡 北九州

長崎熊本

鹿児島

大分

日田

宮崎

久留米二日市

飯塚

(小丸川)

天山

九州の主な電力網  

Page 34: メイカーRuby講習会2013

Ruby講座

  苅田

松浦

新小倉

豊前

大分新大分

唐津

相浦

苓北

川内

玄海

川内

大平

福岡 北九州

長崎熊本

鹿児島

大分

日田

宮崎

久留米二日市

飯塚

(小丸川)

天山

実際に設置してみた 飯塚市大学支援補助金に感謝!

福岡

唐津

二日市

長崎

飯塚

大分

久留米

Page 35: メイカーRuby講習会2013

Ruby講座

ソーシャルWebで情報共有

Page 36: メイカーRuby講習会2013

Ruby講座

設置方法 p 山崎の自宅(福岡)の設置風景

Page 37: メイカーRuby講習会2013

Ruby講座

SynchroSitone~  

Page 38: メイカーRuby講習会2013

Ruby講座

SynchroSitone~ すっごくシンクロしとうね

 

Page 39: メイカーRuby講習会2013

Ruby講座

Rubyで実装した! はっきり言ってむいていない"

"

"

Page 40: メイカーRuby講習会2013

Ruby講座

でもmrubyなら ばっちり

Ruby1.9で実装して 開発途上にあるmrubyへフィードバックするのが目的 こういう用途にはこの機能が欲しいとか

Page 41: メイカーRuby講習会2013

Ruby講座

アナログポートに刺したアンテナからの生データ ノイズだらけだけど、60Hzあたりの成分も見える

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 42: メイカーRuby講習会2013

Ruby講座

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

Page 43: メイカーRuby講習会2013

Ruby講座

時系列データを 周波数成分に分解する

59.93 59.94 59.96 59.97 59.98 59.99 60.00 60.01 60.02 0"

5"

10"

15"

20"

25"

1" 2" 3" 4" 5" 6" 7" 8" 9"

Page 44: メイカーRuby講習会2013

Ruby講座

Rubyなら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 45: メイカーRuby講習会2013

Ruby講座

Rubyの記述力!

Page 46: メイカーRuby講習会2013

Ruby講座

Rubyでできるの? "p 正確な時間間隔でサンプリング"• 1/60秒=16.7ミリ秒、その倍の速度が必要"• 5ミリ秒周期で正確にサンプリング"

p 収集途中でGCが入ってはだめ!"p ずっと安定して動き続けないとだめ"

Page 47: メイカーRuby講習会2013

Ruby講座

正確な時間間隔で サンプリング

p リアクタパターンを利用" event machineで実装 シングルスレッド主義で 軽量イベント駆動

Page 48: メイカーRuby講習会2013

Ruby講座

rubygemsの event machine

ユーザ定義のイベント

リアクタ

プログラム

応答性がいい

Page 49: メイカーRuby講習会2013

Ruby講座

rubygemsの event machine

ユーザ定義のイベント

リアクタ

プログラム

定期発生イベント

Page 50: メイカーRuby講習会2013

Ruby講座

サンプリングの周期? p 60Hzだと、

•  1周期は、16ミリ秒くらい •  8ミリ秒で止まって見える •  8ミリ秒よりちょっと長いと逆転 •  8ミリ秒より短いとOK

•  で、5ミリ秒にします

Page 51: メイカーRuby講習会2013

Ruby講座

Eventmachineの使い方の基礎

require 'eventmachine' EM.run { EM.add_timer(5){ puts 'どーん' EM.stop

} }

Page 52: メイカーRuby講習会2013

Ruby講座

Eventmachineの使い方の基礎 require 'eventmachine'

EM.run { EM.add_timer(5){ puts 'どーん' EM.stop

} EM.add_periodic_timer(1){puts('とん')} }

Page 53: メイカーRuby講習会2013

Ruby講座

Eventmachineの使い方の基礎 require 'eventmachine'

EM.run { EM.add_timer(5){ puts 'どーん' EM.stop

} EM.add_periodic_timer(1){puts('とん')} EM.add_periodic_timer(0.5){puts('た')} }

Page 54: メイカーRuby講習会2013

Ruby講座

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

require 'eventmachine' EM.run {n=0 EM.add_periodic_timer(0.005){ (時刻を調べて補正) サンプリング実行 n+=1 EM.stop if n==N } }

Page 55: メイカーRuby講習会2013

Ruby講座

サンプリング中に GCを入れない

p RubyのFiberでバッファ(ウィンドウ)への書き込み処理をコルーチンにする"

p 継続で、配列オブジェクトを再利用"

Page 56: メイカーRuby講習会2013

Ruby講座

Fiberで資源を節約  "window=Fiber.new{i=0 buf=Array.new(SIZE) loop{r=Fiber.yield(buf) if r==0 then i=0 else buf[i]= サンプリング値*窓関数 i+=1 end } }

Page 57: メイカーRuby講習会2013

Ruby講座

Fiber使用法の例

順列の生成方法 > [1,2,3,4].permutation => #<Enumerator: [1, 2, 3, 4]:permutation> > [*1..10].permutation.to_a なかなか返ってこない〜

Page 58: メイカーRuby講習会2013

Ruby講座

順列生成をFiberにする f=->n{Fiber.new{ [*1..n].permutation.each{|x|Fiber.yield x}}} g=f[10] => #<Fiber:0x00000126282090> g.resume => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] g.resume => [1, 2, 3, 4, 5, 6, 7, 8, 10, 9] g=f[100] g.resume

Page 59: メイカーRuby講習会2013

Ruby講座

Rubyのクロージャで 窓関数をメモ化

p 2回目からは計算しない"

hamming=->{m={} ->i{m[i]||=(0.54-0.46*cos(2*PI*i/N-1))}} h=hamming[] h[1] eval('m',h.binding)

Page 60: メイカーRuby講習会2013

Ruby講座

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

Page 61: メイカーRuby講習会2013

Ruby講座

SynchroSitone~2.0 p 赤外線LEDぴかぴか追加バージョン

赤外線LED

Page 62: メイカーRuby講習会2013

Ruby講座

電源周波数が すっごくシンクロしている理由  

Page 63: メイカーRuby講習会2013

Ruby講座

苅田

松浦

新小倉

豊前

大分新大分

唐津

相浦

苓北

川内

玄海

川内

大平

福岡 北九州

長崎熊本

鹿児島

大分

日田

宮崎

久留米二日市

飯塚

(小丸川)

天山

九州電力の中央給電司令所が がんばって発電所を集中制御

Page 64: メイカーRuby講習会2013

Ruby講座

苅田

松浦

新小倉

豊前

大分新大分

唐津

相浦

苓北

川内

玄海

川内

大平

福岡 北九州

長崎熊本

鹿児島

大分

日田

宮崎

久留米二日市

飯塚

(小丸川)

天山

発送電分離と電力逆潮流

たいよう 

風力発電

太陽光発電

Page 65: メイカーRuby講習会2013

Ruby講座

電力事業者の 3つの主要サービス • 電力供給"

•  基本"

• 電力余力供給"•  停電しないという品質"

• 周波数調整力供給"

•  電源の品質、発電機の保護"

"

Page 66: メイカーRuby講習会2013

Ruby講座

周波数調整力の市場価値  

揚水ポンプをインバーター型にして""周波数調整力取引でポンプの電力料金を2~3%削減"

Page 67: メイカーRuby講習会2013

Ruby講座

九州中のエアコンの出力を 瞬時にシンクロさせる

1分以内に九州中の10万台程度のオフィスのエアコンが一斉に反応できれば電源周波数調整力として市場価値がうまれる"

エアコン 10万台規模

赤外線LED

ぴかぴか

Page 68: メイカーRuby講習会2013

Ruby講座

どこかで強風が吹いたら p 風力発電量が急増し、需給バランスが崩れる

Page 69: メイカーRuby講習会2013

Ruby講座

苅田

松浦

新小倉

豊前

大分新大分

唐津

相浦

苓北

川内

玄海

川内

大平

福岡 北九州

長崎熊本

鹿児島

大分

日田

宮崎

久留米二日市

飯塚

(小丸川)

天山

九州中のエアコンがに即座に反応

ブォー

ブォー

ブォー

ブォー

ブォー

ブォー

ブォー

ブォー

Page 70: メイカーRuby講習会2013

Ruby講座

需用者側の周波数調整 p スマートグリッド"p 家庭用のLithium-ion 蓄電池"p 電気自動車、スマート家電、スマートメータ""

Page 71: メイカーRuby講習会2013

Ruby講座

SynchroSitone~2.0 家庭用蓄電池と同等のことがずっと安価に"

 "

 電力事業者との契約で電気料金を減らせるかも""

ラズベリーパイ"(35ドル)"

赤外線LED" 7円

温度センサー"100円

Page 72: メイカーRuby講習会2013

Ruby講座

エアコン消費電力の変化

エアコン1(12年前購入)電源ON9時5分

エアコン1電源OFF9時15分

エアコン2(7年前購入)電源ON9時20分

エアコン2(7年前購入)電源OFF9時42分

電源OFFすれば,消費電力1分以内に最低300W減少する 10万台なら,3万KW

Page 73: メイカーRuby講習会2013

Ruby講座

わかったこと Makersのmrubyはあり!

Page 74: メイカーRuby講習会2013

Ruby講座

これからmrubyを使ってみたいもの p ロボット・メイカーにもなるぞ