Raspberry Pi 3によるOLEDディスプレイ への表示」で、Python言語よりRaspberry Piに接続したOLED「SSD1306」に表示しました。今回はGo言語を使って、動画とテキストをOLED「SSD1306」に表示します。

使用するSSD1306ライブラリ

SSD1306ライブラリは、「package ssd1306」を使用します。

animated GIFファイルの再生

SSD1306」のExampleを使いましたが、そのままだとコンパイルできなかったので修正しています。

package main

import (
	"image"
	"image/draw"
	"image/gif"
	"log"
	"os"
	"time"

	"github.com/nfnt/resize"
	"periph.io/x/periph/conn/i2c/i2creg"
	"periph.io/x/periph/devices/ssd1306"
	"periph.io/x/periph/host"
)

// convertAndResizeAndCenter takes an image, resizes and centers it on a
// image.Gray of size w*h.
func convertAndResizeAndCenter(w, h int, src image.Image) *image.Gray {
	src = resize.Thumbnail(uint(w), uint(h), src, resize.Bicubic)
	img := image.NewGray(image.Rect(0, 0, w, h))
	r := src.Bounds()
	r = r.Add(image.Point{(w - r.Max.X) / 2, (h - r.Max.Y) / 2})
	draw.Draw(img, r, src, image.Point{}, draw.Src)
	return img
}

func main() {
	// Load all the drivers:
	if _, err := host.Init(); err != nil {
		log.Fatal(err)
	}

	// Open a handle to the first available I?C bus:
	bus, err := i2creg.Open("")
	if err != nil {
		log.Fatal(err)
	}

	var DefaultOpts = ssd1306.Opts{
		W:             128,
		H:             64,
		Rotated:       false,
		Sequential:    false,
		SwapTopBottom: false,
	}
	dev, err := ssd1306.NewI2C(bus, &DefaultOpts)
	if err != nil {
		log.Fatal(err)
	}

	// Decodes an animated GIF as specified on the command line:
	if len(os.Args) != 2 {
		log.Fatal("please provide the path to an animated GIF")
	}
	f, err := os.Open(os.Args[1])
	if err != nil {
		log.Fatal(err)
	}
	g, err := gif.DecodeAll(f)
	f.Close()
	if err != nil {
		log.Fatal(err)
	}

	// Converts every frame to image.Gray and resize them:
	imgs := make([]*image.Gray, len(g.Image))
	for i := range g.Image {
		imgs[i] = convertAndResizeAndCenter(DefaultOpts.W, DefaultOpts.H, g.Image[i])
	}

	// Display the frames in a loop:
	for i := 0; ; i++ {
		index := i % len(imgs)
		c := time.After(time.Duration(10*g.Delay[index]) * time.Millisecond)
		img := imgs[index]
		dev.Draw(img.Bounds(), img, image.Point{})
		<-c
	}
}

次のコマンドでコンパイルして実行します。実行時のパラメータとして与えている「DfQqM.gif」は、animated GIFファイルです。

$ go build
$ ./goframe DfQqM.gif

SSD1306に表示された動画を次に示します。

テキスト表示

SSD1306にテキストを表示します。

package main

import (
	"image"
	"image/color"
	"log"

	"golang.org/x/image/font"
	"golang.org/x/image/font/basicfont"
	"golang.org/x/image/math/fixed"
	"periph.io/x/periph/conn/i2c/i2creg"
	"periph.io/x/periph/devices/ssd1306"
	"periph.io/x/periph/host"
)

func main() {
	// Load all the drivers:
	if _, err := host.Init(); err != nil {
		log.Fatal(err)
	}

	// Open a handle to the first available I?C bus:
	bus, err := i2creg.Open("")
	if err != nil {
		log.Fatal(err)
	}

	var DefaultOpts = ssd1306.Opts{
		W:             128,
		H:             64,
		Rotated:       false,
		Sequential:    false,
		SwapTopBottom: false,
	}
	dev, err := ssd1306.NewI2C(bus, &DefaultOpts)
	if err != nil {
		log.Fatal(err)
	}

	img := image.NewGray(image.Rect(0, 0, 128, 64))

	d := &font.Drawer{
		Dst:  img,
		Src:  image.NewUniform(color.Gray{255}),
		Face: basicfont.Face7x13,
	}

	for i := 0; i < 6; i++ {
		d.Dot = fixed.Point26_6{fixed.Int26_6(2 * 64), fixed.Int26_6((9 + (i * 11)) * 64)}
		d.DrawString("012345678901234567")
	}

	dev.Draw(img.Bounds(), img, image.Point{})

}

次のコマンドでコンパイルして実行します。

$ go build
$ ./gotext

SSD1306に18文字6行のテキストが表示されます。