FLORAというArduino互換マイコンボードに以前使ったNokia5110液晶をくっつけて、首から下げるペンダント(ネックレス)を作りました。
白黒液晶上にgifアニメ画像を表示することができます。
内部構造?
プログラム領域におかれた2値画像データを読みだして、1枚ずつ表示することで動かしています。 FLORAのプログラム領域は32KBあるので、大体40枚ほどなら入るはずです。
ここで使う画像データは、PythonとOpenCVを使ってつくりました。
使用部品
おまけ:苦労したところ
プログラム領域を利用する
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
というメソッドを使うことで解決しました。