11月25日発売 書籍『Arduinoと3Dプリンタでロボットを作ろう』を出させて頂きました!

【自作基板 / 電子工作】UPDI・ICSP・UART書き込みに対応した自作AVRプログラマの製作![AVR Universal Programmer]

Arduinoとの出会いをきっかけに電子工作を始めて以来、AVRマイコンは個人的にも思い入れのある存在で、今でも何かと使う機会が多いです。

そしてAVRマイコンにはICSPUPDIといった複数の書き込み方式があり、扱うチップによって対応する書き込み装置(AVRプログラマ)を都度使い分ける必要があります。

例えば、Arduino(ATmega328P)やATtiny85など従来のAVRではICSPでの書き込みが必要である一方、最近のATtiny202やATtiny814などの新しいチップではUPDIによる書き込み方式が使われています。

これは、2016年にAVRの開発元であるAtmel(アトメル社)がMicrochip Technology Inc.(マイクロチップ・テクノロジー社)に買収されたことにより、後継シリーズのtinyAVR 0/1/2やmegaAVR 0シリーズでは書き込み方式がUPDIに変更されたことによるようです。

ICSPとUPDIは互換性がないため、プロジェクトごとに異なる書き込み環境を用意しなければならず、「あのチップにはこの書き込み装置、このボードには別のやつ…」といった煩雑さを感じる事がよくあります。

そういった背景から、ICSPとUPDI、さらにUART書き込みまで対応出来る汎用AVRプログラマを自作してみることにしました。

UPDI・ICSP・UART書き込みに対応した自作AVRプログラマの製作!

実は今回のAVRプログラマを作るきっかけとなったのは、以前製作した同様のコンセプトで設計されたオープンソースのプロジェクトです。

ここ1年ほど使っていますが、自作で作れる汎用AVRプログラマとして重宝しています。

【電子工作】1台のデバイスでUART/ICSP/UPDIのプログラミング(書き込み)が出来る便利な基板の紹介!

そして日々の作業環境に合わせて「もう少しこうだったらいいのに」と思う点も出てきたため、今回はそれを踏まえてより使いやすくなるように自作ボードとして新たに製作してみることにしました。

ボードコンセプト

1台で古いATmega/ATtiny系から、UPDI対応の最新tinyAVRシリーズ、そしてUARTにも対応させるシンプルな汎用AVRプログラマとするのが今回製作したボードのコンセプトです。

ICSP書き込みについて

ICSP(In-Circuit Serial Programming)による書き込みは、Arduinoを使う場合には「ArduinoISP」スケッチを使って書き込み機として使う方法が一般的です。
また、安価で入手出来るUSBaspといったAVRライターもよく使われています。

ArduinoISPスケッチはArduino IDEの「スケッチ例」に含まれており、Arduino UNOといったATmega328P(ATmega32U4など)に書き込むことでICSP書き込み機として動作します。

またUSBaspのようなICSPプログラマでも同様に、提供されている書き込みプログラムをATmega8系のMCUを使い実現しています。

【電子工作 / PCB】AVRプログラマ USBaspを自分仕様にアレンジして自作ボードを製作してみました!

しかし、これらMCUで組むと必要なパーツ数が多くなってしまうので、今回製作したボードでは必要な部品点数を減らすためにATtinyを使いこのマイコンで動くカスタムされたArduinoISPスケッチを使うことでICSP書き込みを行えるようにしています。

UPDI書き込みについて

UPDI(Unified Program and Debug Interface)による書き込みは、上記と同様Arduino(ATmega328PやATmega32U4)に「jtag2updi」スケッチを書き込みUPDIプログラマとして動かすか、シリアルUPDIを使う方法があります。

本ボードでは、USB-シリアル変換チップとしてFT232RLを使っているので、これを使えば簡単にシリアルUPDIによる書き込みを行う回路を組むことがこ出来るので採用しています。

【電子工作 / Arduino】ATtiny202をArduino IDEで使う環境メモ!

UART

USB-シリアル変換チップにFT232RLを使うことにしました。
このチップは5V or 3.3Vのロジックレベル切り替えが容易で、UART通信以外にも多用途に利用できます。

【電子工作 / PCB】FTDI FT232RLを使ったUSB-シリアル変換モジュールを自作してみました

本ボードでは、TX/RX以外にもDTRやRTSピンなどを引き出しており以下のような用途にも対応出来るようにしました。

例えば、DTR信号が使えるとArduino互換ボードなどへの自動書き込み(オートリセット)で利用することができます。

またESP32では、それに加えてRTS信号が使えるとこちらもオートリセットをかける用途でも使えます。

【電子工作】ESP32(ESP-WROOM-32)の基本的な使い方!モジュール単体で動かしてみる!
【Arduino】USB-シリアル変換モジュール(USB-TTLコンバータ)からArduinoにスケッチを書き込む方法!

これらの制御信号が揃っていることで、通常のUSBシリアル変換器としても汎用的に使用出来ると思います。


以上が全体構成となります。

電圧レベル(3.3V or 5V)、UARTまたはプログラムモード、ICSP/UPDI書き込みの切り替えと、各モードをスイッチ操作により変更できるシンプルな構成になります。

回路と基板設計・構成について

先述の通り今回製作したAVRプログラマボードは、ICSP / UPDI / UART という3つの書き込み方式に対応する構成になっています。

USB-シリアル変換チップにFT232RLを使用、UPDI書き込みにはこのTX/RXラインを使いシリアルUPDIでの書き込みを行い、ICSPでの書き込みではATtiny1614(またはATtiny814)に書き込んでいるISPプログラムを使い書き込みを行う構成とし、それらモードおよびロジック電圧(3.3V/5V)をスイッチ操作により切り替える形としています。

全体の回路構成は非常にシンプルです。

UART部分

USB-シリアル変換チップにFT232RLを使用。
TX/RXだけでなく、DTRやRTSなどの制御信号も引き出しています。

FT232RLには内蔵3.3Vレギュレータが搭載されていますが、出力できるのは50mA程度です。
例えば、ESP32などを接続して使うことも想定し外部LDOを使いました。

UPDI部分

UPDIによる書き込み部分では、FT232RLを使ったシリアルUPDI書き込みとしています。

参考 SerialUPDIGitHub

外部のMCUなしで直接書き込みが可能です。

このように、RXD-TXD間にダイオードと制限&保護抵抗を入れるだけのシンプルな構成で、jtag2updiなどのソフトと組み合わせて使うことができます。

ICSP部分

ICSP書き込みでは、MOSI / MISO / SCK / RESET / VCC / GND の6本の信号線を用いてマイコンに直接プログラムを書き込みます。

ATtiny1614(またはATtiny814)を使ってArduinoISP互換のスケッチを動作させICSP書き込みを行う形としています。

PCBWayに基板を発注

基板の発注は、PCBWayを利用しました。

基板データ(ガーバーファイル)をダウンロード出来るようにしておきます。
何かの参考になればと思います。

簡単にPCBWayでの発注方法も見ておきます。

PCBWayでの基板発注は、[概算の見積価格の確認(仮発注)] → [データチェックを受け最終価格が決定]という流れで進めていきます。

発注項目の選択は特記すべきところはなくデフォルトで選択されている項目から変更する必要はありませんが、基板製造時に入る製造番号[Remove product No.]を削除するオプション[Yes(extra+$1.5)]を選択しました。

レジスト(基板カラー)はお好みで選択して下さい。

基板製造料金は6.5ドルとなりました。

MEMO
本記事でご紹介している基板は、[表面処理]オプションに[無電解金フラッシュ(ENIG)]を選択しています!

今回基板と一緒にメタルマスク(ステンシル)も発注しました。
パーツの実装面は、[表面のみ]となります。

基板製造料金6.5ドルにステンシル料金10ドルが加算されて、16.5ドルという見積価格になりました。

ここからガーバーファイルをアップロードしてデータのレビューが行われ、最終価格が決定され発注への流れとなります。

PCBWayでの基本的な基板発注方法はこちらの記事で詳しくまとめています。
あわせて見て頂ければと思います。

【PCBWay】初めてPCBWayで基板を発注してみました。ユーザー登録から基板発注までの手順をご紹介!

基板の到着

選択するレジストの色によって若干製造時間が変わってきますが、通常の基板であれば2~3日程度で製造が完了し発送されます。

今回配送方法にOCSを選択し、発注から6日で手元に基板が届きました。
PCBWayさんのOCSって早いんですよねー!
発送完了から2日で手元に届いたことになります。

今回はギフトショップで購入した基板定規も一緒に届きました。

PCBWayでは選択出来るレジストカラーが多いので、今後基板を発注する際の色味や質感等の確認で使おうと考えています。

PCBWayのギフトショップで注文していた基板定規(PCB Ruler)が届きました!基板発注の際にレジストの色味確認で使おうと考えています

パーツの実装

パーツの実装です。
ステンシルを使いはんだペーストを塗布します。

いつも使っているはんだペーストを切らせてしまい、シリンジに入ったものを使ったのですが・・・
少し粘性が弱くて細かいパッド部分から垂れてしまいました。

それほどシビアなパーツは使っていないので、ブリッジしても手はんだでの修正は簡単だと思います。

ちなみに、ステンシルを使ったはんだペーストの塗布ではいつもこれを使っています。

パーツの実装は、MHP50というミニリフロー装置を使いました。
PD電源が使えコンパクトで作業スペースの邪魔にもなりにくい、自作基板製作ではいつも愛用している非常に便利なホットプレートです!

【電子工作 / PCB】ミニリフロー装置『Miniware MHP50』を使ってみる!加熱性能や安全設計はMHP30から全て引き継がれ使い勝手がさらに向上した便利なリフロー装置です

今回製作した基板はMHP50のホットプレートサイズを若干超えるサイズ(70mm×40mm)だったため、このような専用スタンドを使いリフローしました。

MHP50を使ったリフローで、大きな基板にも対応することが出来るので便利です!

【電子工作 / PCB】Miniware MHP50で使えるスタンドの製作。大きな基板やいろんなリフロー方法に対応出来るので便利ですよ!

リフロー後Type-C端子がブリッジしてしまいましたが、手はんだで修正しました。

ピンヘッダー&ピンソケット、ボックスヘッダーを取り付けて実装は完了です!

ファームウェアの書き込み

ICSPによる書き込み用のファームウェアをボードのATtinyに書き込みます。
ArduinoISPスケッチをATtiny用にカスタムしたこちらのISPファームウェア(ISAISP.ino)を使わせて頂きました。

参考 Integrated Serial Adapter (ISA)Hackaday

一応こちらからもダウンロード出来るようにしておきます。

上記ファームウェアを本ボードのATtinyに書き込みます。

ファームウェアの書き込みには、本ボード背面の[Self Prog]ジャンパーを短絡させておきます。

そしてモードスイッチを[PROG]および[UPDI]にセットして、Arduino IDEから本ボード搭載のATtinyに上記ISPファームウェアを書き込みます。

ATtinyを扱われたことがない方のために、ボードパッケージのインストール方法なども簡単に書いておきます。
必要ない方は飛ばして下さい!

ボードパッケージ(megaTinyCore)のインストール

まず本ボードで使っているATtiny1614(または814)へのファームウェアの書き込みには、[megaTinyCore]というボードパッケージをArduino IDEにインストールしておく必要があります。

Arduino IDEの[基本設定] → [追加のボードマネージャのURL]に進み、

以下URLを貼り付けます。

貼り付けるURL
http://drazzy.com/package_drazzy.com_index.json

次にボードマネージャへと進み、「megatiny」で検索すると目的の[megaTinyCore by Spence Konde]が見つかります。
このボードパッケージをインストールします。

ファームウェアの書き込み

これでArduino IDEの[ボード]の項目に[megaTinyCore]が加わり、UPDI書き込みに対応した各種ATtinyチップへの書き込みが行えるようになります。

本基板ではATtiny1614(またはATtiny814)を使っており、これにファームウェアを書き込むので選択します。

本ボードとPCをケーブルで接続し、[ポート]を選択、[書き込み装置]に[SerialUPDI]を選択します。

ATtiny1614は生チップを使っているので、まずヒューズの書き換えを行います。
下記設定で[ブートローダーを書き込む]を選択し書き込みます。

[ブートローダーの書き込みが完了しました]と表示されればヒューズの書き込みは完了です。

次に[書き込み装置を使って書き込む]を選択し、ファームウェア本体を書き込みます。

書き込みが完了したらこのような表示になると思います。

以上でファームウェアの書き込みは完了です。
これでAVRプログラマの完成です!

MEMO
正常にファームウェアの書き込みが完了したら、基板背面のジャンパーパッドの短絡は解除してお使い下さい!

シルクプリントのミスを発見

完成後、書き込み等の動作確認をやっていたのですが、PCにシリアルとして認識されているのにICSP/UPDIともに書き込みが全く出来ず・・・

ここで初めて気付いたのですが、シルクプリントのミスがありました。
切り替えスイッチ部分のICSPとUPDIのシルクを入れる場所が逆になっていました。

これは悔しいですね!

MEMO
本記事内のKiCad画像や上記ダウンロードデータは、シルクを入れ替え修正済みです!

書き込み設定

AVRプログラマとしての書き込み設定は対象デバイスによって変わってきますが、簡単に見ておきます。

ICSPによる書き込み

ICSPによる書き込みを行う場合、モードスイッチを[PROG]および[ICSP]を選択します。

書き込む対象デバイスによって変わってきますが、書き込み装置に[Arduino as ISP]を選択して書き込みを行います。

ICSPによる書き込み方法は、こちらの記事が参考になると思います。

【電子工作 / PCB】100均で売ってそうなミニゲーム機を自作しよう!ATtiny85で動かすミニゲーム機TinyConsoleの製作その②[基板実装・ゲームデータの書き込み]

UPDIによる書き込み

UPDIによる書き込みを行う場合、モードスイッチを[PROG]および[UPDI]を選択します。

書き込み装置に[SerialUPDI]を選択して書き込みを行います。

UPDIによる書き込み方法は、こちらの記事が参考になると思います。

【Arduino】新しいATtiny(tinyAVR 0/1/2シリーズ)やmegaAVR 0シリーズなどで採用されたUPDIによる書き込み方法! Arduino IDEで環境を構築する!

UART

USB-シリアルコンバーターとして使用する場合、モードスイッチを[UART]にします。
この状態では、FT232RLがPCとのシリアル通信を仲介するUSB-シリアル変換器として動作します。

シリアルモニターでのデバッグ通信、またESP32など他のマイコンとの通信にも利用できます。

使用パーツ一覧

今回使用したパーツの一覧です。

パーツ定数入手先
コンデンサ
(0805)
C9/C9 1μFAliExpress
コンデンサ
(0603)
C1/C2/C3/C5 100nF
C4/C6 4.7μF
C7/C10 47pF
AliExpress
ダイオード
(SOD-123)
D1 1N5819WAliExpress
ヒューズ
(1206)
F1 500mAAliExpress
USB端子J2 Type-C端子(16P)AliExpress / 秋月電子
LED
(0603)
LED1(TX) / LED2(RX)
LED3(3.3V) / LED4(5V)
LED5(Programming) / LED6(Error)
※色はお好みで
AliExpress
抵抗
(0603)
R1/R2 5.1kΩ
R3/R4/R5/R6/R8/R9 1kΩ
R7 470Ω
R10/R11 27Ω
AliExpress
スイッチSW1/SW2/SW3 6P DPDT(SMD)AliExpress
MUCU2 ATtiny1614(ATtiny814) SOIC-14AliExpress / モノタロウ
USB-TTLU2 FT232RL(SSOP28)AliExpress / 秋月電子
LDOU3 LDL1117S33RAliExpress
その他ホックスヘッダー 6P(2×3)
ピンヘッダー / ピンソケット
秋月電子

最後に!

今回製作したAVRプログラマ(AVR Universal Programmer)は、ICSP・UPDI・UARTという3つの書き込み方式に対応しており、汎用プログラマとしては便利だと思います。

ArduinoやATtinyなどAVRマイコンを使った電子工作をしていると、「このチップはICSP?こっちはUPDIしか使えない」といった場面によく出くわしますが、そんなときにこの1枚があれば便利です。

また、書き込み以外にもUSBシリアルアダプタとしても使える構成なので、ちょっとしたデバッグ用途やESP32などの書き込み補助的な使い方も出来るのがいいと思います。

AVRマイコンの使用環境によって必要な構成は異なるかもしれませんが、自分の環境に合った物が作れるのは自作のいいところですね!
これから使っていきます・・・

コメントを残す