「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」からダウンロードします。
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の割り当て一覧を示します。
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」を参照してプログラムを作成します。
作成したコードは別途記載致します。