Your SlideShare is downloading. ×
0
あいさつ
自己紹介!   Twitter @nobonobo   メカトロソフト屋   PythonMatrixJp 運営の Pythonista   ” あ”のつく会社の大阪オフィスで働いている。   最近ホームページが出来ました!    h...
Python を始めたきっかけ   8年前ロボットミドルウェア開発に携わった。   CORBA が使えるスクリプトが必要だった。   チャートからロボット動作の台本を作るツール。   → 近未来家庭のセットでロボットのお芝居を
そのときの成果物は・・・   いろいろ発展して使われているみたいです。
Python でフィジカルコンピューティング ハードに挑戦してみませんか?
なぜ今ハードなのか?   最近ハードとソフトの融合が熱い!   光ったり動いたり音出たりって単純に楽しい!   新しいコミュニケーションの形が生まれるかも?
マルチタッチの躍進   直感的な意志を機器に伝えられることができるよう    になった!   GPS やコンパス、    加速度計を組合せて       セカイカメラ       TriSat
Kinnect の可能性   すでに多くの応用ハックが!   人の人数、顔や骨の姿勢まで推定できる!   応用範囲が広すぎる!
いまこそハード&ソフトだ!   どちらか一方では成熟してきていて、    なかなか地味な変化しか生まれない。   新しいなにかを求めるならハードとソフトの融合を。   ソフト屋さんはハードを学ぼう!   ハード屋さんはソフトを学ぼう!
Python でハードに絡む   やり方は以下の3通りa)ハード自体は専用言語で開発。 PC とハードをつ ないで、 PC 上の Python から制御!b)マイコン上で Python を動かす!c)Python 記述をからハードそのものを作る!
PC にハードをつなぐ   例えば・・・
Python モジュールの充実ぶりは異常   PySerial   PyParallel   PyVISA ( GPIB )   PyUSB   PyBluez ( Bluetooth )   python-wifi ( WiFi ...
ぜひやってみてください   楽しいですよ〜
b) 案について   専用言語で開発したくない!   マイコンソフト開発に Python 使えないの?   Python で書きたいでござる!   Python のノウハウを生かしたいでござる!
そこで python-on-a-chip ですよ   特徴       Python バイトコードが走る VM       マイコン向けに省メモリデザイン       ガベージコレクタ搭載       ROM64KB 、 RAM8KB...
従来のマイコン開発   組み込みの世界はプロプライエタリツールだらけ   コンパイル、リンク、バイナリ作成、ダウンロード   手順が複雑で初心者泣かせ。   マイコンごとに機能の違いや記述スタイルに差   アプリのダイナミックロードは...
今回のやり方だとなにがいいの?   Python でアプリを組める!   バイトコードだけ入れ替えてアプリを更新できる   メモリ管理しなくていい   エラー処理がある   VM ならではの機能が使える
サポート機能   boolean   Integer / [float] / tuple / list / dict   function / module / class   generator / decorator   thre...
残念ながらまだない   Python コードコンパイラ   足回りのモジュール   初心者向けの環境
Python-on-a-chip の勘所   実装コードの書き方   バイトコード生成   ユーザコードの配置戦略   VM ポーティングのポイント   実際のアプリコード紹介
実装コードの書き方   書き方は3種類       C 記述で機能実装       Pure-python で機能実装       Python 記述内に埋め込み C 記述
バイトコードの生成   pyImgCreator.py というユーティリティを使う                                       ByteCode    Python 記述     Python 記述      ...
ユーザーコードの配置   ユーザコードをどの段階で VM に渡すか?                        ユーザコードから     ByteCode                                      C ラン...
VM ポーティングのポイント   6つのハンドラを実装するだけ       plat_init()   初期化や準備       plat_memGetByte()   バイトコード取得       plat_getByte()    ...
実際のアプリコード      メモリの読み書き APIdef mem_read(addr):                                       def mem_write(addr, value):  """__NA...
実際のアプリコード   ColorLED クラス    class ColorLed(object):       def __init__(self):           レジスタ初期設定       def set(self, r,g,...
PWM による電力制御   パルス幅で電力出力を可変させる手法。   最近のマイコンはたいがいこの機能を持っている。
のこぎり波ジェネレータ   Python の記述でそのまんま     def gen(start):       phase = start       while 1:          phase += 1          phase ...
動作デモ   R と G と B でノコギリ波の初期値を 1/3 づつずらし    てジェネレータを初期化。   あとは延々と RGB を出力してる。    def main():      cled = ColorLed()      r...
できたらいいなぁ   バイトコード生成が Python で出来ちゃうので。   AppEngine 上に開発環境構築できないか?   あとは足回りをしっかり揃えることで面白くなる。
python-on-a-chip まとめ   組み込みノウハウに詳しい人とそうでない人が分    業するのに使える。   苦労する部分を解決してしまえば、マイコン応用ア    プリがガンガン量産できる。   OS に頼らなくてもマルチタス...
質問
余談1:最近のハードウェア事情●   プログラマブルなハードデバイス●   さらっと紹介
FPGA/PLD●   コンフィグメモリを持ち●    その内容により動作ロジックをカスタマイズ可能●    ソフトの柔軟性を兼ね備えたハード
ASIC●   一般に売られる「役割の決まった半導体」の製法●    消費電力が少ない●    作ってもらうのに大金と期間が必要●   FPGA で試作して ASIC で量産という流れが多い
研究・試作分野での FPGA●   初期費用が少なくて済む●    画像処理やリアルタイム処理など●    10 GbE や100 GbE のファイヤーウォール●   ナノ秒オーダーでのスケジューリングが動く
方式の比較            変更の容易さ   消費電力ソフトウェア( DSP など)     ◎      高い FPGA/PLD     ○      程々   ASIC       ×      低い
リアルの課題●   現実の状況をより正確に把握するのは難しい!●    人、車の動きを捉えること。●    それもより現実的なスピードで!●   (人が通り過ぎたあとで人が通った事を知れても    役に立たない)
c) 案について   もっとハードならではという事が色々できないの?   リアルタイムに大量のデータを処理するとかできん    の?   ハードは並列処理が得意なんだからそれを生かせ    ないの?
そこで MyHDL ですよ!   特徴       Python2HDL トランスレータ       ジェネレータを使った並列ロジック設計及びシミュレー        ション       波形データの出力機能       他のオープン...
要するに   Python で FPGA/PLD の開発ができるよ!   予算があれば ASIC も!   というプロジェクトです。
MyHDL による FPGA 開発手順   Python コードによる機能モデル作成   動確用シミュレーションモデル作成   シミュレーション結果の検証   HDL へのトランスレート   論理合成
余談2:ハード屋の常識●   モックモデルの重視●    ユニットテストの重視●    DbC ( DesignByContract )的な考えを重視●   つまり、実装コードよりもテストコードやモックコー    ドや制約ルールの方をたくさん書...
ソフト業界で重視の間違いじゃね?●   手戻りが許されにくい風潮もあってハード屋さんの    方が先にすんなり受け入れられた。●   ソフト屋さんは手直しすればよかったこともあって    導入が遅れたのかも?
MyHDL の基本デコレータ   @always_comb    常に従う振る舞いを記述するのに使う    HDL に変換可能   @always    特定タイミングの振る舞いを記述するのに使う    HDL に変換可能   @inst...
実際のコード   Python コード     from myhdl import *     LED_NUM = 24     def driver(clock, sin, latch, led):       shift_latch = ...
実際のコード   トランスレート後 verilog コード       `timescale 1ns/10ps       module driver (clock, sin, latch, led);       input clock; ...
実際のコード   シミュレーション記述    from myhdl import *    Import logic1    def test_logic1():      clock = Signal(bool(False))      a...
テストの実行テストを実行する Python コードtb_fsm = traceSignals(test_logic1)sim = Simulation(tb_fsm)sim.run()これで、vcdファイルという波形ログが保存される。
テスト結果波形vcdファイルは gtkview というツールで見れる。
最後はベンダーツールで   HDL ( verilog や VHDL )にトランスレートしたら、       フィッティング       ポストフィットシミュレーション       ビットストリーム生成       コンフィギュレーシ...
実演   ドラム型 LED ディスプレイの動画紹介
参考情報   http://python.matrix.jp/modules/myhdl.html   http://opencores.org/ HDL のオープンソースサイ    ト   rpexzeros Python プロセッサを...
MyHDL まとめ   opencores にも MyHDL を使ったプロジェクトがち    らほら   MyHDL はベンダーロックインすることなくモデルを    みんなで共有できる。   シビアなスケジュールでの動きを Python ...
質問
まとめ全体   Python はハード屋の仕事に使えるモジュールがそ    ろっている。   ハードとソフトの融合から新しい世界が開ける。   ソフト屋のみなさんハードにチャレンジしよう!
おまけハードの事始めには是非弊社グループ企業運営のはんだづけカフェ にお越しください。
おしまいご静聴ありがとうございました
Upcoming SlideShare
Loading in...5
×

Python physicalcomputing

3,061

Published on

#pyconjp 2011/01

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,061
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Python physicalcomputing"

  1. 1. あいさつ
  2. 2. 自己紹介! Twitter @nobonobo メカトロソフト屋 PythonMatrixJp 運営の Pythonista ” あ”のつく会社の大阪オフィスで働いている。 最近ホームページが出来ました! http://osaka.accense.com/
  3. 3. Python を始めたきっかけ 8年前ロボットミドルウェア開発に携わった。 CORBA が使えるスクリプトが必要だった。 チャートからロボット動作の台本を作るツール。 → 近未来家庭のセットでロボットのお芝居を
  4. 4. そのときの成果物は・・・ いろいろ発展して使われているみたいです。
  5. 5. Python でフィジカルコンピューティング ハードに挑戦してみませんか?
  6. 6. なぜ今ハードなのか? 最近ハードとソフトの融合が熱い! 光ったり動いたり音出たりって単純に楽しい! 新しいコミュニケーションの形が生まれるかも?
  7. 7. マルチタッチの躍進 直感的な意志を機器に伝えられることができるよう になった! GPS やコンパス、 加速度計を組合せて  セカイカメラ  TriSat
  8. 8. Kinnect の可能性 すでに多くの応用ハックが! 人の人数、顔や骨の姿勢まで推定できる! 応用範囲が広すぎる!
  9. 9. いまこそハード&ソフトだ! どちらか一方では成熟してきていて、 なかなか地味な変化しか生まれない。 新しいなにかを求めるならハードとソフトの融合を。 ソフト屋さんはハードを学ぼう! ハード屋さんはソフトを学ぼう!
  10. 10. Python でハードに絡む やり方は以下の3通りa)ハード自体は専用言語で開発。 PC とハードをつ ないで、 PC 上の Python から制御!b)マイコン上で Python を動かす!c)Python 記述をからハードそのものを作る!
  11. 11. PC にハードをつなぐ 例えば・・・
  12. 12. Python モジュールの充実ぶりは異常 PySerial PyParallel PyVISA ( GPIB ) PyUSB PyBluez ( Bluetooth ) python-wifi ( WiFi ) pypcap ( Ether ) etc...
  13. 13. ぜひやってみてください 楽しいですよ〜
  14. 14. b) 案について 専用言語で開発したくない! マイコンソフト開発に Python 使えないの? Python で書きたいでござる! Python のノウハウを生かしたいでござる!
  15. 15. そこで python-on-a-chip ですよ 特徴  Python バイトコードが走る VM  マイコン向けに省メモリデザイン  ガベージコレクタ搭載  ROM64KB 、 RAM8KB あれば十分  すでに十数種のマイコンで動作実績あり  PyCon2009 の PyMite-LT で作者登壇  GPLv2
  16. 16. 従来のマイコン開発 組み込みの世界はプロプライエタリツールだらけ コンパイル、リンク、バイナリ作成、ダウンロード 手順が複雑で初心者泣かせ。 マイコンごとに機能の違いや記述スタイルに差 アプリのダイナミックロードは基本できない 常にリビルド&バイナリ作成&ダウンロードの手間
  17. 17. 今回のやり方だとなにがいいの? Python でアプリを組める! バイトコードだけ入れ替えてアプリを更新できる メモリ管理しなくていい エラー処理がある VM ならではの機能が使える
  18. 18. サポート機能 boolean Integer / [float] / tuple / list / dict function / module / class generator / decorator thread ( green-thread ) 対話型コンソール
  19. 19. 残念ながらまだない Python コードコンパイラ 足回りのモジュール 初心者向けの環境
  20. 20. Python-on-a-chip の勘所 実装コードの書き方 バイトコード生成 ユーザコードの配置戦略 VM ポーティングのポイント 実際のアプリコード紹介
  21. 21. 実装コードの書き方 書き方は3種類  C 記述で機能実装  Pure-python で機能実装  Python 記述内に埋め込み C 記述
  22. 22. バイトコードの生成 pyImgCreator.py というユーティリティを使う ByteCode Python 記述 Python 記述 Python 記述 py ImgCreator C ソース (埋め込まれた C コードがあれば) もし C ソースが生成されたら必ず VM と一緒にリン クする必要がある。
  23. 23. ユーザーコードの配置 ユーザコードをどの段階で VM に渡すか? ユーザコードから ByteCode C ランタイム 生成した C ソース ユーザの C ソース VM の C ソース ビルド&リンク バイナリ マイコン Flash ライター
  24. 24. VM ポーティングのポイント 6つのハンドラを実装するだけ  plat_init() 初期化や準備  plat_memGetByte() バイトコード取得  plat_getByte()  plat_putByte()  plat_getMsTicks() 起動後経過時間取得  plat_reportError() エラーハンドラ
  25. 25. 実際のアプリコード  メモリの読み書き APIdef mem_read(addr): def mem_write(addr, value): """__NATIVE__ """__NATIVE__ pPmObj_t offset; pPmObj_t offset; PmReturn_t retval = PM_RET_OK; pPmObj_t value; pPmObj_t result; PmReturn_t retval = PM_RET_OK; unsigned long *ptr; unsigned long *ptr; if (NATIVE_GET_NUM_ARGS() != 1) { if (NATIVE_GET_NUM_ARGS() != 2){ PM_RAISE(retval, PM_RET_EX_TYPE); PM_RAISE(retval, PM_RET_EX_TYPE); return retval;} return retval;} offset = NATIVE_GET_LOCAL(0); offset = NATIVE_GET_LOCAL(0); if (OBJ_GET_TYPE(offset) != OBJ_TYPE_INT) { if (OBJ_GET_TYPE(offset) != OBJ_TYPE_INT) { PM_RAISE(retval, PM_RET_EX_TYPE); PM_RAISE(retval, PM_RET_EX_TYPE); return retval;} return retval;} ptr = (unsigned long *)(((pPmInt_t)offset)->val); value = NATIVE_GET_LOCAL(1); retval = int_new(*ptr, &result); if (OBJ_GET_TYPE(value) != OBJ_TYPE_INT) { NATIVE_SET_TOS(result); PM_RAISE(retval, PM_RET_EX_TYPE); return retval; return retval;} """ ptr = (unsigned long *)(((pPmInt_t)offset)->val); pass *ptr = ((pPmInt_t)value)->val; return retval; """ pass
  26. 26. 実際のアプリコード ColorLED クラス class ColorLed(object): def __init__(self): レジスタ初期設定 def set(self, r,g,b): R,G,B 出力設定
  27. 27. PWM による電力制御 パルス幅で電力出力を可変させる手法。 最近のマイコンはたいがいこの機能を持っている。
  28. 28. のこぎり波ジェネレータ Python の記述でそのまんま def gen(start): phase = start while 1: phase += 1 phase &= 511 val = abs(phase-256) if val<0: val = 0 if val>255: val = 255 yield val
  29. 29. 動作デモ R と G と B でノコギリ波の初期値を 1/3 づつずらし てジェネレータを初期化。 あとは延々と RGB を出力してる。 def main(): cled = ColorLed() r = gen(0) g = gen(512/3) b = gen(512*2/3) while 1: cled.set(r.next(),g.next(),b.next()) sys.wait(1)
  30. 30. できたらいいなぁ バイトコード生成が Python で出来ちゃうので。 AppEngine 上に開発環境構築できないか? あとは足回りをしっかり揃えることで面白くなる。
  31. 31. python-on-a-chip まとめ 組み込みノウハウに詳しい人とそうでない人が分 業するのに使える。 苦労する部分を解決してしまえば、マイコン応用ア プリがガンガン量産できる。 OS に頼らなくてもマルチタスクが実現できる。
  32. 32. 質問
  33. 33. 余談1:最近のハードウェア事情● プログラマブルなハードデバイス● さらっと紹介
  34. 34. FPGA/PLD● コンフィグメモリを持ち● その内容により動作ロジックをカスタマイズ可能● ソフトの柔軟性を兼ね備えたハード
  35. 35. ASIC● 一般に売られる「役割の決まった半導体」の製法● 消費電力が少ない● 作ってもらうのに大金と期間が必要● FPGA で試作して ASIC で量産という流れが多い
  36. 36. 研究・試作分野での FPGA● 初期費用が少なくて済む● 画像処理やリアルタイム処理など● 10 GbE や100 GbE のファイヤーウォール● ナノ秒オーダーでのスケジューリングが動く
  37. 37. 方式の比較 変更の容易さ 消費電力ソフトウェア( DSP など) ◎ 高い FPGA/PLD ○ 程々 ASIC × 低い
  38. 38. リアルの課題● 現実の状況をより正確に把握するのは難しい!● 人、車の動きを捉えること。● それもより現実的なスピードで!● (人が通り過ぎたあとで人が通った事を知れても 役に立たない)
  39. 39. c) 案について もっとハードならではという事が色々できないの? リアルタイムに大量のデータを処理するとかできん の? ハードは並列処理が得意なんだからそれを生かせ ないの?
  40. 40. そこで MyHDL ですよ! 特徴  Python2HDL トランスレータ  ジェネレータを使った並列ロジック設計及びシミュレー ション  波形データの出力機能  他のオープンソースシミュレータとの連携  活発な開発  昨年末に0.7リリース  LGPL
  41. 41. 要するに Python で FPGA/PLD の開発ができるよ! 予算があれば ASIC も! というプロジェクトです。
  42. 42. MyHDL による FPGA 開発手順 Python コードによる機能モデル作成 動確用シミュレーションモデル作成 シミュレーション結果の検証 HDL へのトランスレート 論理合成
  43. 43. 余談2:ハード屋の常識● モックモデルの重視● ユニットテストの重視● DbC ( DesignByContract )的な考えを重視● つまり、実装コードよりもテストコードやモックコー ドや制約ルールの方をたくさん書く事になる
  44. 44. ソフト業界で重視の間違いじゃね?● 手戻りが許されにくい風潮もあってハード屋さんの 方が先にすんなり受け入れられた。● ソフト屋さんは手直しすればよかったこともあって 導入が遅れたのかも?
  45. 45. MyHDL の基本デコレータ @always_comb 常に従う振る舞いを記述するのに使う HDL に変換可能 @always 特定タイミングの振る舞いを記述するのに使う HDL に変換可能 @instance シミュレーション用シナリオを記述するのに使う HDL には変換できない
  46. 46. 実際のコード Python コード from myhdl import * LED_NUM = 24 def driver(clock, sin, latch, led): shift_latch = Signal(intbv(0)[LED_NUM*3:]) output_latch = Signal(intbv(0)[LED_NUM*3:]) @always_comb def combination(): led.next = output_latch @always(clock.posedge) def main_proc(): shift_latch.next = concat(shift_latch[LED_NUM*3-1:0], sin) @always(latch.posedge) def latch_proc(): output_latch.next = shift_latch return instances()
  47. 47. 実際のコード トランスレート後 verilog コード `timescale 1ns/10ps module driver (clock, sin, latch, led); input clock; input sin; input latch; output [71:0] led; wire [71:0] led; reg [71:0] shift_latch; reg [71:0] output_latch; assign led = output_latch; always @(posedge latch) begin: DRIVER_LATCH_PROC output_latch <= shift_latch; end always @(posedge clock) begin: DRIVER_MAIN_PROC shift_latch <= {shift_latch[((24 * 3) - 1)-1:0], sin}; end endmodule
  48. 48. 実際のコード シミュレーション記述 from myhdl import * Import logic1 def test_logic1(): clock = Signal(bool(False)) a = Signal(bool(False)) b = Signal(bool(False)) y = Signal(bool(False)) log1 = logic1.Logic1(clock, a, b, y) @always(delay(50)) def clock_gen(): clock.next = not clock @instance def sequence1(): a.next = 1 b.next = 0 yeild clock.posedge return instances()
  49. 49. テストの実行テストを実行する Python コードtb_fsm = traceSignals(test_logic1)sim = Simulation(tb_fsm)sim.run()これで、vcdファイルという波形ログが保存される。
  50. 50. テスト結果波形vcdファイルは gtkview というツールで見れる。
  51. 51. 最後はベンダーツールで HDL ( verilog や VHDL )にトランスレートしたら、  フィッティング  ポストフィットシミュレーション  ビットストリーム生成  コンフィギュレーションメモリの更新 という流れは FPGA ベンダツールで
  52. 52. 実演 ドラム型 LED ディスプレイの動画紹介
  53. 53. 参考情報 http://python.matrix.jp/modules/myhdl.html http://opencores.org/ HDL のオープンソースサイ ト rpexzeros Python プロセッサを作ろうとしていた。 (無茶しやがって・・・。) myhdl-doc-jp ドキュメント翻訳プロジェクト
  54. 54. MyHDL まとめ opencores にも MyHDL を使ったプロジェクトがち らほら MyHDL はベンダーロックインすることなくモデルを みんなで共有できる。 シビアなスケジュールでの動きを Python の記述で 実現できる。(ナノ秒単位)
  55. 55. 質問
  56. 56. まとめ全体 Python はハード屋の仕事に使えるモジュールがそ ろっている。 ハードとソフトの融合から新しい世界が開ける。 ソフト屋のみなさんハードにチャレンジしよう!
  57. 57. おまけハードの事始めには是非弊社グループ企業運営のはんだづけカフェ にお越しください。
  58. 58. おしまいご静聴ありがとうございました
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×