PICNICのページ



2002年の暮れに 仕事の関係の講習会で秋月電子PICNICを扱う機会を得ました。
個人的にはPICは玄人受けする内部構造なので手を出しかねていたのですが、PICNICにはHTTPサーバーが組み込まれているためLANケーブルを接続してブラウザでアクセスするだけで簡単に使用する事が出来ます。

このページは、PICNICに関連した資料をまとめたものです。


PICNICで使用されているCPUは、マイクロチップ社のPIC16C877という40ピンのICです。
このCPUには、ポートA〜Eの合計39本のI/O端子がありますが、ポートC〜Eまでは、シリアル通信とNIC(RTL8019AS)との接続に使用されているため、ユーザーに開放されているのはポートA,Bの13本のみ(内1本は、温度計専用)となります。
また、16×2行のLCDを付けると、使えるI/Oは7本になってしまいます。

PIC16C877のI/Oポート一覧を表1に示します。

− 表1:PICNIC I/Oポート一覧 −

05H:Port A
85H:TRISA
06H:Port B
86H:TRISB
ポート 接続先 備考 ポート 接続先 備考
PB7 LED7
LCD D7
CN2-12
デジタル出力
PB6 LED6
LCD D6
CN2-11
デジタル出力
PA5
LM35DZ
温度計
(AD変換値÷1024×500)℃
PB5
LED5
LCD D5
CN2-10
デジタル出力
PA4
未使用

PB4
LED4
LCD D4
CN2-9
デジタル出力
PA3
CN2-4
アナログ入力
PB3
LCD E
CN2-8
デジタル出力
PA2
CN2-3
アナログ入力
PB2
LCD RS
CN2-7
デジタル出力
PA1
CN2-2
アナログ入力
PB1
CN2-6
(CN1-8)CTS?
デジタル入力
PA0
CN2-1
アナログ入力
PB0/INT
CN2-5
(CN1-7)RTS?
デジタル入力

07H:Port C
87H:TRISC
08H:Port D
88H:TRISD
09H:Port E
89H:TRISE
ポート 接続先 ポート 接続先 ポート 接続先
PC7
(CN1-3)RxD
PD7
RTL8019AS SD7
PC6
(CN1-2)TxD
PD6
RTL8019AS SD6
PC5
RTL8019AS IOCHRDY
PD5
RTL8019AS SD5
PC4
RTL8019AS SA4
PD4
RTL8019AS SD4
PC3
RTL8019AS SA3
PD3
RTL8019AS SD3
PC2
RTL8019AS SA2
PD2
RTL8019AS SD2
PE2
RTL8019AS RSTDRV
PC1
RTL8019AS SA1
PD1
RTL8019AS SD1
PE1
RTL8019AS IOWR
PC0
RTL8019AS SA0
PD0
RTL8019AS SD0
PE0
RTL8019AS IORD


PICNICはLAN経由で各種データの受け渡しをしますが、HTTPとUDPの2種類の方法を選べます。
HTTPはブラウザを使用してPICNICの各種データを表示/操作できるのですが、表示される画面はPICNIC内のデータを書き換えない限り変更する事は出来ません。
一方 UDPを使った方法は、データのみを受け渡しするためPC側で画面を自由にデザインする事が出来ます。
どちらの場合にもIPv4というプロトコルを使用します。これは、インターネットで一般的に使用されているもので、ヘッダと呼ばれる宛先などを記したブロックに添えて PICNICとやり取りするデータを送る事で実現します。
ここでは、UDPを使用してPICNICを操作します。また、PC側のプログラムは、ボーランドのDelphiを使用します。


DelphiはObject PASCALを基本にしてGUIを容易に扱えるよう工夫されている言語ですが、PASCALの命令というよりも GUI等のコンポーネントでプログラミングを行う感じです。
PASCALは変数の型の管理が厳密なので、異なる型を扱う場合(数値を表示する場合など)は、一度 型の変換をしなければいけません。C言語等を使っている人はとっつきにくいかもしれませんが、型キャストや型変換用の関数を使うことで簡単に変換する事が出来ます。(変換用関数を知らないとパニックになりますが...)


さて 本題のPICNICの制御ですが、インターネットで検索したところ「PICNIC ver2.00をつくる」というページにパラレルポートの制御やADCの読込みについてのサンプルプログラムが載っていました。3バイト程度のコマンドを送るだけで良いようです。
表2に判る範囲のPICNIC UDPコマンドをまとめてみました。

− 表2:PICNICのUDPコマンド −

第一バイト 第二バイト 第三バイト 機能
00H ステータスの取得(para_get_status)
PICNICは8バイトのステータスを返す
 第1バイト:Port Aデータ
 第2バイト:Port Bデータ
 第3バイト:Port A入出力方向
 第4バイト:Port B入出力方向
 第5バイト:ADC 上位バイト
 第6バイト:ADC 下位バイト
 第7バイト:ADCON1? ※1
 第8バイト:未使用
ちなみに各コマンドを発行すると、コマンド処理後にPICNICはステータスを返します。
ADCのデータは前回出力を指示したチャンネルの指示した時の値が出るだけのようです。
01H ポートNo. ビットNo.
00H〜07H
High設定(para_set_high)
指定されたポートの指定されたビットを"H"にする
Port A:05H
Port B:06H
02H ポートNo. ビットNo. Low設定(para_set_low)
指定されたポートの指定されたビットを"L"にする
Port A:05H
Port B:06H
03H 全設定(para_set_whole)※2
 第1バイト:03H
 第2バイト:設定するポートNo.
 第3バイト:01H(連続して設定する数)
 第4バイト:"0"にするビット列
 第5バイト:"1"にするビット列

例)
 TRISB: 03H, 86H, 01H, "0"ビット列, "1"ビット列
04H ADCポート Waitタイム AD変換(para_get_adc)※3
ADCポート
 PA0 :81H
 PA1 :89H
 PA2 :91H
 PA3 :99H
 PA5 :A1H (温度センサー)
Waitタイム:数値×25uSec
05H 00H PortB 内蔵プルアップOFF(para_set_rbpu)※4
00H
以外
PortB 内蔵プルアップON


PICNICの資料は、製造元のトライステートのアセンブラのソースや信州大学インターネット大学院のIT技術演習に詳しい情報が記載されています。

 ※1:ソースファイルでは、adcon1(9FH)と記載されていますが、レジスタの操作を見るとADCON0(1FH)を扱っているのではないかと思われます。(どちらにせよ返ってくる値は「82H」固定のようですが...)

 ※2:全設定は、PICNICプログラムver1.2の2984行から記述されています。
   レジスタバンクの切り替えまではしていないので、操作するのはTRISB(ポートBの入出力設定)位に留めておいた方が良さそうです。

 ※3:AD変換は、同じく3024行から記述されています。

 ※4:内蔵プルアップON/OFFは、3010行から記述されています。

※PICNICのUDPコマンド一覧を公開しているページを見つけました。PICNICおぼえ書き(03/11/27追記)


Delphiでプログラミング

1、テストプログラム (PICNIC_Control)

PICNICの概要を理解したところで、プログラムに入ります。
最終的にどのようなプログラムを組むかは個々に委ねるとして、とりあえずPICNICの各I/Oの動作を確認できるテスト/プログラムを検討してみます。

余談ですが、DelphiのInternetコンポーネントの中にある「UdpSocket」では、PICNICのデータを受けた際にonReceiveイベントが発生せず、送信のみしか出来ませんでした。これは、Delphi6,7の両方で同じ症状です。
「PICNIC ver2.00をつくる」では、Fastnetコンポーネント内の「NMUDP」を使っていますが、こちらはちゃんと受信イベントが発生します。
また、Indy Clientsコンポーネントの「IdUDPClient」には受信イベントらしいものが見当たりませんでした。Delphi7にはFastnetコンポーネントは存在しないようなので注意してください。


作成した「PICNIC_Control」を公開します。
(プログラムの骨格は、「PICNIC ver2.00をつくる」にあるサンプルプログラムそのままですが...)
手を抜いてあるので、 固定となっています。実使用時は、PICNICの設定の合わせ忘れの無いよう、注意してください。

Delphiのソース(LZH形式)
実行形式ファイル


プログラムの流れは
  1. フォームがアクティブになったときにステータスを読み込み、PBのチェックボックスの設定に反映させる。
  2. 5秒に一度タイマ・イベントを発生させてステータスを読み込み、メモ・コンポーネントに16進表示すると共に、PB1,0の表示に反映させる。
  3. PB7〜2のチェックボックスの設定を変化させたときは、チェックの有り無しに応じてPBの制御コマンドを送る。
  4. PAのデータ読込みボタンが押されたら、ボタンに応じたADCのデータを読み込み表示する。
と なっています。

ソースを見ると分かるのですが、当初は ステータス取得用のボタンを用意していました。ところが、PB1,0の入力データを見るたびにボタンを押さなくてはならないため、タイマ・イベントによるステータス取得に変更しました。
ボタンそのものは、VisibleをFalseにしているだけなので、設計時のフォーム上では表示されたままになっています。このボタンを削除しても何ら問題ありません。

※テストプログラムでは、PB7〜2が出力・PB1,0が入力となっていますが、これはPICNICに液晶を付けた時の設定のようです。PICNIC単体では、PB7〜4が出力・PB3〜0が入力になっているようです。PICNICの環境が違う方は注意してください。(03/11/21追記)


2、信号が変化したらメールを送信するプログラム(PICNIC_Mail)

テストプログラムでPICNICの機能を一通り確認できた事と思います。
PCがインターネットに接続できる環境がある場合、PICNICの状態の変化でメールを発信できると、外に出ている時でも状態の変化を知る事が出来ます。
次のプログラムは、温度や入力ポートの状態が変化した時にメールを発信するものです。
メールを送るには、プロバイダ関連の設定をする必要があります。また、テストプログラムではPICNIC自身の設定が固定されていました。IPアドレスが使用済みの場合や複数のPICNICを使いたい場合などで不都合なので、こちらも簡単に設定できるようになっています。

Delphiのソース(LZH形式)
実行形式ファイル

各種の設定は、「PICNIC_Mail.exe」が展開されたフォルダにPICNIC_Mail.iniという設定ファイルを作成し記録しています。レジストリは一切操作していませんので、フォルダごと削除して下さい。
また、メール関連の設定についても暗号化等は行っていません。第三者が簡単に覗く事が出来ますので注意願います。

※設定画面の内容は、変更するとキャンセルで終了しても変更が反映されます(単なる手抜き (^^; )。注意してください。