LoginSignup
0
0

More than 5 years have passed since last update.

GoでLチカ

Last updated at Posted at 2017-08-20

ググって出てくるのが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勉強したのでコード直した。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0