Economics of Apps - University of Oxford, 15 Oct 2010Volker Hirsch
The slides to my talk given at ForumOxford's Future of Technologies conference on 15 October 2010 at the University of Oxford. And, yes, the imagery is there in full glory... :)
IMAX3: Amazing Dataflow-Centric CGRA and its Applications
I present this slide to all hungry engineers who are tired of CPU, GPU, FPGA, tensor core, AI core, who want some challenging one with no black box inside, and who want to improve by themselves.
Economics of Apps - University of Oxford, 15 Oct 2010Volker Hirsch
The slides to my talk given at ForumOxford's Future of Technologies conference on 15 October 2010 at the University of Oxford. And, yes, the imagery is there in full glory... :)
IMAX3: Amazing Dataflow-Centric CGRA and its Applications
I present this slide to all hungry engineers who are tired of CPU, GPU, FPGA, tensor core, AI core, who want some challenging one with no black box inside, and who want to improve by themselves.
6. LIBLO AVRをこのように立ててブレッドボードに差し込みました。スケッチを書き込むときは一旦ブレッド
ボードから外して書き込み、チェックなどを行ってください。
白の線はArduino のD6に、ArduinoのRXとRaspberry PiのTXを接続します。
<<プログラム>>
まず、Arduino のスケッチを作ります。
https://github.com/adafruit/Adafruit_NeoPixel#adafruit-neopixel-library
より、NeoPixelのライブラリをダウンロードし、インストールをします。「Download ZIP」ボタンからダウンロ
ード、解凍して出てきた’Adafruit_NeoPixel-master’フォルダを ‘Adafruit_NeoPixel’ という名前に変更し、
ライブラリフォルダにコピーします(ライブラリインストール方法は巻末を参照してください)。
その後、以下のスケッチをArduino/互換機に書き込みます。
# i n c l u d e < A d a f r u i t _ N e o P i x e l . h >
# d e f i n e P I N 6
/ / P a r a m e t e r 1 = n u m b e r o f p i x e l s i n s t r i p
/ / P a r a m e t e r 2 = A r d u i n o p i n n u m b e r ( m o s t a r e v a l i d )
/ / P a r a m e t e r 3 = p i x e l t y p e f l a g s , a d d t o g e t h e r a s n e e d e d :
7. / / N E O _ K H Z 8 0 0 8 0 0 K H z b i t s t r e a m ( m o s t N e o P i x e l p r o d u c t s w / W S 2 8 1 2 L E D s )
/ / N E O _ K H Z 4 0 0 4 0 0 K H z ( c l a s s i c ' v 1 ' ( n o t v 2 ) F L O R A p i x e l s , W S 2 8 1 1 d r i v e r
s )
/ / N E O _ G R B P i x e l s a r e w i r e d f o r G R B b i t s t r e a m ( m o s t N e o P i x e l p r o d u c t s
)
/ / N E O _ R G B P i x e l s a r e w i r e d f o r R G B b i t s t r e a m ( v 1 F L O R A p i x e l s , n o t v
2 )
A d a f r u i t _ N e o P i x e l s t r i p = A d a f r u i t _ N e o P i x e l ( 6 0 , P I N , N E O _ G R B + N E O _ K H Z 8 0 0 ) ;
/ / I M P O R T A N T : T o r e d u c e N e o P i x e l b u r n o u t r i s k , a d d 1 0 0 0 u F c a p a c i t o r a c r o s s
/ / p i x e l p o w e r l e a d s , a d d 3 0 0 - 5 0 0 O h m r e s i s t o r o n f i r s t p i x e l ' s d a t a i n p u
t
/ / a n d m i n i m i z e d i s t a n c e b e t w e e n A r d u i n o a n d f i r s t p i x e l . A v o i d c o n n e c t i n g
/ / o n a l i v e c i r c u i t . . . i f y o u m u s t , c o n n e c t G N D f i r s t .
# d e f i n e M A X P I X E L 6 0
i n t s t r i p R [ M A X P I X E L ] ;
i n t s t r i p G [ M A X P I X E L ] ;
i n t s t r i p B [ M A X P I X E L ] ;
u i n t 3 2 _ t c o l ;
S t r i n g s = " " ;
v o i d s e t u p ( ) {
i n t i ;
f o r ( i = 0 ; i < M A X P I X E L ; i + + ) {
s t r i p R [ i ] = 0 ;
s t r i p G [ i ] = 0 ;
s t r i p B [ i ] = 0 ;
}
s t r i p . b e g i n ( ) ;
s t r i p . s h o w ( ) ;
S e r i a l . b e g i n ( 9 6 0 0 ) ;
S e r i a l . p r i n t l n ( " R e a d y " ) ;
}
v o i d l o o p ( ) {
c h a r c ;
i n t i = 0 ;
i n t v a l u e ;
s = " " ;
8. w h i l e ( i < 2 5 6 ) {
i f ( S e r i a l . a v a i l a b l e ( ) > 0 ) {
c = S e r i a l . r e a d ( ) ;
i f ( 1 0 = = c ) {
b r e a k ;
}
s + = c h a r ( c ) ;
}
}
i f ( ' R ' = = s . c h a r A t ( 0 ) ) {
S e r i a l . p r i n t l n ( " R " ) ;
v a l u e = s . s u b s t r i n g ( 1 ) . t o I n t ( ) ;
S e r i a l . p r i n t l n ( v a l u e ) ;
i n t w r i t e V a l u e = 0 ;
f o r ( i = M A X P I X E L - 1 ; i > = 0 ; i - - ) {
i f ( i = = v a l u e ) {
w r i t e V a l u e = 2 0 0 ;
}
s t r i p R [ i ] = w r i t e V a l u e ;
}
}
i f ( ' G ' = = s . c h a r A t ( 0 ) ) {
S e r i a l . p r i n t l n ( " G " ) ;
v a l u e = s . s u b s t r i n g ( 1 ) . t o I n t ( ) ;
S e r i a l . p r i n t l n ( v a l u e ) ;
i n t w r i t e V a l u e = 0 ;
f o r ( i = M A X P I X E L - 1 ; i > = 0 ; i - - ) {
i f ( i = = v a l u e ) {
w r i t e V a l u e = 2 0 0 ;
}
s t r i p G [ i ] = w r i t e V a l u e ;
}
}
i f ( ' B ' = = s . c h a r A t ( 0 ) ) {
S e r i a l . p r i n t l n ( " B " ) ;
v a l u e = s . s u b s t r i n g ( 1 ) . t o I n t ( ) ;
S e r i a l . p r i n t l n ( v a l u e ) ;
i n t w r i t e V a l u e = 0 ;
f o r ( i = M A X P I X E L - 1 ; i > = 0 ; i - - ) {
i f ( i = = v a l u e ) {
9. w r i t e V a l u e = 2 0 0 ;
}
s t r i p B [ i ] = w r i t e V a l u e ;
}
}
N e o P i x e l B a r ( ) ;
}
v o i d N e o P i x e l B a r ( ) {
i n t i ;
f o r ( i = 0 ; i < M A X P I X E L ; i + + ) {
c o l = s t r i p . C o l o r ( s t r i p R [ i ] , s t r i p G [ i ] , s t r i p B [ i ] ) ;
s t r i p . s e t P i x e l C o l o r ( i , c o l ) ;
}
s t r i p . s h o w ( ) ;
}
これを実行して、Arduino IDEから「ツール」-「シリアルモニタ」で、LFのみ、9600 baud を選択します。上の
窓にR10と打って「送信」とするとLEDが赤色に10個分光ればスケッチの動作確認はOKです。
さて、ここまでうまく動いたら、Raspberry Pi からコントロールしてみましょう。
第4章で使用した、sendserial.pyを使い、以下のように操作します。
sudo python3 sendserial.py R4 (4個のLEDの赤成分を光らせる)
sudo python3 sendserial.py G7 (7個のLEDの緑成分を光らせる)
sudo python3 sendserial.py B15 (15個のLEDの青成分を光らせる)
17. においセンサ用Arduinoスケッチ
c o n s t i n t a n a l o g I n P i n = A 0 ;
i n t s e n s o r V a l u e = 0 ;
i n t o u t p u t V a l u e = 0 ;
i n t i ;
v o i d s e t u p ( ) {
S e r i a l . b e g i n ( 9 6 0 0 ) ;
p i n M o d e ( 2 , O U T P U T ) ;
p i n M o d e ( 3 , O U T P U T ) ;
d i g i t a l W r i t e ( 2 , L O W ) ;
}
v o i d l o o p ( ) {
f o r ( i = 1 ; i < 4 ; i + + ) {
d e l a y ( 2 3 8 ) ;
d i g i t a l W r i t e ( 3 , H I G H ) ;
d e l a y ( 3 ) ;
18. s e n s o r V a l u e = a n a l o g R e a d ( a n a l o g I n P i n ) ;
d e l a y ( 2 ) ;
d i g i t a l W r i t e ( 3 , L O W ) ;
d i g i t a l W r i t e ( 2 , H I G H ) ;
d e l a y ( 8 ) ;
d i g i t a l W r i t e ( 2 , L O W ) ;
}
S e r i a l . p r i n t ( " s e n s o r = " ) ;
S e r i a l . p r i n t ( s e n s o r V a l u e ) ;
S e r i a l . p r i n t l n ( ) ;
a n a l o g W r i t e ( 5 , s e n s o r V a l u e / 6 ) ;
d e l a y ( 2 ) ;
}
これを実行し、Raspberry Piには先のMCP3008のチャンネル4に接続します。アルコールや、ニンニクの匂
いなどに反応しますので試してみてください。
LEDテープを使ってセンサを可視化する
今までの、センサとLEDテープを組み合わせて、センサの値をLEDテープで表示するようにしてみました。
LEDテープのRGBの3チャンネルの値を使いますので、今回はセンサーを音、タッチセンサ、光センサの3
つを接続してみました。先の作例の配線を同時にすると、このようになります。
19. プログラムを、trisense.pyとして作成します。
# ! / u s r / b i n / e n v p y t h o n 3
i m p o r t w i r i n g p i 2 a s w
i m p o r t t i m e
i m p o r t s e r i a l
w . w i r i n g P i S P I S e t u p ( 0 , 1 0 0 0 0 0 0 )
d e f M C P 3 0 0 8 ( c h a n n e l ) :
r e g i s t e r = 0 x 8 0
b u f f = ( 1 < < 1 6 ) + ( r e g i s t e r < < 8 ) + ( c h a n n e l < < 1 2 )
b u f f = b u f f . t o _ b y t e s ( 3 , b y t e o r d e r = ' b i g ' )
w . w i r i n g P i S P I D a t a R W ( 0 , b u f f )
r e t u r n ( ( ( b u f f [ 1 ] & 3 ) * 2 5 6 ) + b u f f [ 2 ] )
d e f s e n d s e r i a l ( s ) :
b = l i s t ( s )
f o r x i n b :
s e r . w r i t e ( x . e n c o d e ( " u t f - 8 " ) )
s e r . w r i t e ( b ' x 0 a ' )
20. c h a n n e l = 0
s e r = s e r i a l . S e r i a l ( ' / d e v / t t y A M A 0 ' , 9 6 0 0 )
w h i l e 1 :
p r i n t ( )
t i m e . s l e e p ( 0 . 1 )
d a t a = M C P 3 0 0 8 ( 0 )
p r i n t ( " R : " , d a t a , " " , e n d = " " )
s e n d s e r i a l ( " R " + s t r ( d a t a ) )
d a t a = M C P 3 0 0 8 ( 1 ) / / 1 0
p r i n t ( " G : " , d a t a , " " , e n d = " " )
s e n d s e r i a l ( " G " + s t r ( d a t a ) )
d a t a = M C P 3 0 0 8 ( 2 ) / / 2 0 - 2 0
p r i n t ( " B : " , d a t a , " " , e n d = " " )
s e n d s e r i a l ( " B " + s t r ( d a t a ) )
センサの値にょって、data の割る数などは調整してください。