2016年5月21日土曜日

DigiSpark に FreeBSD から書き込む


はじめに


(2017/08/31 追記) 手順がわかりにくいので新記事として書き直しました。こちらのページをご覧ください。


DigiSpark は ATTiny85 を使った Arduino 互換の小型ボード。下記のようにいろいろとすごい。
  • 小さくて安い。USB コネクタに直挿しできる。正規品でも 1000円以下。クローン品だと200円以下。
  • AVR マイコンのソフトウェア(V-USB) だけで USB を実現していて、HID デバイスとして認識され、ツール(micronucleus) を使ってファームウェアを書き込める。
  • USB 通信機能は書き込み用だけでなくファームウェアからも呼び出せて、しかるべき通信をするファームウェアを書き込めば、USB 経由で PC と通信できる。
本来は Arduino 互換ボードとして使うものだが、0番地から始まる通常の ATTiny85 のファームウェアを書き込めば(ファームのサイズが 6kB 以下なら) 動作するので、C言語(avr-gcc) で開発したファームウェアを書き込んで ATTiny85 ボードとして使える。今回はこのような使い方が前提。

専用の書き込みツールはもともと Windows, Mac, Linux,OpenBSD に対応しているようだが、試してみたところ FreeBSD からも書き込みができたので報告する。通信用のファームウェアを書き込んで FreeBSD と USB で通信する方法も別稿で紹介する。

コマンドライン版書き込みツール micronucleus (Windows 版)

DigiSpark に対応した Arduino の統合開発環境 

https://sourceforge.net/projects/digistump/files/DigisparkArduino-Win32-1.0.4-May19.zip/download
(または  https://www.arduino.cc/en/Main/Software/ )


をダウンロードする。Windows 用の書き込みツール Digispark-Arduino-1.0.4\hardware\tools\avr\bin\micronucleus.exe がこの統合開発環境に含まれている(Windows では書き込み前にドライバのインストールが必要。ドライバが古いと書き込みソフトが応答しなくなる。 こちらの手順を参照して Digistump.Drivers.zip をインストールする)。

Windows での使い方は
C:\> micronucleus.exe --run FILENAME.hex
実行後、一度 DigiSpark を USB コネクタから抜いて挿しなおすと FILENAME.hex が DigiSpark に書き込まれる。

FreeBSD 用 micronucleus のコンパイル

この書き込みツール micronucleus の FreeBSD 版をコンパイルする。開発元のページ http://digistump.com/wiki/digispark/tutorials/connecting/ から、書き込みツール micronucleus の github にリンクがある。ここから micronucleus-master.zip をダウンロードして展開する。書き込みツールのソースファイル micronucleus-master/commandline/ を FreeBSD に置く。

コンパイル時に Makefile の修正が必要。OS 判定部分の
else ifeq ($(shell uname), OpenBSD)

else ifeq ($(shell uname), FreeBSD)
に修正する。make を実行すると micronucleus が生成する(FreeBSD6.4 で確認。libusb-0.1.12_2 を ports でインストールしてある)。

micronucleus の実行には root 権限が必要。
# micronucleus --run FILENAME.hex
で FILENAME.hex が書き込める。

備考

ATTiny85 には他の高機能のマイコンと異なり、専用のブートローダ領域がなく、割り込みベクタも移動できない。どうやってブートローダを実現しているのかと思ったら、下記のような工夫をしているそうだ(フラッシュメモリの先頭にある割り込みベクタをブートローダから書き換える。ブートローダはフラッシュの末尾に置く)。
http://digistump.com/board/index.php?topic=168.5;wap2

C言語(avr-gcc) で開発したファームウェアを書き込んだところちゃんと動いたが、ウォッチドッグリセットがうまくいかない(ウォッチドッグリセットの発生後フリーズしてしまう。ファームウェアの書き込みモードに移行せず、書き込んだファームウェアも再始動しない)。リセットせずウォッチドッグ割り込みを発生するだけなら正常に動作する。

参考

DigiSpark 国内販売店
http://www.elefine.jp/SHOP/Digispark.html/

DigiSpark 回路図
https://s3.amazonaws.com/digispark/DigisparkSchematicFinal.pdf

ArduinoのHEXファイルを残す方法
http://d.hatena.ne.jp/licheng/20130826/p1
参考にさせていただきました。どうもありがとうございます。

Digispark のヒューズ
hfuse=5FH, lfuse=F1H, efuse=FEH (RESET 無効, 低電圧プログラミング不可, BOD なし)


2 件のコメント:

  1. このコメントは投稿者によって削除されました。

    返信削除
  2. 書き込めない場合 (1) USB ハブを経由して接続する (2) root 権限があるか確認する で解決したことがありました。別の USB ポートに変えるだけで解決することもあります。

    返信削除