1. 概要
    1. 久々にGo言語のgobotフレームワークのWebページを見たらdigisparkやらmicrobitをコントロールする例があった。
    2. Raspberry Pi上のGo言語からdigisparkを介してLチカ実験をやってみたら,かなり手間取ったので備忘を残す。
    3. 実験の前提

      Go言語インストール→ Raspberry PiでGo言語を動かす
      RasPi+Go+arduinoでLチカ→ Raspberry Pi + Arduino UNO + Go言語でLチカする

    4. 先行事例
      GOBOT — Digispark
      Controlling a Digispark board
  2. digispark にlittlewireを書き込む

    1.  littlewireはdigisparkをUSB接続の入出力インターフェースとして動作させるためのファームウェア。

    2. 先行事例のgortを使用した方法ではうまくインストールできなかったので,Digistump提供のlittlewireファームと書き込みツールを使用した。

    3. Arduino IDEにこの方法でdigispark-cloneをインストールすると,littilewireファーム(littilewire_v13.hex)と書き込みツール(micronucleus)が既にダウンロードされている。
      ~/.arduino15/packages/digispark/hardware/avr/1.0.0/bootloaders/littlewire_v13.hex
      ~/.arduino15/packages/digispark/tools/micronucleus/2.0a4/micronucleus

    4. ファームと書き込みツールを個別にダウンロードする場合
      1. ファーム
        https://github.com/kimio-kosaka/digispark-clone/archive/1.0.0.zip
        フォームウェア(.hexファイル)はbootloadersフォルダの中にある。
      2. 書き込みツール
        https://github.com/kimio-kosaka/digispark-clone/releases/download/1.0.0/micronucleus-2.0a4-linux-arm.tar.gz
    5. 次のように操作してdigisparkにlittilewire_v13.hexを書き込む。
      $ ./micronucleus  littilewire_v13.hex
      micronucleusのメッセージに従ってdigisparkの再接続またはリセットする。

    6. 正しく書き込まれると新たなUSBデバイスが出現する。
      $ lsusb
      Bus 001 Device 110: ID 1781:0c9f Multiple Vendors USBtiny
  3. digisparkプラットフォームのインストール(make)
    Controlling a Digispark board を参照して作業。ただし,Permission denied が多発してインストールできない。

    $ go install gobot.io/x/gobot/platforms/digispark
    # gobot.io/x/gobot/platforms/digispark
    gcc: error: $WORK/gobot.io/x/gobot/platforms/digispark/_obj/_cgo_main.o: Permission denied
    gcc: error: $WORK/gobot.io/x/gobot/platforms/digispark/_obj/_cgo_export.o: Permission denied
    gcc: error: $WORK/gobot.io/x/gobot/platforms/digispark/_obj/littleWire.cgo2.o: Permission denied
    gcc: error: $WORK/gobot.io/x/gobot/platforms/digispark/_obj/littleWire.o: Permission denied
    gcc: error: $WORK/gobot.io/x/gobot/platforms/digispark/_obj/littleWire_servo.o: Permission denied
    gcc: error: $WORK/gobot.io/x/gobot/platforms/digispark/_obj/littleWire_util.o: Permission denied
    gcc: error: $WORK/gobot.io/x/gobot/platforms/digispark/_obj/opendevice.o: Permission denied
    
    上記をsudoで実行した
    sudo で実行するとgobotファイル群を/root/に探しに行っている。
    /root/ にはgobotのファイルが無いのでエラーになる。
    $ sudo go install gobot.io/x/gobot/platforms/digispark
    can't load package: package gobot.io/x/gobot/platforms/digispark: 
    cannot find package "gobot.io/x/gobot/platforms/digispark" in any of:
     /usr/local/go/src/gobot.io/x/gobot/platforms/digispark (from $GOROOT)
     /root/go/src/gobot.io/x/gobot/platforms/digispark (from $GOPATH)
    
    
    /root/に~/goフォルダのシンボリックリンクを置いた。
    $ sudo ln -s /home/pi/go  /root/go
    
    sudo でインストールすると,今度はエラーは出ずインストール終了。
    $ sudo go install gobot.io/x/gobot/platforms/digispark
    $
  4. Lチカのソースコード digispark_blink.go
    package main
    
    import (
    	"time"
    	"gobot.io/x/gobot"
    	"gobot.io/x/gobot/drivers/gpio"
    	"gobot.io/x/gobot/platforms/digispark"
    )
    
    func main() {
    	digispark := digispark.NewAdaptor()
    	led := gpio.NewLedDriver(digispark, "1")
        work := func() {
                gobot.Every(500*time.Millisecond, func() {
                            led.Toggle()
                    })
            }
    
            robot := gobot.NewRobot("blinkBot",
                    []gobot.Connection{digispark},
                    []gobot.Device{led},
                    work,
            )
    
            robot.Start()
    }
  5. 実行 / ビルド
    $ go run digispark_blink.go
    # command-line-arguments
    /usr/local/go/pkg/tool/linux_arm/link: running gcc failed: exit status 1
    gcc: error: /tmp/go-link-041728947/go.o: Permission denied
    gcc: error: /tmp/go-link-041728947/000000.o: Permission denied
    gcc: error: /tmp/go-link-041728947/000001.o: Permission denied
    
    またもやPermission deniedが出たのでsudoで実行。
    $ sudo go run digispark_blink.go
    
    ビルドもsudoで実行。
    $ sudo go build digispark_blink.go
    
    ビルドで生成された実行ファイルはsudo不要で動く。
    $ ./digispark_blink
  6. 参考
    1. Go言語チュートリアル(日本語)
    2. GOBOTフレームワーク(英語)
    3. GOBOT-Digispark(英語)
    4. KosakaLab-BlogのGo言語関連記事