PICプログラマーについて(その1、ラズパイでプログラム)

温湿度計の修理も無事終了し、さあ、疑似電波時計の制作を再開しようと思ったらまたトラブル発生。
alasixosaka.hatenablog.com

PICをプログラムしようとしたら、PICKit3がエラーを吐いて全然動いてくれなくなった。もともと、アマゾンかAliExpressで買った安物で偽物なので、今まで動いてくれてありがとうというくらいの品物なのだが、プログラマーがないと作業が進まないので何とかしないといけない。
正式版のPICKit3は既に廃番になっていて、今は後継のPICKit4というのが売られている。ところが、何と¥15000位する。とても買う気にならない。PICKit3のバッタもんは今でもアマゾンやAliExpressで売っているがこちらも昔は¥1000以下で買えたのに、¥3000-5000位する。バッタもんにそんな値段出す気にならん。
正式版のプログラマーは最新のMPLAB SNAPというのがあって、これも結構値上がりしているのだが、値段を見ると秋月電子では¥3000台の値段になっている。これくらいならと思うが、ところが半導体不足の影響か、ずっと在庫切れの状態が続いている。マルツでは納期40週間という表示で、とても待っていられない。
そうなるともっと別の方法を取るしかないので、少し調べてみた。
一つはラズパイを使って、Pickleというソフトを使って書き込む方法。もう一つは、純ハードのPICerFTというのを自作する方法。
ラズパイを使った方法のメリットは、何といってもラズパイを持っていれば、外付け部品が抵抗2本とFET一つで済む点。幸いなことに全部家にある。ただし、ラズパイなのでモニターは別途必要だし、この方法だと9Vの電源が別個に必要。また、ラズパイでプログラムに書き込むので、Windowsで作ったPIC用のHEXファイルをラズパイにもっていかないといけない。(Windowsとファイル共有する方法もある)
一方の、PICerFTの場合は、部品がそれなりに必要ではんだ付けはほぼ必須(まあブレッドボードでもできないレベルではないが)。ただし、一度作ってしまえば、Windowsのソフトで動くし、PICKitのようにシームレスにプログラミングできるわけではないが、PC1台で完結するので作業はだいぶ楽。色々考えるとPICerFTに軍配が上がりそう。
とはいえ、Pickleの場合は、すぐに始められるので、PICerFTに必要なパーツを注文している間にとりあえず試してみることにした。

Pickleの導入

ラズパイの初期化は終わっているものとして、そこにPickleをインストールする。ラズパイは、電流計の時にいじったZeroWを今回も使うことにした。
alasixosaka.hatenablog.com

ピンヘッダーを取り付け

ラズパイZeroは買ったままの状態ではピンヘッダーがついていない。今回はGPIOを使うので、ピンヘッダーをはんだ付けする。また、家の中をごそごそして、2列のピンヘッダーを探す。ととりあえず一つあった。が、ピン数が一つ足りない。20×2の合計40ピン分必要なのだが、19×2しかない。ピン配置を見るとGNDの一つとGPIOの21番が使えなくなるだけで大勢に影響ないので、そのままはんだ付けする。どうしても必要になったらまた継ぎ足せばよいだけの話。

Pickleのインストール

Pickleのインストールと配線、書き込みについては、このサイトを参考にした。
flatisle.com
前後編に分かれていて、丁寧に説明がしてある。
まずは、Pickleをラズパイにインストールする。ブログの手順通りにやれば問題なかった。

sudo su
wget "http://wiki.kewl.org/downloads/pickle-5.01.tgz"
tar zxf pickle-5.01.tgz
cd pickle
make linux
make linux-install

次にPickleの設定用ファイルを作成する。これもブログの通りの手順で問題ない。

mkdir /home/ユーザー名/.pickle
nano /home/ユーザー名/.pickle/config

設定ファイルは下記の通り。実はこれが後で問題になるのだが詳しくは後で。

DEVICE=RPI
SLEEP=1
BITRULES=0x1000
VPP=15
PGM=-1
PGC=7
PGD=3

配線する

ラズパイの準備ができたので、配線をする。PICは手持ちの中から、16F1938と16F19155を試してみた。どちらも28ピンで基本的なピン配置は同じ。
ざっくり書くと、ラズパイのGPIO22をロジックレベルコンバーター回路の入力に、出力はPICのVPP(1番ピン)に接続。ラズパイのGPIO2をPICのICSDAT(28番ピン)に接続、ラズパイのGPIO4をPICのICSCLK(27番ピン)に接続する。それ以外に、VCC、VDDを繋ぐのも必要。また、9Vの電源も必要。
Frizingで書くとこんな感じの配線。なお、PICの記号は適当に28ピンのPICであったものを使っている。

Pickleの配線。9Vの電源は実際はACアダプターを使用

書き込みしようとしたが失敗

これで準備完了ということで、まず、IDコマンドを実行してみた。

p14 id

こうすると、接続されているPICの型番が表示されるはず。しかし、エラーになって正しく表示されない。
まず疑ったのがロジックレベルコンバーター回路で、正しく9Vが入力されていないのではと思った。まずは回路のチェックから。調べてみたが配線は間違ってない。
そこで、今度は下記のテストを実行して、テスターでVPPの電圧を測ってみた。

ptest VPP 5

これで、VPPをHIGH、LOWをモニターに表示しながら変化させるテストができる。最後の数字はテストの時間(秒)。
やってみると、テスターは0Vのままピクリとも動かない。
おかしいと思って、ブレッドボード上の9Vの所をチェックしたがこれも0Vになっている。ならばとACアダプターを直接テスターで測るとちゃんと電圧が出ている。どうも、ブレッドボードでACアダプターのプラグを受けるパーツとACアダプターのジャックの相性が悪いらしく、強く抑えると電圧が出てくるが、手を離すと0Vに戻る状態。これではどうしようもないので、別のACアダプターと交換することに。と言っても、手持ちの9Vのアダプターはこれ1個しかないので、12VのACアダプターを持ってきて、DC-DCコンバーターで9Vに落とすことにした。DC-DCコンバーターはAitendoで買ったものを使った。
www.aitendo.com
これで9Vの出力を確認し、もう一度テストコマンドを実行した。すると、今度は7Vという中途半端な電圧でしかも、HIGH、LOWに応じて変化することなく一定の電圧になっていた。
そこで、今度はラズパイのGPIOと正しく配線されているかチェックしてみた。しかし、接続は正しい。
そうすると、設定ファイルが間違っているのでは、と思い、configファイルを開いてみたが、ブログの通り正しく書かれている。
訳が分からんと思って、その日は諦めて作業を終えた。

configファイルが設定ミス

一晩考えて、もう一度configファイルを疑ってみた。今度は別のブログのサイトを見てようやく間違いに気づいた。
neuralassembly.blogspot.com
両方のサイトを見比べるとまず、configファイルの長さが違う。しかし、これが今回のミスの原因ではなかった。結論から言うと短い方のconfigファイルでもちゃんと動きます。間違っていたのは最初の方の参考サイトのGPIOの設定で、例えばVPPの設定では、VPP=15で、ラズパイの15番ピンをVPPにするという説明がされているが、実際にはラズパイの15番ピン(GPIO22)をVPPに設定するには、ピン番号ではなくGPIOのNo.を入力してやる必要がある、つまり、VPP=22としなければならない。同様に、PGC=7ではなくて、PGC=4、また、PGD=3ではなくて、PGD=2が正しい。従って、正しい設定ファイルは下記のようになる。

DEVICE=RPI
SLEEP=1
BITRULES=0x1000
VPP=22
PGM=-1
PGC=4
PGD=2

これでテストしてみると、無事に認識した。

PickleでPICを認識して、型番が正しく表示された。モニターをカメラで撮ったので見づらくて申し訳ありません。

ちなみに、写真に写っているのは、PIC16F19155を認識しているときの様子ですが、PIC16F19155などの新しい型番では、コマンドにp14ではなく、n14を使います。本家のサイトを見て初めて知りました。
wiki.kewl.org
ちなみに、対応している型番を調べるには、p14やn14などのコマンドに続いて、selectを入力すると対応しているデバイスの一覧が表示されます。これも、上記の本家サイトを見て知りました。
LチカのHEXファイル書き込んで動作確認も行いました。驚くのはその書き込みの速度です。確かにLチカのプログラムは短いですが、PICKitでは少し時間がかかっていたのが瞬間的に終わってしまいます。さすがは高級なチップを使っているだけのことはあると思いました。

Pickleで書き込んだプログラムをLチカで動作確認

バイス

上の方にPICプログラマーの本命はPICerFTだと書きましたが、テストで一応動いたことだし、今回のようにプログラマーが壊れるとバックアップもあった方がいいかなと思い、ラズパイを使ったPickleのライターも作ってみることにしました。外付け部品は手持ちであるのですが、少し格好よくするためにHATを使うことにしました。また、9Vの電源はACアダプターを使った別電源とせず、ラズパイの5V出力から昇圧コンバーターを使って作ることにしました。これらの部品はAitendoで発注。ついでにラズパイZero用のケースも発注。基板むき出しではちょっと取り回しがしづらいので。
いつの間にか、送料が改定されていて¥700以上もするようになっていた。これからはあまりお気楽に注文できないなあ。
出来上がったのがこちら。HATを取り付けるとケースに入らなくなるので、ケースはあくまでラズパイZeroを不慮の短絡などから守るためという位置づけになりました。
ちなみに、ラズパイにつなげるモニターの問題は、SSHを使って解決しました。ラズパイは立ち上がるのに時間がかかるので、LEDが点滅しているのを見て、点滅が終わる頃を見計らって接続する必要がありますが、別にモニターを用意するよりもはるかに楽に使えます。
www.indoorcorgielec.com
また、Windowsとのファイル共有も上のサイトに書いてある方法で簡単に行えました。

出来上がったと思ったら失敗

さて、半田付けも終わって、テストをしようと思い、ラズパイに通電し、DC-DCコンバーターの出力電圧をモニターすると5Vしか出ていない。買ったままだし、ボリュームの設定が悪いのだろうと思って、ボリュームを回してみたが一向に電圧が変化せず。実は、半田付けするときに、半田ごてでボリュームの外側を少し溶かしてしまっていた。何やらにおいがするなと思ったときには後の祭りで、ボリュームの上部が見事にへこんでいた。

これが原因かどうかは不明だが、DC-DCコンバーターがまともに動作してないのは確か。アマゾンで検索するとそっくりのデバイスがいくつかヒットするが、レビューを見ると動いたり動かなかったりという感じらしい。半田付けする前にちゃんとテストしておくべきと反省。
とはいえ、上に書いたように降圧コンバーターを使うのは別電源が必要だし、手持ちの別の昇圧コンバーターでは大きすぎてHATからはみ出てしまうので、これくらいのコンパクトなのが良い。アマゾンで検索していると似たようなものでちょっと違うのがある。比較的信頼性のあるHiletgoの製品で、Aitendoのとの違いはUSBの端子があることくらい。まあこれで動かなかった場合は別の手を考えるとしてとりあえず注文した。