the magpi issue 14 en
TRANSCRIPT
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 1/36
IISSSSUUEE 1144 -- JJUULL 22001133
A A
M M
a a g g a a z z i i n n e e f f o o r r R R a a s s p p b b e e r r r r y y P P i i U U s s e e r r s s
hh tt tt pp :: / / / / ww ww ww .. tt hh ee mm aa gg pp ii .. cc oo mmRRaassppbbeerrrryy PPii iiss aa ttrraaddeemmaarrk k ooff TThhee RRaassppbbeerrrryy PPii FFoouunnddaattiioonn..TThhiiss mmaaggaazziinnee wwaass ccrreeaatteedd uussiinngg aa RRaassppbbeerrrryy PPii ccoommppuutteerr..
GGeett pprriinntteedd ccooppiieess
aatt tthheemmaaggppii..ccoomm
II / / OO aanndd llooggiicc eexxppaannssiioonn
RRoobboottiicc aarrmm ccoonnttrrooll
PPaarraalllleell pprroocceessssiinngg
BBoooottccaammpp rreeppoorrtt
LLEEDD mmaattrriixxCChhaarrmm
JJAAVVAA
TThhee ccaammeerraa
mmoodduullee
Win a 512MB
Raspberry Pi
& interfacing
goodies
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 2/36
A s h S t o n e - C h i e f E d i t o r / A d m i n i s t r a t i o n / P r o o f R e a d i n g
W . H . B e l l - I s s u e E d i t o r / L a y o u t / G r a p h i c s / A d m i n i s t r a t i o n
B r y a n B u t l e r - P a g e D e s i g n / G r a p h i c s
I a n M c A l p i n e - L a y o u t / T e s t e r / P r o o f R e a d i n g
C h r i s ' t z j ' S t a g g - T e s t e r
C o l i n D e a d y - L a y o u t / P r o o f R e a d i n g
M a t t J u d g e - W e b s i t e / A d m i n i s t r a t i o n
A a r o n S h a w - L a y o u t
S h e l t o n C a r u t h e r s - P r o o f R e a d i n g
T h e M a g P i T e a m
M e l t w a t e r - P r o o f R e a d i n g
S a i Y a m a n o o r - T e s t e r
J a m e s N e l s o n - P r o o f R e a d i n g
A d r i a n H a r p e r - L a y o u t
P a u l C a r p e n t e r - T e s t e r
D a v e A l l a n - T e s t e r
C l a i r e P r i c e - P r o o f R e a d i n g
P h i l T e s s e y m a n - T e s t e r
S t e v e D r e w - L a y o u t
14
W e l c o m e t o t h e 1 4 t h i s s u e o f T h e M a g P i - a n o t h e r f u l l y l o a d e d g u i d e t o a l l t h i n g s R a s p b e r r y P i !
T h i s m o n t h w e b e g i n o u r j o u r n e y i n i n t r o d u c i n g t h e n e w e s t m o d u l e i n t h e R a s p b e r r y P i w o r l d , t h e
c a m e r a , w i t h a g r e a t g u i d e w r i t t e n b y J a m e s H u g h e s o n s e t u p a n d b a s i c o p e r a t i o n . T h e c o n c l u s i o n o f
t h i s a r t i c l e w i l l b e f o u n d i n n e x t m o n t h ' s e d i t i o n w h e r e J a m e s b u i l d s o n t h e s e f o u n d a t i o n s w i t h h i n t s a n d
t i p s o n a d v a n c e d u s a g e .
W e r e l o a d t h e M a t r i x w i t h p a r t t w o o f t h e i n t e r e s t i n g P i M a t r i x a r t i c l e , t a k e a l o o k a t t h e G u z u n t y b o a r d
a n d r e v i e w t h e e v e r p o p u l a r S o u t h W e s t R a s p b e r r y P i B o o t C a m p s .
W e b r i n g y o u m o r e o n t h e p r o g r a m m i n g l a n g u a g e s C h a r m , S c r a t c h a n d P y t h o n p l u s b r i n g y o u t h e f i r s t
M a g P i a r t i c l e o n t h e p o p u l a r l a n g u a g e , J a v a .
I a m p l e a s e d t o r e p o r t t h a t a l l p r e - o r d e r V o l u m e 1 M a g P i b u n d l e s o r d e r e d v i a K i c k s t a r t e r o r
t h e m a g p i . c o m h a v e n o w s h i p p e d . W e w i l l s o o n h a v e i n d i v i d u a l i s s u e s c o m i n g t o p r i n t . W e h o p e y o u
e n j o y t h e p r i n t e d e d i t i o n s a n d t h a n k y o u a g a i n f o r y o u r s u p p o r t a n d p a t i e n c e i n h e l p i n g m a k e t h e d r e a m
a r e a l i t y .
A s h S t o n e
C h i e f E d i t o r o f T h e M a g P i
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 3/36
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 4/36
D I F F I C U L T Y : B E G I N N E R
J a m e s H u g h e s
G u e s t W r i t e r
B A S I C O P E R A T I O N
G e t t i n g t o g r i p s w i t h t h e c a m e r a m o d u l e
T h e R a s p b e r r y P i c a m e r a - p a r t 1
A f e w w e e k s a g o , t h e R a s p b e r r y P i F o u n d a t i o n
l a u n c h e d t h e i r f i r s t p e r i p h e r a l , a 5 M P c a m e r a .
P r i c e d a t $ 2 5 , t h e s a m e p r i c e a s t h e m o d e l A , i t ’ s
a v e r y s m a l l P C B o n w h i c h i s a n O m n i v i s i o n
O V 5 6 4 7 c a m e r a m o d u l e . I t c o n n e c t s t o e i t h e r t h e
M o d e l A o r M o d e l B R a s p b e r r y P i u s i n g a 1 5 c m
1 5 w a y r i b b o n c o n n e c t o r .
O v e r t h e c o u r s e o f t h i s s e r i e s I w i l l t a k e y o u
t h r o u g h i n i t i a l c o n n e c t i o n o f t h e c a m e r a t o y o u r
R a s p b e r r y P i a n d w i l l s h o w y o u s o m e o f t h e
b a s i c c o m m a n d s u s e d t o t a k e b o t h s t i l l a n d v i d e o
i m a g e r y . A t t h e e n d , s o m e o f t h e m o r e
s o p h i s t i c a t e d f e a t u r e s w i l l a l s o b e e x p l a i n e d . N o t
e v e r y o p t i o n w i l l b e c o v e r e d ( n e w o p t i o n s a r e
b e i n g a d d e d a l l t h e t i m e s o i t ’ s d i f f i c u l t t o k e e p
u p ) b u t h o p e f u l l y t h i s a r t i c l e w i l l g i v e e n o u g h
i n f o r m a t i o n f o r y o u t o b e a b l e t o c o v e r m o s t
i m a g e t a k i n g t a s k s . F i r s t l y t h o u g h , a d e s c r i p t i o n
o f h o w t h e c a m e r a m o d u l e c a m e t o b e . . .
H i s t o r y
F r o m i t s f i r s t l a u n c h t h e R a s p b e r r y P i h a s h a d a
c o n n e c t o r o n i t t o a t t a c h a c a m e r a t o t h e G P U
( t h e V i d e o C o r e 4 G r a p h i c s P r o c e s s i n g U n i t o n
t h e R a s p b e r r y P i ) . T h i s c o n n e c t i o n u s e s t h e C S I -
2 e l e c t r i c a l p r o t o c o l a n d i s a s t a n d a r d u s e d i n
m o s t m o b i l e p h o n e s . I t i s a n e x t r e m e l y f a s t
c o n n e c t i o n , w h i c h o n t h e R a s p b e r r y P i i s
c a p a b l e o f s e n d i n g 1 0 8 0 p s i z e d i m a g e s
( 1 9 2 0 x 1 0 8 0 x 1 0 b p p ) a t 3 0 f r a m e s p e r s e c o n d ,
o r l o w e r r e s o l u t i o n a t e v e n h i g h e r f r a m e r a t e s . I t
h a d a l w a y s b e e n i n t e n d e d a t s o m e p o i n t t o
r e l e a s e a c a m e r a m o d u l e t h a t c o u l d u s e t h i s
c o n n e c t i o n , a s t h e a b i l i t y t o s t r e a m h i g h s p e e d
v i d e o d a t a t h r o u g h t h e G P U w i t h o u t a n y
i n t e r a c t i o n w i t h t h e A R M p r o c e s s o r w o u l d a l w a y s
m a k e t h e c a m e r a m u c h m o r e e f f i c i e n t t h a n a n y
U S B a t t a c h e d w e b c a m . I t w o u l d a l s o e n a b l e t h e
u s e o f t h e G P U ’ s a b i l i t y t o e n c o d e H 2 6 4 v i d e o ,
o r J P E G i m a g e s i n h a r d w a r e .
I t t u r n s o u t t h a t p r o d u c t i s i n g a t i n y P C B l i k e t h e
c a m e r a b o a r d i s n o t a q u i c k t a s k ! T h e p r o t o t y p e
w a s r e - d e s i g n e d t o r e m o v e s o m e u n n e c e s s a r y
c o m p o n e n t s , b u t m o r e i m p o r t a n t l y , t o m o v e t h e
c a m e r a c r y s t a l , u s e d f o r t i m i n g , t o t h e P C B i t s e l f .
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 5/365
E l e c t r o m a g n e t i c c o m p a t i b i l i t y ( E M C ) t e s t i n g h a d
s h o w n t h a t t h e 2 5 M h z c l o c k p r o v i d e d b y t h e
G P U c a u s e d t o o m u c h i n t e r f e r e n c e a s i t p a s s e d
u p t h e r i b b o n c a b l e t o t h e P C B . A d d i n g a c r y s t a l
t o t h e P C B i t s e l f s t o p p e d t h i s i n t e r f e r e n c e . A
c o u p l e m o r e b o a r d d e s i g n s l a t e r , t o h e l p w i t h
p r o d u c t i o n l i n e m a n u f a c t u r e a n d t e s t i n g , a n d
e v e n t u a l l y , a b o u t a y e a r a f t e r t h e f i r s t p r o t o t y p e s ,
t h e p r o d u c t i o n b o a r d w a s r e a d y .
M e a n w h i l e , w o r k h a d b e e n o n g o i n g t o w r i t e a
c o u p l e o f a p p l i c a t i o n s t o m a k e u s e o f t h e
c a m e r a , t o u p d a t e t h e G P U f i r m w a r e t o s u p p o r t
t h e c a m e r a , a n d t o i m p r o v e t h e c a m e r a t u n i n g a s
t h e b a s i c t u n i n g a l r e a d y i n p l a c e h a d a n u m b e r o f
o b v i o u s d e f e c t s .
C a m e r a t u n i n g i s a c o m p l e x t a s k , w h i c h h a s
b e e n c o v e r e d o n t h e R a s p b e r r y P i w e b s i t e , s o I
w o n ’ t r e p e a t i t h e r e . S u f f i c e i t t o s a y , t h e e n d
r e s u l t s a r e w e l l w o r t h t h e e x t r a e f f o r t p u t i n b y
D a v i d P l o w m a n w h i l e a t B r o a d c o m . T h a n k s
D a v i d .
S o , w i t h t h e h i s t o r y o u t o f t h e w a y , l e t ’ s t a k e a
l o o k a t g e t t i n g y o u r c a m e r a g o i n g .
S e t t i n g u p
F i r s t l y , i t ’ s i m p o r t a n t t o s t a r t w i t h a w a r n i n g .
C a m e r a s l i k e t h e s e a r e s t a t i c s e n s i t i v e . Y o u
s h o u l d e a r t h y o u r s e l f p r i o r t o h a n d l i n g t h e P C B ( a
s i n k t a p / f a u c e t o r s i m i l a r s h o u l d s u f f i c e i f y o u
d o n ’ t h a v e a n e a r t h i n g s t r a p ) .
T h e r e a r e o n l y t w o c o n n e c t i o n s t o m a k e , t h e
r i b b o n c a b l e n e e d s t o b e a t t a c h e d t o t h e c a m e r a
P C B a n d t h e R a s p b e r r y P i i t s e l f . Y o u n e e d t o g e t
i t t h e r i g h t w a y r o u n d o r t h e c a m e r a w i l l n o t w o r k .
O n t h e c a m e r a P C B , t h e b l u e b a c k i n g o n t h e
c a b l e s h o u l d b e a w a y f r o m t h e P C B , a n d o n t h e
R a s p b e r r y P i i t s h o u l d b e t o w a r d s t h e e t h e r n e t
c o n n e c t i o n ( o r w h e r e t h e e t h e r n e t c o n n e c t o r
w o u l d b e i f y o u a r e u s i n g a m o d e l A ) .
A l t h o u g h t h e c o n n e c t o r s o n t h e P C B a n d t h e P i
a r e d i f f e r e n t , t h e y w o r k i n a s i m i l a r w a y . O n t h e
R a s p b e r r y P i , y o u n e e d t o p u l l u p t h e t a b s o n
e a c h e n d o f t h e c o n n e c t o r .
I t s h o u l d s l i d e u p e a s i l y , a n d b e a b l e t o p i v o t
a r o u n d s l i g h t l y . F u l l y i n s e r t t h e r i b b o n c a b l e i n t o
t h e s l o t , e n s u r i n g i t i s s t r a i g h t , t h e n g e n t l y p r e s s
d o w n t h e t a b s t o c l i p i t i n t o p l a c e . T h e c a m e r a
P C B i t s e l f a l s o r e q u i r e s y o u t o p u l l t h e t a b s a w a y
f r o m t h e b o a r d , g e n t l y i n s e r t t h e c a b l e , t h e n p u s h
t h e t a b s b a c k .
T h e P C B c o n n e c t o r i s a l i t t l e m o r e a w k w a r d t h a n
t h e o n e o n t h e P i i t s e l f . T h e r e i s a v i d e o a t
h t t p : / / y o u t u . b e / G I m e V q H Q z s E w h i c h s h o w s t h e
c o n n e c t i o n s b e i n g m a d e .
S o , w e n o w h a v e t h e h a r d w a r e a l l a t t a c h e d , w e
n o w n e e d t o m a k e s u r e w e h a v e t h e c o r r e c t
s o f t w a r e i n s t a l l e d . A s e x p l a i n e d a b o v e , t h e r e a r e
s o m e c o m m a n d l i n e a p p s t o i n s t a l l , a n d a
f i r m w a r e u p g r a d e w i t h t h e c a m e r a d r i v e r a n d
t u n i n g t o i n s t a l l . T h i s p r o c e s s m a y n o t b e
n e c e s s a r y i n f u t u r e a s n e w e r d i s t r o ’ s a r e
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 6/36
r e l e a s e d w h i c h a l r e a d y c o n t a i n t h e r e q u i r e d f i l e s .
T o u p d a t e t h e f i r m w a r e , l i b r a r i e s a n d
a p p l i c a t i o n s , e x e c u t e t h e f o l l o w i n g i n s t r u c t i o n s
o n t h e c o m m a n d l i n e .
sudo apt-get updatesudo apt-get upgrade
N o w y o u n e e d t o e n a b l e c a m e r a s u p p o r t u s i n g
t h e r a s p i - c o n f i g p r o g r a m y o u w i l l h a v e u s e d
w h e n y o u f i r s t s e t u p y o u r R a s p b e r r y P i .
sudo raspi-config
U s e t h e c u r s o r k e y s t o m o v e t o t h e c a m e r a
o p t i o n a n d s e l e c t e n a b l e . W h e n y o u e x i t r a s p i -
c o n f i g i t w i l l a s k t o r e b o o t . T h e e n a b l e o p t i o n w i l l
e n s u r e t h a t o n r e b o o t t h e c o r r e c t G P U f i r m w a r e
w i l l b e r u n n i n g ( w i t h t h e c a m e r a d r i v e r a n d
t u n i n g ) , a n d t h e G P U m e m o r y s p l i t i s s u f f i c i e n t t o
a l l o w t h e c a m e r a t o a c q u i r e e n o u g h m e m o r y t o
r u n c o r r e c t l y . R u n n i n g a c a m e r a a n d a s s o c i a t e d
e n c o d e r d o e s t a k e u p a b i g c h u n k o f m e m o r y , a s
t h e i m a g e s a r e l a r g e , a n d t h e r e n e e d s t o b e a t
l e a s t t w o o f t h e m i n m e m o r y a t a n y t i m e i n o r d e r
t o p r o v i d e a d o u b l e ( i n s o m e c a s e s t r i p l e ) b u f f e r
w h i c h p r e v e n t s ' t e a r i n g ' o f i m a g e s d u r i n g d i s p l a y .
C h e c k i n g i t w o r k s
O K , w e h a v e c o n n e c t e d t h e h a r d w a r e , a n d
i n s t a l l e d t h e s o f t w a r e . N o w w e n e e d t o s e e i f i t i s
a l l w o r k i n g c o r r e c t l y ! T h e q u i c k e s t w a y i s j u s t t o
t y p e i n
raspistill -t 5000
T h i s r u n s t h e s t i l l s c a p t u r e p r o g r a m f o r 5
s e c o n d s ( o r 5 0 0 0 m i l l i s e c o n d s . N o t e t h a t a l l
t i m e s u s e d a r e i n m i l l i s e c o n d s ) . Y o u s h o u l d s e e
t h e w h o l e d i s p l a y r e p l a c e d w i t h a m o v i n g i m a g e
o f w h a t e v e r t h e c a m e r a i s l o o k i n g a t . I f y o u d o n ’ t
s e e t h e p r e v i e w a p p e a r , o r t h e r e a r e e r r o r
m e s s a g e s d i s p l a y e d , g o s t r a i g h t t o t h e
T r o u b l e s h o o t i n g s e c t i o n a t t h e e n d o f t h e a r t i c l e !
S o , w h a t c a n i t d o ?
A s w i t h a n y c a m e r a , i t c a n w o r k i n t w o w a y s . W e
c a n c a p t u r e s t i l l i m a g e s , j u s t l i k e a c a m e r a , o r w e
c a n c a p t u r e v i d e o , l i k e a c a m c o r d e r . T h e t w o
d e m o a p p l i c a t i o n s p r o v i d e d h a n d l e t h e s e t a s k s
s e p a r a t e l y . A l t h o u g h i t w o u l d b e q u i t e p o s s i b l e t o
c o m b i n e t h e m i n t o o n e a p p l i c a t i o n , t h a t m a k e s
t h e c o d e m o r e c o m p l i c a t e d , a n d a s d e m o c o d e a
l o t o f e f f o r t w a s p u t i n t o m a k e i t a s e a s y t o
u n d e r s t a n d a s p o s s i b l e . A s a n a s i d e , t h e C
l a n g u a g e s o u r c e c o d e f o r t h e a p p l i c a t i o n s i s
p u b l i c l y a v a i l a b l e f r o m t h e F o u n d a t i o n ' s g i t h u b
r e p o s i t o r y . A n y o n e i s w e l c o m e t o p l a y a r o u n d
w i t h i t a n d a l t e r i t f o r t h e i r p a r t i c u l a r p u r p o s e s .
T h e c o d e i s w e l l c o m m e n t e d a n d u s e s t h e
D o x y g e n c o m m e n t i n g s c h e m e s o y o u c a n
p r o d u c e H T M L d o c u m e n t a t i o n d i r e c t l y f r o m t h e
s o u r c e c o d e .
S o , o n t o t h e a p p s t h e m s e l v e s . T h e y a r e
c o m m a n d l i n e a p p l i c a t i o n s , a n d d o n o t n e e d t o
b e r u n f r o m a d e s k t o p e n v i r o n m e n t s i n c e t h e
p r e v i e w o u t p u t f r o m t h e a p p s i s s u p e r i m p o s e d
o v e r t h e t o p o f a n y d e s k t o p o r c o n s o l e b e i n g
u s e d . T y p i n g j u s t t h e n a m e o f t h e a p p l i c a t i o n , o r
a d d i n g - - h e l p o r - ? t o t h e c o m m a n d l i n e w i l l
p r o d u c e a l i s t o f a l l t h e a v a i l a b l e o p t i o n s . T h e l i s t
i s q u i t e l o n g , s o y o u m a y w a n t t o p i p e t h e o u t p u t
i n t o ‘ l e s s ’ s o y o u c a n s c r o l l u p a n d d o w n t o r e a d
i t .
raspistill | lessraspivid | less
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 7/367
B a s i c o p t i o n s
B o t h a p p l i c a t i o n s u s e t h e - t o p t i o n t o s p e c i f y t h e
l e n g t h o f t i m e i n m i l l i s e c o n d s t h e y s h o u l d
c o n t i n u e r u n n i n g .
S o “ r a s p i s t i l l - t 3 0 0 0 ” w i l l r u n t h e c a m e r a f o r 3
s e c o n d s .
I n t h e s t i l l s c a s e , a n d i f a f i l e n a m e i s s p e c i f i e d ,
t h e c a p t u r e o f t h e s t i l l w i l l t a k e p l a c e a t t h e e n d o f
t h e t i m e p e r i o d . I n t h e v i d e o c a s e , a n d a g a i n i f a
f i l e n a m e i s s p e c i f i e d , t h e c a p t u r e s t a r t s s t r a i g h t
a w a y a n d w i l l b e a s l o n g a s t h e t i m e p e r i o d .
T o s p e c i f y t h e f i l e n a m e o f t h e o u t p u t f i l e , y o u u s e
t h e - o o p t i o n . T h e f o l l o w i n g c o m m a n d r u n s t h e
c a m e r a f o r 2 s e c o n d s a n d a t t h e e n d o f t h e
p e r i o d w i l l t a k e a s t i l l i m a g e , s a v i n g i t t o t h e f i l e
i m a g e . j p g .
raspistill -o image.jpg -t 2000
T h i s c o m m a n d w i l l d o t h e s a m e b u t w i l l s a v e a 2
s e c o n d H 2 6 4 v i d e o f i l e c a l l e d v i d e o . h 2 6 4
raspivid -o video.h264 -t 2000
Y o u d o n ’ t n e e d t o s p e c i f y a f i l e n a m e f o r t h e
o u t p u t - i f y o u d o n ’ t t h e n n o c a p t u r e i s d o n e , b u t
t h e p r e v i e w w i l l s t i l l b e r u n f o r t h e s p e c i f i e d t i m e .
I f y o u d o n ’ t s p e c i f y a t i m e , t h e n 5 s e c o n d s i s
u s e d a s a d e f a u l t .
T h e f o l l o w i n g w i l l t a k e a p i c t u r e a f t e r 5 s e c o n d s .
raspistill -o image.jpg
S o w e h a v e m a d e s o m e f i l e s , b u t h o w d o w e s e e
w h a t t h e y l o o k l i k e ? W e l l , t o v i e w J P G i m a g e s ,
t h e F B I p r o g r a m i s q u i t e u s e f u l . Y o u c a n i n s t a l l i t
q u i c k l y u s i n g :
sudo apt-get install fbi
T h e n y o u c a n e a s i l y d i s p l a y y o u r J P G i m a g e s ,
z o o m i n a n d o u t ( u s e - a n d + ) e t c .
fbi image.jpg
T o v i e w v i d e o , y o u c a n u s e t h e a l r e a d y i n s t a l l e d
o m x p l a y e r .
omxplayer video.h264
P r e v i e w o p t i o n s
Y o u c a n s p e c i f y w h e t h e r y o u w a n t t h e p r e v i e w
d i s a b l e d ( - n ) , o r w h e t h e r i t i s t o a p p e a r f u l l
s c r e e n ( - f ) o r i n a w i n d o w ( - p ) . Y o u c a n a l s o
s p e c i f y w h a t o p a c i t y ( - o p ) t h e p r e v i e w w i n d o w i s
t o h a v e ( s o y o u c a n s e e t h e d e s k t o p u n d e r n e a t h
i f n e c e s s a r y ) .
T o d i s p l a y t h e p r e v i e w i n a w i n d o w a t p o s i t i o n
1 0 0 , 1 0 0 , w i d t h 5 0 0 , h e i g h t 4 0 0 a n d a t 5 0 %
o p a c i t y ( 0 - t r a n s p a r e n t t o 2 5 5 - o p a q u e ) , e n t e r :
raspistill -p 100,100,500,400 -op 128 -oimage.jpg
T o d i s a b l e p r e v i e w c o m p l e t e l y , e n t e r :
raspistill -n -o image.jpg
J o i n u s i n i s s u e 1 5 o f T h e M a g P i w h e r e s o m e o f
t h e m o r e a d v a n c e d f e a t u r e s w i l l b e d i s c u s s e d !
T r o u b l e s h o o t i n g
I f y o u r c a m e r a i s n o t w o r k i n g , t h e r e a r e a n u m b e r
o f t h i n g s t o c h e c k t o e n s u r e i t i s s e t u p c o r r e c t l y .
1 ) A r e t h e r i b b o n c o n n e c t o r s a l l f i r m l y s e a t e d a n d
t h e r i g h t w a y r o u n d ? 2 ) I s t h e c a m e r a m o d u l e
c o n n e c t o r f i r m l y a t t a c h e d t o t h e c a m e r a P C B ?
3 ) H a v e y o u r u n s u d o a p t - g e t u p d a t e , s u d o a p t -
g e t u p g r a d e ? 4 ) H a v e y o u r u n r a s p i - c o n f i g a n d
e n a b l e d t h e c a m e r a ?
S o , i f t h i n g s a r e s t i l l n o t w o r k i n g , t r y t h e f o l l o w i n g :
E r r o r : r a s p i s t i l l / r a s p i v i d n o t f o u n d . T h i s
p r o b a b l y m e a n s y o u r u p d a t e / u p g r a d e f a i l e d i n
s o m e w a y . T r y i t a g a i n .
E r r o r : E N O M E M d i s p l a y e d . C a m e r a i s n o t
s t a r t i n g u p . C h e c k a l l c o n n e c t i o n s a g a i n .
E r r o r : E N O S P C d i s p l a y e d . C a m e r a i s
p r o b a b l y r u n n i n g o u t o f G P U m e m o r y . C h e c k
c o n f i g . t x t i n t h e / b o o t / f o l d e r . T h e g p u _ m e m
o p t i o n s h o u l d b e a t l e a s t 1 2 8 .
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 8/36
D I F F I C U L T Y : B E G I N N E R
P e t e r L a v e l l e
G u e s t W r i t e r
P Y T H O N C O N T R O L
C o n t r o l u s i n g a P y t h o n s c r i p t
C o n t r o l l i n g t h e M a p l i n / O W I r o b o t
r o b o t i c a r m
I n t r o d u c t i o n
T h i s a r t i c l e e x p a n d s o n t h e w o r k b y J a m i e S c o t t ,
e t a l i n t h e W i k i h o w a r t i c l e a t
h t t p : / / w w w . w i k i h o w . c o m / U s e - a - U S B - R o b o t i c -
A r m - w i t h - a - R a s p b e r r y - P i - ( M a p l i n ) a n d a l l o w s
y o u t o c o n t r o l t h e m o v e m e n t o f t h e a r m u s i n g a
s e q u e n c e o f i n s t r u c t i o n s r e a d f r o m a C S V
( C o m m a S e p a r a t e d V a r i a b l e s ) f o r m a t t e d f i l e b y a
P y t h o n s c r i p t .
T h i s a r t i c l e a s s u m e s y o u a r e u s i n g t h e R a s p b i a n
d i s t r i b u t i o n b u t y o u s h o u l d a l s o b e a b l e t o g e t
t h i s w o r k i n g u s i n g t h e O c c i d e n t a l i s d i s t r i b u t i o n
f r o m A d a f r u i t . ( M o r e i n f o r m a t i o n a b o u t t h i s
d i s t r i b u t i o n c a n b e f o u n d a t
h t t p : / / l e a r n . a d a f r u i t . c o m / a d a f r u i t - r a s p b e r r y - p i -
e d u c a t i o n a l - l i n u x - d i s t r o / o v e r v i e w ) .
C o n f i g u r i n g y o u r R a s p b e r r y P i
B e f o r e y o u c a n s t a r t u s i n g t h e s c r i p t , t h e r e a r e a
f e w t h i n g s y o u w i l l h a v e t o d o t o g e t y o u r
R a s p b e r r y P i r e a d y . T h e f i r s t t h i n g y o u w i l l n e e d
t o d o i s a d d t h e u s e r a c c o u n t y o u a r e u s i n g o n
t h e R a s p b e r r y P i t o t h e ' p l u g d e v ' g r o u p .
A s s u m i n g y o u a r e u s i n g t h e d e f a u l t ' p i ' u s e r
a c c o u n t , t h e c o m m a n d t o d o t h i s w i l l b e :
sudo usermod -aG plugdev pi
T h e n e x t s t e p i s t o a d d a u d e v r u l e t o a l l o w t h e
' p i ' u s e r t o s e n d c o m m a n d s t o t h e a r m . T o d o
t h i s , c r e a t e a f i l e c a l l e d / e t c / u d e v / r u l e s . d / 8 5 -
r o b o t a r m . r u l e s , u s i n g t h e c o m m a n d :
sudo nano /etc/udev/rules.d/85-robotarm.rules
w i t h t h e c o n t e n t s b e l o w :
SUBSYSTEM=="usb", ATTRS{idVendor}=="1267",
ATTRS{idProduct}=="0000", ACTION=="add",
GROUP="plugdev", MODE="0666"
T o s a v e t h e f i l e , p r e s s c t r l - x a n d t h e n p r e s s ‘ Y ’
f o l l o w e d b y E n t e r .
Y o u ’ l l t h e n n e e d t o i n s t a l l t h e P y t h o n U S B
l i b r a r i e s . I f o u n d t h a t t h e o n e f r o m t h e A p t
r e p o s i t o r y w a s s l i g h t l y o u t o f d a t e , s o I h a d t o
i n s t a l l t h e A p t v e r s i o n f i r s t a n d t h e n u p g r a d e i t
u s i n g t h e p i p c o m m a n d . T h e c o m m a n d b e l o w
w i l l d o t h i s :
sudo apt-get install python-pip -y
sudo pip install pyusb --upgrade
W h e n t h e P y t h o n U S B l i b r a r i e s h a v e b e e n
i n s t a l l e d , r e b o o t y o u r R a s p b e r r y P i s o t h a t t h e
c h a n g e s t o u d e v a n d t h e ' p i ' u s e r a c c o u n t t a k e
e f f e c t w i t h t h e c o m m a n d :
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 9/369
sudo shutdown -r now
C o n n e c t t h e a r m
W h e n t h e R a s p b e r r y P i h a s b e e n r e b o o t e d ,
c o n n e c t t h e a r m t o a f r e e U S B p o r t a n d t u r n i t o n .
A U S B h u b s h o u l d n o t b e n e e d e d h e r e . T o c h e c k
t h a t t h e P i h a s s u c c e s s f u l l y d e t e c t e d t h e a r m ,
e x e c u t e t h e c o m m a n d :
dmesg | grep usb | grep 1267
I f t h e a r m h a s b e e n d e t e c t e d s u c c e s s f u l l y y o u
s h o u l d s e e o u t p u t s i m i l a r t o t h e l i n e b e l o w :
[ 252.790554] usb 1-1.3: New USB device
found, idVendor=1267, idProduct=0000
I f y o u d o n ’ t s e e t h e r e s u l t a b o v e , t u r n o f f
t h e a r m u s i n g t h e p o w e r s w i t c h , u n p l u g
f r o m t h e U S B p o r t , p l u g t h e a r m b a c k i n
a n d t u r n t h e p o w e r b a c k o n .
G e t t i n g t h e c o d e
T h e s c r i p t s c a n b e f o u n d o n G i t h u b a t
h t t p s : / / g i t h u b . c o m / p e t e r l a v e l l e / m a p l i n a r m
Y o u c a n c l o n e t h e r e p o s i t o r y d i r e c t l y o n t o y o u r
P i i f y o u h a v e t h e G i t c l i e n t i n s t a l l e d . I n s t a l l i n g
t h e G i t c l i e n t o n R a s p b i a n i s a s s i m p l e a s
r u n n i n g t h e c o m m a n d :
sudo apt-get install git-core
W h e n y o u h a v e t h e G i t c l i e n t i n s t a l l e d , r u n t h e
c o m m a n d :
git clone
https://github.com/peterlavelle/maplinarm
t o p u l l d o w n a c o p y o f t h e P y t h o n c o d e . T h i s
c o m m a n d w i l l c l o n e t h e r e p o s i t o r y i n t o a
s u b d i r e c t o r y c a l l e d ‘ m a p l i n a r m ’ a n d s h o u l d p u l l
d o w n t h e f i l e s l i s t e d b e l o w :
cd maplinarm/
ls
commander.py commands.csv maplinrobot.py
README.md
M a k i n g t h e s c r i p t s e x e c u t a b l e
N o w w e n e e d t o m a k e t h e s c r i p t s e x e c u t a b l e b y
t h e R a s p b e r r y P i . T o d o t h i s , c h a n g e i n t o t h e
d i r e c t o r y y o u c l o n e d t h e r e p o s i t o r y d o w n t o u s i n g
t h e c d c o m m a n d a n d r u n t h e c o m m a n d c h m o d
7 5 5 * . p y T h i s w i l l g i v e a l l f i l e s e n d i n g i n ‘ . p y ’
e x e c u t a b l e p e r m i s s i o n s . Y o u c a n d o u b l e - c h e c k
t h i s w i t h t h e c o m m a n d l s - l a * . p y a n d l o o k i n g f o r
t h e ‘ x ’ i n t h e l e f t - h a n d c o l u m n o f t h e o u t p u t o n
e a c h l i n e . S e e e x a m p l e l i s t i n g b e l o w :
P r o g r a m m i n g t h e a r m
O k , n o w o n t o t h e g o o d p a r t . T h e s c r i p t
c o m m a n d e r . p y w i l l r e a d i n c o m m a n d s f r o m a
C S V f i l e p a s s e d t o i t a s a n a r g u m e n t .
T h e r e i s a n e x a m p l e f i l e c a l l e d ‘ c o m m a n d s . c s v ’
i n t h e G i t r e p o s i t o r y t o h e l p y o u g e t s t a r t e d . S o
l e t s o p e n t h i s f i l e u p a n d t a k e a l o o k w i t h t h e
c o m m a n d :
nano commands.csv
C o n t e n t s a r e i n c l u d e d b e l o w f o r r e f e r e n c e :
shoulder-up,1.00,1.00
elbow-down,1.00,2.00
base-clockwise,4.00,1.00
shoulder-down,1.00,1.00
grip-close,1.00,1.00
base-anti-clockwise,4.00,2.00
grip-open,1.00,1.00
elbow-up,1.00,2.00
drwxrwxr-x 3 pete pete 4096 May 19 14:11 .
drwx------ 37 pete pete 4096 May 19 14:11 ..
-rwxrwxr-x 1 pete pete 1726 May 19 14:11 commander.py
-rwxrwxr-x 1 pete pete 2388 May 19 14:11 maplinrobot.py
git clone https://github.com/peterlavelle/maplinarm
Cloning into 'maplinarm'...
remote: Counting objects: 35, done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 35 (delta 8), reused 12 (delta 2)
Unpacking objects: 100% (35/35), done.
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 10/360
A s y o u c a n s e e h e r e , t h e b a s i c f o r m a t f o r e a c h
c o m m a n d i s :
command,duration,pause
command - a n y v a l i d c o m m a n d f o u n d i n t h e
m a p l i n r o b o t . p y s c r i p t
duration- t h e t i m e i n s e c o n d s t o e x e c u t e t h e
c o m m a n d f o r . M a k e s u r e a l l v a l u e s a r e e n t e r e d
t o t w o d e c i m a l p l a c e s . e . g , f o r 1 s e c o n d s p e c i f y a
v a l u e o f 1 . 0 0 h e r e .
pause - t h e t i m e i n s e c o n d s t o w a i t b e f o r e
e x e c u t i n g t h e n e x t c o m m a n d i n t h e s e q u e n c e .
M a k e s u r e a l l v a l u e s a r e e n t e r e d t o t w o d e c i m a l
p l a c e s . e . g , f o r 1 s e c o n d s p e c i f y a v a l u e o f 1 . 0 0
h e r e .
T h e c o m m a n d e r . p y s c r i p t w i l l e x e c u t e e a c h l i n e
i n t h e C S V f i l e a s a s e p a r a t e c o m m a n d f o r t h e
d u r a t i o n y o u s e t a n d w i l l w a i t f o r t h e n u m b e r o f
s e c o n d s s e t i n t h e p a u s e v a l u e b e f o r e m o v i n g o n
t o t h e n e x t c o m m a n d i n t h e s e q u e n c e .
V a l i d c o m m a n d s a n d a d e s c r i p t i o n f o r e a c h c a n
b e f o u n d b e l o w :
base-anti-clockwise - R o t a t e s t h e b a s e a n t i -
c l o c k w i s e
base-clockwise - R o t a t e s t h e b a s e c l o c k w i s e
shoulder-up - R a i s e s t h e s h o u l d e r
shoulder-down- L o w e r s t h e s h o u l d e r
elbow-up - R a i s e s t h e e l b o w
elbow-down- L o w e r s t h e e l b o w
wrist-up - R a i s e s t h e w r i s t
wrist-down - L o w e r s t h e w r i s t
grip-open- O p e n s t h e g r i p
grip-close - C l o s e s t h e g r i p
light-on - T u r n s o n t h e L E D i n t h e g r i p
light-off- T u r n s t h e L E D i n t h e g r i p o f f
stop - S t o p s a l l m o v e m e n t o f t h e a r m
T r y t h i s o u t y o u r s e l f b y e d i t i n g t h e
c o m m a n d s . c s v f i l e i n t h e r e p o s i t o r y a n d
r e p l a c i n g t h e c o n t e n t s w i t h y o u r o w n i n s t r u c t i o n s
t o t h e a r m .
R u n n i n g y o u r p r o g r a m
R u n n i n g y o u r p r o g r a m i s a s s i m p l e a s r u n n i n g
t h e c o m m a n d . / c o m m a n d e r . p y c o m m a n d s . c s v
f r o m t h e c o m m a n d l i n e o n y o u r R a s p b e r r y P i .
T h e s c r i p t w i l l o u t p u t e a c h s t e p o f y o u r p r o g r a m
a s i t r u n s i t . Y o u c a n f i n d a e x a m p l e o u t p u t o f m y
t e r m i n a l b e l o w a s a n e x a m p l e r u n u s i n g t h e
c o m m a n d s . c s v f i l e i n t h e r e p o s i t o r y :
./commander.py commands.csv
Running command 'shoulder-up' for a duration
of 1.000000 second(s) with a pause of 1.000000
second(s)
Sending command shoulder-up
T h e s e r i e s o f c o m m a n d s w i l l t h e n f i n i s h w i t h :
Done.
All commands executed. Stopping the arm
T h a t ’ s i t . I f y o u h a v e a n y i d e a s o n h o w t h i s c o u l d
b e i m p r o v e d o r e x p a n d e d ( m a y b e b y a d d i n g
s o m e s o r t o f c o n t r o l l o g i c t o t h e c o m m a n d s f i l e ,
f o r e x a m p l e ) t h e n f e e l f r e e t o c o n t a c t m e v i a t h e
c o n t a c t f o r m o n m y b l o g a t
h t t p : / / s o l d e r i n t h e v e i n s . c o . u k / c o n t a c t - m e /
W h e r e t o b u y ?
I n t h e U K t h e r o b o t a r m i s a v a i l a b l e f r o m M a p l i n
( h t t p : / / w w w . m a p l i n . c o . u k - c o d e A 3 7 J N ) o r
e l s e w h e r e f r o m R o b o t i k i t s
( h t t p : / / w w w . o w i r o b o t . c o m - c o d e s O W I - 5 3 5 a n d
5 3 5 - U S B ) .
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 11/36
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 12/362
D I F F I C U L T Y : A D V A N C E D
P h i l i p M u n t s
G u e s t W r i t e r
I / O , A / D & T I M I N G
U s i n g a n A R M C o r t e x - M 0 m i c r o c o n t r o l l e r
I n p u t / O u t p u t P r o c e s s o r
A s a n e m b e d d e d s y s t e m d e v e l o p e r , I a w a i t e d
t h e r e l e a s e o f t h e R a s p b e r r y P i w i t h g r e a t
i n t e r e s t a n d a n t i c i p a t i o n . I o r d e r e d o n e e a r l y o n
a n d , l i k e m a n y o t h e r s , w a i t e d f o r i t t o a r r i v e .
T h e r e a r e m a n y , m a n y e m b e d d e d s y s t e m
p o s s i b i l i t i e s f o r a $ 3 5 L i n u x c o m p u t e r .
L i n u x b r i n g s a g r e a t d e a l o f c a p a b i l i t y t o t h e p a r t y ,
e s p e c i a l l y w i t h r e g a r d s t o n e t w o r k i n g a n d U S B
s u p p o r t . B u t o n e t h i n g L i n u x s y s t e m s , i n c l u d i n g t h e
R a s p b e r r y P i , l a c k : m i c r o s e c o n d I / O ( i n p u t / o u t p u t )
s i g n a l t i m i n g r e s o l u t i o n . T h e m u l t i u s e r , m u l t i t a s k i n g ,
v i r t u a l m e m o r y f o u n d a t i o n o f L i n u x s i m p l y p r e v e n t s i t
f r o m r e s p o n d i n g t o o r t i m i n g e x t e r n a l e v e n t s w i t h
p r e d i c t a b l e m i c r o s e c o n d r e s o l u t i o n .
S o m e i n t e r e s t i n g p r o j e c t s t h a t w o u l d r e q u i r e
m i c r o s e c o n d t i m i n g r e s o l u t i o n i n c l u d e :
• I R ( I n f r a r e d ) r e m o t e c o n t r o l p r o t o c o l s , s u c h a s t h e
L E G O ® P o w e r F u n c t i o n s R C p r o t o c o l ;
• D C C ( D i g i t a l C o m m a n d C o n t r o l ) f o r m o d e l
r a i l r o a d s ;
• U l t r a s o n i c r a n g i n g w i t h a d e v i c e l i k e t h e P a r a l l a x
u l t r a s o n i c d i s t a n c e s e n s o r .
T h e o t h e r c a p a b i l i t i e s o f L i n u x a r e s o c o m p e l l i n g t h a t
a t t e m p t s h a v e b e e n m a d e f r o m t i m e t o t i m e t o g r a f t i n
r e a l t i m e s u p p o r t . N o n e o f t h e s e h a v e b e e n
p a r t i c u l a r l y s u c c e s s f u l , a t l e a s t i n t e r m s o f “ m i n d
s h a r e ” . B u t f o r t u n a t e l y t h e r e i s a n o t h e r w a y : t h e I / O
p r o c e s s o r ( F i g u r e 1 ) .
F i g u r e 1 - I / O P r o c e s s o r
I / O P r o c e s s o r
A n I / O P r o c e s s o r i s s i m p l y a s e p a r a t e c o m p u t e r
d e d i c a t e d t o I / O o p e r a t i o n s , u s u a l l y a c t i n g a s a s l a v e
t o t h e “ m a i n ” o r “ r e a l ” p r o c e s s o r . T h e I / O p r o c e s s o r
r u n s i t s o w n s o f t w a r e , s e p a r a t e f r o m t h e m a i n
p r o c e s s o r . D e p e n d i n g o n t h e i m p l e m e n t a t i o n , t h e I / O
p r o c e s s o r s o f t w a r e m a y o r m a y n o t b e a l t e r a b l e f r o m
t h e m a i n p r o c e s s o r .
T h e I / O p r o c e s s o r i d e a i s n o t n e w . T h e I B M 7 0 9 4
m a i n f r a m e c o m p u t e r o f 1 9 6 2 c o u l d u s e a 7 0 4 4
c o m p u t e r f o r a l l I / O . P r o c e s s i n g w a s p e r f o r m e d o n
t h e 7 0 9 4 a n d I / O d o n e o n t h e 7 0 4 4 . E v e n t h e o r i g i n a l
I B M P C , r e l e a s e d i n 1 9 8 1 , h a d a n 8 0 4 8 8 - b i t
m i c r o c o n t r o l l e r i n t h e k e y b o a r d t o h a n d l e k e y p r e s s
t i m i n g . T o d a y , t h e I / O p r o c e s s o r i d e a h a s b e e n
p u s h e d a l l t h e w a y d o w n t o s i n g l e c h i p s y s t e m s : T h e
N X P L P C 4 3 0 0 , i t s e l f a s i n g l e c h i p A R M C o r t e x - M 4
m i c r o c o n t r o l l e r , i n c l u d e s a s e p a r a t e A R M C o r t e x - M 0
m i c r o c o n t r o l l e r , f o r r e a l t i m e p r o c e s s i n g , o n t h e s a m e
c h i p .
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 13/361 3
T h e R a s p b e r r y P i M o d e l B o f f e r s s e v e r a l d i f f e r e n t I / O
i n t e r f a c e s , f o r e x a m p l e : e t h e r n e t , U S B , a n d t h e P 1
e x p a n s i o n h e a d e r . A c a s e c a n b e m a d e f o r a t t a c h i n g
a n I / O p r o c e s s o r t o a n y o f t h e t h r e e i n t e r f a c e s .
E t h e r n e t a n d U S B o f f e r g o o d b a n d w i d t h a n d
s t a n d a r d i n t e r f a c e s . A n I / O p r o c e s s o r b o a r d b u i l t t o
a t t a c h t o e i t h e r E t h e r n e t o r U S B w o u l d a l s o b e a b l e t o
c o n n e c t t o a n y o t h e r L i n u x , W i n d o w s , o r M a c
c o m p u t e r . B u t b o t h E t h e r n e t a n d U S B i m p o s e
s i g n i f i c a n t c o s t a n d c o m p l e x i t y p e n a l t i e s u p o n t h e I / O
p r o c e s s o r b o a r d . I t w o u l d b e d i f f i c u l t ( t h o u g h n o t
i m p o s s i b l e ) t o d e s i g n a n I / O p r o c e s s o r b o a r d , w i t h
U S B o r E t h e r n e t , c o s t i n g l e s s t h a n t h e R a s p b e r r y P i
i t s e l f .
T h e P 1 e x p a n s i o n h e a d e r p r o v i d e s s e v e r a l d i f f e r e n t
I / O i n t e r c o n n e c t : I 2 C , S P I , U A R T , a n d b a s i c G P I O .
A n y o r a l l o f t h e s e m a y b e u s e d t o c o m m u n i c a t e w i t h
a m i c r o c o n t r o l l e r .
L P C 1 1 1 4 I / O p r o c e s s o r
I h a v e d e s i g n e d a n d b u i l t a n I / O p r o c e s s o r b o a r d f o r
t h e R a s p b e r r y P i u s i n g t h e N X P L P C 1 1 1 4 , a n A R M
C o r t e x - M 0 s i n g l e c h i p m i c r o c o n t r o l l e r . I s e l e c t e d t h i s
d e v i c e f o r s e v e r a l r e a s o n s :
• L o w c o s t - I p a i d U S D $ 1 . 2 6 e a c h f o r t h e
L P C 1 1 1 4 F N 2 8 f r o m A v n e t E x p r e s s . T h e L P C 1 1 x x
f a m i l y i s e s s e n t i a l l y N X P ' s 3 2 - b i t a t t a c k o n t h e 8 - b i t
m i c r o c o n t r o l l e r m a r k e t . T h e y a r e p r i c e d l e s s t h a n
a l m o s t a n y P I C o r A V R o f s i m i l a r c a p a b i l i t y . T h e
L P C 1 1 1 4 i n t e r n a l o s c i l l a t o r i s a l s o s t a b l e e n o u g h t h a t
n o c r y s t a l o r e x t e r n a l o s c i l l a t o r i s r e q u i r e d , s a v i n g
e v e n m o r e m o n e y .
• D I P p a c k a g e - I c a n d o s u r f a c e m o u n t s o l d e r i n g ,
g i v e n p r o p e r e q u i p m e n t , b u t I c a n ' t s a y I e n j o y i t . A s
f a r a s I k n o w , t h e L P C 1 1 1 4 F N 2 8 a n d s o m e
P I C 3 2 M X d e v i c e s ( m o r e e x p e n s i v e ) a r e t h e o n l y 3 2 -
b i t m i c r o c o n t r o l l e r s a v a i l a b l e i n a e a s i l y h a n d -
s o l d e r a b l e D I P p a c k a g e .
• I S P ( I n S y s t e m P r o g r a m m i n g ) - w i t h o u t a d d i t i o n a l
h a r d w a r e . N X P A R M C o r t e x m i c r o c o n t r o l l e r s h a v e a
b u i l t - i n s e r i a l p o r t b o o t l o a d e r t h a t a l l o w s t h e m t o b e
r e p r o g r a m m e d w i t h o u t a n y a d d i t i o n a l h a r d w a r e .
• G o o d s u p p o r t b y f r e e d e v e l o p m e n t t o o l s . A R M
m i c r o c o n t r o l l e r s , i n c l u d i n g t h e L P C 1 1 1 4 , a r e v e r y
w e l l s u p p o r t e d b y b i n u t i l s / g c c / n e w l i b / g d b c o m p i l e r
t o o l c h a i n .
F i g u r e 2 - A s s e m b l e d I / O P r o c e s s o r b o a r d
S o m e o t h e r R a s p b e r r y P i e x p a n s i o n b o a r d s c o n t a i n a
m i c r o c o n t r o l l e r ( u s u a l l y a n A V R ) a s a n a d d i t i o n o r
a f t e r t h o u g h t . T h e L P C 1 1 1 4 m i c r o c o n t r o l l e r i s c e n t r a l
t o t h i s b o a r d ' s d e s i g n . E v e n t h o u g h i t o n l y c o n t a i n s
o n e i n t e g r a t e d c i r c u i t , a n L E D , a n d 8 r e s i s t o r s a n d
c a p a c i t o r s , t h i s b o a r d o f f e r s :
• 8 G P I O ( G e n e r a l P u r p o s e I n p u t / O u t p u t ) s i g n a l s
b r o u g h t o u t t o s c r e w t e r m i n a l s .
• 5 t e r m i n a l s c a n b e c o n f i g u r e d a s A / D ( A n a l o g t o
D i g i t a l ) i n p u t s f o r m e a s u r i n g a n a l o g s i g n a l s .
• 3 t e r m i n a l s c a n b e c o n f i g u r e d a s t i m e r i n p u t s , f o r
c o u n t i n g o r m e a s u r i n g i n c o m i n g p u l s e s .
• 5 t e r m i n a l s c a n b e c o n f i g u r e d a s t i m e r o u t p u t s ,
s u c h a s P W M ( P u l s e W i d t h M o d u l a t i o n ) o u t p u t s f o r
c o n t r o l l i n g m o t o r s .
N o t a l l i n p u t / o u t p u t f u n c t i o n s a r e a v a i l a b l e a t t h e
s a m e t i m e ; f o r e x a m p l e , P 1 . 0 c a n b e c o n f i g u r e d f o r
a n y o f d i g i t a l i n p u t , d i g i t a l o u t p u t , a n a l o g i n p u t ,
t i m e r / c o u n t e r i n p u t , b u t o n l y o n e f u n c t i o n a t a t i m e .
F o r m o r e i n f o r m a t i o n a b o u t t h e L P C 1 1 1 4 I / O
P r o c e s s o r , i n c l u d i n g h o w t o p u r c h a s e o n e , v i s i t :
h t t p : / / t e c h . m u n t s . c o m / M C U / F r a m e w o r k s / R a s p b e r r y P
i / e x p a n s i o n / L P C 1 1 1 4 /
N e x t t i m e
I n f u t u r e a r t i c l e s I w i l l d e s c r i b e i n m o r e d e t a i l h o w t o
u s e t h e L P C 1 1 1 4 I / O p r o c e s s o r t o b u i l d s o m e
i n t e r e s t i n g c o n t r o l p r o j e c t s w i t h t h e R a s p b e r r y P i .
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 14/364
D I F F I C U L T Y : A D V A N C E D
D e r e k C a m p b e l l
G u e s t W r i t e r
B u i l d a G u z u n t y
A n O p e n S o u r c e , O p e n H a r d w a r e A d d o n
M a k e a l o w c o s t G P I O e x p a n d e r
D o y o u w a n t t o c o n n e c t e l e c t r o n i c s t o y o u r
R a s p b e r r y P i b u t a r e w o r r i e d a b o u t o v e r l o a d i n g
o r d a m a g i n g t h e G P I O ( G e n e r a l P u r p o s e I n p u t
O u t p u t ) p i n s ? S a y " H e l l o ! " t o t h e G u z u n t y P I - S B .
G u z u n t y i s a n O p e n S o u r c e , O p e n H a r d w a r e
a d d o n y o u c a n e a s i l y b u i l d y o u r s e l f . T h i s t i n y
l i t t l e b o a r d w i l l p r o t e c t y o u r R a s p b e r r y P i w h i l e
y o u l e a r n , b u t i t c a n d o s o m u c h m o r e .
T h e G u z u n t y i s p r o g r a m m a b l e u s i n g ‘ c o r e s ’ .
T h e s e f i l e s c a n h a n d l e r e p e t i t i v e t a s k s t h a t s l o w
d o w n t h e R a s p b e r r y P i ' s C P U a n d t h e y c a n
p r o v i d e a c c e s s t o 2 5 m o r e i n p u t / o u t p u t p i n s t h a n
o n t h e G P I O a l o n e . T a k e i t t o t h e n e x t l e v e l a n d
l e a r n t o p r o g r a m a c o r e t o d o n e w t a s k s y o u r s e l f .
P r o t e c t i n g y o u r R a s p b e r r y P i
A s s t a n d a r d , n o R a s p b e r r y P i s i g n a l s a r e d i r e c t l y
b r o u g h t o u t t o t h e p i n s o n t h e t o p s i d e o f t h e
G u z u n t y , s o i t i s a l m o s t i m p o s s i b l e t o f e e d
d a m a g i n g v o l t a g e s i n t o y o u r R a s p b e r r y P i .
I n s t e a d , a l l s i g n a l s p a s s t h o u g h t h e c h i p a t t h e
h e a r t o f t h i s d e s i g n , a X i l i n x X C 9 5 7 2 X L .
T h e X C 9 5 7 2 X L i s a C o m p l e x P r o g r a m m a b l e
L o g i c D e v i c e o r C P L D f o r s h o r t . D o n ’ t w o r r y
a b o u t t h e w o r d ‘ C o m p l e x ’ i n t h e n a m e , t h e
G u z u n t y m a k e s i t e a s y . T h e C P L D i s t o l e r a n t o f 5
v o l t s i g n a l s w h i c h w o u l d d a m a g e y o u r R a s p b e r r y
P i , s o y o u c a n i n t e r f a c e w i t h m o r e k i n d s o f
e x t e r n a l d e v i c e s , i n c l u d i n g A r d u i n o .
N O T E : T h e C P L D w i l l b e d a m a g e d b y v o l t a g e s
g r e a t e r t h a n 5 . 5 v o l t s . Y o u s h o u l d b e e s p e c i a l l y
a w a r e t h a t m a i n s v o l t a g e s a r e d a n g e r o u s a n d
n e e d s p e c i a l i s o l a t i o n c i r c u i t r y . H o w e v e r , i f y o u
s h o u l d m a k e a m i s t a k e a n d f r y t h e C P L D , a
r e p l a c e m e n t c h i p c a n b e p u r c h a s e d
i n e x p e n s i v e l y a n d s w a p p e d i n t o t h e s o c k e t .
I n p u t / O u t p u t e x p a n s i o n
T h e C P L D i s p r o g r a m m a b l e , b u t u n l i k e a
c o m p u t e r p r o g r a m , a C P L D p r o g r a m d e f i n e s
h a r d w a r e l o g i c . T o p r o v i d e I / O ( I n p u t / O u t p u t )
e x p a n s i o n , w e p r o g r a m t h e C P L D t o p r o v i d e a
S e r i a l P e r i p h e r a l I n t e r f a c e ( S P I ) o n f o u r o f i t s
g e n e r a l p u r p o s e I / O p i n s .
T h e S y s t e m O n C h i p ( S O C ) o f t h e R a s p b e r r y P i
h a s S P I , o n G P I O s 8 , 9 , 1 0 a n d 1 1 . W e c a n t h u s
e a s i l y m a k e t h e R a s p b e r r y P i s e n d d a t a t o t h e
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 15/361 5
C P L D i n a n y p r o g r a m m i n g l a n g u a g e t h a t c a n
o p e n t h e S P I d e v i c e . T h e C P L D t h e n u s e s t h e
d a t a w e s e n d i t t o t u r n i t s o u t p u t p i n s o n o r o f f .
T h e S P I i n t e r f a c e w o r k s i n b o t h d i r e c t i o n s , s o w e
c a n a l s o r e a d f r o m t h e C P L D w h e t h e r i t s i n p u t
p i n s a r e i n a h i g h o r l o w s t a t e . T h e s t a n d a r d
G u z u n t y b o a r d h a s a t o t a l o f 2 5 f r e e I / O p i n s . W e
n e e d 4 R a s p b e r r y P i G P I O p i n s t a l k i n g t o t h e
C P L D a n d , i f w e n e e d t h e m , t h e r e a r e a n o t h e r 1 3
u n u s e d p i n s o n t h e R a s p b e r r y P i . G u z u n t y t a k e s
y o u r R a s p b e r r y P i f r o m 1 7 G P I O s i g n a l s t o 4 0
I / O ' s ( 2 5 p l u s 1 3 ) . N o t b a d !
D o i n g r e p e t i t i v e t a s k s
T h e s e t a s k s w i l l b e s i m p l e j o b s w h e r e w e n e e d
t o t u r n l o g i c s i g n a l s o n a n d o f f q u i c k l y a n d
r e p e t i t i v e l y a s w i t h P u l s e W i d t h M o d u l a t i o n
( P W M ) f o r e x a m p l e . W i t h P W M , w e c a n c o n t r o l
t h e b r i g h t n e s s o f a L E D o r t h e p o s i t i o n o f a s e r v o
b y c o n t r o l l i n g t h e l e n g t h o f t i m e a l o g i c o u t p u t i s
h e l d h i g h . A n o t h e r e x a m p l e i s d r i v i n g a L E D o r
L C D d i s p l a y . T h e d i s p l a y l o o k s c l e a r a n d s t a b l e
t o t h e h u m a n e y e , b u t i n r e a l i t y , t h e d i f f e r e n t
d i s p l a y e l e m e n t s a r e b e i n g s w i t c h e d o n a n d o f f
h u n d r e d s o f t i m e s a s e c o n d . T h e s e t a s k s c a n p u t
a c o n s i d e r a b l e l o a d o n t h e C P U o f t h e R a s p b e r r y
P i , b u t a C P L D c a n e a s i l y h a n d l e t h e m l e a v i n g
y o u r R a s p b e r r y P i t o g e t o n w i t h t h e r e a l w o r k .
N O T E : H a n d l i n g a n i n d e p e n d e n t t a s k l i k e t h i s
d o e s r e q u i r e o n e e x t r a p i n o n b o t h t h e C P L D a n d
o n t h e R a s p b e r r y P i t o p r o v i d e a c l o c k s i g n a l s o
t h a t t h e C P L D c a n k e e p t r a c k o f t i m e .
D e s i g n y o u r o w n c o r e
T o m a k e i t a s e a s y a s p o s s i b l e t o g e t s t a r t e d , t h e
G u z u n t y w e b s i t e a l r e a d y c o n t a i n s a s u i t e o f
c o r e s t o d o a v a r i e t y o f u s e f u l t a s k s w h e n
p l u g g e d i n t o y o u r R a s p b e r r y P i . H o w e v e r , y o u
d o n ’ t h a v e t o s t o p t h e r e . Y o u c a n c r e a t e y o u r
o w n c o r e s u s i n g a f r e e t o o l c h a i n d o w n l o a d a b l e
f r o m t h e X i l i n x w e b s i t e . Y o u p r o g r a m c o r e s u s i n g
e i t h e r s c h e m a t i c s o r a H a r d w a r e D e s c r i p t i o n
L a n g u a g e . H o w y o u d o t h a t i s b e y o n d t h e s c o p e
o f t h i s a r t i c l e , b u t i n t h e m e a n t i m e c h e c k o u t t h e
c o r e s a l r e a d y a v a i l a b l e a t :
h t t p s : / / g i t h u b . c o m / G u z u n t y / P i / w i k i / A v a i l a b l e -
c o r e s .
C a n G u z u n t y p o w e r m y p r o j e c t s ?
Y e s , t h e G u z u n t y p r o v i d e s g r o u n d , 3 . 3 v a n d 5 v
o u t p u t s . T h e s e a r e t a k e n f r o m t h e p o w e r p i n s o n
t h e R a s p b e r r y P i G P I O h e a d e r . Y o u m u s t
a d h e r e t o t h e R a s p b e r r y P i ' s o v e r a l l p o w e r d r a i n
l i m i t s .
F o r m o r e d e t a i l s , s e e :
h t t p s : / / g i t h u b . c o m / g u z u n t y / p i / w i k i / F r e q u e n t l y -
a s k e d - q u e s t i o n s .
T h a t ' s a l l F o l k s !
I d o h o p e y o u d e c i d e t o b u i l d y o u r n e x t p r o j e c t
w i t h a G u z u n t y . I ’ m s u r e y o u w i l l b e g l a d y o u d i d .
P l e a s e v i s i t h t t p s : / / g i t h u b . c o m / G u z u n t y / P i / w i k i t o
f i n d e x a m p l e c o r e s a n d t h e c o d e t o d r i v e t h e m .
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 16/366
D I F F I C U L T Y : M O D E R A T E
B r u c e E . H a l l
W 8 B H
G u e s t W r i t e r
P I M A T R I X
C o n t r o l a n 8 x 8 m a t r i x o f 6 4 L E D s
P a r t 2 : C o n t r o l i n d i v i d u a l L E D s
& g i v e t h e P i M a t r i x a w o r k o u t
I n t r o d u c t i o n
I n P a r t 1 o f t h i s s e r i e s w e l o o k e d a t h o w t o b u i l d t h e
P i M a t r i x k i t a n d h o w t o c o n f i g u r e I
2
C o n t h e
R a s p b e r r y P i t o c o m m u n i c a t e w i t h i t . T h e r e s u l t w a s
a s i m p l e P y t h o n s c r i p t t o t u r n a l l t h e L E D s o n a n d o f f .
I n t h i s m o n t h ' s t u t o r i a l w e w i l l f o l l o w o n f r o m P a r t 1
a n d d o s o m e t h i n g m o r e i n t e r e s t i n g . F i r s t w e w i l l l o o k
a t h o w t h e P i M a t r i x w o r k s , t h e n w e w i l l w r i t e c o d e f o r
s o m e t h i n g m o r e Y o u T u b e f r i e n d l y !
H o w d o e s i t w o r k ?
T h e h e a r t o f t h e P i M a t r i x i s t h e M C P 2 3 0 1 7 c h i p f r o m
M i c r o c h i p . T h i s i s a w o n d e r f u l d e v i c e f o r c r e a t i n g
h a r d w a r e i n t e r f a c e s b e c a u s e :
I f y o u d o s o m e t h i n g ‘ b a d ’ w i t h y o u r c o n n e c t i o n t o t h e
o u t s i d e w o r l d a n d f r y t h e 2 3 0 1 7 , y o u ’ v e l o s t l e s s t h a n
U S $ 1 . 5 0 a n d s t i l l h a v e a w o r k i n g R a s p b e r r y P i .
I t j u s t s o h a p p e n s t h a t t h e L E D m a t r i x r e q u i r e s 1 6
d a t a l i n e s - a p e r f e c t m a t c h . B u t h o w c a n y o u c o n t r o l
6 4 L E D s w i t h o n l y 1 6 l i n e s ? D o n ’ t y o u n e e d 6 4 l i n e s ?
T h a t ’ s w h e r e t h e ‘ m a t r i x ’ c o m e s i n . T a k e a l o o k a t a
t y p i c a l w i r i n g d i a g r a m f o r t h e s e d e v i c e s :
T h e L E D s a r e w i r e d i n a n 8 x 8 m a t r i x w i t h 8 r o w s
( l a b e l e d ‘ D i g ’ ) a n d 8 c o l u m n s ( l a b e l e d ‘ S e g ’ ) . T h e s e
8 r o w s a n d 8 c o l u m n s m a k e u p o u r 1 6 c o n n e c t i o n s t o
t h e o u t s i d e w o r l d . T o t u r n o n a n L E D , a p p l y p o w e r
a n d g r o u n d t o t h e c o r r e s p o n d i n g c o l u m n a n d r o w
c o n n e c t i o n s . F o r e x a m p l e , t o t u r n o n t h e h i g h l i g h t e d
L E D a t p o s i t i o n ( 0 , 0 ) a p p l y p o w e r t o t h e a n o d e o n
l e f t - m o s t c o l u m n ‘ S e g D P ’ a n d g r o u n d t o t h e c a t h o d e
o n t h e t o p - m o s t r o w ‘ D i g 0 ’ . N o t i c e t h a t e a c h L E D
s h a r e s a r o w c o n n e c t i o n w i t h 7 o t h e r L E D s a n d a
c o l u m n c o n n e c t i o n w i t h 7 o t h e r L E D s .
• I t ' s p e a k s ' I
2
C a n d o n l y n e e d s t w o
c o m m u n i c a t i o n l i n e s f r o m t h e R a s p b e r r y P i
• I t b u f f e r s a n d p r o t e c t s y o u r P i f r o m t h e o u t s i d e
w o r l d
• I t g i v e s y o u 1 6 I / O d a t a l i n e s t o w o r k w i t h
• I t i s d i r t c h e a p ! L e s s t h a n U S $ 1 . 5 0 a t u n i t
q u a n t i t i e s
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 17/361 7
L e t ’ s s e e h o w o u r p r o g r a m f r o m p a r t 1 w o r k s . T o l i g h t
u p a l l o f t h e L E D s w e s e n d t h e h e x a d e c i m a l v a l u e
0 x F F t o P o r t A o f t h e 2 3 0 1 7 , w h i c h g o e s t o t h e
c o l u m n p i n s o f t h e m a t r i x . H e x a d e c i m a l 0 x F F i s t h e
s a m e a s b i n a r y 1 1 1 1 1 1 1 1 . E a c h b i t a n d t h e r e f o r e
e a c h c o l u m n i n p u t w i l l b e a t l o g i c 1 ( + 3 . 3 V ) . W e a l s o
m u s t s e n d t h e v a l u e o f 0 x 0 0 t o P o r t B , w h i c h g o e s t o
t h e r o w p i n s . H e x a d e c i m a l 0 x 0 0 i s t h e s a m e a s
b i n a r y v a l u e 0 0 0 0 0 0 0 0 . E a c h b i t a n d t h e r e f o r e e a c h
r o w i n p u t w i l l b e a t l o g i c 0 ( g r o u n d ) . B e c a u s e a l l t h e
c o l u m n s ( a n o d e s ) a r e h i g h a n d a l l t h e r o w s
( c a t h o d e s ) a r e l o w , a l l t h e L E D s t u r n o n .
C o d i n g f o r c o l u m n s
W e c a n m a k e m o r e i n t e r e s t i n g d i s p l a y s b y c h a n g i n g
t h e r o w a n d c o l u m n i n p u t s . F o r i n s t a n c e , i n s t e a d o f
m a k i n g a l l o f t h e c o l u m n i n p u t s h i g h , i f w e o n l y m a k e
o n e c o l u m n h i g h t h e n o n l y t h e L E D s i n t h a t c o l u m n
w i l l t u r n o n . T h e o t h e r s w i l l s t a y o f f .
T o t r y t h i s w e w i l l u s e t h e P y t h o n i n t e r a c t i v e m o d e .
F r o m t h e c o m m a n d l i n e , e n t e r :
python
T h e P y t h o n p r o m p t i s a t r i p p l e c h e v r o n ' > > > ' . F r o m
h e r e w e e n t e r o u r P y t h o n c o d e a n d t h e i n t e r p r e t e r
w o r k s a s w e g o . E n t e r t h e 1 1 c o m m a n d s f r o m t h e t w o
c o d e b l o c k s o n p a g e 1 2 i s s u e 1 3 :
>>> import smbus
...
>>> bus = smbus.SMBus(1) #0 for Rev.1 Pi
...
>>> bus.write_byte_data(addr,portA,0xFF)
A l l L E D s s h o u l d n o w b e o n . N o w l e t ’ s t u r n o n a s i n g l e
c o l u m n . T o t u r n o n t h e f i r s t c o l u m n w e j u s t n e e d t o
t u r n o n t h e l o w e s t b i t . T h i s i s e a s y , j u s t w r i t e t h e v a l u e
o f 0 0 0 0 0 0 0 1 ( 0 x 0 1 ) t o P o r t A . E n t e r :
>>> bus.write_byte_data(addr,portA,0x01)
I f w e w a n t t o t u r n o n t h e t h i r d c o l u m n w e w r i t e t h e
b i n a r y v a l u e 0 0 0 0 0 1 0 0 ( 0 x 0 4 ) t o P o r t A :
>>> bus.write_byte_data(addr,portA,0x04)
I f w e s t a r t n u m b e r i n g o u r c o l u m n s a t z e r o w e c a n
d e t e r m i n e t h e v a l u e m a t h e m a t i c a l l y a s 2 ^ n , w h e r e n
i s t h e c o l u m n n u m b e r . S o c o l u m n 0 i s 1 , c o l u m n 1 i s
2 , c o l u m n 2 i s 4 , c o l u m n 3 i s 8 a n d s o o n . T o c o d e
t h i s v a l u e w e u s e a n e a t t r i c k , t h e l e f t - s h i f t o p e r a t o r
‘ < < ’ . E n t e r t h e f o l l o w i n g a n d r e p l a c e ' c o l ' w i t h a n y
n u m b e r b e t w e e n 0 a n d 7 :
>>> bus.write_byte_data(addr,portA,
0x01<<col)
D i d w h a t y o u e x p e c t h a p p e n ? D e p e n d i n g o n y o u r
o r i e n t a t i o n t h e r e s u l t m i g h t h a v e b e e n t h e o p p o s i t e o f
w h a t y o u e x p e c t e d . T h i s i s b e c a u s e t h e c o l u m n p i n s
f o r t h e L E D m a t r i x a r e w i r e d i n t h e o p p o s i t e d i r e c t i o n
t o t h e P o r t A p i n s ( s e e t h e t a b l e o n p a g e 1 3 i n i s s u e
1 3 ) . T o c o r r e c t f o r t h i s w e ’ l l u s e t h e r i g h t - s h i f t
o p e r a t o r i n s t e a d o f t h e l e f t - s h i f t o p e r a t o r :
>>> bus.write_byte_data(addr,portA,
0x80>>col)
W h e n y o u a r e r e a d y t o m o v e o n , t u r n o n a l l t h e
c o l u m n L E D s w i t h t h e f o l l o w i n g c o m m a n d :
>>> bus.write_byte_data(addr,portA,0xFF)
C o d i n g f o r r o w s
N o w l e t ’ s d o t h e s a m e t h i n g f o r r o w s . W e c a n u s e t h e
s a m e t e c h n i q u e b u t e l e c t r i c a l l y w e n e e d t o s e l e c t i v e l y
b r i n g t h e r o w t o l o g i c 0 , n o t l o g i c 1 . F o r e x a m p l e , t o
t u r n o n r o w 3 w e ’ l l n e e d t o s e n d t h e b i n a r y v a l u e
1 1 1 1 1 0 1 1 t o P o r t B . T h e t h i r d b i t f r o m t h e r i g h t i s
l o g i c 0 a n d e v e r y t h i n g e l s e i s l o g i c 1 . N o t i c e t h a t a l l o f
t h e b i t s a r e f l i p p e d , o r i n v e r t e d , c o m p a r e d t o w h a t w e
u s e d i n t h e c o l u m n m e t h o d . W e c a n w r i t e t h e b i n a r y
v a l u e 1 1 1 1 1 0 1 1 a s t h e i n v e r s e o f 0 0 0 0 0 1 0 0 .
I n P y t h o n t h e i n v e r s e ( o r b i t w i s e N O T ) o p e r a t o r i s
t h e t i l d e ' ~ ' . E n t e r t h e f o l l o w i n g a n d r e p l a c e ' r o w ' w i t h
a n y n u m b e r b e t w e e n 0 a n d 7 :
>>> bus.write_byte_data(addr,portB,
~(0x01<<row))
C o d i n g f o r i n d i v i d u a l L E D s
I t ’ s e a s i e r t h a n y o u t h i n k . A l l w e h a v e t o d o i s
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 18/368
c o m b i n e t h e c o d e f o r s e l e c t i n g t h e r o w a n d s e l e c t i n g
t h e c o l u m n !
>>> bus.write_byte_data(addr,portA,
0x80>>col)
>>> bus.write_byte_data(addr,portB,
~(0x01<<row))
F i n a l l y , t o t u r n o f f a l l L E D s e n t e r :
>>> bus.write_byte_data(addr,portA, 0x00)
D e m o c o d e
W e n o w h a v e e n o u g h m a t e r i a l t o c r e a t e a d e m o
p r o g r a m . E a c h t y p e o f d e m o h a s b e e n g r o u p e d i n t o
i t s o w n r o u t i n e . T r y t y p i n g t h i s c o d e u s i n g y o u r
f a v o r i t e e d i t o r a n d s a v e i t a s m a t r i x - p a r t 2 . p y .
A l t e r n a t i v e l y y o u c a n c o p y i t f r o m
h t t p : / / w 8 b h . n e t / p i / m a t r i x - p a r t 2 . p y . Y o u c a n r u n i t f r o m
t h e c o m m a n d l i n e w i t h t h e f o l l o w i n g :
chmod +x matrix-part2.py
./matrix-part2.py
I n P a r t 3 o f t h i s s e r i e s w e w i l l c r e a t e s o m e i n t r i c a t e
m a t r i x d i s p l a y s . H a v e f u n !
#!/usr/bin/python# matrix-part2.py# Selectively turn on and off each row, column, and pixel
import smbus #gives us a connection to the I2C busimport time #for timing delays
#Definitions for the MCP23017 chip ADDR = 0x20 #The I2C address of our chipDIRA = 0x00 #PortA I/O direction, by pin. 0=output, 1=inputDIRB = 0x01 #PortB I/O direction, by pin. 0=output, 1=inputPORTA = 0x12 #Register address for PortA PORTB = 0x13 #Register address for PortBOUTPUT = 0INPUT = 1
# Lower Level LED Display routinesdef Init23017 ():
#Set up the 23017 for 16 output pinsbus.write_byte_data(ADDR,DIRA,0x00); #all zeros = all outputs on PortA bus.write_byte_data(ADDR,DIRB,0x00); #all zeros = all outputs on PortB
def TurnOffLEDS ():bus.write_byte_data(ADDR,PORTA,0x00) #set all columns low bus.write_byte_data(ADDR,PORTB,0x00) #set all rows low
def TurnOnLEDS ():bus.write_byte_data(ADDR,PORTA,0xFF) #set all columns low bus.write_byte_data(ADDR,PORTB,0x00) #set all rows low
def SetLED (row,col):#Turn on an individual LED at (row,col). All other LEDS off.bus.write_byte_data(ADDR,PORTA,0x80>>col)bus.write_byte_data(ADDR,PORTB,~(1<<row))
def SetColumn (col):#Turn on all LEDs in the specified column. Expects input of 0-7bus.write_byte_data(ADDR,PORTB,0x00)bus.write_byte_data(ADDR,PORTA,0x80>>col)
def SetRow (row):#Turn on all LEDs in the specified row. Expects input of 0-7bus.write_byte_data(ADDR,PORTA,0xFF)bus.write_byte_data(ADDR,PORTB,~(1<<row))
def Pause():#Turn off LEDS and wait a while between casesTurnOffLEDS();time.sleep(0.5);
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 19/361 9
def FlashLEDS (delay):#Flash all of the LEDS on/off for the specified timeTurnOnLEDS()time.sleep(delay)TurnOffLEDS()time.sleep(delay)
def LEDtest (delay):#Turn on all 64 LEDS for the specified time delay, in seconds
print "\nLighting all LEDS for %d seconds" % delayTurnOnLEDS() #turn them all ontime.sleep(delay) #wait a whilePause() #then turn them off
def FlashTest (numCycles,delay):print "\nFlash all of the LEDS"for count in range(0,numCycles):
FlashLEDS(delay)Pause()
def ColumnTest (numCycles):#Turn on each Column.
#Keep PortB (rows) low & set each bit in PortA (columns) high#This will actually light LEDS in reverse order, col 7 to col0,#because PortA bit 0 is wired to Col7, A1 to Col6,..., A7 to Col0print "\nTurn on Columns 0 to 7"for count in range(0,numCycles):
print "...cycle",count+1for col in range(0,8):
SetColumn(col)time.sleep(0.5)
time.sleep(1)Pause()
def RowTest (numCycles):#Turn on each row, from row 0 to row 7
#Keep PortA (columns) high & selectively turn a bit in PortB (rows) low print "\nTurn on Rows 0 to 7"for count in range(0,numCycles):
print "...cycle",count+1for row in range(0,8):
SetRow(row)time.sleep(0.5)
time.sleep(1)Pause()
def PixelTest (numCycles):#Flash each LED according to its (row,col) coordinateprint "\nFlash each LED in (row,col) order"
for count in range(0,numCycles):for row in range(0,8):for col in range(0,8):
SetLED(row,col)time.sleep(0.1)
Pause()
# Here is the program body: call each of the text routines in turn.
print "\nPi Matrix test program starting"bus = smbus.SMBus(1); #Use '1' for newer Pi boards; 0 for oldiesInit23017() #Set all 16 I/O pins as outputLEDtest(5) #Turn on all LEDS to verify connectivityFlashTest(25,0.1) #Flash them all for a little fun
ColumnTest(3) #Sequentially turn on Columns 0 to 7RowTest(3) #Sequentially turn on Rows 0 to 7PixelTest(1) #Flash each pixel in row,col orderFlashLEDS(0.1) #Visual end of testprint "\nDone."
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 20/36
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 21/36
L i v e r p o o l R a s p b e r r y J a m
W h e n : S a t u r d a y 6 t h J u l y 2 0 1 3 @ 9 . 3 0 a m
W h e r e : N o r t h L i v e r p o o l A c a d e m y , 1 2 0 H e y w o r t h S t , L i v e r p o o l , L 5 0 S Q
T h e e v e n t w i l l r u n f r o m 9 . 3 0 a m u n t i l 4 . 0 0 p m . F u r t h e r i n f o r m a t i o n a n d f r e e t i c k e t s a r e a v a i l a b l e a t
h t t p : / / r a s p b e r r y j a m . o r g . u k / e v e n t / l i v e r p o o l - r a s p b e r r y - j a m - r j a m - r j a m l p l - s a t u r d a y - 6 t h - j u l y - 2 0 1 3 /
W a n t t o k e e p u p t o d a t e w i t h a l l t h i n g s R a s p b e r r y P i i n y o u r a r e a ?
T h e n t h i s s e c t i o n o f T h e M a g P i i s f o r y o u ! W e a i m t o l i s t R a s p b e r r y J a m e v e n t s i n y o u r a r e a , p r o v i d i n g
y o u w i t h a R a s p b e r r y P i c a l e n d a r f o r t h e m o n t h a h e a d .
A r e y o u i n c h a r g e o f r u n n i n g a R a s p b e r r y P i e v e n t ? W a n t t o p u b l i c i s e i t ?
E m a i l u s a t : e d i t o r @ t h e m a g p i . c o m
B a r n s l e y H a c k - a - t h o n
W h e n : S a t u r d a y 6 t h J u l y 2 0 1 3 @ 9 . 0 0 a m
W h e r e : D i g i t a l M e d i a C e n t e r , B a n s l e y
T h i s e v e n t w i l l r u n f r o m 9 . 0 0 a m u n t i l 9 . 0 0 p m . T h e e v e n t i s f r e e . F u r t h e r i n f o r m a t i o n i s a v a i l a b l e a t
h t t p : / / m a k e d o . i n / h a c k d a y
L i m a R a s p b e r r y P i M e e t - u p
W h e n : S a t u r d a y 1 3 t h J u l y 2 0 1 3 @ 1 1 . 0 0 a m
W h e r e : L i m a P u b l i c L i b r a r y , 6 5 0 W M a r k e t S t , L i m a , O H
A t t e n d e e s w i l l r e c e i v e a n L R I T A . o r g f l a s h d r i v e a n d a p i z z a l u n c h .
R e g i s t e r a t h t t p : / / w w w . l r i t a . o r g / e v e n t s / b i t - t a l k / j u l y - 1 3 , - 2 0 1 3 - r a s p b e r r y - p i - m e e t - u p . a s p x
S i n g a p o r e R a s p b e r r y P i T r a i n i n g
W h e n : S a t u r d a y 1 3 t h J u l y @ 2 . 0 0 p m
W h e r e : S i n g a p o r e S c i e n c e C e n t r e , D i g i t a l D e s i g n S t u d i o , S i n g a p o r e 6 0 9 0 8 1
R u n s f r o m 2 . 0 0 - 4 . 3 0 p m . F r e e f o r S c i e n c e C e n t r e m e m b e r s , S $ 1 0 f o r o t h e r s . F u r t h e r i n f o r m a t i o n :
h t t p : / / w w w . i t s c . o r g . s g / i n d e x . p h p ? o p t i o n = c o m _ e v e n t b o o k i n g & t a s k = v i e w _ e v e n t & e v e n t _ i d = 7 4 & I t e m i d = 4 1
2 1
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 22/362
D r M i k e B a r t l e y
& C a r o l i n e H i g g i n s
G u e s t W r i t e r s
R A S P B E R R Y P I
B o o t C a m p s
W h a t a r e t h e i n g r e d i e n t s f o r a f u n
f i l l e d f a m i l y P i d a y ?
R a s p b e r r y P i B o o t C a m p e v e n t s a r e n o w b e i n g h e l d
o n a r e g u l a r b a s i s i n t h e s o u t h w e s t o f t h e U K . T h e
M a g P i a s k e d M i k e B a r t l e y , o n e o f t h e o r g a n i s e r s o f
t h e B r i s t o l e v e n t , t o t e l l u s a l l a b o u t t h e e v e n t s a n d
h o w t h e y c a m e a b o u t , h o p e f u l l y t o i n s p i r e s i m i l a r
e v e n t s e l s e w h e r e .
I n D e c e m b e r 2 0 1 2 t h e B r i s t o l b r a n c h o f B C S T h e
C h a r t e r e d I n s t i t u t e f o r I T h e l d i t s a n n u a l t a l k t o
e n c o u r a g e c h i l d r e n i n t o c o m p u t i n g . T h e v e n u e w a s
A t - B r i s t o l a n d t h e t h e m e w a s t h e R a s p b e r r y P i . W i t h
a n i n s p i r a t i o n a l t a l k f r o m R o b B i s h o p o f t h e
R a s p b e r r y P i F o u n d a t i o n , t h e e v e n t a t t r a c t e d o v e r
4 5 0 a t t e n d e e s w i t h a t l e a s t 3 0 0 b e i n g c h i l d r e n . S i n c e
t h e U K g o v e r n m e n t p r o p o s e d t h e p l a n n e d u p d a t e s t o
t h e I T c u r r i c u l u m l a s t y e a r t h e r e h a s b e e n a g r o w i n g
i n t e r e s t i n t h e s u b j e c t f r o m c h i l d r e n , p a r e n t s a n d
t e a c h e r s . I t w a s c l e a r w e h a d h i t a t o p i c o f h i g h
i n t e r e s t a n d w e n e e d e d t o u n d e r s t a n d h o w b e s t t o
t a k e i t f o r w a r d .
B o t h t h e U n i v e r s i t y o f B r i s t o l a n d A t - B r i s t o l h a v e
o u t r e a c h p r o g r a m s t o e n c o u r a g e c h i l d r e n i n t o
c o m p u t i n g a n d e n g i n e e r i n g . A c o l l a b o r a t i o n b e t w e e n
t h e t h r e e o r g a n i s a t i o n s s e e m e d l i k e a p e r f e c t w a y t o
c o l l e c t i v e l y a c h i e v e o u r g o a l s ; t o c r e a t e a s e r i e s o f
e v e n t s w h i c h s u p p o r t t h e l e a r n i n g o f t h e n e x t
g e n e r a t i o n o f i n n o v a t o r s a n d e n g i n e e r s , w h i l s t
p r o v i d i n g a f u n d a y o u t f o r t h e f a m i l y .
A t - B r i s t o l p r o v i d e s t h e f a c i l i t i e s a n d l o g i s t i c s ; t h e
U n i v e r s i t y o f B r i s t o l ’ s s t u d e n t s r u n a d r o p i n c l i n i c a n d
w o r k s h o p s a s w e l l a s l o a n i n g e q u i p m e n t . T h e B C S
p u t a c a l l o u t t o t h e i r m e m b e r s t o f i n d v o l u n t e e r s w h o
r u n w o r k s h o p s a n d d e m o n s t r a t i o n s . A l l t h r e e m a d e
f i n a n c i a l c o n t r i b u t i o n s o f s o m e s o r t . T h e v o l u n t a r y
" l e t ' s d o t h i s " a t t i t u d e p e r v a d e d t h e o r g a n i s a t i o n a n d
t h e e v e n t a n d e n a b l e d t h e t h r e e o r g a n i s a t i o n s t o w o r k
t o g e t h e r t o p u l l o f f t h e f i r s t t w o e v e n t s , w h i c h p r o v e d
t o b e h u g e l y s u c c e s s f u l .
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 23/362 3
O v e r 4 0 0 c h i l d r e n a n d 2 0 0 a d u l t s a t t e n d e d t h e f i r s t
t w o R a s p b e r r y P i B o o t C a m p s t o l e a r n w h a t t h e y c a n
d o w i t h t h e P i . F r o m c o n t r o l l i n g r e m o t e c o n t r o l c a r s
a n d L E D s t o s e t t i n g u p a h o m e m e d i a s e r v e r – t h e
c h i l d r e n g o t t o g r i p s w i t h h o w t h e y c a n u s e t h e
R a s p b e r r y P i t o m a k e t h i n g s !
M a r c u s a g e d 1 2 c o m m e n t e d " T h i s w a s f a n t a s t i c . M y
P i h a s b e e n a t h o m e i n i t s b o x f o r a w h i l e b u t I ’ v e n o w
l e a r n e d l o a d s o f c o o l t h i n g s t o d o w i t h i t . M e a n d m y
m a t e s a r e l o o k i n g f o r w a r d t o t h e n e x t o n e a l r e a d y ! "
T h e e v e n t s w i l l n o w b e c o m e a r e g u l a r f e a t u r e a t A t -
B r i s t o l o n a S a t u r d a y i n S e p t e m b e r , N o v e m b e r ,
J a n u a r y , M a r c h a n d M a y .
T h e w o r k s h o p s r a n g e d f r o m b e g i n n e r t o a d v a n c e
l e v e l , a n d a l s o i n c l u d e d a s h o w - a n d - t e l l s e c t i o n t h a t
g a v e v i s i t o r s t h e o p p o r t u n i t y t o l e a r n m o r e a b o u t
e x p e r t l e v e l p r o j e c t s . P i - C a r s p r o v e d t o b e v e r y
p o p u l a r w o r k s h o p ; c h i l d r e n h a d t h e o p p o r t u n i t y t o
b u i l d r e m o t e c o n t r o l h a n d s e t f o r a c a r u s i n g t h e i r
R a s p b e r r y P i . O t h e r w o r k s h o p s i n c l u d e d t h e P i a s a
h o m e m e d i a s e r v e r , l e d t r a f f i c l i g h t s a n d h o w t o l o g
d a t a t o t h e i n t e r n e t . T h e M a g p i t e a m w e r e o n h a n d t o
a n s w e r q u e s t i o n s . T h e s h o w - a n d - t e l l s e c t i o n i n c l u d e d
a n u m b e r o f r o b o t s c o n t r o l l e d b y a R a s p b e r r y P i a n d
a d r a w i n g r o b o t .
O b v i o u s l y o r g a n i s i n g a l a r g e s c a l e e v e n t o f t h i s
n a t u r e t h r o w s u p m a n y c h a l l e n g e s , f i n d i n g e n o u g h
e q u i p m e n t h a s b e e n t h e m a i n i s s u e . W e a s k e d
p e o p l e t o b r i n g t h e i r o w n m o n i t o r s , k e y b o a r d s a n d
p o w e r c a b l e s , w h i c h o f c o u r s e i s n ’ t a l w a y s p o s s i b l e .
W e e n c o u r a g e d v i s i t o r s b r i n g t h e i r l a p t o p s a n d t h e r e
w e r e v o l u n t e e r s o n h a n d t o s h o w t h e m h o w t o s e t u p
t h e i r l a p t o p t o c o n t r o l t h e i r P i .
F u t u r e B o o t C a m p s w i l l c o n t i n u e t h e t h e m e o f
w o r k s h o p s a n d d e m o n s t r a t i o n s o n t h e P i a n d o t h e r
p l a t f o r m s l i k e A r d u i n o . H o w e v e r , o t h e r a s p e c t s o f
c o m p u t i n g w i l l a l s o b e c o v e r e d . F o r e x a m p l e , t h e
s e c o n d B o o t C a m p o n J u n e 1 5 t h f e a t u r e d a ' R a i l s
G i r l s ' w o r k s h o p , h o s t e d b y l o c a l w e b a g e n c y
S i m p l e w e b . F e m a l e p r o g r a m m e r s w e r e i n v i t e d t o
s p e n d t h e d a y l e a r n i n g R u b y o n R a i l s . I n a d d i t i o n t o
t h i s w e r a n t h r e e 9 0 m i n u t e w o r k s h o p s w h i c h a i m e d
t o i n t r o d u c e c h i l d r e n t o a p p l i c a t i o n w r i t i n g u s i n g t h e
l a n g u a g e P r o c e s s i n g . T h e b a s i c s o f v a r i a b l e s ,
c o n d i t i o n a l s , l o o p s a n d f u n c t i o n s w i t h t h e a i m o f
d e v e l o p i n g a g a m e b y t h e e n d o f t h e w o r k s h o p . T h i s
w i l l h e l p t h e c h i l d r e n p r e p a r e f o r a f r e e o n e w e e k
p r o g r a m m i n g c o u r s e t o b e h e l d a t t h e U n i v e r s i t y o f
B r i s t o l a s p a r t o f a n a t i o n a l c o m p e t i t i o n o r g a n i s e d b y
t h e Y o u n g R e w i r e d S t a t e .
G o i n g f o r w a r d t h e t h r e e o r g a n i s a t i o n s w i l l c o n t i n u e t o
w o r k t o g e t h e r a s a l l o b j e c t i v e s r e m a i n c o m p l e t e l y
a l i g n e d . I t i s c l e a r t h a t c o l l a b o r a t i o n l i k e t h i s h a s b e e n
e x t r e m e l y b e n e f i c i a l i n e n a b l i n g u s t o a c h i e v e o u r
g o a l s . E v e n t s w i l l b e h e l d o v e r f i v e S a t u r d a y s e a c h
y e a r a n d t h e r e w i l l b e t h e m e s ( s u c h a s W i r e l e s s ,
R o b o t i c s , a n d s m a r t h o m e s ) t o k e e p t h e e v e n t s f r e s h .
T h e f i r s t t w o e v e n t s r e l i e d h e a v i l y o n t h e g o o d w i l l o f
v o l u n t e e r s . N o w t h a t w e h a v e o r g a n i s e d t w o
s u c c e s s f u l b o o t c a m p s w e n e e d t o e n s u r e t h e e v e n t
i s s u s t a i n a b l e b y a s k i n g f o r d o n a t i o n s a n d
s p o n s o r s h i p . W e w o u l d l i k e t o b u y d e d i c a t e d
e q u i p m e n t a n d c o v e r t h e c o s t s i n c u r r e d b y
v o l u n t e e r s . I f y o u w o u l d l i k e t o c o n t r i b u t e t o f u t u r e
e v e n t s b y p r o v i d i n g a w o r k s h o p , b e i n g p a r t o f t h e
s h o w - a n d - t e l l s e c t i o n o r b y m a k i n g a d o n a t i o n ,
p l e a s e c o n t a c t c a r o l i n e . h i g g i n s @ b r i s t o l . a c . u k
D r . M i k e B a r t l e y i s C h a i r o f B C S T h e C h a r t e r e d I n s t i t u t e f o r
I T i n B r i s t o l a n d o f t h e H i g h T e c h S e c t o r G r o u p o f t h e W e s t
o f E n g l a n d L o c a l E n t e r p r i s e P a r t n e r s h i p s .
C a r o l i n e H i g g i n s i s O u t r e a c h & S t u d e n t L i a i s o n M a n a g e r ,
F a c u l t y o f E n g i n e e r i n g , U n i v e r s i t y o f B r i s t o l .
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 24/364
D I F F I C U L T Y : A D V A N C E D
P e t e r N o w o s a d
G u e s t W r i t e r
P r o g r a m m i n g i n C h a r m p a r t 3
H a v i n g c o v e r e d R I S C O S o n t h e R a s p b e r r y P i
a n d C h a r m d a t a t y p e s i n t h e f i r s t t w o a r t i c l e s , i t ' s
m y p l e a s u r e t o w e l c o m e y o u t o t h e t h i r d a r t i c l e i n
t h e s e r i e s o n t h e C h a r m p r o g r a m m i n g l a n g u a g e .
I f y o u ' v e b e e n f o l l o w i n g t h e s e r i e s , y o u m a y w e l l
h a v e a l r e a d y i n s t a l l e d C h a r m u n d e r R I S C O S
a n d t r i e d o u t t h e p r i n t e d e x e r c i s e s . I f n o t i t ' s n o t
t o o l a t e t o g o b a c k a n d d o s o !
I n t h i s a r t i c l e I a m g o i n g t o c o v e r s o m e o f t h e
s y n t a x a n d s e m a n t i c s o f C h a r m i l l u s t r a t e d b y
s i m p l e e x a m p l e s w h i c h I h o p e w i l l w h e t y o u r
a p p e t i t e a n d a r m y o u ( n o p u n i n t e n d e d ! ) w i t h
e n o u g h k n o w l e d g e t o s t a r t w r i t i n g y o u r o w n
C h a r m p r o g r a m s .
C h a r m i s a n o b j e c t o r i e n t e d s t r u c t u r e d
p r o g r a m m i n g l a n g u a g e . T h e s t r u c t u r e d p r o g r a m
t h e o r e m , w h i c h p r o v i d e s t h e t h e o r e t i c a l b a s i s o f
s t r u c t u r e d p r o g r a m m i n g , s t a t e s t h a t t h r e e w a y s
o f c o m b i n i n g p r o g r a m s n a m e l y s e q u e n c i n g ,
s e l e c t i o n , a n d i t e r a t i o n a r e s u f f i c i e n t t o e x p r e s s
a n y c o m p u t a b l e f u n c t i o n .
S e q u e n c e
I n t h e a b s e n c e o f f l o w o f c o n t r o l
s t a t e m e n t s r e l a t e d t o s e l e c t i o n
a n d i t e r a t i o n , C h a r m p r o g r a m s
e x e c u t e a l i n e a t a t i m e f r o m t o p t o b o t t o m e . g .
int x := 1;
int y := 2;
int z := x + y;
do_this ();
do_that ();
h o w e v e r e v e n i n t h i s s i m p l e e x a m p l e do_this
a n d do_that
c a u s e c a l l o u t s t o n a m e d
p r o c e d u r e s t h a t c o n t a i n t h e i r o w n c o d e ( n o t
s h o w n h e r e ) . A l t h o u g h w h i t e s p a c e i s i g n o r e d ,
u s u a l l y e a c h l i n e c o n t a i n s a s i n g l e s t a t e m e n t
w h i c h e n d s w i t h a s e m i c o l o n , w i t h o n e c o m m o n
s t a t e m e n t t y p e b e i n g t h e a s s i g n m e n t s t a t e m e n t
i n w h i c h t h e l e f t h a n d s i d e i s a s s i g n e d t h e v a l u e
o f t h e e x p r e s s i o n o n t h e r i g h t h a n d s i d e w i t h t h e
t w o b e i n g s e p a r a t e d b y t h e a s s i g n m e n t
o p e r a t i o n :=
.
S e l e c t i o n
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 25/362 5
O f t e n p r o g r a m s w a n t t o t a k e d i f f e r e n t c o u r s e s o f
a c t i o n u n d e r d i f f e r e n t c o n d i t i o n s a n d t h i s i s
h a n d l e d b y s e l e c t i o n , w h i c h i n C h a r m i s p r o v i d e d
b y t h e if
a n d case
k e y w o r d s .
ifc h e c k s w h e t h e r t h e f o l l o w i n g c o n d i t i o n a l
e x p r e s s i o n e v a l u a t e s t o true i n w h i c h c a s e t h e
n e x t s t a t e m e n t , o r b l o c k o f s t a t e m e n t s e n c l o s e d
i n c u r l y b r a c k e t s i s e x e c u t e d , o r false
i n w h i c h
c a s e i t i s n o t .
T h e if
k e y w o r d h a s a n o p t i o n a l a s s o c i a t e d
elsek e y w o r d t h a t i f p r e s e n t i n t r o d u c e s t h e
s t a t e m e n t o r s t a t e m e n t s t h a t s h o u l d b e e x e c u t e d
i f t h e b o o l e a n e x p r e s s i o n i s n o t true
e . g .
i f x = 1y := 0;
else
y := 1;
N o t e t h e u s e o f i n d e n t a t i o n t o h e l p
h i g h l i g h t t h e f l o w o f c o n t r o l l o g i c .
T h e case
k e y w o r d i n t r o d u c e s a s e r i e s o f
c l a u s e s t h a t m a t c h t h e v a l u e o f a n i n t e g e r
v a r i a b l e a g a i n s t a n u m b e r o f p o s s i b l e c o n s t a n t
v a l u e s a n d c h o o s e s a b l o c k o f c o d e t o e x e c u t e
e . g .
case x
{
1: handle_1 ();
2: handle_2 ();
otherwise:
handle_other (x);
}
N o t e t h e u s e o f t h e otherwise
c l a u s e t o c a t c h
a n y v a l u e s t h a t d o n o t m a t c h .
I t e r a t i o n
S o m e t i m e s t h e s a m e c o d e
n e e d s t o b e e x e c u t e d
m a n y t i m e s w i t h i n a l o o p ,
o f t e n t o p r o c e s s e a c h
m e m b e r o f a n a r r a y . T h i s
i s h a n d l e d b y i t e r a t i o n
u s i n g t h e while
, repeat
a n d for
k e y w o r d s .
whilec h e c k s w h e t h e r t h e f o l l o w i n g c o n d i t i o n a l
e x p r e s s i o n e v a l u a t e s t o t r u e i n w h i c h c a s e t h e
n e x t s t a t e m e n t , o r b l o c k o f s t a t e m e n t s e n c l o s e d
i n c u r l y b r a c k e t s a r e e x e c u t e d u n t i l t h e
e x p r e s s i o n e v a l u a t e s t o f a l s e e . g .
while true loop ();
repeati s s i m i l a r t o w h i l e b u t t h e c o n d i t i o n a l
e x p r e s s i o n i s a t t h e e n d o f t h e l o o p a n d m u s t
e v a l u a t e t o false
f o r t h e l o o p t o b e r e p e a t e d
e . g .
repeat loop (); false;
fora l l o w s a c o n t r o l v a r i a b l e t o b e i n i t i a l i s e d ,
i n c r e m e n t e d a n d t e s t e d a l l i n o n e s t a t e m e n t e . g .
i n i t i a l i s e s t h e c o n t e n t s o f a n i n t e g e r a r r a y o f s i z e
1 0 t o 0 .
B o o l e a n e x p r e s s i o n s
B o o l e a n e x p r e s s i o n a p p e a r a s p a r t o f m a n y f l o w
o f c o n t r o l s t a t e m e n t s i n C h a r m a n d c a n b e
c o m p o s e d o f t h e f o l l o w i n g c o m p a r i s o n o p e r a t o r s :
= - e q u a l
# - n o t e q u a l
: = : - e q u a l ( p o i n t e r c o m p a r i s o n )
: # : - n o t e q u a l ( p o i n t e r c o m p a r i s o n )
> - g r e a t e r t h a n
< - l e s s t h a n
> = - g r e a t e r t h a n o r e q u a l t o
< = - l e s s t h a n o r e q u a l t o
I f A a n d B a r e b o o l e a n e x p r e s s i o n s , t h e y c a n b e
c o m b i n e d u s i n g t h e l o g i c a l o p e r a t o r s :
A a n d B - b o t h A a n d B m u s t b e t r u e
A o r B - e i t h e r A o r B m u s t b e t r u e
n o t A - A m u s t b e f a l s e
for (int i := 0 step i := i + 1 while i < 10) a[i] := 0;
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 26/366
n i l
T h e nil
k e y w o r d o c c u p i e s a s p e c i a l p l a c e i n t h e
C h a r m l a n g u a g e a n d c a n b e u s e d t o i n i t i a l i s e
a n d t e s t p o i n t e r s ( r e f v a r i a b l e s ) . I t i n d i c a t e s t h a t
t h e p o i n t e r i s n o t c u r r e n t l y s e t u p t o p o i n t
a n y w h e r e , a n d a n a t t e m p t t o u s e i t w i l l r e s u l t i n
a n e x c e p t i o n t h a t s t o p s p r o g r a m e x e c u t i o n .
T r e e r e c u r s i o n
T h e f o l l o w i n g p r o g r a m u s e s t r e e r e c u r s i o n a n d
t h e l a n g u a g e c o n s t r u c t s t o d r a w a t r e e o n t h e
s c r e e n
import lib.Maths;
import lib.Vdu;
module Tree{
const
MODE = 31, | display mode |
OFFSET = 30, | display offset |
LEVELS = 7, | branch levels |
VARS = 1000; | variations |
int xmax, ymax, xshift, yshift; | screen parameters |
proc variation (real value, real deviation) real
{
return value * (1 + deviation * (0.5 - 1.0 * (Maths.random () mod (VARS + 1)) / VARS));
}
proc branch (int level, real length, real angle, int xs, int ys)
{
int xe := xs + length * Maths.fn.cos(angle);
int ye := ys + length * Maths.fn.sin(angle);
Vdu.plot (Vdu.P_POINT + Vdu.P_PLOT_F_ABS, xs l_sl xshift, ys l_sl yshift);
Vdu.plot (Vdu.P_PLOT_F_ABS, xe l_sl xshift, ye l_sl yshift);
if level > 1 + Maths.random () mod 2
{
real scale := variation (0.65, 0.25);int branches := level - Maths.random () mod 3;
if branches <= 0 return;
real range := variation (1.5, 0.2);
for int i := 0 step inc (i) while i <= branches
{
real factor := variation (0.5, 0.8);
if i = branches factor := 0;
branch (level - 1,
variation (length * scale, 0.2),
variation (angle, 0.3) + i * range / branches - range / 2,
xe - (xe - xs) * factor, ye - (ye - ys) * factor);}
}
}
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 27/364
T o m a k e t h e t r e e l o o k m o r e r e a l i s t i c s o m e
b r a n c h p a r a m e t e r s h a v e b e e n r a n d o m i s e d , f o r
e x a m p l e t h e i r l e n g t h a n d t h e a n g l e b e t w e e n
t h e m . T o c o m p i l e t h i s p r o g r a m , C h a r m v e r s i o n
2 . 6 . 5 o r n e w e r i s n e e d e d .
F o r t h i s m o n t h ' s e x e r c i s e a d d s o m e f r u i t ( h i n t
r a n d o m l y d r a w s o m e c o l o u r e d c i r c l e s a t o r n e a r
b r a n c h e n d s ) .
N e x t T i m e
N e x t t i m e I i n t e n d t o t a l k a b o u t w r i t i n g c o n t a i n e r s
i n C h a r m , n a m e l y s e t s , l i s t s a n d m a p s .
export proc ~start ()
{
Vdu.mode (MODE);
xshift := Vdu.mode_var (MODE, Vdu.MV_X_EIG_FACTOR);
yshift := Vdu.mode_var (MODE, Vdu.MV_Y_EIG_FACTOR);
xmax := Vdu.mode_var (MODE, Vdu.MV_X_WINDOW_LIMIT) + 1;
ymax := Vdu.mode_var (MODE, Vdu.MV_Y_WINDOW_LIMIT) + 1;Vdu.g_colour (0, 7);
Vdu.plot (Vdu.P_POINT + Vdu.P_PLOT_F_ABS, OFFSET l_sl xshift, OFFSET l_sl yshift);
Vdu.plot (Vdu.P_RECTANGLE_FILL + Vdu.P_PLOT_F_ABS,
(xmax - OFFSET - 1) l_sl xshift,
(ymax - OFFSET - 1) l_sl yshift);
Vdu.g_colour (0, 0);
branch (LEVELS, (ymax - OFFSET) / 3, Maths.fn.asn(1), (xmax - OFFSET) / 2, OFFSET);
}
}
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 28/368
D I F F I C U L T Y : M E D I U M
V l a d i m i r A l a r c ó n
& N a t h a n i e l M o n s o n
G u e s t W r i t e r s
F R E S H L Y R O A S T E D
A b e g i n n e r s g u i d e t o J a v a
A P i a n d a c u p o f J a v a , p l e a s e !
Y o u w i l l n e e d :
- A R a s p b e r r y P i w i t h R a s p b i a n .
- 1 5 0 M B o f f r e e s p a c e i n y o u r S D c a r d .
- B a s i c k n o w l e d g e o f p r o g r a m m i n g .
- B a s i c c o m m a n d - l i n e u s a g e .
I n t r o d u c t i o n
I n t h i s a r t i c l e I ' l l s h o w y o u h o w t o w r i t e a n d r u n J a v a
p r o g r a m s o n y o u r R a s p b e r r y P i .
J a v a i s a n o b j e c t - o r i e n t e d l a n g u a g e d e s i g n e d t o r u n
o n m a n y o p e r a t i n g s y s t e m s w i t h o u t r e q u i r i n g
r e c o m p i l a t i o n o f t h e s o u r c e c o d e . J a v a a l s o i n c l u d e s
a v a s t a m o u n t o f l i b r a r i e s , w h i c h o f f e r s o l u t i o n s t o
m o r e a d v a n c e d p r o b l e m s l i k e r u n n i n g c o m p l e x w e b
s i t e s o r h i g h - e n d m i s s i o n - c r i t i c a l a l g o r i t h m s . I n t h i s
a r t i c l e I w i l l f o c u s o n t h e v e r y b a s i c s o f t h e l a n g u a g e .
O n c e y o u m a s t e r t h e l a n g u a g e t h e r e a r e p l e n t y o f
w e b s i t e s o n t h e I n t e r n e t w i t h l o t s o f d e t a i l s o f
l i b r a r i e s a n d m a n y e x a m p l e s .
I ' l l f i r s t s h o w y o u t h e s t e p s t o i n s t a l l t h e J a v a c o m p i l e r
a n d v i r t u a l m a c h i n e o n t h e R a s p b e r r y P i . T h e n , w e ' l l
c r e a t e a c o u p l e o f b a s i c J a v a p r o g r a m s . . . a n d w e ' l l
r u n t h e m !
T h i s a r t i c l e s h o w s y o u t h e r u n n i n g e x a m p l e s f i r s t , a n d
d e l v e s i n t o c o n c e p t s l a t e r . T h e i d e a b e h i n d t h i s
a p p r o a c h i s t h a t i t w i l l b e e a s i e r f o r y o u t o l o o k a t r e a l
J a v a p r o g r a m s a n d t r y t o i d e n t i f y t h e n e w e l e m e n t s
a n d t h e i r f u n c t i o n s b y y o u r s e l f . O n c e y o u h a v e w r i t t e n
t h e p r o g r a m a n d r u n i t , I w i l l e x p l a i n t h e n o v e l t i e s .
1 . I n s t a l l a t i o n
T o w r i t e , c o m p i l e a n d r u n y o u r p r o g r a m , y o u ' l l n e e d
t w o t h i n g s : a t e x t e d i t o r , a n d a J a v a d e v e l o p m e n t k i t
( J D K ) . Y o u c a n u s e a n y t e x t e d i t o r t o w r i t e a J a v a
p r o g r a m . I p r e f e r Geany b e c a u s e o f i t s s y n t a x
c o l o u r i n g , b u t Leafpad o r GEdit w i l l w o r k t o o .
W h i l e t h e r e a r e s e v e r a l J D K s , I s u g g e s t O p e n J D K 7 .
A J D K i n c l u d e s ( m a i n l y ) a c o m p i l e r a n d a J a v a v i r t u a l
m a c h i n e ( J V M ) . T h e c o m p i l e r g e n e r a t e s p l a t f o r m
i n d e p e n d e n t b y t e c o d e a n d t h e J V M i s a b l e t o r u n t h i s
b y t e c o d e .
T o i n s t a l l Geany a n d O p e n J D K 7 o p e n a t e r m i n a l
w i n d o w a n d t y p e :
sudo apt-get install -y openjdk-7-jdk geany
I t w i l l p r o b a b l y t a k e a t l e a s t n i n e m i n u t e s t o d o w n l o a d
a n d i n s t a l l e v e r y t h i n g , b u t i t c a n t a k e l o n g e r
d e p e n d i n g o n t h e s p e e d o f y o u r i n t e r n e t c o n n e c t i o n .
O n c e t h e i n s t a l l a t i o n h a s f i n i s h e d , c h e c k b o t h
p a c k a g e s a r e i n s t a l l e d c o r r e c t l y . Y o u s h o u l d b e a b l e
t o o p e n Geany f r o m t h e m a i n m e n u , u n d e r
" P r o g r a m m i n g " . T o t e s t O p e n J D K 7 , o p e n a t e r m i n a l
w i n d o w a n d t y p e :
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 29/362 9
java -version
I t s h o u l d d i s p l a y a f e w l i n e s s t a r t i n g w i t h :
java version "1.7...
OpenJDK ...
2 . R u n n i n g o u r f i r s t p r o g r a m
C r e a t e a d i r e c t o r y t o s t o r e o u r p r o g r a m s . F o r
e x a m p l e , o p e n a t e r m i n a l a n d t y p e :
mkdir cupofjava
N o w i t i s t i m e t o w r i t e o u r f i r s t p r o g r a m ( a c l a s s )
c a l l e d " H i T h e r e " . J a v a i s a n o b j e c t o r i e n t e d
p r o g r a m m i n g l a n g a u g e , w h e r e e v e r y p r o g r a m
c o n t a i n s a t l e a s t o n e c l a s s w h i c h i n t u r n c a n u s e
o t h e r c l a s s e s .
O p e n t h e t e x t e d i t o r ( Geany i n m y c a s e ) a n d c r e a t e a
f i l e c a l l e d HiThere.java. T y p e i n ,
public class HiThere {
public static void main(String[] args) {
System.out.println("A Java Pi!");
}
}
a n d s a v e t h e f i l e . U s i n g t h e t e r m i n a l , c h a n g e t o t h e
d i r e c t o r y " cupofjava " ( w h e r e y o u c r e a t e d t h e
p r o g r a m ) u s i n g :
cd cupofjava
a n d t h e n t y p e :
javac HiThere.java
T h e javac c o m m a n d c o m p i l e s t h e .java f i l e i n t o a
.class f i l e . T h e c o m p i l e r a n a l y s e s t h e s o u r c e c o d e
i n t h e HiThere.java f i l e a n d g e n e r a t e s t h e
b i t e c o d e f o r m . A f t e r 1 5 s e c o n d s o r s o , t h i s c o m m a n d
s h o u l d s i l e n t l y f i n i s h . I f y o u m i s s p e l l e d s o m e t h i n g i t
w i l l s h o w a n e r r o r m e s s a g e t h a t w i l l d i s p l a y w h e r e t h e
p r o b l e m i s . I f t h i s i s t h e c a s e , g o b a c k t o t h e t e x t
e d i t o r , c h e c k y o u r c o d e a n d f i x t h e m i s s p e l l i n g , s a v e
t h e f i l e , a n d t h e n r u n j a v a c a g a i n . O n c e t h e f i l e h a s
b e e n s u c c e s s f u l l y c o m p i l e d , y o u ' l l f i n d a n e w f i l e i n
t h e s a m e d i r e c t o r y c a l l e d HiThere.class
. T h i s i s
t h e c o m p i l e d p r o g r a m t h a t w i l l b e r u n .
T o r u n t h e p r o g r a m t y p e :
java HiThere
Y o u d o n ' t n e e d t o s p e c i f y t h e .class e x t e n s i o n .
T h e c o m m a n d javac c o m p i l e s p r o g r a m s , a n d t h e
c o m m a n d java
e x e c u t e s t h e m .
T h e p r o g r a m w i l l r u n a n d w i l l d i s p l a y :
A Java Pi!
W e l l . . . C o n g r a t u l a t i o n s ! Y o u h a v e w r i t t e n a n d r u n
y o u r f i r s t J a v a p r o g r a m o n t h e R a s p b e r r y P i .
Y o u p r o b a b l y n o t i c e d t h e p r o g r a m t o o k a f e w
s e c o n d s t o w r i t e t h a t m e s s a g e . W h y s o s l o w ?
A c t u a l l y , J a v a i s q u i t e f a s t . T h e w h o l e p r o g r a m t o o k
o n l y a c o u p l e o f m i l l i s e c o n d s t o r u n , b u t J a v a n e e d s a
f e w s e c o n d s a t t h e b e g i n n i n g t o l o a d t h e J V M . T h e
g o o d n e w s i s t h a t o n c e t h e J V M i s l o a d e d , t h e
p r o g r a m r u n s v e r y f a s t .
W e l l , l e t ' s n o w l o o k a t t h e p r o g r a m i n m o r e d e t a i l .
T h e r e ' s o n l y o n e l i n e i n i t t h a t i s a c t u a l l y e x e c u t e d .
T h i s l i n e i s :
System.out.println("A Java Pi!");
T h e o t h e r l i n e s s p e c i f y t h e n a m e o f t h e c l a s s
" HiThere
" ( a t l i n e 1 ) , a n d t h e n a m e o f t h e m e t h o d
main ( a t l i n e 3 ) . T h i s c l a s s , s i m i l a r t o a n y o t h e r J a v a
c l a s s , c a n h a v e m a n y m e t h o d s b u t w e a r e u s i n g o n l y
a s i n g l e o n e i n t h i s e x a m p l e .
C h a l l e n g e # 1 : Y o u r t u r n n o w . U s i n g t h e t e x t e d i t o r ,
c h a n g e t h e m e s s a g e i n b e t w e e n d o u b l e q u o t e s i n t h e
s o u r c e f i l e f r o m " A J a v a P i ! " t o " M y n a m e i s N a m e . "
( u s e y o u r n a m e ) a n d s a v e i t . W i t h t h e t e r m i n a l ,
c o m p i l e t h e p r o g r a m a g a i n a n d r u n i t u s i n g t h e t w o
c o m m a n d s ( j a v a c a n d j a v a ) s h o w n b e f o r e . I f y o u d o i t
r i g h t , t h e p r o g r a m w i l l d i s p l a y y o u r n a m e n o w . D o i t !
A n o t e : T h e s y n t a x o f J a v a ( t h e w o r d s a n d
p u n c t u a t i o n o f t h e l a n g u a g e ) i s v e r y s i m i l a r t o t h e
s y n t a x o f t h e C l a n g u a g e . A n y p r o g r a m m e r w i t h
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 30/360
k n o w l e d g e o f C w i l l f i n d t h e b a s i c s o f J a v a v e r y e a s y
t o u n d e r s t a n d .
3 . J a v a v a r i a b l e s a n d C o n t r o l f l o w
T h e n e x t e x a m p l e i l l u s t r a t e s t h e u s e o f v a r i a b l e s a n d
c o n t r o l f l o w s t a t e m e n t s . I n t h e s a m e d i r e c t o r y w h e r e
w e s t o r e d t h e f i r s t p r o g r a m , c r e a t e a n e w f i l e c a l l e d
DiceRoller.java. T h e n a p p e n d ,
import java.util.Random;
public class DiceRoller {
public static void main(String[] args) {
Random generator = new Random();
int d = 0;
while (d < 4) {
System.out.print("Rolling... ");
int face = 1 + generator.nextInt(6);
System.out.print("I got a "+ face
+ ". ");
if (face == 1) {
System.out.print("Wow! An ACE!");
}
System.out.println();
d = d + 1;
}
}
}
t o t h e f i l e a n d s a v e i t . C o m p i l e a n d t h e n r u n t h e
p r o g r a m .
javac DiceRoller.java
java DiceRoller
Y o u ' l l s e e s o m e t h i n g s i m i l a r t o :
Rolling... I got a 2.
Rolling... I got a 1. Wow! An ACE!
Rolling... I got a 4.
Rolling... I got a 5.
T h e p r o g r a m w i l l r o l l f o u r d i c e a n d w i l l i d e n t i f y w h i c h
o n e s a r e a c e s ( t h e n u m b e r 1 ) . D o y o u s e e h o w i t
w o r k s ?
T h e r e a r e q u i t e a f e w t h i n g s o f i n t e r e s t i n t h i s
e x a m p l e . T h i s p r o g r a m u s e s t w o i n t e g e r v a r i a b l e s ,
n a m e d d
a n d face
. T h e v a r i a b l e d
i s u s e d t o m a k e
s u r e w e r o l l f o u r t i m e s , n o t t h r e e t i m e s o r n o t f i v e
t i m e s . T h e face
v a r i a b l e s t o r e s t h e d i e f a c e a f t e r
e a c h r u n . T h e p r o g r a m a l s o r e c e i v e s a n a r r a y o f
s t r i n g s i n t h e v a r i a b l e n a m e d args. T h e args
v a r i a b l e c o n t a i n s t h e c o m m a n d - l i n e p a r a m e t e r s
p r e s e n t w h e n t h e p r o g r a m i s r u n . F i n a l l y , t h e
p r o g r a m a l s o u s e s a n o b j e c t c a l l e d generator.
R e m e m b e r I t o l d y o u a J a v a c l a s s c a n u s e o t h e r
c l a s s e s ? T h i s i s a n e x a m p l e . T h i s p r o g r a m u s e s a n
e x i s t i n g c l a s s ( c a l l e d Random) t h a t s p e c i a l i z e s i n
g e n e r a t i n g r a n d o m n u m b e r s . A c l a s s c a n b e u s e d b y
c a l l i n g i t s m e t h o d s , e i t h e r d i r e c t l y o r b y c r e a t i n g a n
o b j e c t . I n t h i s c a s e w e o n l y u s e o n e o f i t s m e t h o d s ,
t h e o n e c a l l e d nextInt(), t o g e t a r a n d o m n u m b e r .
A d d i t i o n a l l y , J a v a u s e s t h e b r a c k e t s {
a n d }
t o d e f i n e
g r o u p s o f i n s t r u c t i o n s , c a l l e d b l o c k s . E a c h b l o c k c a n
b e e m p t y , o r h a v e o n e o r m o r e i n s t r u c t i o n s . Y o u c a n
d e f i n e s u b - b l o c k s i n s i d e e x i s t i n g b l o c k s a s n e e d e d .
T h i s i s c o m m o n l y u s e d i n c o n t r o l - f l o w s t a t e m e n t s .
T a l k i n g a b o u t t h i s , . . . t h i s e x a m p l e s h o w s t h e u s e o f
t w o c o n t r o l - f l o w s t a t e m e n t s : if a n d while. A n if
s t a t e m e n t e x e c u t e s a b l o c k o n l y i f t h e c o n d i t i o n
s p e c i f i e d i n p a r e n t h e s i s i s t r u e ; a while, o n t h e o t h e r
h a n d , w i l l e x e c u t e t h e n e s t e d b l o c k m u l t i p l e t i m e s a s
l o n g a s t h e c o n d i t i o n i s t r u e . O t h e r c o n t r o l b l o c k s a r e
for, do- while, switch a n d if- else.
I n t h e e x a m p l e , t h e if
s t a t e m e n t c h e c k s t h e v a l u e o f
face. T h a t ' s w h y t h e e x t r a m e s s a g e a p p e a r s o n l y
w h e n a n a c e i s r o l l e d . T h e while s t a t e m e n t , o n t h e
o t h e r h a n d , e x e c u t e s t h e i n c l u d e d b l o c k f o u r t i m e s .
T h e while l o o p c o n t i n u e s w h i l e t h e v a l u e o f t h e
v a r i a b l e d i s l e s s t h a n 4 . N o t i c e t h a t t h e v a r i a b l e i s
s e t t o z e r o b e f o r e t h e l o o p . I n s i d e t h e l o o p i t
i n c r e a s e s b y o n e a t t h e e n d o f t h e b l o c k . T h e r e f o r e ,
t h e f i r s t f o u r t i m e s ( 0 , 1 , 2 , 3 ) t h e while s u c c e e d s ,
b u t o n t h e f i f t h o n e ( w h e n i t h a s t h e v a l u e 4 ) i t f a i l s .
C h a l l e n g e # 2 : C h a n g e t h e p r o g r a m t o r o l l 7 d i c e ,
w h e r e e a c h d i c e h a s 1 0 f a c e s . O n c e y o u h a v e s a v e d
y o u r c h a n g e s , g o t o t h e c o m p i l e t h e p r o g r a m a g a i n
a n d r u n i t u s i n g t h e t w o c o m m a n d s ( javac
a n d
java) s h o w n b e f o r e . I f y o u d o i t r i g h t , t h e p r o g r a m
w i l l n o w d i s p l a y a l l s e v e n d i c e . G o f o r i t !
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 31/36
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 32/362
D I F F I C U L T Y : A D V A N C E D
W . H . B e l l
M a g P i W r i t e r
C L I E N T S E R V E R
M o d e l f o r u s i n g m a n y c o m p u t e r s
P a r a l l e l c a l c u l a t i o n s - p a r t 3
C o m p l e t i n g B a t c h C a l c u l a t o r
W e l c o m e b a c k t o t h e P y t h o n P i t . T h i s a r t i c l e i s a c o n t i n u a t i o n o f t h e t u t o r i a l p r e s e n t e d i n I s s u e s 1 0 a n d 1 3 . I f y o u h a v e n o t
a l r e a d y d o n e s o , i t w o u l d b e a g o o d i d e a t o r e a d t h e p r e v i o u s p a r a l l e l c a l c u l a t i o n s a r t i c l e s i n t h e s e I s s u e s b e f o r e p r o c e e d i n g .
T h e FunctionCalculator.py f i l e w a s o r i g i n a l l y w r i t t e n t o r u n a g e n e t i c a l g o r i t h m , u s i n g s e v e r a l c o m p u t e r s a t o n c e . T h e
c a l c u l a t i o n s f o r e a c h p o i n t i n t h e g e n e t i c a l g o r i t h m w e r e e v a l u a t e d u s i n g C + + a n d r a n f o r a r o u n d e i g h t m i n u t e s o n h i g h
s p e c i f i c a t i o n C P U c o r e s . I n t h i s c a s e , t h e t i m e o v e r h e a d o f s e r v e r a n d c l i e n t p r o c e s s e s w r i t t e n i n P y t h o n w a s n e g l i g a b l e .
S i n c e t h e c l u s t e r u s e d w a s o f t e n u s e d f o r o t h e r t a s k s , t h e i m p l e m e n t a t i o n o f FunctionCalculator.py p r o v i d e d a w a y o f
u s i n g a s m a n y c o r e s a s p o s s i b l e w i t h o u t r e q u i r i n g a r i g i d a d d r e s s i n g s t r u c t u r e .
T h e r e r e m a i n t w o s t e p s l e f t i n t h i s s e r i e s o f a r t i c l e s : ( i ) t h e c o m p l e t i o n o f t h e BatchCalculator c l a s s a n d ( i i ) t h e u s e o f
FunctionCalculator.py t o r u n s o m e m o r e s e r i o u s c a l c u l a t i o n s . O p e n t h e f i l e FunctionCalculator.py f r o m I s s u e
1 3 . T h e n g o d o w n t o f u n c t i o n shutdown i n t h e c l a s s BashCalculator . A f t e r shutdown , a d d t h e m e m b e r f u n c t i o n
evaluate :
def evaluate(self, cmds):
# Wait until at least one client thread is availablewhile len(self.client_threads) == 0:
print "Waiting for a client to connect"time.sleep(5)
ncmds = len(cmds)
# Create a buffer to collect the resultsresults = [0.]*ncmds
# If no commands were given return empty list of resultsif ncmds == 0:
return results
# Create a buffer to collect the status of the results and the results# 0 => not calculated, 1 => being calculated, 2 => done
status_results = []icmd = 0while icmd < ncmds:
status_results.append(StatusResult(0,0.))icmd = icmd + 1
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 33/363 3
# Loop until all of the calculations have finished.finished = Falseithread = 0icmd = 0while not finished:
print "Looping"print "Status and results = %s" % status_resultstime.sleep(1)
# Check if all status flags are 2 and copy the results into the# results list at the same timejobsLeft = Falsefor i in xrange(ncmds):
sr = status_results[i]if sr.cmd_status != 2:
jobsLeft = Truebreak
results[i] = sr.result
if not jobsLeft:finished = Truecontinue
print "Have jobs to do"
# Check the number of threads inside the loop in case more# threads are created during the loopnthreads = len(self.client_threads)
print "Currently have %d threads to work with" % nthreads
# If the index points at the last thread go back to the# first thread.if ithread == nthreads:
ithread = 0
print "Using thread index %d" % ithread
# If the index points at the last cmd go back to the first cmd.if icmd == ncmds:
icmd = 0
print "Checking cmd index %d" % icmd
# Check if this cmd has been submitted or not. If the# command has already been submitted skip to the next# command.if status_results[icmd].cmd_status != 0:
print "Command %d has status %d" % (icmd, status_results[icmd].cmd_status)
icmd = icmd + 1continue
print "Searching for an idle thread"
# Find an idle threadfoundThread = Falsewhile not foundThread:
# Check the number of threads inside the loop in case more# threads are created during the loopnthreads = len(self.client_threads)
# Keep looping round and round.
if ithread == nthreads:ithread = 0
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 34/364
T h e evaluate f u n c t i o n t a k e s a l i s t o f c o m m a n d s a n d r e t u r n s a l i s t o f f l o a t i n g p o i n t n u m b e r s w h i c h c o r r e s p o n d t o e a c h
c o m m a n d . T h e f u n c t i o n p e r f o r m s t h e c a l c u l a t i o n s b y p a s s i n g e a c h c o m m a n d t o a c l i e n t p r o c e s s .
T h e evaluate f u n c t i o n w a i t s u n t i l a l e a s t o n e c l i e n t t h r e a d h a s c o n n e c t e d . O n c e o n e c l i e n t h a s c o n n e c t e d a while l o o p i s
u s e d t o e v a l u a t e e a c h o f t h e c o m m a n d s . T h e c o m m a n d s a r e g i v e n a n a s s o c i a t e d s t a t u s c o d e o f z e r o , w h i c h i s s e t t o o n e i f
t h e c o m m a n d i s b e i n g e v a l u a t e d o r t w o i f t h e c o m m a n d h a s b e e n e v a l u a t e d . T o p r e v e n t a t i g h t l o o p a n d a n a s s o c i a t e d h i g h
u s e o f C P U o n t h e c o m p u t e r r u n n i n g t h e BatchCalculator , a sleep s t a t e m e n t i s u s e d w i t h i n s e v e r a l o f t h e l o o p s . T h e r e
a r e a l o t o f print s t a t e m e n t s t o s h o w h o w t h e f u n c t i o n w o r k s .
I f a c l i e n t p r o c e s s c o n n e c t s t o t h e s e r v e r w h i l e s o m e c o m m a n d s a r e b e i n g e v a l u a t e d , t h e n i t w i l l b e a d d e d t o t h e p o o l o f
a v a i l a b l e c l i e n t s . T h e r e f o r e , t h e s p e e d o f c a l c u l a t i o n w i l l i n c r e a s e a s m o r e c l i e n t s c o n n e c t . T h e evaluate f u n c t i o n w a i t s
f o r o n e o f t h e a s s o c i a t e d t h r e a d s t o b e c o m e a v a i l a b l e a n d p a s s e s i t a c o m m a n d . W h e n a c o m m a n d h a s b e e n e v a l u a t e d t h e
r e s u l t i s s t o r e d i n t h e status_results l i s t a n d t h e n c o p i e d i n t o t h e results l i s t . T h e status_results l i s t i s o f t y p e
StatusResult, w h i c h i s m u t a b l e . T h e r e f o r e , t h e
client_threadsf u n c t i o n i s p a s s e d a p o i n t e r t o t h e e l e m e n t o f t h e l i s t ,
c a n w r i t e t h e r e s u l t s i n t o i t , a n d s e t t h e c o m m a n d s t a t u s .
T e s t i n g t h e B a t c h C a l c u l a t o r
W h i l e t h e launchBatchClient.py p r o g r a m f r o m t h e l a s t t u t o r i a l i n I s s u e 1 3 c a n b e u s e d t o s t a r t t h e c l i e n t s , t h e s e r v e r
p r o g r a m launchBatchCalculator.py n e e d s t o b e u p d a t e d t o p a s s a l i s t o f c o m m a n d s t o t h e evaluate f u n c t i o n o f t h e
BatchCalculator. L o o k b a c k a t t h e f i r s t a r t i c l e i n t h i s s e r i e s a n d s e e h o w t h e c o m m a n d s w e r e p a s s e d t o t h e
FunctionCalculator.py . T h e n t r y t o n u m e r i c a l l y s o l v e ,
y = 4*x**4 - (x - 4)**3/(6-x)**2 + x
f o r t h e v a l u e o f x w h e n y i s 1 0 . C h o o s e 1 0 0 v a l u e s o f x a t r a n d o m b e t w e e n - 1 0 0 0 a n d 1 0 0 0 . P a s s t h e s e e q u a t i o n s t o t h e
BatchCalculator. P i c k t h e b e s t t w o p o i n t s a n d s e l e c t a n o t h e r 1 0 0 v a l u e s f o r x w i t h i n t h e s e c o n d r a n g e . R e p e a t t h e
p r o c e d u r e u n t i l a s o l u t i o n i s f o u n d . W h i l e t h i s c a l c u l a t i o n w i l l r u n s l o w e r t h a n u s i n g a s i n g l e R a s p b e r r y P i , t h e p r o b l e m w i l l
d e m o n s t r a t e h o w t o u s e t h e BatchCalculator
. T h e s o l u t i o n t o t h e p r o b l e m w i l l b e g i v e n n e x t t i m e .
self.client_threads[ithread].processingCmd().wait(1) # wait until finished or 1 sec.if not self.client_threads[ithread].processingCmd().isSet():
foundThread = Trueelse:
ithread = ithread + 1time.sleep(1)
# If there are no available threadsif not foundThread:
print "All threads are busy processing commands."time.sleep(2)continue
# Submit the command and the target list elementprint "icmd %d" % icmdsr = status_results[icmd]self.client_threads[ithread].evaluate(cmds[icmd], sr)
# Go to the next commandicmd = icmd + 1
# For debugging
print "results = %s" % results
return results
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 35/36
T o s e e t h e l a r g e r a n g e o f P C S L b r a n d R a s p b e r r y P i a c c e s s o r i e s v i s i t
h t t p : / / w w w . p c s l s h o p . c o m
June's Winners!T h e w i n n e r o f a n e w 5 1 2 M B R a s p b e r r y P i M o d e l B p l u s P C S L P i A n g l e c a s e a n d G P I O
C o b b l e r k i t i s S u r a j p a l S i n g h ( B r i s t o l , U K ) .
T h e 2 n d a n d 3 r d p r i z e w i n n e r s o f a P C S L P i A n g l e c a s e a r e J a m e s D u f f e l l ( P r e s t o n , U K ) a n d
K o b i t h a r u n K u n a s e k a r a n ( S c a r b o r o u g h , U K ) .
C o n g r a t u l a t i o n s . W e w i l l b e e m a i l i n g y o u s o o n w i t h d e t a i l s o f h o w t o c l a i m y o u r p r i z e s !
T h i s m o n t h t h e r e i s o n e M A S S I V E p r i z e !
T h e w i n n e r w i l l r e c e i v e a n e w R a s p b e r r y P i
5 1 2 M B M o d e l B , a n e x c l u s i v e W h i t e b e r r y
P C S L c a s e , 1 A P S U , H D M I c a b l e , 1 6 G B
N O O B S m e m o r y c a r d , G P I O C o b b l e r k i t ,
b r e a d b o a r d a n d j u m p e r w i r e s !
F o r a c h a n c e t o t a k e p a r t i n t h i s m o n t h ' s
c o m p e t i t i o n v i s i t :
h t t p : / / w w w . p c s l s h o p . c o m / i n f o / m a g p i
C l o s i n g d a t e i s 2 0 t h J u l y 2 0 1 3 .
W i n n e r s w i l l b e n o t i f i e d i n n e x t m o n t h ' s
m a g a z i n e a n d b y e m a i l . G o o d l u c k !
O n c e a g a i n T h e M a g P i a n d P C S u p p l i e s L i m i t e d a r e p r o u d t o a n n o u n c e y e t
a n o t h e r c h a n c e t o w i n s o m e f a n t a s t i c R a s p b e r r y P i g o o d i e s !
JULY COMPETITION
3 5
7/27/2019 The MagPi Issue 14 En
http://slidepdf.com/reader/full/the-magpi-issue-14-en 36/36
T h e M a g P i i s a t r a d e m a r k o f T h e M a g P i L t d . R a s p b e r r y P i i s a t r a d e m a r k o f t h e R a s p b e r r y P i F o u n d a t i o n . T h e M a g P i m a g a z i n e i s
c o l l a b o r a t i v e l y p r o d u c e d b y a n i n d e p e n d e n t g r o u p o f R a s p b e r r y P i o w n e r s , a n d i s n o t a f f i l i a t e d i n a n y w a y w i t h t h e R a s p b e r r y P i
F o u n d a t i o n . I t i s p r o h i b i t e d t o c o m m e r c i a l l y p r o d u c e t h i s m a g a z i n e w i t h o u t a u t h o r i z a t i o n f r o m T h e M a g P i L t d . P r i n t i n g f o r n o n c o m m e r c i a l
p u r p o s e s i s a g r e e a b l e u n d e r t h e C r e a t i v e C o m m o n s l i c e n s e b e l o w . T h e M a g P i d o e s n o t a c c e p t o w n e r s h i p o r r e s p o n s i b i l i t y f o r t h e c o n t e n t
o r o p i n i o n s e x p r e s s e d i n a n y o f t h e a r t i c l e s i n c l u d e d i n t h i s i s s u e . A l l a r t i c l e s a r e c h e c k e d a n d t e s t e d b e f o r e t h e r e l e a s e d e a d l i n e i s m e t b u t
s o m e f a u l t s m a y r e m a i n . T h e r e a d e r i s r e s p o n s i b l e f o r a l l c o n s e q u e n c e s , b o t h t o s o f t w a r e a n d h a r d w a r e , f o l l o w i n g t h e i m p l e m e n t a t i o n o f
Feedback & Question TimeF r i d a y J u n e 1 4 , 2 0 1 3 . E s c o n d i d o ,
C a l i f o r n i a , U S A . I g o t m y
m a g a z i n e s t o d a y ! H o o r a y H o o r a y
H o o r a y !
H o m e r H a z e l
W o w ! – w h a t a n i n c r e d i b l y
p r o f e s s i o n a l p r o d u c t i o n !
I h a v e d o w n l o a d e d t h e 1 3 i s s u e s
a n d h a v e p l o u g h e d t h r o u g h t h e
f i r s t t w o . A s a r e t i r e d I T t e a c h e r ,
t h i s i s j u s t w h a t w e n e e d a n d i t i s
p r e s e n t e d i n s u c h a w a y t h a t
a n y o n e c a n g e t s o m e t h i n g o u t o f i t
– y o u n g a n d o l d . M y P i t a k e s m e
b a c k t o m y A c o r n A t o m d a y s a n d
a s o l d e r i n g i r o n , a n d i t i s g o o d t o
s e e y o u n g s t u d e n t s t a k i n g t h i s u p
a g a i n . I a m c u r r e n t l y w o r k i n g w i t h
a Y e a r 7 y o u n g l a d y d o i n g s o m e
p r o g r a m m i n g a n d s i m p l e c o n t r o l
c i r c u i t s , a n d s h e i s l o v i n g i t – w e l l ,
w e b o t h a r e , r e a l l y !
I s p e n d m y l i f e w r i t i n g a c o m p l e x
e n g i n e e r i n g p r o g r a m i n
P o w e r B A S I C – i f o n l y t h i s w a s
a v a i l a b l e f o r L i n u x ( a n d i t i s n o t f o r
t h e w a n t o f a s k i n g ) – a n d g e t t i n g
t o g r i p s w i t h t h e s y n t a x o f P y t h o n
h a s b e e n a n i n t e r e s t i n g c h a l l e n g e .
M y o n l y f e e b l e c o m p l a i n t i s t h a t
s e t t i n g u p a p r i n t e r i s a n i g h t m a r e !
I c a n g e t i t t o p r i n t f r o m
L i b r e O f f i c e , b u t n o t t h e c o m m a n d
p r o m p t , t h o u g h I a m s u r e t h a t t h e
a n s w e r w i l l b e i n t h e i s s u e s I h a v e
n o t l o o k e d a t y e t .
I t i s g o o d t o s e e B r i t a i n l e a d i n g
t h e w o r l d a g a i n i n t h e f i e l d o f
m i c r o c o m p u t e r s – w e l l d o n e P i .
I a i n J o h n s t o n e
[ E d : S e e i s s u e 1 2 f o r c o m m a n d
l i n e p r i n t i n g ]
2 8 8 p a g e s o f g o o d n e s s j u s t
a r r i v e d . T h e m a g s l o o k a w e s o m e ,
l o v e t h e b i n d e r a n d s t i c k e r s !
I t s b e e n a b i t o f a w a i t b u t i t s
d e f i n i t e l y b e e n w o r t h i t ! T h e w h o l e
b u n d l e i s f a n t a s t i c a n d t h e
m a g a z i n e q u a l i t y i s p e r f e c t . T h e y
l o o k a n d f e e l l i k e a p r e m i u m
m a g a z i n e y o u w o u l d b u y f r o m a
n e w s a g e n t s . Y o u c a n s e e r i g h t
a w a y t h e h a r d w o r k t h a t h a s g o n e
i n t o t h e s e a n d i t i s v e r y m u c h
a p p r e c i a t e d .
T H A N K Y O U ! ! t o t h e w h o l e
M a g P i t e a m ! ! T i m e t o c r a c k o n
a n d s t a r t r e a d i n g !
N i a l P e a r c e
F i r s t o f a l l . G R E A T m a g a z i n e !
T h a n k s f o r t a k i n g t h e r i s k s t o g e t
i t o u t t h e r e i n t h e f i r s t i n s t a n c e . I
b o u g h t t h e i s s u e s a s s o o n a s I
s a w I c o u l d a n d t h e y t u r n e d u p
t o d a y ( Y A Y ! ! )
C h r i s B u r g e s s
J u s t r e c e i v e d m y b i n d e r a n d
m a g s - t h e y l o o k g r e a t !
T h a n k s f o r a l l t h e e f f o r t y o u h a v e
p u t i n t o t h i s . A n d y o u j u s t k n o w
t h a t w e a l l w a n t V o l u m e 2 n o w
d o n ' t y o u : - )
M a r k P e a r s o n
[ E d : A l l V o l u m e 2 i s s u e s t o d a t e
w i l l b e a v a i l a b l e s o o n ]
J u s t r e c e i v e d m y m a g a z i n e s a n d
b i n d e r t o d a y . W o w ! T h e y a r e
b e a u t i f u l .
T h i s w h o l e p r o j e c t h a s b e e n
g r e a t . I h a d s e l e c t e d t h e
S i g n a t u r e K i t a n d a m I e v e r g l a d .
T h e h a r d w a r e k i t c a m e s o m e t i m e
a g o a n d t h e w h o l e t h i n g w a s t o p
q u a l i t y . I t m e a n t a l o t t o h a v e
t h o s e b o o k s s i g n e d b y L i z a n d
E b e n . C o n g r a t u l a t i o n s f o r a w e l l
e x e c u t e d p r o j e c t .
T o n y G u e r i c h