みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

PlatformIO Digisparkを動かす

はじめに

ShigezoneでDigisparkを購入したのPlatformIOで動かしてみる。

書き込みの時にコツがいるのでメモっておく。

プロジェクトの作成

作業用ディレクトリを次のように作成する。

$ mkdir -p ~/pio/digispark
$ cd ~/pio/digispark

このボードのCPUはATTINY85なのでボードをdigispark-tinyに設定する。

$ pio init -b digispark-tiny

プログラムの作成

platformio.iniはデフォルトのままで良い。

src/main.cppを次の内容で作成する。

#include <Arduino.h>

#define LED (1)

void setup() {
    pinMode(LED, OUTPUT);
}

void loop() {
    digitalWrite(LED, HIGH);
    delay(500);
    digitalWrite(LED, LOW);
    delay(500);
}

ビルドと書き込み

次のコマンドでビルド。

$ pio run

書き込みでエラー

書き込みで使用しているmicronucleusがエラーにになる。

$ pio run -t upload
(...省略 ...)
micronucleus: library/micronucleus_lib.c:66: micronucleus_connect: Assertion `res >= 4' failed.
Aborted (core dumped)
*** [upload] Error 134

有名なエラーのようでトラブルシューティングは見つかる。

ここによると、udevルールを作成すると良いとある。

/etc/udev/rules.d/49-micronucleus.rules

# UDEV Rules for Micronucleus boards including the Digispark.
# This file must be placed at:
#
# /etc/udev/rules.d/49-micronucleus.rules    (preferred location)
#   or
# /lib/udev/rules.d/49-micronucleus.rules    (req'd on some broken systems)
#
# After this file is copied, physically unplug and reconnect the board.
#
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666"
KERNEL=="ttyACM*", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
#
# If you share your linux system with other users, or just don't like the
# idea of write permission for everybody, you can replace MODE:="0666" with
# OWNER:="yourusername" to create the device owned by you, or with
# GROUP:="somegroupname" and mange access using standard unix groups.

次のコマンドで設定を反映する。

$ sudo udevadm control --reload-rules

それでも発生するエラー

バイスへのアクセス権限の問題だと言われていたが、それを解決したはずなのにまだこのエラーが出る。

micronucleus: library/micronucleus_lib.c:66: micronucleus_connect: Assertion `res >= 4' failed.

試行錯誤を繰り返し辿り着いた解決方法。

ボードとPCをUSBケーブルで接続しているが、書き込む前に一度接続を外すとうまく行くことがわかった。

手順としては次のようになる。

  1. USBケーブルを抜去
  2. 書き込みコマンドを実行
  3. USBケーブルを挿入
  4. 書き込み成功

まず、USBケーブルを抜いて接続されていない状態にする。

$ pio run -t upload
(...省略...)
AVAILABLE: micronucleus
CURRENT: upload_protocol = micronucleus
Uploading .pio/build/digispark-tiny/firmware.hex

この表示が出たところで、ケーブルを接続する。

> Please plug in the device ... 
> Press CTRL+C to terminate the program.
> Device is found!
connecting: 40% complete
> Device has firmware version 1.6
> Available space for user applications: 6012 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 94  page size: 64
> Erase function sleep duration: 752ms
parsing: 60% complete
> Erasing the memory ...
erasing: 80% complete
> Starting to upload ...
writing: 100% complete
>> Micronucleus done. Thank you!
=================================== [SUCCESS] Took 46.83 seconds ===================================

このようにメッセージが表示されれば書き込み成功。

まとめ

micronucleusでの書き込みには若干のコツが必要となり手間取った。 Google先生によって、エラーメッセージとudevルールまでは簡単にたどり着くが、USBでの接続を一度切るというところまではなかなか見つけられなかった。

無事、LEDがチカチカしたのでOK。