【Py】8ドット美咲フォントをJapanino POV用にコンバート

E3 任天堂カンファレンスの生中継動画を見てたらこんな時間、、、
3DS用ソフト第一弾が、昔なつかしい「パルテナの鏡」のリメイクだっていうのには、ちょっとびっくり。


Japaninoに付属の光残像ユニット(POV)
LEDを動かしながら点滅することで、残像によって文字などを表示できるという面白グッズ。
データをいちいち手で作成するのは大変なので、フリーの8×8日本語フォント「美咲フォント」を、Arduino言語用のデータ文字列にコンバートするスクリプトをPythonで書いてみました。


がんばれば、twitterのツイートを拾ってきてPOVへシリアル転送して表示させる、、、 みたいなことも可能かと。(アルファベット+かな+画数の極少ない漢字なら)

シリアルでPCからJapaninoへビットマップデータを転送しながら、メモリに収まらない長さの文字を表示するのは実験済み。

、、、ですが、ジュゲムをまるまる表示させようとすると、最後まで行く前に手が疲れてきます。  というか飽きます(汗
たぶん、普通に長い文字を表示させたいだけなら、フラッシュメモリに格納してやるだけで足りるんじゃなかろうか、という気がします。

ustreamで、アイドルの女の子が生放送中に送られてきたツイートを読み上げながらPOVを回してツイートを表示する、、、みたいな、 深夜ラジオのハガキコーナーみたいなのをやれば それなりに面白いかも、、、と思ったけど、オサーンなので止めw

import Image,ImageDraw,ImageFont
from Image import NEAREST,ROTATE_270
try:
  range=xrange
except:
  pass
DEBUG=True

#変換した文字列
#あまり長いと、SRAMに収まりません。 多分
jugem=u"じゅげむじゅげむごこうのすりきれ"
#かな16文字でビットマップデータ128バイト使用
#16 x 8 =128

class PovText(object):
  def __init__(self,font="MISAKI.TTF"):
    self._im=Image.new("1",(1024,8))
    self._draw=ImageDraw.ImageDraw(self._im)
    self._font=ImageFont.truetype(font,8)
    self._slen=1024//8 #safety length
    self._slen=4 #実験用
  def convert(self,txt):
    "convert text to Pov BitData"
    dat=[]
    font=self._font
    im=self._im
    draw=self._draw
    slen=self._slen
    totalWidth=0
    for i in range(0,len(txt),slen):
      t= txt[i:i+slen]
      w,h=draw.textsize(t,font)
      if DEBUG :
        print t,w
      draw.rectangle((0,0,2048,8),fill=0)
      draw.text((0,0),t,font=font,fill=255)
      self.s=im.transpose(ROTATE_270).tostring()
      dat.append(self.s[:w])
      totalWidth+=w
    return "".join(dat),totalWidth
  
def bin(c):
  dat=[]
  msk=0x80
  for i in range(8):
    if msk&c :
      dat.append("1")
    else :
      dat.append("0")
    c<<=1
  return "0b"+"".join(dat)

def text2bin(txt):
  u"じゅげむ をバイナリーデータ文字列に"
  p=PovText()
  dat,h=p.convert(txt)
  if DEBUG :
    Image.fromstring("1",(8,len(dat)),dat).save("text2bin.png")
  tlist=[]
  for i in dat:
    t="%s,"%bin(ord(i))
    if DEBUG:
      print t
    tlist.append(t)
  txt="\n".join(tlist)
  return txt
if __name__=="__main__":
  t=text2bin(jugem)
  fp=open("jugem.txt","wb")
  fp.write(t)
  fp.close()

コメントを残す

メールアドレスが公開されることはありません。