Raspberry Pi 3上のArchLinuxでGo言語によるLチカ

ArchLinuxをRaspberry Pi 3にインストール」でRaspberry Pi 3にArchLinuxをインストールしました。このArchLinuxがインストールされたRaspberry Pi 3でGo言語により、LEDの点灯/消灯、押しボタンの入力、テキスト表示ディスプレイ(LCD)への表示を行います。

Raspberry Pi 3上のArchLinuxにGo言語による開発環境をインストール

1.次に示すのGo言語のアーカイブファイル「go1.9.2.linux-arm64.tar.gz」を「Downloads」からダウンロードします。

Go言語のアーカイブファイル

2.ウンロードしたGo言語のアーカイブファイル「go1.9.2.linux-arm64.tar.gz」を、root権限により次のコマンドで「/usr/local」に解凍します。

# tar -C /usr/local -xzf go1.9.2.linux-arm64.tar.gz

テキストエディタを使って次の構文をパス環境変数ファイル「/etc/profile」に追加し、rebootします。

export PATH=$PATH:/usr/local/go/bin

3.次のような簡単なプログラム「hello.go」を作成します。

package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}

4.次のようにgoツールでビルドします。ソースコードが置かれたフォルダ名が実行ファイル名となります。

$ go build

5.実行可能なファイル「hello」が作成されたので、 次のように実行します。

$ ./hello
hello, world

「hello, world」の表示により、正常にRaspberry Pi 3上のArchLinuxにGo言語による開発環境がインストールされたことを確認します。

Go言語によるアプリの作成

Raspberry Pi 3でGo言語を使用して、LEDの点灯/消灯、SWの入力、テキスト表示ディスプレイ(LCD)への表示を行うアプリを作成します。

root権限で次のコマンドを入力し、ライブラリを取得するためにgitをインストールします。

# pacman -S git

GPIOをコントロールするライブラリ「go-rpio」を次のコマンドで取得します。なおライブラリ「go-rpio」の詳細については、「stianeikeland/go-rpioo」を参照してください。

$ go get -v github.com/stianeikeland/go-rpio

go言語でGPIOを制御するライブラリは「GoDoc」にまとめられています。

次の今回使用するGPIOの割り当て一覧を示します。

Raspberry Pi 3で使用するGPIO
GPIO名 PIN番号 設定 機能
GPIO20 38 出力 LED
GPIO19 35 入力 SW
GPIO2 3 入出力 LCD(SDA)
GPIO3 5 入出力 LCD(SCL)

LチカとSW入力プログラム
次のようなLチカとSW入力プログラムを作ります。GPIOをコントロールするライブラリ「go-rpio」をimport宣言します。

package main

import (
    "fmt"
    "github.com/stianeikeland/go-rpio"
    "os"
    "os/signal"
    "syscall"
    "time"
)

func main() {
    fmt.Println("start")

    err := rpio.Open()

    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    pin := rpio.Pin(20) // GPIO20ピンを使うLED
    pin.Output()
    pinin := rpio.Pin(19)// GPIO19ピンを使うSW

    ch := make(chan os.Signal, 1)
    signal.Notify(ch, syscall.SIGINT)
    loop := true
    pinin.Input()        // Input mode

    for loop {
    
        res := pinin.Read()  // Read state from pin (High / Low)
        fmt.Printf("input: %v\n", res)
        
        select {
        case s := <-ch:
            fmt.Printf("signal receive: %v\n", s)
            if s == syscall.SIGINT { // SIGINT受け取ったらループ抜ける
                loop = false
                pin.Low()
            }
        default:
            pin.Toggle()
            time.Sleep(1 * time.Second)
        }
    }

    rpio.Close()
    fmt.Println("stop")
}

次のコマンドでコンパイルして実行します。SWを押すごとに「input: 0」が表示されます。

$ go build
$ sudo ./sample
[sudo] password for alarm:
start
input: 1
input: 1
input: 1
input: 1
input: 1
input: 1
input: 0
input: 1
input: 1
input: 0
input: 0
input: 1
input: 1
input: 1
^Cinput: 1
signal receive: interrupt
stop

LCDへの表示

使用するテキスト表示ディスプレイ(LCD)はAQM1602XAで、コントロールICに「ST7032i」を使用し、I2Cでインタフェースされます。

I2Cを可能とするブートローダを構成するために、ファイル「/boot/config.txt」に次の構文を追加します。

dtparam=i2c_arm=on

ブート時にロードされるi2c-devモジュールとi2c_bcm2835モジュールを、ファイル「/etc/modules-load.d/raspberrypi.conf」に次のように設定する。

i2c-dev i2c-bcm2708

<参考>
次のコマンドでもカーネルモジュールが追加できます。

$ sudo modprobe i2c-dev
$ sudo modprobe i2c_bcm2835

次のコマンドでi2c-toolsをインストールします。

$ sudo pacman -Sy i2c-tools

rebootして次のコマンドでI2Cのデバイスが表示されることを確認します。

$ ls /dev
   ・・・
i2c-0
i2c-1
i2c-2
   ・・・

次のコマンドでカーネルのモジュールリストを表示します。

$ lsmod
Module                  Size  Used by
brcmfmac              311296  0
joydev                 20480  0
vc4                   163840  3
smsc95xx               40960  0
brcmutil               16384  1 brcmfmac
usbnet                 53248  1 smsc95xx
mii                    20480  2 usbnet,smsc95xx
cfg80211              688128  1 brcmfmac
drm_kms_helper        192512  2 vc4
rfkill                 32768  4 cfg80211
drm                   421888  3 vc4,drm_kms_helper
syscopyarea            16384  1 drm_kms_helper
sysfillrect            16384  1 drm_kms_helper
sysimgblt              16384  1 drm_kms_helper
fb_sys_fops            16384  1 drm_kms_helper
pwm_bcm2835            16384  0
bcm2835_wdt            16384  0
i2c_bcm2835            16384  0
i2c_dev                20480  0

次のコマンドを発行してI2Cのアドレスを取得する。LCDのI2Cのアドレスは「3e」であることがわかります。

# $ sudo i2cdetect -y 1
[sudo] password for pdt:
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

I2Cをコントロールするライブラリ「go-i2c」を次のコマンドで取得します。なおライブラリ「go-i2c」の詳細については、「package i2c」を参照してください。

$ go get -v github.com/d2r2/go-i2c

go言語でI2Cを制御するライブラリは「GoDoc」にまとめられています。

なお、コントロールIC「ST7032i」の制御については、「anyPiのPiConsole I/Fの入出力」で作成したpython言語のプログラムをもとに、Hitachi HD44780「d2r2/go-hd44780」を参照してプログラムを作成します。

作成したコードは別途記載致します。