LSI Jiu-Jitsu

電子工作とブラジリアン柔術

OLED 0.96インチで遊ぶ (4) - PBMファイル表示

今回はImagemagickのconvertを使用して文字列をPBMフォーマットに変換して表示を行ってみます。

文字列「柔術」を画像化してみます。

$ convert -font /usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf \
          -pointsize 32 \
          -extent 64x32 \
          -compress none \
          -monochrome \
          +antialias \
          label:'柔術' \
          bjj.pbm

font : フォント名
pointsize : フォントサイズ
extent : 画像サイズ
label : 文字列
を指定します。
他のオプションはPBMを生成するのに必要なオプションとなります。
フォントは色々と試してみましたがTakaoGothicが一番見やすかったです。

生成されたbjj.pbmを開くとこんな感じで見えます。(見やすいようにデータ間のスペースは削除しています)

f:id:mohran:20180529234158j:plain

指定した位置にPBMファイルを表示するスクリプトを作りましたので、これを通して表示してみます。

#!/usr/bin/perl -w

open(RFP, "<" . $ARGV[0]) || die("Fatal : Can't open file ... $ARGV[0]\n");

$pos_xs = $ARGV[1];
$pos_ys = $ARGV[2];

@pbm = ();

$w = 0;
$h = 0;
$i = 0;
while(<RFP>){
  $l = $_;
  chomp($l);

  $l =~ s/#.*$//;

  if($l eq ''){ next; }

  $i++;
  if($i==1){
    if($l ne 'P1'){ die("Error : It isn't P1 format ...\n"); }
  }elsif($i==2){
    ($width, $height) = split(/\s+/, $l);
  }else{
    $l =~ s/\s+//g;
    foreach $d (split(//, $l)){
      $pbm[$h][$w] = $d;
      $w++;
      if($w==$width){
        $h++;
        $w = 0;
      }
    }
  }
}
close(RFP);

# display set
$cmd = 'i2cset -y 1 0x3c 0x00 0xa0 0xc0 i';
system($cmd);

$pos_xe = $pos_xs + $width - 1;
$pos_ye = $pos_ys + $height / 8 - 1;

$cmd  = 'i2cset -y 1 ';
$cmd .= '0x3c 0x00 ';
$cmd .= '0x20 0x00 ';  # horizontal mode
$cmd .= sprintf("0x21 0x%02x 0x%02x ", $pos_xs, $pos_xe);  # column
$cmd .= sprintf("0x22 0x%02x 0x%02x ", $pos_ys, $pos_ye);  # page
$cmd .= 'i';
system($cmd);

$i = 0;
for($h=0; $h<$height; $h+=8){
  for($w=0; $w<$width; $w++){
    $d = unpack("C", pack("B8", $pbm[$h+7][$w] .
                                $pbm[$h+6][$w] .
                                $pbm[$h+5][$w] .
                                $pbm[$h+4][$w] .
                                $pbm[$h+3][$w] .
                                $pbm[$h+2][$w] .
                                $pbm[$h+1][$w] .
                                $pbm[$h+0][$w]));
    if($i==0){
      $cmd = "i2cset -y 1 0x3c 0x40 ";
    }
    $cmd .= sprintf("0x%02x ", $d);
    $i++;
    if($i==16){
      $i = 0;
      $cmd .= "i";
      system($cmd);
    }
  }
}

if($i != 0){
  $cmd .= "i";
  system($cmd);
}

# display enable
$cmd = 'i2cset -y 1 0x3c 0x00 0x8d 0x14 0xaf i';
system($cmd);


引数に「PBMファイル」「表示開始カラム」「表示開始ページ 」を指定します。

$ ./disp_pbm.pl bjj.pbm 32 2


こんな感じで表示されました。


色々と組み合わせて文字列を表示してみました。

なお、上記のスクリプトはPBMファイルのHeightが8の倍数であることが前提となっていますのでご注意ください。

[参考記事]