ジョイスティック自作用ツールキットOpenStickは元々PIC18F2550(又は2553)を採用していました。このマイコンは28pinで、DIPパッケージだと結構大きい部類になります。
そこで先日PIC18F14K50を使用したOpenStickLiteをβリリースしました。こちらは20pinなので入力ピン数は少なくなりますが、これでも大抵の用途には事足りると思っています。
価格もこちらの方が大幅に安くてすみます。
OpenStickもOpenStickLiteもUSBからプログラムを書き込む為のブートローダを使用しています。 電源投入時(またはリセット時)の条件設定によりブートローダが書き込みモードで立ち上がります。この状態で書き込みツール「MybootOS」を使うとUSBポート経由でプログラムを書き込める訳です。
この種の話題でいつも問題になるのがブートローダ自体はどうやって書き込むかという事です。 ブートローダでブートローダを書き込む事はできないので、通常はそのマイコン専用のライター(PICKit3など)を使用します。
しかし皆がライターを持っているわけではありません。 そこでArduinoを使ってPIC18F2550にブートローダを書き込む実験を過去に行い、問題なく書きこむ事ができました(下記を参照ください)。
今回はArduinoからPIC18F14K50にブートローダを書き込んでみます。これが可能になればOpenStickLiteを安価に使用できます。
まずここの資料でPIC18F14K50の書き込み仕様を調べます。 大体はPIC18F2550と同じですが微妙に違うところがあります。一番問題なのはPGD,PGC端子が耐圧3.3Vという記述です。 PIC18F2550の時はArduinoUNOを用いて5Vで駆動していました。特にPGDは双方向なのでレベル変換は面倒です。 よって今回は3.3V版ArduionoProMiniを用いることにします。
またスケッチには若干のWAITタイムの変更と書き込みイネーブルONのコードを追加しました。
スケッチ→PICWrite18F14K50.ino
書込み電圧は006Pの積層乾電池(9Vの四角いやつ)を用いる事にします。先の資料によると書込み電圧の上限は9Vという事なので、新品の電池だと定格を超える可能性がありダイオード一本で電圧を下げました(使い古した電池だとそのまま繋いで大丈夫です)。
回路
ArduinoProMiniはUSBシリアル変換回路を内蔵していないので、外部にFT232RLの変換回路を接続し、Arduino/PIC18F14K50に供給する3.3V電源もFT232RL内臓のレギュレータから取っています。
PIC18F14K50の電源-GND間のコンデンサは当初0.47μFを使いましたが、PIC18F14K50に電源を投入した瞬間にArduinoProMiniから反応が無くなる事がありました。恐らくFT232RLの3.3V出力が瞬間的にダウンする為と思われ0.22μF(実際には0.1μ×2本)に変更しました。
PIC18F14K50へArduinoProMiniで書き込む回路図。
参考までにUSBシリアル変換は次の回路です(最近の電子工作には何かと登場しますね。一家に一台FT232RLです)。
FT232RLは3.3Vのレギュレータを内蔵しており、これをVCCIO端子に入力する事で3.3Vレベルで使用できます。この回路ではスイッチを設けて5Vと3.3Vを切り替える様にしています。
但しレギュレータから取れるのは50mAまでなのであまり大きくはありません。
FT232RLによるUSBシリアルインターフェース
Arduino ProMiniで書き込み中。
横のFRISKケースはUSBシリアル変換です。
書込み手順
※PIC18F2550の時に書いた内容とほぼ同じです。
※前回同様TeraTermの「貼り付けの行間遅延設定」を50mS程度にしておく必要があります(書込み時間待ちの為です)。
<PIC18F14K50にブートローダを書込む手順>
- まずPIC18F14K50の3.3V電源と9V電池は切り離しておく。
- Arduino IDEを立ち上げこのスケッチを書込む。
- TeraTermをシリアルモードにしてArduinoに接続する。
シリアル設定:9600bps,8bit,パリティ無し,stop=1,フロー制御=none
改行コードは送信・受信共にCRにする。
また、「設定」→「その他設定」メニューの「コピーと貼り付け」タグを選び、「貼り付けの行間遅延」を50mS程度にしておく。
- 接続するとTeraTerm上に以下のメニューが表示される。
r <start address> <count>: read from PIC
e : all erase
w : write to PIC
v : verify
- ここでPIC18F14K50に3.3V電源→9V電池の順で供給する。
- 必要に応じ’r’コマンドで現在書かれている内容を確認する。たとえば・・・
r 0 0×100<CR>
と入力すると、FLASHメモリの0番地から0FF番地の内容を表示する。
消去済ならCODEエリア全ての内容がFFになっているはずである。
(消去チェック機能はないので、どちらにしても次の消去コマンドを実行しておくべきです)
- 消去済みでない場合はeコマンドで消去する。
ALL Erase <y/n>?と効いてくるのでyを入力する。
このコマンドはチップ全体を消去する(一瞬で終わります)。
- ‘w’コマンドで書込む。w <cr>を入力すると’Send me intelhex text’と表示されるので、ここでIntelHEXファイルを送る。この際、上に書いた理由でコピペで貼り付ける方法で送る。 たとえばブートローダのHEXファイルである’Bootloader18F14K50.hex’をメモ帳等で開いて全域をコピーした後、Teratermの画面上に貼り付ける。
(前に書いた様に「ファイル」→「ファイル転送」メニューからの送信だと取りこぼしが発生する)
- エラーなく書き込みが完了したら’v’コマンドでベリファイを行う。方法は’w’コマンドと同じで、v<cr>入力後IntelHEXテキストを貼付けるとFlashメモリを読出して比較する。 エラーが出なければ正常に書き込めた筈である。
- 9V電池→3.3V電源の順で切り離し、TeraTermの接続を切りArduinoのUSBケーブルを抜く。
やっぱりArduinoUNOでやってみる。
と、ここまでで書き込みが出来たのですが、やっぱり3.3V版Arduinoは少数派で手元にない場合もあると思われ、メジャーなArduino UNO等でも書けると何かと便利です。 この場合5Vで動作するArduinoと3.3Vで動作するPIC18F14K50の間をどう繋ぐかが問題です。ArduinoからPIC18F14K50へ一方的に入力するPGC信号は単に抵抗分割で問題ありません。一方PGD信号は双方向なのでまじめにレベル変換器を入れると結構面倒な事になります。しかし3.3VのHレベルはArduinoはHと認識してくれる筈と期待しPGDも単純抵抗分割で試してみました。
ArduinoUNOでPIC18F14K50に書き込んでみる回路図。
実験風景・・・
ArduinoUNOで書き込み。UNOは直接USBケーブルを繋げるのですっきりします。
特に問題なく書けました。これが手っ取り早いです。
気をよくしてFritzingでも回路を書いてみました。
Fritzingでも描いてみた。
各ファイル
※PIC18F14K50用ブートローダは上記バイナリセットかソースのどちらにも収録しています。※言うまでもないとは思いますが、同様の実験をされて万一デバイスが壊れたりしても責任は持てませんので、そこんとこはよろしくお願いいたします。