ArduinoなどでおなじみのAVRマイコンのAtmel(アトメル社)は2016年にマイクロチップ・テクノロジー社(Microchip Technology Inc.)に買収され、それ以降に発売されたチップではICSPでの書き込みからUPDIによる書き込み方法に変更されているようです。
ATtinyシリーズのチップではATtiny202やATtiny404といったtinyAVR 0シリーズやATtiny212やATtiny414といったtinyAVR 1シリーズなどです。
またArduinoでも使われているATmega328Pの後継チップ?となるATmega4809といったmegaAVR 0シリーズのチップも同様で、その書き込み方法にはUPDIが採用されています。
UPDIでの書込みは単線式となっているので1本の信号線のみの接続で書き込みが行えます。
ICSPによる書き込み(MOSI/MISO/SCK/RESET)と比べると接続が簡単で便利なんですが、ICSPとの互換性がないためこれらチップを扱う際はUPDIによる書き込みを行う必要があり、当然対応した書込み装置が必要となってきます。
UPDIの書き込みには既存のデバイスを使って簡単に書き込み装置として使うことが出来ます。
ArduinoやUSBシリアル変換モジュールを使えば、これらをUPDIによる書込み装置として使うことが出来ます。
従来のICSPでの書込み方法とは異なりますが既存のデバイスを書込み装置として使うことができ、その方法は簡単で信号線は1本のみで完結してしまうので便利となります。
新しいATtinyシリーズのチップなどを扱う機会も増えてきたことから、UPDIによる書込み方法をまとめておきます。
UPDIによる書込み方法!Arduino IDEで環境を構築する!
私の場合、Arduinoから電子工作を始めたということもありAVRマイコンやチップを扱うことが比較的多いのですが、新しいAVRチップはその書き込み方法が従来のICSPでの書き込み方法からUPDIによる書き込み方式が採用されています。
Arduinoでも使われているATmega328PやATtinyシリーズのチップとなるATtiny13やATtiny85など少し古いタイプのものはICSPによる書き込みとなっています。
ICSPによる書き込みなので、MOSI/MISO/SCK/RESETを使った書き込みですね!
Arduinoのブートローダーの書き込みなどでもこの書き込み方法を使います。
対して新しいAVRチップ、例えばATtinyシリーズですとtinyAVR 0/1/2シリーズやmegaAVR 0シリーズなどはUPDI(Unified Program and Debug Interface)による書き込み方法が採用されています。
ICSPによる書き込みでは、Arduino IDEに標準で用意されているArduinoISPスケッチをArduinoボードに書き込みAVRライタとして使ったり、USBaspといった書き込み装置が使えました。
しかしUPDIによる書き込み方法とは互換性がないため新しいシリーズのチップを扱う場合、対応した書き込み環境を新たに用意する必要があります。
Arduino IDEでUPDIでの書き込み環境を作る!
UPDIでの書き込みでは従来のICSPでの書き込み環境が使えないので新たに用意する必要があります。
とは言っても簡単です!
既存のArduinoボードやUSB-シリアル変換モジュールに少し手を加えると可能となります。
まずArduinoを書き込み装置として使う手順です!
- 書き込み装置として機能するArduinoの用意(“jtag2updi”の書き込み)
- UPDI書き込みに対応した各ボードパッケージのインストール
- Arduino(書込み装置)との接続
- ブートローダーの書込み書き込み
- スケッチの書き込み
①書き込み装置として機能するArduinoの用意(“jtag2updi”の書き込み)
まずArduinoを書込み装置として使う方法です!
Arduino UnoやNanoなどが使えますが、こちらではUnoで進めていきます。
ICSPでの書き込みではArduino IDEに用意されている[ArduinoISP]というスケッチをArduinoボードに書き込むことでArduinoを書き込み装置として使うことが出来ました。
Arduinoではおなじみの方法ですね!
UPDIでの書き込みでも同様に便利な書き込み用のスケッチ[jtag2updi]が用意されています。
ATtiny用のボードパッケージ等でおなじみのSpenceKondeさんが配布されているものです。
このスケッチをArduinoに書き込むことによりUPDI書込み装置として使うことが出来ます。
書き込み用のスケッチ(jtag2updi)は以下GitHubサイトからダウンロード出来ます。
参考 SpenceKonde/jtag2updiGitHub解凍したフォルダは「jtag2updi-master」という名前になっているので、「jtag2updi」にフォルダ名を変更しておきます。(フォルダ内のメインプログラムのファイル名「jtag2updi.ino」にフォルダ名を合わせておきます)
フォルダ内にあるArduinoファイル「jtag2updi.ino」を開くと空白のスケッチとなっていますが、同フォルダ内にある他のヘッダーファイル等も読み込まれるので問題ありません。
このスケッチを通常作業でArduinoボードにアップロードするとUPDI書込み装置として機能してくれます。
UPDI書き込み装置の完成です!
②UPDI書き込みに対応した各ボードパッケージのインストール
UPDIでの書き込み装置が用意出来ました。
あとはArduino IDEを使いこのArduinoを経由して書き込みを行いますが、UPDI書き込みに対応したチップを扱うボードパッケージのインストールが必要となります。
こちらでは、UPDI書き込みに対応したATtinyチップ(tinyAVR 0/1/2シリーズ)とATmegaチップ(megaAVR 0シリーズ)を対象にArduino IDEを使い書き込みが出来る環境を作っていきます。
【tinyAVR 0/1/2シリーズ】megaTinyCoreボードパッケージのインストール
tinyAVR 0/1/2シリーズといったUPDI書き込みに対応したATtinyチップへの書き込みには[megaTinyCore]というボードパッケージのインストールが必要となります。
ATtiny202やATtiny412、ATtiny1614といったUPDI書き込みに対応したATtinyチップ用のボードパッケージです。
本記事のUPDI書き込みでは必要ありませんが、ICSP書き込みに対応したATtinyチップを扱う場合は[ATTinyCore]ボードパッケージが必要となります。
参考までに!
Arduino IDEの[基本設定]から[追加のボードマネージャのURL]に以下のURLを貼り付けます。
既に[ATtinyCore]をインストール済みでURLを貼り付けている場合は不要です!
次に[ツール]→[ボード]→[ボードマネージャ]へと進み[megaTinyCore by Spence Konde]をインストールして完了です。
これで[ボード]の項目に[megaTinyCore]が加わり、UPDI書き込みに対応した各種ATtinyチップを選択しコンパイル&書き込みを行うことが出来ます。
【megaAVR 0シリーズ】MegaCoreXボードパッケージのインストール
次はATmega808やATmega3208、ATmega4809といったmegaAVR 0シリーズのチップを扱う際は[MegaCoreX]ボードパッケージが必要となります。(必要なければこの項目は飛ばして下さい)
megaAVR 0シリーズのチップを扱う際は、同様の手順で[追加のボードマネージャのURL]に以下URLを貼り付けます。
これで[ボード]の項目に[MegaCoreX]が加わり、UPDI書き込みに対応したmegaAVR 0シリーズのチップを選択することが出来るようになります。
これでArduino IDEでUPDIによる書込み環境が出来ました!
③書き込み装置(Arduino)との接続
それでは実際に書き込みを行ってみます。
UPDI書き込みに対応したチップは結構手元にあるのですが、こちらではATtiny202への書き込みを例にやってみます!
ATtiny202のピンアウトはこのようになっています。
書き込みの際に使う端子は、UPDI/VCC/GNDの3本のみです。
チップ駆動電源となるVCC(1番ピン)とGND(8番ピン)、そして書き込みで使う信号線はUPDI端子(6番ピン)1本のみの接続でブートローダーやスケッチの書き込みを行うことが出来ます。
チップによってVCC/GND/UPDI端子の位置が異なってきますが、基本的に他のチップでも以下同様の手順で書き込み作業は行えます。
ICSPでの書き込みでは6本の接続(VCC/GND/MOSI/MISO/SCK/RESET)が必要でしたが、UPDIでの書き込みでは3本(信号線は1本のみ)で行えるので接続は非常に簡単です。
MOSI/MISOってどっちだったかな?なんてこともなく接続が簡単で便利です!
UPDIでの書き込み装置として機能するように先程jtag2updiスケッチを書き込んだArduinoとの接続はこのようになります。
信号線はArduinoのD6端子から4.7kΩの抵抗を介してUPDI端子に接続するだけです。
Arduino | ATtiny202 |
D6 | — 4.7kΩ — UPDI |
5V | VCC |
GND | GND |
④ブートローダーの書き込み
それでは書き込みです。
初めて使うチップ(生チップ)では最初に1度だけブートローダーの書き込みが必要となってきます。
ATtiny(こちらではATtiny202を使っています)ではブートローダーは必要ありませんが、ヒューズビットを書き換えるために1度だけブートローダーを書き込む作業を行っておきます。
動作周波数(クロック周波数)などの各種設定を変更するために行います。
まずボードの設定です。
[ツール]→[ボード]→[megaTinyCore]の中から書き込む対象チップを選択します。
今回ATtiny202に書き込むので[ATtiny412/402/212/202]ですね。
動作周波数(Clock)等変更できますが、今回は他の項目はすべてデフォルト設定で行いました。
そしてjtag2updiを書き込んだArduinoを経由してUPDIによる書き込みを行うので、[書き込み装置]は[jtag2updi]を選択しておきます。
あとは[ブートローダを書き込む]をクリックしてブートローダーの書き込み(ヒューズの書き換え)を行います。
⑤スケッチの書き込み
最後にスケッチの書き込みです!
Lチカスケッチを書き込んでみます。
ATtiny202の7番ピン(D4)に接続したLEDを1秒間隔で点滅させるスケッチです。
1 2 3 4 5 6 7 8 9 10 11 | void setup() { pinMode(4, OUTPUT); } void loop() { digitalWrite(4, HIGH); delay(1000); digitalWrite(4, LOW); delay(1000); } |
書き込むための接続およびボード設定は先程ブートローダーを書き込んだ時と同じです。
スケッチの書き込みは、[書き込み装置を使って書き込む]から行います。
LEDが1秒間隔で点滅すれば成功です!
ICSPによる書き込みと比べUPDIでの書き込みは信号線は1本のみいう単線で行えるので簡単で便利ですね!
使用するチップにより端子の位置(VCC/GND/UPDI)が異なりますが、他のチップを扱う場合も接続や作業手順は同じです。
[ボード]の項目で対象となるチップを選択してブートローダーを1度だけ書き込み、あとは[書き込み装置を使って書き込む]からスケッチの書き込みが行えます。
ATmega4809などmegaAVRシリーズのチップでも作業手順は同じです。
USB-シリアル変換モジュールを使った書き込み方法
先程はArduinoに「jtag2updi」を使ってUPDIの書き込み装置として使いました。
UPDIでの書き込みは、USB-シリアル変換モジュール経由で行うことも出来ます。
こちらではFTDI社製のシリアルモジュールを使って書き込みを行ってみました。
USB-シリアル変換モジュールを使ったUPDI書き込みは以下図の接続が基本となります。
シリアルモジュールのTXD-RXD端子間に接続するショットキーバリアダイオードとRXD-UPDI端子間に接続する470Ωの抵抗が必要となります!
ショットキーダイオードではありませんが、汎用ダイオードとして一般的によく使われる1N4148で代用しましたが問題なく使えました!
反応速度とか関係してくるのかな?BAT43や1N5817あたりのショットキーダイオードは入手もしやすいのでいいかもしれません!
USB-シリアル変換モジュールと書き込む対象チップとの接続はこのようになります。
今回もATtiny202を例にした接続です。
Arduinoを使った時と同様、UPDI/VCC/GNDを対応した端子に接続するだけです!
ブートローダーやスケッチの書き込み方法は先程の手順と同じですが、書き込み装置の設定が変わってきます。
書き込み装置として選ぶのは[SerialUPDI]です。
ボーレートによりSerialUPDIは他にも複数選択肢がありますが、FTDIのシリアルモジュール(FT232RLチップ)を使ったATtiny202への書き込みにはどの転送スピードを選択しても書き込みは出来ました。
[シリアルポート]・[ボード]・[書き込み装置]の選択ができたら、あとは先程と同じ手順で[ブートローダーを書き込む]、そして[書き込み装置を使って書き込む]からブートローダーやスケッチの書き込みを行うことが出来ます。USB-シリアル変換モジュール経由で直接書き込めるので、先程のようにjtag2updiを書き込んだArduinoを用意する手間が省けます。
作業環境により使いやすい書き込み方法を選べばいいと思います。
UPDIは送信側・受信側を交互にデータ送信することで1本の信号線のみで双方向の通信を行う半二重通信です。
上記接続図通りで上手く機能してくれるのですが、更に詳しい事が知りたい方はSpenceKondeさんが以下サイトにまとめられているので、ボーレートや抵抗値の選定など参考になるかと思います。
1つのモジュールでICSP/UPDI/UARTの書き込みが出来るボードの製作
UPDI書き込みに対応したチップでは先述のように、[jtag2updi]を使いArduinoボードを書き込み装置として使う方法やUSB-シリアル変換モジュール経由での書き込み方法が使えます。
どちらの方法も簡単なんですが、書き込みの際に毎回付随するパーツを用意して接続するなど結構面倒な作業となります。
またICSPによる書き込みに対応したチップを扱う際はUPDIとは互換性がないので、これまた対応した書き込み方法が必要となってきます。
UPDIに対応したチップは便利ですが、まだまだ古いタイプのATtinyやATmega328PなどICSP書き込みのチップを扱うことも多いことから毎回それぞれに対応した書き込み装置を用意するのが面倒だったので、1つのボードでICSPとUPDI、またUARTでの書き込みが行える便利な書き込み基板(モジュール)を作ってみました。(HACKADAY.IOで紹介されていたものです)
こちらも参考になればと思います。
最後に!
UPDI書き込みに対応したtinyAVR 0/1/2シリーズやmegaAVR 0シリーズといった新しいタイプのAVRチップを扱う機会も増えてきたことから、UPDIによる書き込み方法をまとめてみました!
ICSPでの書き込みに対応したATtinyに関してはこちらの記事でまとめているので合わせて読んで頂ければと思います。
ATtiny85やATtiny84など、まだまだ便利に使えますからね!
コメントを残す