2013年1月18日金曜日

LeonardoでAttiny85にスケッチを書き込んでみた

もの凄くお久しぶりなのですが、今年初の記事。
タイトルの通り、Arduino as ISP でattiny85にブートローダとスケッチを書き込んでみた。これだけだと大したことないですが、leonardoをispとして使った例はまだ少ないと思うので、とりあえずブログに書き込んでみた次第である。

1/26 追記: ブートローダの書き込みは、厳密にはヒューズビットの調整です。

とりあえず成功したところの写真が次の通り。


さて、今回使ったものは下記の通りである。
  • パソコン(今回はMacOSX10.6のMBA使用)
  • Arduino Leonardo(ここでは互換品のFreaduino使用)
  • USBケーブル(ここでは TypeA to miniB使用 ※)
  • ジャンプワイヤー(オス⇔メスが4本か5本必要)
  • 動作確認用のLED1本(ここではオレンジLED使用)
  • 200±100Ω前後の抵抗1本(ここでは220Ω1%)
  • 書込み先のAVRマイコン(ここではAttiny85-20PU使用)
※本来のLeonardoはmicroBですのでご注意を。

上記にも示したが、正規のArduinoでは無く、Freaduinoを使用した。多分正規のArduino Leonardoでも変わらないと思うが、一応注意。(ちなみに5Vでも3.3Vでも正常に書き込み・駆動するようだ)
あと、Arduino 1.0.2以上が必須である。1.0.1以下の人は最新版を。

Arduino IDEを起動する前に、事前準備としてAttiny用のボードデータを用意しなければならない。そこで、下記のURLの左上辺りに「↓ZIP」的なボタンがあるので、そこからダウンロードし、展開して自分のArduinoフォルダ(Macだと書類の中のArduinoフォルダ)にhardwareというフォルダを作り、そこにavrフォルダを突っ込む。

  GitHub - attiny : https://github.com/damellis/attiny

ここからがメイン。LeonardoにArduinoISPを書き込む。ソースコードはArduino IDEの ファイル→スケッチブックの例→ArduinoISP にある。これを書き込むのだが…。

Duemilanoveなどとの違いとして、仮想シリアルポートをマイコン自身で再現している為に、SSピンを下手に使おうとするとリセットされたりすることがあるらしい(持ってないのでよく知らない)。その対策の為、ArduinoISPのソースコードのうち、冒頭のコメントの直後にある1行を下記の通りに改変する必要がある。

//#define RESET     SS // これを...
  #define RESET     10 // このようにD10ピンに変更する

1はMISO、2はVCC、3はSCLK、4はMOSI、5はRESET、6はGND。
ここまで着たら後は配線するだけ。Arduino側にあるSPIピンは右図のような配置となってる。Freaduinoだと○の位置がMISOの真横なのだが、左上に書いてあるのが普通(?)らしいので、左上に置いた。というか、MISOという字が邪魔で書けなかったというのが本音。

SS(RESET)ポート以外はSPI接続するだけなので大したことはない。
下記のイメージ通りに配線すれば完了である。

SPIとAttiny85の配線は、1-1、2-5、3-7、4-8、5-×、6-4.

ちなみに、VCCは分かりやすく+5V(もしくは3.3V)とも表記されるが、可変することを考慮し、ここではVCCと表記した。MOSI (Master Out Slave In) とMISO (Master In Slave Out) はSPI通信の要。SCLKは通信クロック(制御用)、RESETは書き換え対象(スレーブ)のリセット用である。まぁ一応。

実体配線…というか、ブレッドボードでの具体的な配線まで示す必要性があるかは分からないが、実験的な意味もあるので、一応テスト用配線を含めた配線を示す。


一応VCCとGNDは+と-に振り分けておいた(分かりやすいので)。
テスト用にLEDは220ΩをD3につないでピカピカさせた。ピカピカコードは以下の通り。

void setup( ) {
  pinMode(3, OUTPUT);
}
void loop( ) {
  digitalWrite(3, HIGH);
  delay(1000);
  digitalWrite(3, LOW);
  delay(1000);
}

まぁ大して説明するようなものではないと思うので、見たとおりのチカチカ。ちなみにArduinoでのピンの関係は下図の通り。5ピンしか使えないである。


スケッチの書き込みは、事前に ツール→マイコンボード→Attiny85 (internal 8mhz) にしておくこと。また、ツール→書込装置→Arduino as ISP にしておくこと。逆にLeonardo等を使うときはマイコンボードの方は戻すように。他のAVRライターを使うなら書込装置も。まぁ間違えても多分支障はなく、エラーか不正動作で済むはず。

さて、実際に試された方は分かると思うが、1MHz駆動で、1000msなのに数秒間もかかるピカピカ。これは初期でヒューズビットと呼ばれるCR発振回路(内部クロック)の制御値が1MHzになるような値になっているからである。どうすれば良いかというと、Arduino IDEの ツール→ブートローダを書き込む、でOK。
1/26 追記: ブートローダを書き込む は実際にはヒューズビットの調整等しかしません。hardwareディレクトリを見ると分かりますが、専用のブートローダにあたるものは無いのでご注意下さい。(つまり直接アドレス0x0000にプログラムカウンタが飛ぶことになります。)

とりあえず徹底的に細かく色々書いてみたけど、はっきり言ってここまで書くのに3時間前後かかったので、多分これっきりでまた長く書かなくなりそうだ…。疲れた。絶望的。
そんなわけで今度はAttiny13を…(ぇ

おやすみなさい。

参考文献等

2 件のコメント:

  1. とても魅力的な記事でした!!
    また遊びに来ます!!
    ありがとうございます。

    返信削除
    返信
    1. 銘柄選びさん、コメントありがとうございます。
      情報収集に徹底して記事を書いた甲斐があります(汗

      ペースはかなり遅くなると思いますが、今後もよろしくお願いします。

      削除