Contenu connexe
Similaire à メイカーRuby講習会2013
Similaire à メイカーRuby講習会2013 (9)
Plus de Kindai University
Plus de Kindai University (20)
メイカーRuby講習会2013
- 1. Ruby講座
メイカーを目指す人のための
mruby
にむけた試み
事例(ソーシャル電力需給センサーネットワーク)
CACAnet Fukuoka/近畿大学
山崎重一郎
- 2. Ruby講座
mrubyで
ゴールドラッシュに
参加しよう!
- 4. Ruby講座
人件費競争フリーな製造業
p 中国製はなぜ安いの?(理由:人件費が安いから)
p レーザカッター+CADデータの製造業
• レーザーカッターの価格は中国でも日本でも同じ
• IKEAは原材料に最適化した国で製造
- 5. Ruby講座
じゃあ、自分も
IKEAになれるんじゃない?
p レーザカッターがどんどん安くなっている
p デザイン=CADデータが勝負!
- 6. Ruby講座
ひょっとして、IKEAより
上いけるんじゃない?
p 大量生産しなくてもメーカになれる
• 顧客の家のスペースに最適化した家具
p ネットの人々の力を利用できる
• 世界一のデザインを採用(世界一の階段とか)
- 8. Ruby講座
サプライチェーンの個人利用
p もとは日本の自動車メーカが作ったシステム
• ジャストインタイム方式
p 「個人メーカー」も利用可能
• ネット仕入れのアリババとか
- 9. Ruby講座
サプライチェーンの個人利用
p もとは日本の自動車産業が作ったシステム
• ジャストインタイム方式
p 個人もネット経由で利用可能になった
• ネット仕入れのアリババとか
- 10. Ruby講座
クラウドファウンディング
p ネットで資金調達
• 銀行 (利息が必要)
• ベンチャーキャピタル (上場しろって言われる)
• キックスターター ○
• 開発中の製品の「予約」=「投資」
• 最低調達目標金額を設定 + 募集期間は30日
• 目標額が集まらなければ、予約はなしになる
• 集まれば、カードから引落されて開発資金になる
- 15. Ruby講座
ビットからアトムへ
p いまやソフトを商品にするのは難しい
• スマフォアプリで一攫千金?
p ものにすれば、値段を付けて売りやすい
• 「∼装置」と言い張ればいい
- 16. Ruby講座
予約=投資
p ゲームみたいに沢山小さな失敗ができる
• 期限内に目標額が集まらなければなしになる
p 予約=市場調査
• 資金が集まれば、売れることはわかっている
p コメントで客のニーズが直接わかる
• 製品化までにどんどん改良できる
- 17. Ruby講座
自分で製造しないメーカー
クワーキィ社が製品化、製造、販売を受け持つ
企画やアイデアを投稿した人に売り上げから還元
試作は3Dプリンタ
予約が目標まで集まったら製品化はキックスタータと同じ
デザイン
キャッチフレーズ
商品企画
値付け
- 20. Ruby講座
で、本題
p mruby(組み込み用軽量Ruby)
+
p メーカーズムーブメントの文脈
- 21. Ruby講座
mruby
p 軽量Ruby
• コンパクト、高速、モジュラリティがすごく高い
• コア以外のクラスはmrbgem で組み込む
• mrbgemは、make で静的に組み込む仕組む仕組み
アプリ
http Regexp Socket mrbgem
mruby VM
- 22. Ruby講座
組み込みソフトとしての
mrubyの使い方
p C言語が適しているところはCで書く
p mrubyが便利なところ
• テキスト処理、Web接続とか
httpアクセス
リモコン
テキスト処理
- 23. Ruby講座
mrubyボード登場
p Enzi、EAPL-Trainer
p arduinoピン互換(シールドが使える)
- 24. Ruby講座
enziの宣伝
p 福岡CSKさん
• 予約だと5980円!
• 4月に届く予定∼
p PDF
file://localhost/Users/yamasaki/
Desktop/enzi.pdf
- 28. Ruby講座
AC電源周波数
検知アンテナ
電源コンセントの周波数を測定できます。
50Hz 東日本
60Hz 西日本
- 29. Ruby講座
電力の需要と供給
需要が増えると 発電機のトルクが増える
おもいなあ
モーター
手回し発電機
電球
LED
- 30. Ruby講座
電力の需要と供給
需要が増えると 発電機のトルクが増える
mortar
電力需要
発電所
周波数変動で瞬時に需給関係がわかる!
- 32. Ruby講座
#!/usr/local/bin/ruby
Rubyで75行
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
}
- 33. Ruby講座
九州の主な電力網 新小倉
福岡
北九州 苅田
玄海 唐津 豊前
飯塚
松浦 大分
相浦
天山
二日市
久留米
日田
大分
新大分
熊本
長崎
大平
苓北
(小丸川)
川内 宮崎
川内
鹿児島
- 34. Ruby講座
実際に設置してみた
飯塚市大学支援補助金に感謝!
新小倉
福岡
北九州 苅田
福岡
玄海 唐津 豊前
飯塚
飯塚
松浦 大分
二日市 大分
相浦 日田
天山 久留米
新大分
唐津
長崎
熊本
大分
大平
苓北
(小丸川)
二日市
川内 宮崎 久留米
川内
鹿児島
長崎
- 36. Ruby講座
設置方法
p 山崎の自宅(福岡)の設置風景
- 38. Ruby講座
SynchroSitone
すっごくシンクロしとうね
- 39. Ruby講座
Rubyで実装した!
はっきり言ってむいていない"
"
"
- 40. Ruby講座
でもmrubyなら
ばっちり
Ruby1.9で実装して
開発途上にあるmrubyへフィード
バックするのが目的
こういう用途にはこの機能が欲しいとか
- 41. 0"
500"
1000"
1500"
2000"
2500"
3000"
3500"
4000"
4500"
1"
る
Ruby講座
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"
ノイズだらけだけど、60Hzあたりの成分も見え
系列1"
- 43. Ruby講座
時系列データを
周波数成分に分解する
25"
20"
15"
10"
5"
0"
1"
59.93
2"
59.94
3"
59.96
4"
59.97 59.98
5" 6"
59.99
7"
60.00
8"
60.01
9"
60.02
- 44. Ruby講座
Rubyなら
fft=->a{n=a.size"
FFTは2行
(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)}
- 46. Ruby講座
Rubyでできるの?
"
p 正確な時間間隔でサンプリング"
• 1/60秒=16.7ミリ秒、その倍の速度が必要"
• 5ミリ秒周期で正確にサンプリング"
p 収集途中でGCが入ってはだめ!"
p ずっと安定して動き続けないとだめ"
- 47. Ruby講座
正確な時間間隔で
サンプリング
p リアクタパターンを利用"
event machineで実装
シングルスレッド主義で
軽量イベント駆動
- 48. Ruby講座
rubygemsの
event machine
ユーザ定義のイベント
リアクタ
応答性がいい
プログラム
- 49. Ruby講座
rubygemsの
event machine
ユーザ定義のイベント
定期発生イベント
リアクタ
プログラム
- 50. Ruby講座
サンプリングの周期?
p 60Hzだと、
• 1周期は、16ミリ秒くらい
• 8ミリ秒で止まって見える
• 8ミリ秒よりちょっと長いと逆転
• 8ミリ秒より短いとOK
• で、5ミリ秒にします
- 51. Ruby講座
Eventmachineの使い方の基礎
require 'eventmachine'
EM.run {
EM.add_timer(5){
puts 'どーん'
EM.stop
}
}
- 52. Ruby講座
Eventmachineの使い方の基礎
require 'eventmachine'
EM.run {
EM.add_timer(5){
puts 'どーん'
EM.stop
}
EM.add_periodic_timer(1){puts('とん')}
}
- 53. 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('た')}
}
- 54. Ruby講座
5ミリ秒ごとに駆動されるプログラム
(実際は微調整が必要!)
require 'eventmachine'
EM.run {n=0
EM.add_periodic_timer(0.005){
(時刻を調べて補正)
サンプリング実行
n+=1
EM.stop if n==N
} }
- 55. Ruby講座
サンプリング中に
GCを入れない
p RubyのFiberでバッファ(ウィンドウ)
への書き込み処理をコルーチンにする"
p 継続で、配列オブジェクトを再利用"
- 56. 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
} }
- 57. Ruby講座
Fiber使用法の例
順列の生成方法
> [1,2,3,4].permutation
=> #<Enumerator: [1, 2, 3, 4]:permutation>
> [*1..10].permutation.to_a
なかなか返ってこない〜
- 58. 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
- 59. 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)
- 61. Ruby講座
SynchroSitone 2.0
p 赤外線LEDぴかぴか追加バージョン
赤外線LED
- 62. Ruby講座
電源周波数が
すっごくシンクロしている理由
- 63. Ruby講座
九州電力の中央給電司令所が
がんばって発電所を集中制御
新小倉
北九州 苅田
★
福岡
玄海 唐津 豊前
飯塚
松浦 大分
二日市 大分
相浦 日田
天山 久留米
新大分
熊本
長崎
大平
苓北
(小丸川)
川内 宮崎
川内
鹿児島
- 64. Ruby講座
発送電分離と電力逆潮流
新小倉
福岡
北九州 苅田
玄海 唐津 豊前
飯塚
松浦
たいよう 二日市
大分
大分
相浦 日田
天山 久留米
新大分
熊本
長崎
太陽光発電
大平
苓北
(小丸川)
風力発電
川内 宮崎
川内
鹿児島
- 65. Ruby講座
電力事業者の
3つの主要サービス
• 電力供給"
• 基本"
• 電力余力供給"
• 停電しないという品質"
• 周波数調整力供給"
• 電源の品質、発電機の保護"
- 67. Ruby講座
九州中のエアコンの出力を
瞬時にシンクロさせる
1分以内に九州中の10万台程度のオフィスのエアコンが
一斉に反応できれば電源周波数調整力として市場価値が
うまれる"
赤外線LED
ぴかぴか
エアコン
10万台規模
- 69. Ruby講座
九州中のエアコンがに即座に反応
新小倉
福岡
北九州 苅田
ブォー 玄海 唐津 ブォー
豊前
飯塚
松浦 大分
二日市 大分
相浦 日田
天山 久留米
新大分
ブォー 熊本
長崎 ブォー
大平
苓北
(小丸川)
ブォー
ブォー
川内 宮崎
川内
鹿児島
ブォー
ブォー
- 70. Ruby講座
需用者側の周波数調整
p スマートグリッド"
p 家庭用のLithium-ion 蓄電池"
p 電気自動車、スマート家電、スマートメータ"
"
- 71. Ruby講座
SynchroSitone 2.0
家庭用蓄電池と同等のことがずっと安価に"
"
電力事業者との契約で電気料金を減らせるかも"
"
+
赤外線LED" 温度センサー"
ラズベリーパイ" 7円 100円
(35ドル)"
- 72. Ruby講座
エアコン消費電力の変化
電源OFFすれば,消費電力1分以内に最低300W減少する
10万台なら,3万KW
エアコン1 エアコン1 エアコン2 エアコン2
(12年前購入) 電源OFF (7年前購入) (7年前購入)
電源ON 9時15分 電源ON 電源OFF
9時5分 9時20分 9時42分
- 73. Ruby講座
わかったこと
Makersのmrubyはあり!