ブレッドボードの絵を描くコマンドを作る(ラベル編)

ブレッドボードの絵の作成、今回で最終回です。
最後はピン配のラベルをつけていきます。あと、コマンドの指定方法が空白区切りは使い勝手が悪いので、改行区切りも対応します。

このような指定方法を、

takk@takk:~/github/bread$ cat sample.sh
. bread.sh 21,1,22,20,P e14,f17,I red,j14,3,12,W black,2,15,a17,W d15,d9,300,R red,c9,2,8,L red,21,1,3,3,W black,21,20,2,18,W

このように変えます。やはり改行した方が見やすいです。

takk@takk:~/github/bread$ cat sample.sh
.  bread.sh '
21,1,22,20,P
e14,f17,I
red,j14,3,12,W
black,2,15,a17,W
d15,d9,300,R
red,c9,2,8,L
red,21,1,3,3,W
black,21,20,2,18,W
'
takk@takk:~/github/bread$ 

引数の処理も、改行も許容するように改造します。

takk@takk:~/github/bread$ grep -A16 ARGV bread.sh
foreach (@ARGV){
	s/a(\d+)/5,$1/g;
	s/b(\d+)/6,$1/g;
	s/c(\d+)/7,$1/g;
	s/d(\d+)/8,$1/g;
	s/e(\d+)/9,$1/g;
	s/f(\d+)/10,$1/g;
	s/g(\d+)/11,$1/g;
	s/h(\d+)/12,$1/g;
	s/i(\d+)/13,$1/g;
	s/j(\d+)/14,$1/g;
	put_resistor(split /,/,$_) if(/R$/);
	put_wire(split /,/,$_) if(/W$/);
	put_led(split /,/,$_) if(/L$/);
	put_ic(split /,/,$_) if(/I$/);
	put_pinheader(split /,/,$_) if(/P$/);
}
takk@takk:~/github/bread$ 

各引数中の改行を処理することにより、改行で読み取れるように修正しました。

foreach $arg (@ARGV){
foreach (split /\n/,$arg){
        s/a(\d+)/5,$1/g;
        s/b(\d+)/6,$1/g;
        s/c(\d+)/7,$1/g;
        s/d(\d+)/8,$1/g;
        s/e(\d+)/9,$1/g;
        s/f(\d+)/10,$1/g;
        s/g(\d+)/11,$1/g;
        s/h(\d+)/12,$1/g;
        s/i(\d+)/13,$1/g;
        s/j(\d+)/14,$1/g;
        put_resistor(split /,/,$_) if(/R$/);
        put_wire(split /,/,$_) if(/W$/);
        put_led(split /,/,$_) if(/L$/);
        put_ic(split /,/,$_) if(/I$/);
        put_pinheader(split /,/,$_) if(/P$/);
}
}

コマンドが改行された引数を受け付けるようになったので、もう少し見やすくしたいと思います。末尾にあったLやR等の部品の種別を先頭に持ってきて、かつ意味がわかる英単語に修正します。

takk@takk:~/github/bread$ cat sample.sh
.  bread.sh '
PIN,21,1,22,20
IC,e14,f17
WIRE,red,j14,3,12
WIRE,black,2,15,a17
RESISTOR,d15,d9,300
LED,red,c9,2,8
WIRE,red,21,1,3,3
WIRE,black,21,20,2,18
'

行末チェックから、

        put_resistor(split /,/,$_) if(/R$/);

このように行頭チェックに変更して、単語でチェックするようにします。

	put_resistor(split /,/,$_) if(/^RESISTOR\b/);

これに付随して、各サブルーチンの先頭で、第一引数を捨てる処理(shift)を入れました。

sub put_resistor{
        shift;
        my $ohm = @_[4];

今回のメインであるラベル処理を追加します。
ピンヘッダーの左側は、右寄せテキストにしたいので、text-anchorにend指定します。右側は、左寄せにしたいので、start指定です。

sub put_pinlabel{
        shift;
        my($color,$x,$y,$text) = @_;
        my($xx,$yy) = get_xxyy($x,$y);
        my $l_xx;
        my $l_yy = $yy + 5;
        if($x == 21){
                $l_xx = $xx - 20;
                print qq#<text x="$l_xx" y="$l_yy" font-size="15" text-anchor="end" stroke="$color" fill="none" >$text</text>#;
        }else{
                $l_xx = $xx + 20;
                print qq#<text x="$l_xx" y="$l_yy" font-size="15" text-anchor="start" stroke="$color" fill="none" >$text</text>#;
        }
}

追加するラベルは、コマンドで指定できるようにsample.shに追加しました。

takk@takk:~/github/bread$ cat sample.sh
(省略)
LABEL,orange,21,1,3.3V
LABEL,blue,21,2,GPIO2/SDA1
LABEL,blue,21,3,GPIO3/SCL1
LABEL,green,21,4,GPIO4/CLK0
LABEL,black,21,5,0V
LABEL,green,21,6,GPI17
LABEL,green,21,7,GPI27
LABEL,green,21,8,GPI22
LABEL,orange,21,9,3.3V
LABEL,purple,21,10,GPI10/MOSI
LABEL,purple,21,11,GPI9/MISO
(省略)

ワイヤーでラベルのテキストが見えなくなってしまうので、ラズパイからブレッドボードへ飛ばすワイヤーは、透かせます。stroke-opacityで0〜1の間で透明度を指定します。

sub put_pinwire{
        shift;
        my($color,$x1,$y1, $x2,$y2) = @_;
        my($xx1,$yy1) = get_xxyy($x1,$y1);
        my($xx2,$yy2) = get_xxyy($x2,$y2);
        print qq#<circle cx="$xx1" cy="$yy1" r="4" fill="white" />#;
        print qq#<circle cx="$xx2" cy="$yy2" r="4" fill="white" />#;
        print qq#<line x1="$xx1" y1="$yy1" x2="$xx2" y2="$yy2" stroke="$color" stroke-width="12" stroke-opacity="0.5" />#;
}

これでブレッドボードの絵を描くコマンドが完成しましたので、少しだけブログの絵を書くのが楽になりました。

bread6-001

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA