ググって出てくるのがPythonの例ばかりで少し飽きてきたのでGoでやってみたメモ。
インストール
cd /opt
curl -L -O https://storage.googleapis.com/golang/go1.8.3.linux-armv6l.tar.gz
diff \
<(sha256sum go1.8.3.linux-armv6l.tar.gz | awk '$0=$1') \
<(echo '3c30a3e24736ca776fc6314e5092fb8584bd3a4a2c2fa7307ae779ba2735e668')
tar xzf go1.8.3.linux-armv6l.tar.gz
mv go go-1.8.3
# `/usr/local/go`に入れなさい、と公式サイトに書いてあるので。
ln -s /opt/go-1.8.3 /usr/local/go
rm go1.8.3.linux-armv6l.tar.gz
確認
# `/usr/local/go`にあるならGOROOTの設定はいらないらしいが、一応。
cat >> ~/.bashrc <<'END'
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
END
source ~/.bashrc
go version
#> go version go1.8.3 linux/arm
hello world
cat > hello.go <<'END'
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
END
go run hello.go
#> hello, world
GOPATH
以下のようなディレクトリ構成にするのがGoの流儀らしい。
~/go
├── bin # `go install` コマンドでできたバイナリが配置される
├── pkg # 依存するパッケージがビルドされたものが置かれるっぽい
└── src # Goのソースコード
で、 ~/go
を $GOPATH
に設定して、これを起点にいろいろ探しに行くそうな。
hello.go
をGoの流儀に合わせる。
cat >> ~/.bashrc <<'END'
export GOPATH=~/go
export PATH=$PATH:$GOPATH/bin
END
source ~/.bashrc
mkdir -p $GOPATH/src/hello
mv hello.go $GOPATH/src/hello/
# `$GOPATH/bin` にhelloコマンドができる
go install hello
hello
#> hello, world
Lチカ
ここからが本題。
go-rpio
GPIOをコントロールするライブラリを作ってくれている方がおられるので
ありがたく使わせてもらいます。
go get -v github.com/stianeikeland/go-rpio
cd $GOPATH/src/github.com/stianeikeland/go-rpio
# v3.0.0を使う
git checkout -b v3.0.0 refs/tags/v3.0.0
チカチカするソース
mkdir -p $GOPATH/src/gpio/blinkled
cat $GOPATH/src/gpio/blinkled/blinkled.go
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(21) // GPIO21ピンを使う
pin.Output()
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGINT)
loop := true
for loop {
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")
}
実行
GPIO21ピンにLEDを繋いで、以下実行。
cd $GOPATH/src/snippet/gpio/blinkled
go install
blinkled
# 1秒置きにチカチカするはず。
# 停止はCtrl-Cで。
少しGo勉強したのでコード直した。