前回入手した、ATmega328Pの後継マイコンATmega328PB-AUの開発環境を整え、ピッチ変換(はんだ付け)の検証を実行したいと思います。
ATmega328PBは、型名に「B」が付いただけ、という機能拡張版では、あるのですが、デバイスIDが異なります(下表)。
型名 | デバイスID |
ATmega328P | 0x1e,0x95,0x0f |
ATmega328PB | 0x1e,0x95,0x16 |
このため、Arduino IDE等で、すましてATmega328Pとして使おうとしてもエラーで弾かれてしまいます。
そこで、Arduino IDEにMiniCoreボードを導入します。Arduino IDEへのボードの追加手順については、こちらの例などを参考にしてください。
以下に、MiniCoreボードの追加について必要な固有情報だけをまとめます。
MiniCoreボードの追加:
「ツールメニュー ⇒ ボード: ⇒ MiniCore ⇒ ATmega328 ⇒ 328PB」を選択して使います。
ATmega328PBにブートローダとヒューズ値を書き込んで、準備しましょう。以下に手順を示します。
Arduino UNO | 接続 | ATmega328PB | |
5V | → | 8 | VCC |
18 | AVCC | ||
GND | ⇔ | 4 | GND |
21 | |||
D10(SS) | → | 1 | D22(RESET) |
D13(SCK) | → | 7 | D13(SCK) |
D12(MISO) | ← | 6 | D12(MISO) |
D11(MOSI) | → | 5 | D11(MOSI) |
シリアルプログラミングに必要な端子(上表参照)に、はんだ付け不良がある場合、上の手順が実行できません。その場合は、シリアルプログラミングに使用する端子を重点的に疑って、はんだ付けのやり直しなどが必要です。
ATmega328PBへ、UART経由でプログラムを書き込む回路は以下図の通りです。
こちら(「#9-5 ブレッドボードにArduinoっぽい物」)の記事で解析したArduino UNOと同等の回路です。
パスコンやリセット回路等の追加素子は、以下図の様に変換基板の下に隠れる部分へ実装しておくと、ブレッドボードのスペースが確保できて、多少使い易くなります。
前節の回路を構築して、Arduino IDEからプログラムのコンパイル&書き込みを実行してみたところ、以下の様なエラーメッセージが……。
最大32384バイトのフラッシュメモリのうち、スケッチが5048バイト(15%)を使っています。 最大2048バイトのRAMのうち、グローバル変数が602バイト(29%)を使っていて、ローカル変数で1446バイト使うことができます。 avrdude warning: attempt 1 of 10: not in sync avrdude warning: attempt 2 of 10: not in sync : (中略) avrdude warning: attempt 10 of 10: not in sync avrdude warning: programmer is not responding; try -xstrict and/or vary -xdelay=100 avrdude error: unable to open programmer urclock on port COM4 |
コンパイルは通ったものの、Flashメモリへの書き込みができない様です。
実は、この時点では、ピッチ変換基板のはんだ付けがすべて成功しているのか?も確かめられておらず、暗闇の中で雲を掴むような状況なのです。
暗闇の中、手探りで一つ一つ確認して行ったところ、どうも、ブートローダが応答していないことが判りました。
何とか、UNOとのシリアルプログラミング接続を確立できていたので、こちらのプログラムを使って解析したところ、以下の様な事実が判明しました。
その結果、1)により、ブートプログラムの先頭アドレスは0x7e00番地であるので、3)と合致しません。
しかも、2)によって、リセットベクタが0x0000番地に設定されているのですが、このアドレス(0x0000番地)にはプログラムが書き込まれていないので0xffffであり、これも合致しません。
※改めて吟味してみると、ブート領域が512バイトなのに、「最大32384バイトのフラッシュメモリ」と言うのも合致していませんね。逆に、ブートプログラムの配置アドレス0x7e80=32,384番地なので、合致します。何か、ちぐはぐです。
これが、ブートローダが機能していない原因だと考えました。
以下の対策を施すことにより、UART経由の書き込みが成功しましたので報告しておきます。
MiniCoreのboards.txtについて:
MiniCoreの要求する環境が、当方の使い方と異なっているのか、そもそも、当方の使い方やセットアップ方法が間違っているのか、それは不明です。ちなみに、当方が導入したMiniCoreのバージョンは、ver.3.0.2でした。
上の対策によって、ブートプログラムを書き込み直したところ、UART経由で、Arduino IDEからATmega328PBへのコンパイル&書き込みが成功しました。解決。
完成したピッチ変換基板の見た目は、そこそこ良さそうに見えるのですが、はんだ付けによって全端子がコンタクトできたのか?確かめておかないと安心して使うことができません。今後、期待した通りに動作しなかった場合、プログラムのせいなのか、変換基板への実装のせいなのか、切り分ける事すらできないからです。
ピッチ変換基板へのはんだ付け状態を確認するためのプログラムを、以下にリンクしておきます。
確認プログラム:test_328pb.ino
Arduino IDEでコンパイル&書き込みすると、シリアルモニタから以下のコマンドを受け付けています。
量産現場では、「針当て📌」や、「バウンダリスキャン」等を使って、はんだ付けの成否を確認してから出荷しています。今回は、その様な手段が使えなかったので、上にリンクしたプログラムを使い、1端子1端子、確認して行きます。
Arduino UNOにLogiscopeをコンパイル&書き込みして、ATmega328PBの端子をモニタしながら確認を実行します。UNO、ATmega328PB、USB⇔UART変換モジュール(FTDI等)を以下接続表に従って接続してください。
Arduino UNO | 接続 | ATmega328PB | 接続 |
USB⇔UART変換 モジュール(FTDI等) |
GND | ⇔ | GND | ⇔ | GND |
5V | → |
VCC AVCC |
||
A0 | ← | 適宜変更(※) | ||
D9 | → | 適宜変更(※) | ||
RXI | ← | TXD | ||
TXO | → | RXD |
※以下、実験サンプルに従い、適宜変更してください。また、FTDIの電圧ジャンパは5V側に設定してください。
実験中の様子を以下図に示します。
ATmega328PBブレッドボード上のLEDは、LED_BUILTIN(=D13)に接続してあります。この後の検証には不要なので、必ず外して実験してください。【tgl,13,500】等とすると、LEDが1秒周期で点滅するので、実験開始前に目で見て、ATmega328PBの動作を確認できる、と言った程度の気休めには、なりました。
ATmega328PBの汎用I/OポートからLOW/HIGHトグル出力しておき、これを変換基板のDIP端子から観測できるかテストします。
実験サンプル:【 】内はATmega328PBシリアルモニタからの送信データ
【tgl,2,1】
OK: toggle 1 [ms] pin#=2
デジタル端子D2を1ms毎にトグル出力しました。
ここで、ATmega328PBのD2端子と、UNOのA0端子をジャンパ線などで接続して実験を進めます。
実験サンプル:【 】内はUNO Logiscopeからの送信データ
【osc,0,16,4,0】
以下図の様な波形が観測出来たらOKです。
はんだ付け不良がある端子の場合:
等の現象が観測されます。
これを、【tgl】コマンドのデジタル端子をD2〜D26まで変化させながら、全端子確認して行きます。
ATmega328PBの汎用I/Oポートから電圧レべル(LOW/HIGH)を入力し、そのまま別なデジタル端子に出力します。
UNOから適切なPWM出力を印加しておき、同じ波形を観測できることを確かめて行きます。
実験サンプル:【 】内はATmega328PBシリアルモニタからの送信データ
【lnk,2,13】
OK: link pin#=from 2 to 13
デジタル端子D2から入力して、D13に出力しました。
実験サンプル:【 】内はUNO Logiscopeからの送信データ
【ana,9,64】
OK: analogWrite(9, 64)
UNOのD9端子へPWMを出力しました(周期約2ms、デューティ64/256)。
ここで、
して、実験を進めて行きます。
実験サンプル:【 】内はUNO Logiscopeからの送信データ
【osc,0,16,4,0】
結果として、以下の様な信号の流れを観測する事になります。
この中でテスト対象は、ATmega328PBのD2端子から、正しくデータを読み出せるかどうか?です。
以下図の様な波形が観測出来たらOKです。
これを、【lnk】コマンドのデジタル端子(from)をD2〜D26まで変化させながら、全端子確認します。
愚直に全端子を確認した結果、D7端子(DIP端子番号で11番ピン)のコンタクトだけが確認できませんでしたw(1x_x)w。
何度かはんだごてを当て直してみたのですが状況に変化なく、一旦諦めて「放置」といたしました。ガラスエポキシ製の基板と表面の銅箔は、接着剤で接合されており、必要以上に熱サイクルをかけ過ぎると、剥がれて回復不能な損傷を与える恐れがあるためです。
接触を確認できなかったD7端子に割り当てられた機能は、以下の通りです。
幸いな事にD7端子に特有な機能の割り当てはアナログ比較器くらいな物だし、それも、AD変換器があるので、恐らく回避可能です。当面、放置としました。暫く放置して使って見て、またモチベーションが復活したら再挑戦するかもしれません。
なお、D7端子を除いた全端子のコンタクトは確認取れました。
「やっぱりね」と、言う感じで、1本、接触不良が残っていました(1^_^;)。それ以外は問題なさそうなので、暫く、このまま使って見たいと思います。兎に角ここまで大変でした。TQFPのピッチ変換なんて、もう嫌だよ〜。