Adafruitの8×8ミニLEDマトリックス制御API(Raspberry Pi用)

Adafuitの8×8のLEDマトリックスをRaspberry Piで使う方法のAPI編です。
初期セットアップの仕方は参考記事を参照してください。
この記事はサンプルコードを思いついたときに適宜追加していきます。そのため見るたびに内容が変わっている可能性があることをご承知おきください。

サンプルコード

Raspberry PiのIPアドレスをスクロール表示(2017/1/29作成)

前提パッケージ: netifaces
使用API: animate(), horizontal_scroll()

Raspberry Piに設定されているIPアドレスをスクロール表示します。フォントデータはJR-100という昔の8bitマイコンのROMデータを吸い上げたものを流用しました。

# -*- coding: utf-8 -*-
from Adafruit_LED_Backpack import Matrix8x8
from PIL import Image
import netifaces

# create font images
font_data = [
    [0x3C, 0x42, 0x46, 0x5A, 0x62, 0x42, 0x3C, 0x00],  # '0'
    [0x08, 0x18, 0x28, 0x08, 0x08, 0x08, 0x3E, 0x00],  # '1'
    [0x3C, 0x42, 0x02, 0x0C, 0x30, 0x40, 0x7E, 0x00],  # '2'
    [0x3C, 0x42, 0x02, 0x3C, 0x02, 0x42, 0x3C, 0x00],  # '3'
    [0x04, 0x0C, 0x14, 0x24, 0x7E, 0x04, 0x04, 0x00],  # '4'
    [0x7E, 0x40, 0x78, 0x04, 0x02, 0x44, 0x38, 0x00],  # '5'
    [0x1C, 0x20, 0x40, 0x7C, 0x42, 0x42, 0x3C, 0x00],  # '6'
    [0x7E, 0x42, 0x04, 0x08, 0x10, 0x10, 0x10, 0x00],  # '7'
    [0x3C, 0x42, 0x42, 0x3C, 0x42, 0x42, 0x3C, 0x00],  # '8'
    [0x3C, 0x42, 0x42, 0x3E, 0x02, 0x04, 0x38, 0x00],  # '9'
    [0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00]   # '.'
]
font_images = []
for code in range(len(font_data)):
    image = Image.new('1', (8, 8))
    for row in range(8):
        val = font_data[code][row]
        for col in range(8):
            image.putpixel((7 - col, row), val % 2)
            val /= 2
    font_images.append(image)

# mapping table of a character to index of font_images list
mapping = {
    '0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, '.':10,
}

# get ip address of interface 'wlan0'
addr = netifaces.ifaddresses('wlan0').get(netifaces.AF_INET)[0]['addr']

# create scrolling ip address image
image_ipaddr = Image.new('1', (8 * len(addr), 8))
for i in range(len(addr)):
    image_ipaddr.paste(font_images[mapping[addr[i]]], (8 * i, 0))

# display and scroll ip address
display = Matrix8x8.Matrix8x8()
display.begin()
display.animate(display.horizontal_scroll(image_ipaddr), delay=0.05)

実行結果


親クラスHT16K33で定義されるメソッド

__init__(self, address=DEFAULT_ADDRESS, i2c=None, **kwargs)

コンストラクタ。addressでI2Cアドレスを指定する。i2cはi2cバスを指定する。通常はどちらも指定する必要はないはず。

begin(self)

ドライバを初期化し、全LEDを消灯状態にする。

set_blink(self, frequency)

ディスプレイ全体の点滅周期を設定する。frequencyで指定できる値は以下のいずれか。

指定できる値 意味
HT16K33_BLINK_OFF 点滅させない。
HT16K33_BLINK_2HZ 0.5秒周期で点滅させる。
HT16K33_BLINK_1HZ 1秒周期で点滅させる。
HT16K33_BLINK_HARFHZ 2秒周期で点滅させる。

set_brightness(self, brightness)

ディスプレイ全体の明るさを設定する。このメソッドで指定した明るさはメソッド実行と同時に反映され、write_display()の実行は不要である。
brightnessで指定できる値は0から15 (0が最暗、15が最明)。未指定時は15。

set_led(self, led, value)

指定されたLEDに点灯状態を設定する。
ledには0~127の値を指定できる。ledの値とLEDの位置の関係は以下の通り。

7 0 1 2 3 4 5 6
23 16 17 18 19 20 21 22
39 32 33 34 35 36 37 38
55 48 49 50 51 52 53 54
71 64 65 66 67 68 69 70
87 80 81 82 83 84 85 86
103 96 97 98 99 100 101 102
119 112 113 114 115 116 117 118

制御ICが16×8のLEDマトリクスまで対応しているため、不連続になっている。
valueには消灯状態にするには0またはFalse、点灯状態にするには0以外またはTrueを指定する。
通常はx座標とy座標の形式で指定できる下位クラスのset_pixel()を使った方が便利。

write_display(self)

内部バッファの状態をLEDマトリクスに出力する。このメソッドを実施しないとLED状態を変更しても表示に反映されない。

clear(self)

ディスプレをクリア(全消灯)させる。

Matrix8x8で定義されるメソッド

__init__(self, **kwargs)

コンストラクタ。通常は引数を指定する必要はない。

set_pixel(self, x, y, value)

指定された場所のLEDを状態を設定する。xyはそれぞれ0~7の値を指定できる。
valueは0また0以外を指定する。0の場合は消灯、0以外の場合は点灯を意味する。

set_image(self, image)

Python Image Library(PIL)で作成したイメージをディスプレイバッファに出力する。イメージは1ビットカラーに変換され、色が0以外の場合にLEDが点灯することを意味する。
imageでイメージを指定する。

create_blank_image(self)

全消灯したImageクラスのイメージを作成し返値として返す。Image.new("RGB", (8, 8))を実行したものと等価である。

horizontal_scroll(self, image, padding=True)

指定されたイメージを左から右に横方向にスクロール(イメージが左に進んでいく見え方)した場合のイメージのリストを返す。
imageはImageクラスのイメージである。8×8である必要はない。
paddingがTrueの場合、全消灯状態のブランクイメージが最初と最後に挿入される。つまりブランクから始まり指定したイメージがスクロールし、最後にブランクで終了する。paddingがFalseの場合はブランクイメージは挿入されない。

vertical_scroll(self, image, padding=True)

指定されたイメージを上から下に縦方向にスクロール(イメージが上に進んでいく見え方)した場合のイメージのリストを返す。
imageはImageクラスのイメージである。8×8である必要はない。
paddingがTrueの場合、全消灯状態のブランクイメージが最初と最後に挿入される。つまりブランクから始まり指定したイメージがスクロールし、最後にブランクで終了する。paddingがFalseの場合はブランクイメージは挿入されない。

animate(self, images, delay=.25)

イメージのリストを順に表示する。このメソッドは即座に表示に反映されるため、write_display()を実行する必要はない。
delayは次のイメージを表示するまでの待ち時間を指定する。デフォルト値は0.25秒である。

参考情報

  1. APIのソースコード (Adafruit)
  2. 制御IC HT16K33のデータシート (秋月電子)

投稿者: けむしろう

プログラミング、サーバ構築、電子工作、旅行が好きです。

コメントを残す

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