ATmega328の書き込み装置をArduino UNO用シールドとして作成
公開日
前回、AVRマイクロコントローラーのATmega328PへのArduinoブートローダーおよびArduinoスケッチを書き込む開発準備についてまとめてみました。
この時作った書き込み装置だとブレッドボードだったため、回路がコードでごちゃごちゃしてしまっているため実用性がなく、その後日談として今回はArduino UNOのためのシールドとして組み立てましたので、この記事にまとめておきたいと思います。
事例を検索で引き当てる
前回の記事で書き込み装置の回路については確立できているかと思いますので、回路図についてはなるべく考えることを減らしたいと考えます。
そのため、単にシールドとして組み立てるだけであれば、まっさきに先人の事例がないかと考え検索してみました。
良い事例を引き当てるための検索に悪戦苦闘すると思いきや、やっぱりArduinoは大量にリソースがあり容易に実現方法を引き当てることができました。
そもそも、事例を1件も見つけることができなかったならこの記事にするべきシールド作成はあきらめてしまうかもしれなかったので、見つけることができて本当に良かったと思います。
Arduino UNO As AtMega328P Programmer by Ericさん
こちらinstructablesのサイトで紹介されていたEricさんの事例は、部品と回路図がまとめられていてとても理解しやすかったです。
またこの事例の場合、Atmega328チップへ書き込んだスケッチによってはAtmega328のMOSI/MISO/SCKのためのGPIOピンから信号が出力されるような用途だった場合に、次回の書き込み時に競合することで破損することになるため、このトラブルを防ぐため抵抗(470Ω)を入れているという工夫があったところはなるほどと思いました。
写真でも紹介されていますが、Atmega328と接続する部品がZIFソケットという部品でできていて、とてもかっこいいと思ったところもポイントです!
ぜひ参考にしたいと思います。
ZIFソケットって何?
一見してレバーを倒すことでソケットの取り外しができそうで、簡単にできそうだな、程度に見ていたのですが、一応外堀から攻める姿勢という意味でZIFソケットについて調査してみました。
ZIFソケットとは、CPUの脱着を行うソケットのひとつで、ソケットの脇に取り付けられたレバーの操作によってCPUチップの抜き差しが行える機構をもつもののことである。
ZIFソケットでは、CPUの固定と解放をレバー操作で行う。レバーを上げてCPUをソケットに挿入し、レバーを元に戻すと、ピンは挟まれて固定され、確実に装着される。取り外す際もレバーを上げてピンを解放すればよい。いずれにしても力を加える必要はない(zero insertion forceである)。
ZIFはZero Insertion Force Socketの頭文字をとってZIFとのこと。
このZIFソケットってどう発音するか?
その点では、動画で取り扱っている方がいらっしゃいました。
こちらの方はジフって発音しているので私も習ってジフソケットということにします。
自作シールドでの変更点
instructablesのサイトで紹介されていた事例の場合では、基板から自作していてちょっと大がかりでした。
私はチャチャっと作ってしまいたくて、ユニバーサル基板を使ってシンプルに実現できるよう以下の変更点を加えることにしました。
- いい感じに必要な部品を乗せられるように基板の回路図は若干修正する
- 私のArduino UNOだとGPIO 0~7のソケットがユニバーサル基板にはまらない数ミリずれてるため、ここへピンソケットをつけることが出来ず別のGPIOへ配置換え
(そもそもArduino UNOってオープンソースハードウェアなので、一般的にずれた配置ってことなのでしょうか…) - 収まりきらない部品は省略する、または将来必要になってから付け足せばよいものは今回は実装しない
必要な部品
- ユニバーサル基板 1個
- リセット端子用プルアップ抵抗(10kΩ) 1個
- ZIFソケット 1個
- 回路保護用の抵抗(470Ω) 3個
- LED 4個 / LED電流制御用の抵抗(470Ω) 4個
- 水晶(16MHz) 1個 / コンデンサ(22pF) 2個
- マイコン通電用スイッチ 1個
個人的にツールというのは、「動作しさえすれば、安い部品でもよく、たとえ壊れても簡単に直せれば品質は問わない」というものだと考えてます。
そのため手元になかった、ZIFソケット/水晶/コンデンサについては安さ重視でAliExpressで購入。
(そもそもAliExpressは当たり外れが大きいものの相当はずれでない限りはそれなりの部品をゲットできている気もします)
水晶はAtmega328の動作クロックを決める部品で複数選択肢がありますが、Arduino UNOでは、Atmega328と16MHz水晶の組み合わせらしく、書き込み装置にも同じく16MHzの水晶を採用することにしました。
回路図
いつも悩むのが回路図の設計。
普段の回路図の設計には、Fritzingという回路図作成に特化したツールか、お絵かき用のgimpのどちらかを使ってデザインしてます。
Fritzingは回路の配線の正しさを確認しながら設計できるけど、部品のサイズが私の手元にあるものと若干異なるため完成イメージが使い見にくい、
対して、Gimpだと回路の正しさは全く確認できないけど、撮影した画像を基板に配置しながらデザインでき、直感的に完成イメージに近づけることができるという感じで
それぞれ良いところと悪いところがありどっちで作業すべきか悩むところ。
今回の場合は部品数も少ないし、基板が小さく密集してるという意味で、どちらかというと配線の失敗は少ないと思われ、完成イメージを見ながらの作業中心なためGimpでお絵かき感覚で実施しました。
完成イメージがこちらになります。
回路図について補足
回路については、参考にさせていただいたinstructablesで紹介されたデザインがベースになってます。
外部チップへ書き込むためのケーブル端子は今すぐには不要なのでなくしてます。
将来必要になったら付け足そうと思います。
書き込み状態を表現するLEDを指す場所は、GPIO7から逆サイドにあるGPIO16へ変更してます。
ここが先ほど挙げたようにユニバーサル基板だと刺さらなかったポートです。
なおこの回路図に描かれた抵抗部品は作業をさぼり全部レイヤーごとコピーして使いまわしてるので抵抗値の意味はありません・・・。
配線は基板裏側を通しているのでクロスしてる場所も大丈夫。
また隠れて見にくいですが、ZIFソケットの下にも配線が続いており、Gimpのレイヤー表示オンオフを活用して下側の回路も表現してます。
ArduinoISPスケッチ
Arduino IDEのメインメニューのビルトインスケッチより、[ファイル] – [スケッチ例] – [ArduinoISP] – [ArduinoISP]から開けるスケッチをそのまま手を加えずプログラムすればいのですが、この基板だとGPIO7のLEDをGPIO16へ変更しており、そのままだとこのLEDは光らすことができません。
そのため非常に残念ですがビルトインのスケッチそのものを使うのではなく、以下の個所を変更してMyArduinoISO.ino等の別ファイルとして保存してから書き込みます。
変更点は76行目のみ。
67 68 69 70 71 72 73 74 75 76 77 |
: // Configure which pins to use: // The standard pin configuration. #ifndef ARDUINO_HOODLOADER2 #define RESET 10 // Use pin 10 to reset the target rather than SS #define LED_HB 9 #define LED_ERR 8 #define LED_PMODE 16 <br> |
Arduino ISPスケッチをArduino UNOへ書き込むことができれば準備OKです。
あとの使い方は前回の記事と同じで、スケッチを作り終えたら、書き込むべきAtmega328チップをZIFソケットへ搭載し、Arduino UNOをUSBポートにさし、Arduino IDEにてシリアルポートの設定をしたことを確認したら、以下いずれかの操作でAtmega328へ書き込みます。
- [スケッチ] – [書き込み装置を使って書き込む]を選ぶ
- シフトキーを押しながらアップロードアイコン(右→アイコン)を押す
LEDが一生懸命ちかちかしたのち完了状態になりますので、通電用スイッチがオフになってることを確認したら、完成したAtmega328をブレッドボードへ載せ替え動作確認という流れです。
最後に
シールドを作ってみると作業が捗ったことに感動してしまいました。
ちょっとしたことなのですが、ケーブルがごちゃごちゃしてるだけでやりにくいと感じていたし、ブレッドボードだと結構大きくなってしまうので邪魔なんですよね。
こういった問題点が一気に解消することができましたので、本来やりたいスケッチの開発に集中することができると実感してます。
すぐにでも次のプロジェクトを始めたい、そう感じてます!
レスポンシブ広告
関連記事
-
Attiny13Aの工場出荷時の書き込みエラーを対策
Attiny13Aは工場出荷時に低速の動作周波数になってる模様です。 この時Ar …
-
ATmega328へArduinoを書き込む
Arduino UNO等のArduinoボードを購入すると、USB端子に直接接続 …
-
素早くマイクミュートとPCスリープが出来るDIYボタンを作る
2020年はCOVID-19の影響で長期にわたる外出自粛が続きました。9月時点で …
-
ドア開閉イベントをSlackへお知らせするセンサーを作る
最近Raspberry Piを手に入れてから個人的にマイコンが流行っていて、WE …
-
SlackのIncoming Webhooksが失敗した時の対処
我が家のIoTとしてSlackのIncoming Webhooksを活用したサー …
-
Arduinoでロータリーエンコーダーの動作確認
ロータリーエンコーダーは、よくボリューム調整のつまみに使われているようなモジュー …
-
ArduinoのPinChange割り込みライブラリとタイマーライブラリを使う
前回、素早くマイクミュートやPCスリープが行えるボタンを自作することで、とても晴 …
-
「子ども見守りサービス」をDIYで自作する
最近「子ども見守りサービス」が注目されているようです。 どうも私は課金の発生する …