PICNIC(Lan Controller)

  1. PICNICとは

    1. PICNIC

       PICNICはPICを利用したNICの意味でしょうか? TriState社で制作し、秋月電子さんでキット販売しています。
        http://www.tristate.ne.jp/tsjob007.htm
      に、同社のキットが紹介されています。

    2. PICNICの機能

       PICNICはLANとSerial(Rs232C)の二つの接続用コネクタと、入出力を設定可能な二つのポートから構成されます。LANからSerialと二つのポートを、UDBのポートとして扱うことができます。つまり、LANから二つのポートにアクセスすることで、入力や出力が可能です。また、シリアルともリンクできますから、USB > PICNICのシリアルを介して、シリアルに接続された機器の制御が可能です。
       また、PICNICはWEBのサーバーとCGIの機能を実装しています。したがって、web から二つのポートの値を取得したら、値を設定できます。
       したがって、出力ポートを「水遣りスイッチ」に接続しておけば、web から「水遣り」が可能です。また、おまけに、温度センサーが RA5 に接続しています。web から、PICNICがおかれている場所の温度を知ることができます。

    3. 拡張

       ポートとシリアルを制御するPC側のプログラムソースがあります。これを応用すれば、PCからLANを経由した制御が可能です。
       また、PICNICはPIC16F877で制御されています。このファームウエアも公開されていますから、サーバーの機能を追加したりカスタマイズすることも可能です。NTPプロトコルを実装した例が、TriState社のwebで紹介されています。

  2. PICNICの構造

    1. PICNICの構造

      PICNICは RTL8019AS をethernet Controller として利用しています。RTLのデータ信号をPICのDポート、アドレス信号(5本)を Cポートに接続しています。
       PICのBポート(8本)とAポート(6本)をPICNICの外部端子に接続しています。このうち、RB4〜RB7はLEDに接続されていますから状態を確認できます。RA5は内部で温度センサに接続されています。

    2. LCD表示

       PICNICにはLCD表示が接続可能になっています。ただし、LCDの制御にPB2〜PB7を共用しますから、外部端子としては利用できなくなります。このLCDは、UDPのポーとして、LANよる表示することもできます。

    3. ブートモード

       PICNICは二つの起動モードがあり、シリアル接続の利用法が異なります。ブートモードの場合、LANの接続はなく、状態の表示と設定が可能です。シリアルにHyperTermを接続し、ブートモードで立ち上げると、Hypertermへの状態表示とコマンド入力を受け付けます。設定した IP が不明な場合、この ブートモードでの起動が利用できます。
       シリアルコネクタの近くのJP2を短絡して起動するとブートモードになります。

    4. LED表示

       PICNICには、ネットワークの状態を表示する3個のLEDがあります。緑はLANへの接続状態を示します。黄色はLANからの受信で、これは、PICNIC以外の受信でも点灯します。赤色はPICNICからLANへの送信時に点灯します。

  3. PICNICの設定

    1. IPの設定(ブートモード)

       IPを設定するにはシリアル(RS232)端子から行います。PCでHyperTerminalを9600bpsで立ち上げておきます。シリアルコネクタを接続し、PICNIC側を「ブート(ストラップ)モード」(JP2の1-2ピンショート)で立ち上げます。すると、

      PIC Network Interface Card - Bootstrap Mode Version 1.2.0.0
      ***** Configuration *****
      MAC Addr.  :00-02-CB-01-CE-31
      [I]P Addr. :192.168.1.200
      [N]etMask  :255.255.255.0
      [G]ateWay  :0.0.0.0
      [H]ttpPort     #80
      [L]CD Port     #0
      [P]arallelPort #10001
      [S]erialPort   #10002
      PICNIC>

      などと表示されます。これで、現在設定されているIPを知ることができます。HyperTerminalから

      PICNIC>i=192.168.1.201
      と入力します。

      これで、PICNICのIPを変更できます。その他の設定はwebから行うこともできます。

    2. WEB接続

       PICNICにはwebサーバー の機能が組み込まれています。IEで

       http://192.168.1.200

      でPICに接続すると、下記のようなページが表示されます。

      この画面で。RB4のHボタンをクリックすると、PICNIC側のLED4が点灯します。RA5In の 「27Celsius」は、PICNICの内蔵されている温度センサーの値の表示です。

    3. 設定

      webの画面では、下記の設定(Configuration)や状態(Status)も表示されます。ここから、PICNICのIPアドレスを変更することも可能です。ただし、有効にするには一旦PICNICをリセットする必要があります。


  4. PICNICプログラミング

    1. PICNICのプログラム
      PICNICには、PICNICを利用するプログラムソースが添付されていますす。ここでは、そのプログラムの説明を行います。
       PICNICを制御する関数を紹介します。これらを利用するには、picnic.h、picnic.lib が必要です。

      PICNIC *pn;
      pn = PN_open("192.168.1.200", 0, 10001, 10002);
       PICNIC を開きます。PICNICのIP,LCD,Pararell,Serial、のポート番号を指定します。

      PN_dirp(pn, PICNIC_PORTB, 4, PN_OUTPUT);
       PICNIC_PORTB の第4ビットを 出力(PN_OUTPUT)に設定します。

      PN_outp(pn, PICNIC_PORTB, 4, 1);
       PICNIC_PORTB の第4ビットに1を出力します。

      PN_close(pn);
       PICNICを閉じます。

    2. picdos

       picdos はDOSレベル(ウインドウを利用しない)PICNICのポートを制御するプログラムです。
      PN_open()で、PicnicのIPと、LCD、Pararell,Serial のポートを指定して開きます。IP を変更した場合、プログラムも修正が必要です。次に、PN_dirp()で、ポートの入力、出力を設定します。最後にPN_outp() でポートの指定ビットを1にします。これで、PICNICのLED4,5,6,7が点灯します。
       PN_の関数を利用するには picnic.h、および、PICNIC.lib が必要です。これらは、元は、DLLフィルダに入っていますが、同じプログラムと同じフォルダに入れるよう変更しました。picnic.lib を追加するには、プロジェクトメニューから、「設定」、「リンク」と辿ります。オブジェクト/ライブラリ/ の最後に、PICNIC.lib へのパスを指定します。

      #include "stdafx.h"
      #include "picnic.h"             // 環境に合わせて変更してください
      
      /*
              RB4-7のピンを出力に設定し、全てにHを出力するプログラム
              4つのLEDが光ります!!
      */
      int main(int argc, char* argv[])
      {
              PICNIC *pn;
      
              pn = PN_open("192.168.1.200", 0, 10001, 10002);
      
              PN_dirp(pn, PICNIC_PORTB, 4, PN_OUTPUT);
              PN_dirp(pn, PICNIC_PORTB, 5, PN_OUTPUT);
              PN_dirp(pn, PICNIC_PORTB, 6, PN_OUTPUT);
              PN_dirp(pn, PICNIC_PORTB, 7, PN_OUTPUT);
      
              PN_outp(pn, PICNIC_PORTB, 4, 1);                        // RB.4 <= 'H'
              PN_outp(pn, PICNIC_PORTB, 5, 1);                        // RB.5 <= 'H'
              PN_outp(pn, PICNIC_PORTB, 6, 1);                        // RB.6 <= 'H'
              PN_outp(pn, PICNIC_PORTB, 7, 1);                        // RB.7 <= 'H'
      
              PN_close(pn);
              return 0;
      }

      このプログラムを応用すれば、PICNICのポートを利用したプログラムを作成できます。

    3. PicTest

      1. 機能
        これは、ダイアログウインドウを利用した、PICNICのテスト用プログラムです。GUI のウインドウを利用して、ポートの入出力の設定や、入力値の表示、出力値の設定ができます。また、LCDがあれば、そこに,日時を表示します。
         
      2. ダイアログの構成
         上部に、PICNICのIPを入力するIP専用エディットボックス、表示を更新する間隔を指定するスライダ、3種のポート番号を指定するエディットボックス、接続用ボタンがあります。
         下部にポートの状態を表示するリストボックスがあります。接続を行うと現在の状態が表示され、ポートのコラムを右クリックすると、メニューが現れポートの入出力や出力値を設定できます。


      3. プログラムの構成

        主要な変数を説明します。

        PICNIC *m_pPN; PICNICのクラスです

        CIPAddressCtrl m_ip; //IP の入力を行う専用エディットボックス
        CSliderCtrl m_span; //更新間隔を設定するスライダ

        CMenu m_menu; //メニュー(IDR_PROP)
        CMenu *m_pPopup1,*m_pPopup2; //サブメニュー1,2
        CMenu *m_pPopup1o,*m_pPopup2o;//サブメニュー3,4

        CImageList *m_pImageList; //ポートを表示する画像付リスト


    4. PicTerm

       これは、LANとSerialRS232Cの間の文字列伝送をします。PicTermを立ち上げ、PICNICのシリアル端子には、HyperTermを接続しておきます。立ち上げると、文字表示画面が開きます。「設定メニュー」でIPアドレス、PICNICのシリアルポートの番号を設定します。ツールバーの電話機ボタンで接続をします。
       PicTermから文字入力すると、PicTern>LAN>シリアル>HyperTerm と文字が流れます。逆も可能です。
      こちらのプログラムは、MFC になっています。
       このプログラムを応用すれば、LAN と シリアルをブリッジするプログラムが作成できそうです。

    5. PICNIC

       これは、(多分)PICTermで利用している、PICNIC.DLL を生成するプロジェクトです。

  5. 不具合

    1. DHCPによるIP取得

       PICNICの機能として、PICNICのIPを 0.0.0.0 にすると、DHCP でIPを取得するとの説明があります。しかし、実際にIPを0に設定すると、IPは取得しているのですが、DHCPサーバーのほうのIP貸し出しリストに表示されません。

    2. 動作しない

       最初に組み立てたキットは期待どおりの動作をしません。ブートモードで起動すると、MACアドレスが すべて FF で表示されます。組み立て中に壊したのか、キットに不具合があったのかは不明です。もう一つ購入し、そちらは正常に動作しました。PICやROMを交換しても症状は同じです。