/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

「進捗ダメです」ペンダントを作った

FLORAというArduino互換マイコンボードに以前使ったNokia5110液晶をくっつけて、首から下げるペンダント(ネックレス)を作りました。

白黒液晶上にgifアニメ画像を表示することができます。

内部構造?

プログラム領域におかれた2値画像データを読みだして、1枚ずつ表示することで動かしています。 FLORAのプログラム領域は32KBあるので、大体40枚ほどなら入るはずです。

ここで使う画像データは、PythonOpenCVを使ってつくりました。

GIFアニメ画像を2値画像に変換するコード

使用部品

  • Adafruit FLORA
  • Sparkfun Graphic LCD 84x48 - Nokia 5110

おまけ:苦労したところ

プログラム領域を利用する

Arduino…というより一般的なマイコンでは、定数は基本的にROMに突っ込まれます。 なので今回の画像データもROMに突っ込まれるのですが、ROMは容量が少ないため、画像データが4枚ほどしか入りません。 これを解決するためには、20KBほど空いているプログラム領域に入れてもらえるようにしなければいけません。 これが結構だるかった。

まず、配列は PROGMEM prog_uchar image1[] のように宣言して、プログラム領域に入れるようにします。 そして画像データを複数扱うため、これらをまとめるポインタ配列を、以下のように定義します。

PROGMEM prog_uchar *gifAnimePointer[] = {
    image1,
    image2,
    ...
}

また、アクセス方法も少し特殊で、以下のようにメモリアドレスをwordで取ってきて、そこから1byteずつ取り出す…ということが必要になります。

gifPointer = (char *)pgm_read_word_near(gifAnimePointer + i);
    
for(int j=0; j < PICTURE_SIZE; j++){
   buffer[j] = (char)pgm_read_byte_near(gifPointer + j);
}

透過gifアニメ

一部のgifアニメを変換した場合、かわいい二次元美少女の顔が黄緑で塗りつぶされてしまいました。

調べてみると実はgifは透過色に対応しており、アニメの中には透過のある現フレームを前フレームの上に重ねて表示して行く作りになっているものがあるようです。

これに対処するため追加したのが、 gif89a_alpha_merge メソッドです。 最初はアルファ値を切り出して、その部分を前フレームのもので塗りつぶす…というベタな実装をしていたのですが、サークルの先輩から教えていただき、 alpha_compositeというメソッドを使うことで解決しました。