PICNICキット(旧版)
※ 現在は、新しいバージョンに切り替わっております。→ (新)PIC-NIC/New PIC Network Interface Card kitここに記載している内容は、旧バージョンのPICNIC に対応したものになります。
秋月電子通商などで販売されている Tristate 製 PICNICの紹介です。
PICNICは、それ単体ではあまり面白いことは出来ません。
応用はPICNICを手にした方々自身が開拓していく代物です。
PICNIC自体がそれ自身で完結していない代物だからです。
弊社では、PICNICを、温度センサーの計測データを Web サイトに表示させるために使用するLANインタフェースに利用しています。
PICNICには Ethernet と RS232C、Web ブラウザ経由で制御できる簡単なI/O ポート制御ファームウェアが PIC16F877 に組み込まれていますが、これだけだと出来る事が限られてしまうことも事実です。
加えて、まとまったデータがトランジスタ技術 2001年1月号にしかなく、当方のようにこれを買えなかったり、2001年1月以降に PICNIC を知った方々にとっては、「使って見たくてもなかなか使えない」代物であることも否定できません。
ここでは、PICNIC の制御方法を紹介します。(LCDを除く)
PICNIC 使用温度センサーについてはこちら → DS1820温度センサーPICNIC 制御方法
予備知識として...(PICNIC 付属の説明書と合わせてご覧ください)
- PICNIC を制御するには、ある程度、PIC に関する知識が必要です。
- PICNIC を制御するには、パラレルポートにおけるプロトコルを知る必要があります。
この情報があまり無いことが、PICNICを遠い存在にしている一つの理由です。 - PICNIC は パラレルポートと呼ばれるポート番号を使用して、UDP プロトコルで制御します。
- PICNIC の パラレルポート番号は、「ブートストラップモード」と呼ばれるモードにて変更できます。
(デフォルト= 10001) - PICNIC は、Ethernet 側と RS232C の 双方向通信が可能で、その時の Ethernet 側の入出力ポートを、
「シリアルポート」と言います。 - PICNIC の シリアルポート番号は、「ブートストラップモード」と呼ばれるモードにて変更できます。
(デフォルト= 10002) - Perl で PICNIC の制御プログラムを記述する場合、他の言語のようにライブラリを使うより、
直接 PICNIC を制御するようにした方が格段に判りやすいです。
当方では、その方針を基本にしています。(複雑なプロトコルではないので) - PICNIC の制御対象とする装置類は、CN2 の 26ピンコネクタを介して接続するようにしてください。
CN5 の 14ピンコネクタはLCD用です。
CN2 ピンアサイン(PICNIC 付属の説明書と合わせてご覧ください)
26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 |
G | G | G | G | G | G | G | G | G | G | G | G | G |
RA0 | RA1 | RA2 | RA3 | RB0 | RB1 | RB2 | RB3 | RB4 | RB5 | RB6 | RB7 | +5V |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
RA0-RA3 回路 |
RB4-RB7 回路 |
RA0-RA3、RB4-RB7 に外部装置を接続する際、PICNIC 側の回路は提示するような回路になっているので、
場合によっては考慮する必要があります。
RA0-RA3 はアナログ入力ピン(A-Dコンバータ内蔵)、RB0-RB7 はディジタル入出力ピン。
RA4は PIC16F877 の仕様上、オープンドレインです。
RA5は アナログ出力タイプの温度センサー LM35DZ を接続するように意図されています。
RAポートのA−D変換精度は 10bit 、Vref は電源電圧(+5V) です。
ディジタル入出力ピンのうち、RB0-RB3 は初期状態では入力、RB4-RB7 は初期状態では出力。
RB0-RB7 の入出力は、パラレルポートに対して後述するプロトコルに従ってデータを送信することで、変更可能です。
パラレルポートプロトコル
コマンド | 機能の説明 | コード | データ | ||||||
---|---|---|---|---|---|---|---|---|---|
GetStatus | PICNIC 側の現在のI/O ポートの状態取得 | 00 | |||||||
SetHigh/SetInput | PIC16F877のPortのビット番号 Bitを「H」/入力にする | 01 | Port | Bit | |||||
SetLow/SetOutput | PIC16F877のPortのビット番号 Bitを「L」/出力にする | 02 | Port | Bit | |||||
SetWhole | PIC16F877のPortへデータ出力 | 03 | Port | Size | Mask | Val | [Mask | Val]... | |
GetADC | PIC16F877の指定ch のA−D変換 | 04 | ch | Wait | |||||
SetRBPU | PIC16F877 RB ポートの内蔵プルアップ | 05 | flag |
コマンド | 機能の説明 | ||||||
---|---|---|---|---|---|---|---|
GetStatus | PICNIC 側の現在のI/O ポートの状態取得 | ||||||
00 | |||||||
SetHigh/SetInput | PIC16F877のPortのビット番号 Bitを「H」/入力にする | ||||||
01 | Port | Bit | |||||
SetLow/SetOutput | PIC16F877のPortのビット番号 Bitを「L」/出力にする | ||||||
02 | Port | Bit | |||||
SetWhole | PIC16F877のPortへデータ出力 | ||||||
03 | Port | Size | Mask | Val | [Mask | Val]... | |
GetADC | PIC16F877の指定ch のA−D変換 | ||||||
04 | ch | Wait | |||||
SetRBPU | PIC16F877 RB ポートの内蔵プルアップ | ||||||
05 | flag |
上記のバイナリデータ列をバイト単位でパラレルポートに送信することで、
必ず以下の8バイト長のレスポンスが返る仕様になっています。
RA | RB | TRIS_RA | TRIS_RB | AD_H | AD_L | ADCON1 | 00 |
(UDPなので、レスポンスが確認出来ない時の再送処理等のリトライがアプリケーションプログラム側で必要です)
※ 後ろ1バイトは、必ずしも 00H ではなく、無意味なデータが入る場合があります。
レスポンス時に得られる情報は、PIC16F877 の内部レジスタのデータそのものです。
AD_H、AD_L は、A−D変換の結果が入り、GetADC コマンド以外は、意味の無いデータになります。
RA0-RA3 の実測値は、(AD_H * 256 + AD_L) / 1024 * Vref で計算できます。
※ データ部に指定できるパラメータなど
Port | PIC16F877 のレジスタアドレス | 05H=PORTA/06H=PORTB/85H=TRISA/86H=TRISB |
Bit | レジスタのビット位置 | 0=LSB .... 7=MSB |
Size | 出力データ数 | Mask+Value の対の数(1以上でなければならない) |
Mask | 出力データマスク(通常は 00H を指定) | I/O 状態を維持したいビットを1にする(AND演算) |
Value | 出力実データ | 出力したいデータそのもの |
ch | A−D変換対象チャンネル指定 | 81H=RA0/89H=RA1/91H=RA2/99H=RA3/A1H=RA5 |
Wait | A−D変換サンプリング時間 | 5μs 単位で指定。00H 指定の場合は、100H 指定と同様。 |
flag | 有効/無効 | 00H で無効、00H 以外の値で有効。 |