2016年10月21日金曜日

Raspberry PiのGPIOを用いてPICマイコンに書き込みをしてみた

はじめに

Raspberry Pi上のScratchでアナログ入力を利用してみた」というエントリにて、PICマイコンを用いると、Raspberry Pi上のScratchにて簡単かつ安価にアナログセンサを取り扱えることを紹介しました。

ただし、PICマイコンには自作プログラムを書き込まなければならず、その書き込み用のツールPICkit3が6千円程度することがややネックでした。

しかし今回、PICkit3を必要とせず、Raspberry PiのGPIOからPICのプログラムを書き込む方法が分かったので紹介します。Raspberry Piをお使いの方ならば、数百円でPICマイコンにプログラムを書き込むことができるようになります。

この方法により、Raspberry Pi上のScratchでアナログセンサを取り扱うことがさらに身近になります。もちろん、それ以外の用途への応用も可能です。

用意するもの

今回、PICマイコンへプログラムを書き込むために用意するものは下記の通りです。
  • 3.3Vで動作するPICマイコン。本ページではAD変換とシリアル通信を取り扱うことのできるPIC12F1822PIC16F1823を用いました。5V以上でしか動作しないPICマイコンでも原理的に書き込み可能だと思いますが、3.3V←→5Vのレベル変換がさらに必要になるので、回路がやや複雑になるでしょう。
  • 9Vの角形電池1つ
  • 9Vの角形電池用スナップ1つ
  • MOSFET 2N7000を1つ:3.3V←→9Vのレベル変換に用います
  • 10kΩの抵抗2つ
  • ブレッドボード、ジャンパワイヤ:適宜


ソフトウェアの準備

まず、Raspberry Piにpickleというソフトウェアをインストールする必要があります。

pickleのページの「Installation」という項目に pickle-4.0d.tar.gz と書かれたリンクがあるのでクリックし、ファイルをダウンロードします。

Raspberry Piのブラウザでは、通常「Downloads」または「ダウンロード」ディレクトリに保存されますので、ファイルマネージャでそれをユーザーpiのホームに移動しておきます。

そして、ターミナルソフトウェアLXTerminalを起動し、下記のコマンド順にを実行し、pickleをインストールします。
$ tar zxf pickle-4.0d.tar.gz
$ cd pickle
$ make
$ sudo make install
以上で必要なソフトウェアのインストールが終わりました。そのターミナルを終了せず、そのまま下記のコマンドを実行します。pickleを用いるための設定ファイルを適切な位置にコピーしています。
$ mkdir /home/pi/.pickle
$ cp src/dotconf/gpio-RPI /home/pi/.pickle/config
次に、コピーした設定ファイルを変更します。ターミナルで下記のコマンドを実行し、設定ファイルをテキストエディタleafpadで開きます。
$ leafpad /home/pi/.pickle/config
開いたファイルの中で、下記の部分を見つけます。これはRaspberry Pi Model B+を用いる設定になっています。
DEVICE=RPI
#DEVICE=RPI2
そのため、Raspberry Pi 2やRaspberry Pi 3を用いている場合、上記の部分を下記のように編集します。

「DEVICE=RPI」の先頭に「#」を記して無効化し、「DEVICE=RPI2」の前の「#」を削除して有効化しているわけです。 Raspberry Pi 3を用いている場合でも「RPI2」のままで構いませんのでご注意ください。
#DEVICE=RPI
DEVICE=RPI2
次に、同じくleafpad上で下記の部分を見つけます。
# RPi OR GPIO BIT-BANG (single PGD DATA I/O)
#                  = CHIPKIT PI =
# !MCLR/VPP        - RPi-Connect 18
VPP=9
# PGM              - RPi-Connect 12
PGM=22
# PGC CLOCK        - RPi-Connect 16
PGC=10
# PGD DATA_I/O     - RPi-Connect 20
PGD=11
これはデフォルトの書き込み設定になっているのですが、今回には該当しないので、「#」のついていない4行に「#」を記して無効化します。すなわち、下記のようになります。
# RPi OR GPIO BIT-BANG (single PGD DATA I/O)
#                  = CHIPKIT PI =
# !MCLR/VPP        - RPi-Connect 18
#VPP=9
# PGM              - RPi-Connect 12
#PGM=22
# PGC CLOCK        - RPi-Connect 16
#PGC=10
# PGD DATA_I/O     - RPi-Connect 20
#PGD=11
次に、そのすぐ下にある以下の行を見つけます。
# RPi OR GPIO BIT-BANG (single PGD DATA I/O)
#                  = CHIPKIT PI PIC32 ICSP =
# !MCLR/VPP        - /RESET
#VPP=4
# PGM              - N/A
#PGM=65535
# PGC CLOCK        - PGC1 RX2
#PGC=14
# PGD DATA_I/O     - PGD1 TX2
#PGD=15
これを以下のように編集します。
# RPi OR GPIO BIT-BANG (single PGD DATA I/O)
#                  = CHIPKIT PI PIC32 ICSP =
# !MCLR/VPP        - /RESET
VPP=4
# PGM              - N/A
PGM=65535
# PGC CLOCK        - PGC1 RX2
PGC=17
# PGD DATA_I/O     - PGD1 TX2
PGD=27
変更のポイントは以下の2つです。
  • 「VPP」、「PGM」、「PGC」、「PGD」のピン番号を記した4行の「#」を削除して有効化すること
  • 「PGC」を「17」に、「PGD」を「27」に変更(もともとのGPIO14とGPIO15はRaspberry Pi上でシリアル通信用に既に使われており、それと干渉しないように)
以上の変更を行ったら、上書き保存してleafpadを閉じてください。以上でpickleを用いる準備は完了です。

なお、編集後の/home/pi/.pickle/configからコメントを表す「#」を含む行を削除した状態は下記のようになっていますので、こちらを丸ごとコピーして保存しても良いです。ただし、「DEVICE」が「RPI2」となっていますのでRaspberry Pi 2およびRaspberry Pi 3用の設定ファイルであることには注意してください。
DEVICE=RPI2
SLEEP=1
BITRULES=0x1000
BUSY=0
VPP=4
PGM=65535
PGC=17
PGD=27
MCP=0x20
FWSLEEP=30
DEBUG=1

回路の準備

次に、PICマイコンに書き込みを行うための回路を準備します。そのために、利用するPICマイコンのピン配置をあらかじめ調べておく必要があります。

PICマイコンへプログラムを書き込むにはいくつかの方法がありますが、今回用いるのは「High voltage programming」という手法です。一般に、マイコンにプログラムを書き込むことを「プログラミング(programming)」と呼ぶことにも注意しておきましょう。

この手法には「VDD」、「VSS(GND)」、「ISCPDAT」、「ISCPCLK」、「~MCLR」という5つのピンを用いますので、そのピンの位置を事前に調べておきます。

今回用いるPIC12F1822およびPIC16F1823の仕様書は英語版日本語版がありますが、それらによると、該当するピンは下記のように配置されていることがわかります。


High voltage programmingでは、~MCLRピンにPICマイコンの動作電圧より高い電圧(ここでは9V)の信号を与える必要があります。

Raspberry PiのGPIOから出力される信号は3.3Vなので、これを9Vに変換する必要があります。そのために、本ページではNチャネルMOSFETを用いた下記のようなレベル変換回路を利用します。

これは、「ロジックレベル双方向変換モジュールBOB-12009」で用いられている回路と同等なものです。


以上をまとめると、PIC12F1822を用いるときに構成すべき回路は下図のようになります。

この回路を構成する場合、9V電池の取り扱いには十分注意してください。9Vの部分をRaspberry Piに接触させると、Raspberry Piが壊れる可能性があります。同様に、回路の接続が正しいことのチェックも重要です。


ほぼ同じですが、PIC16F1823の場合は下図のようになります。


書き込み

最後に、書き込みを行いましょう。

書き込むプログラムをビルドしてできるHEXファイルを用意する必要がありますが、ここでは冒頭で紹介した「Raspberry Pi上のScratchでアナログ入力を利用してみた」というエントリで用いるファイルを書き込んでみます。

HEXファイルはPIC12F1822用とPIC16F1823用の2つしか用意しておりませんのでご注意ください。

まず、LXTerminalを新たに開き、下記のコマンドでファイルをダウンロードし、そのディレクトリに移動します。
$ git clone https://github.com/neuralassembly/TinyPicoBoard
$ cd TinyPicoBoard
pickleというソフトウェアをインストールした際、p12、p14、p16、p24、p32、などといったコマンドがインストールされ、用いるPICマイコンの種類によって使い分けるのですが、本ページではp14コマンドを用います。 まず、Raspberry Piに接続されているPICマイコンの情報を取得するには、下記のコマンドを実行します。
$ p14 id
その結果、下図のように、PICマイコンの情報が表示されます。PIC12F1822が認識されていることが見て取れますね。


TinyPicoBoardディレクトリにある「12f1822.hex」というファイルをPIC12F1822に書き込むには、下記のコマンドを実行します。上図にその様子が示されていますね。
$ p14 program 12f1822.hex
同様に、「16f1823.hex」というファイルをPIC16F1823に書き込むには、下記のコマンドを実行します。
$ p14 program 16f1823.hex
なお、PICに書き込まれているプログラムを消すためのコマンドとしては下記が使えます。消すことの確認を英語で求められたら、「y」をタイプしてEnterします。
$ p14 blank
書き込みが終わったPICは、「Raspberry Pi上のScratchでアナログ入力を利用してみた」に基づいて使用することができます。

終わりに

以上です。~MCLRピンに接続する信号を9Vにレベル変換する必要があることに気づくまで時間がかかってしまいました。

なお、本ページでは3.3Vで動作するPIC12F1822やPIC16F1823を対象としました。4V以上でないと動作しないPICマイコンの場合、恐らく下記のようにする必要があるでしょう(試していません)。
  • VPPピン:Raspberry PiのGPIOから5Vを与える
  • ISCPDAT、ISCPCLKピン:Raspberry Piの17ピン、27ピンと接続する際、3.3V←→5Vのレベル変換回路を介する必要がある


「カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」を執筆しました。

0 件のコメント:

コメントを投稿