(別室)インターフェースのページ
※このページは個人的な趣味によって書かれており、著者は全ての内容について、いかなる責任も負いません。
このページは、主に小型のマイコンで一般的に使われるインターフェースを使って遊ぼうというページです。
●重要なお知らせ(訂正とお詫び)●
1.ADM3202のコンデンサの接続について
第一章 I2C(Inter IC Bus)で遊ぶ
I2Cを使った簡単なボードを作ってみました。
I2Cサンプルのイメージ図
上記、I2Cバス基板の写真(表/裏)
回路図
1.PICを使った簡単なサンプル
(1)PICを使ってEEPをアクセスするサンプル (16F88)
上記I2Cバスに、
「PIC奮闘記」のページで作った実験ボードをつないで、I2C−EEPをアクセスしたサンプルです。
写真/回路図
ハイパーターミナルのイメージ
ハイパーターミナルの設定
プログラムソースサンプル(SDCC 16F88 C言語プログラム)
(2)PICを使ってI2Cでサーボモータをアクセスするサンプル (16F88)
ただいま準備中!!
(3)PICを使ってI2Cでセンサーをアクセスするサンプル (16F88)
ただいま準備中!!
(E)I2Cモニター(デバッグ)ツール (16F88)
ただいま準備中!!
2.AVRを使った簡単なサンプル
(1)AVRを使ってEEPをアクセスするサンプル (ATTiny2313)
PIC同様、AVRバージョンも作ってみました。
写真
ハイパーターミナルのイメージ
ハイパーターミナルの設定
回路図 ※ATTiny2313のヒューズビットは、外部OSC:8MHz以上にして使用する
プログラムソースサンプル(AVR-GCC ATTiny2313 C言語プログラム) ※OSC:8MHz用
(2)2台のAVRを使った簡単なサンプル (ATTiny2313 *2)
2つのAVRマイコン(マイコンA:マスター動作+スレブ動作+LEDボード、 マイコンB:マスター動作+スレブ動作+USART)と、
サンプルのイメージ図
写真
※「(別室)AVRのページ」で紹介した2つの実験ボード(タイプ3A、タイプ4A)をI2Cにつないだものです
マイコンボードへの接続アダプタ(表/裏)
ハイパーターミナルのイメージ
全てのマイコンが起動したら(電源を投入して数秒後)、ハイパーターミナルから1文字入力すると、
ハイパーターミナルの設定
回路図
プログラムソースサンプル(マイコンA:AVR-GCC C言語プログラム) ※OSC:8MHz用
プログラムソースサンプル(マイコンB:AVR-GCC C言語プログラム) ※OSC:8MHz用
3.H8を使った簡単なサンプル
(1)H8を使ってEEPをアクセスするサンプル (H8/3664)
H−8を接続するため、H8バージョンも作ってみました。
写真
ハイパーターミナルのイメージ
ハイパーターミナルの設定
回路図 「(別室)H8で遊ぼうのページ」で作った実験ボードを、I2Cバスにつないだものです。
プログラムソースサンプル(Cygwin/GCC H8/3664 C言語プログラム)
上記プログラムを含むフォルダー全て
4.SH−2を使った簡単なサンプル
(1)SH−2を使ってEEPをアクセスするサンプル (SH7125)
SH−2を接続するため、SH−2バージョンも作ってみました。
写真
ハイパーターミナルのイメージ
ハイパーターミナルの設定
回路図 「(別室)SH−2(SH7125F/SH7144F)で遊ぼう」で作った実験ボードを、I2Cバスにつないだものです
プログラムソースサンプル(Cygwin/GCC SH7125 C言語プログラム)
上記プログラムを含むフォルダー全て
5.AVR、PIC、H8、SH2を使った簡単なサンプル
サンプルのイメージ図
写真
(1)2つのCPU(SH2/H8)から、EEPとパラレルポートを共有するサンプル
写真
準備中
第二章 Microwireで遊ぶ
第三章 USBで遊ぶ
1.HIDクラスを使った簡単なサンプル
(1)CH9329を使ったサンプル
写真
回路図 ※データシートより抜粋
実験イメージ
メモ帳に出力しているイメージ
第四章 Web・イーサネットで遊ぶ
1.XPORTを使った簡単なサンプル
写真/ピン配列
●実験ボード(タイプ1)
写真
回路図
実験のイメージ(LANにつないだ場合/パソコン単体で実験する場合)
(1)PICを使って、LANでパソコンにつないでみる(その1) TCP/IP接続
写真/回路図
ハイパーターミナルのイメージ
IPアドレスは、接続方法により変わります(デフォルトでは、固定ではありません)
ハイパーターミナルの設定
プログラムソース サンプル@ (PIC12F1822用 HI_TECH PICC Ver9.83 C言語プログラム)
(2)PICを使って、LANでパソコンにつないでみる(その2) 仮想COMポート接続
写真/回路図 ※(1)と同じです
ハイパーターミナルのイメージ
Com Port Redirector(CPR)での仮想COMポートの設定/ハイパーターミナルの設定
プログラムソース サンプル@ (PIC12F1822用 HI_TECH PICC Ver9.83 C言語プログラム) ※(1)と同じです
(3)XPORTをWebサーバーにしてみる
XPORTの開発イメージ
Webマネージャのイメージ
3−1)XPORTをWebサーバーにしてメッセージを表示する
写真/回路図 ※XPORTをLANにつないだだけです
XPORTの開発イメージ(cobファイルの作成)
XPORTへの書き込み(「DeviceInstaller」の操作)
XPORTに書き込む時は、パーティションの#1〜#3に書き込むようにします
実行イメージ
このサンプルのフォルダ一式
3−2)XPORTをWebサーバーにしてデータのやり取りをする (その1)XPORTからデータを受信する
写真/回路図
サンプルのイメージ
実行イメージ
このサンプルのフォルダ一式
プログラムソース サンプル (PIC12F1822用 HI_TECH PICC Ver9.83 C言語プログラム)
3−3)XPORTをWebサーバーにしてデータのやり取りをする (その2)XPORTへデータを送信する
写真/回路図
サンプルのイメージ
実行イメージ
JAVAアプレットサンプル
上記、JAVAアプレットを含む、このサンプルのフォルダ一式
プログラムソース サンプル (PIC12F1822用 HI_TECH PICC Ver9.83 C言語プログラム)
3−4)XPORTの汎用I/Oをアクセスしてみる
準備中
(4)XPORTを使った応用事例
4−1)PICのポートを制御してみる
写真/回路図
サンプルのイメージ
ハイパーターミナルでの操作イメージ
ハイパーターミナルの設定メージ
プログラムソース サンプル@ (PIC12F1822用 HI_TECH PICC Ver9.83 C言語プログラム)
2.ColdFireを使った簡単なサンプル
3.LANコントローラ(RTL8019AS)を使った簡単なサンプル
●実験ボード(タイプ1) RTL8019AS + PIC18F4520/PIC18F452
写真
回路図
93C46のダンプ(Serial EEP ROM Writerのイメージ)
(1)パケットの送信・受信サンプル(RTL8019ASの基本操作)
写真
回路図(上記の回路です)
サンプル@のパケットイメージ
サンプル@の「ネットワーク プロトコル アナライザー(Wireshark)」での確認イメージ
サンプルAのパケットイメージ
サンプルAの「ネットワーク プロトコル アナライザー(Wireshark)」での確認イメージ(ダンプ部分を抜粋)と、
サンプルBのイメージ
サンプルBのパケットイメージ
サンプルBの「ネットワーク プロトコル アナライザー(Wireshark)」での確認イメージ
サンプルCのイメージ
サンプルCの送信パケットイメージ
サンプルCの「ネットワーク プロトコル アナライザー(Wireshark)」での確認イメージ
PINGコマンドを実行した時の「ネットワーク プロトコル アナライザー(Wireshark)」での確認イメージ
プログラムソース サンプル@ (PIC18F4520用 MPLAB/C18 C言語プログラム)
プログラムソース サンプルA (PIC18F4520用 MPLAB/C18 C言語プログラム)
プログラムソース サンプルB (PIC18F4520用 MPLAB/C18 C言語プログラム)
プログラムソース サンプルC (PIC18F4520用 MPLAB/C18 C言語プログラム)
(2)UDP/IPを使った簡単なサンプル
UDIパケットのイメージ
チェックサムの計算方法
1)Javaを使った事例@ (パソコンとRTL8019ASボードとのデータのやり取り)
Javaを使って、RTL8019ASボードとパソコンの間でUDP/IPパケットの送受信をしてみました。
回路図(上記の回路で追加はありません)
ARPパケット(受信)機能をつけることで、「RTL8019AS実験ボード」は多くのツールでノードとして認識されます
サンプル@のイメージ
サンプル@の「ネットワーク プロトコル アナライザー(Wireshark)」での確認イメージ
サンプル@の実行イメージ
プログラムソース サンプル@ (PIC18F4520用 MPLAB/C18 C言語プログラム)
プログラムソース サンプル@ 送信プログラム(Java言語プログラム)
プログラムソース サンプル@ 受信プログラム(Java言語プログラム)
プログラムソース サンプル@ 上記Javaプログラムのフォルダ一式
2)Javaを使った事例A (パソコンから、RTL8019ASボードのポートを操作する)
パソコンからJavaを使って、コマンドをUDP/IPパケットで発行し、RTL8019ASボードのポートを操作してみました。
写真と回路図(RTL8019ASボードにLEDをつけただけです)
実行イメージ
プログラムソース サンプル@ (PIC18F4520用 MPLAB/C18 C言語プログラム)
プログラムソース サンプル@ (Java言語プログラム)
上記Javaプログラムを含むサンプル@のJavaフォルダ一式 (LZHアーカイブ)
(3)TCP/IPを使った簡単なサンプル
1)ハイパーターミナルにつないでみる
2)Javaアプレットを使った事例
ただいま、準備中
4.SPIイーサネット・コントローラ(ENC28J60/SP)を使った簡単なサンプル
●実験ボード(タイプ1A) ENC28J60/SP + PIC32MX120F032B
写真
写真では分かりにくいのですが、0.1μFのパスコンはチップコンデンサを多用しています。
回路図
ISP端子にPICKIT3をつないで開発するイメージ
(1)パケットの送信・受信サンプル(ENC28J60/SPの基本操作)
写真
回路図 (上記の回路図と同じです)
サンプル@のイメージ
サンプル@のパケットイメージ
サンプル@のWiresharkでの確認イメージ
サンプルAのイメージ
サンプルAのWiresharkでの確認イメージ
サンプルBのイメージ
サンプルBのパケットイメージ
プログラムソース サンプル@ (PIC32MX120F032B用 MPLAB/C32 C言語プログラム)
プログラムソース サンプルA (PIC32MX120F032B用 MPLAB/C32 C言語プログラム)
プログラムソース サンプルB (PIC32MX120F032B用 MPLAB/C32 C言語プログラム)
(2)UDP/IPを使った簡単なサンプル
UDIパケットのイメージ
チェックサムの計算方法
1)Javaを使った事例@ (パソコンから、ENC28J60ボードのポートを操作する)
LANに接続されたパソコンから、8個の機器のスイッチをON/OFFするサンプルを作ってみました。
写真と回路図(ENC28J60ボードにLEDをつけただけです)
実行イメージ
プログラムソース サンプル@ (PIC32MX120F032B用 MPLAB/C32 C言語プログラム)
プログラムソース サンプル@ (Java言語プログラム)
上記Javaプログラムを含むサンプル@のJavaフォルダ一式 (LZHアーカイブ)
2)Javaを使った事例A (パソコンとENC28J60ボードでデータのやり取りをする)
Javaを使って、パソコンからENC28J60ボードにUDPパケットを送信し、ENC28J60ボードがこれを受信し、パソコンに
写真と回路図(上と同じです)
サンプルのイメージ
実行イメージ
プログラムソース サンプル@ (PIC32MX120F032B用 MPLAB/C32 C言語プログラム)
プログラムソース サンプル@ 送信 (Java言語プログラム)
プログラムソース サンプル@ 受信 (Java言語プログラム)
上記Javaプログラムを含むサンプル@のJavaフォルダ一式 (LZHアーカイブ)
3)Javaを使った事例B (ENC28J60ボードで電圧を測定し、パソコンに連動する)
PIC32MXのA/Dコンバータを使って電圧を測定し、2秒間隔でパソコンに連動するようにしたサンプルです。
写真と回路図
サンプルの実行イメージ
このサンプルプログラムの機能イメージ
プログラムソース サンプル@ (PIC32MX120F032B用 MPLAB/C32 C言語プログラム)
プログラムソース サンプル@ 受信 (Java言語プログラム) ※上記と同じです
上記Javaプログラムを含むサンプル@のJavaフォルダ一式 (LZHアーカイブ) ※上記と同じです
(3)イーサネットで遊ぶ
1)IPアドレスを動的に割り当ててみる
IPアドレスは、固定で決めておいたほうが便利な場合も多いのですが、DHCPパケットを使えば、電源を入れる都度、
DHCPパケットのイメージ
ただいま、準備中
2)PINGコマンド
ただいま、準備中
3)ゲートウエイを越えるパケット
ただいま、準備中
(4)TCP/IPを使った簡単なサンプル
ただいま、準備中
第五章 パソコン系のインターフェースで遊ぶ
1.パラレルポート(D*SUB25ピン)を使った簡単なサンプル
D*SUB25ピンのパラレルポートがついたパソコンを最近はすっかり見かけなくなってしまいましたが、
このコーナーは、
「(別室)パソコンのパラレルポート(プリンタポート)で遊ぼう」
のページにあります。
参考にされる場合は、自己責任でお願いします。
パソコン、PIC、AVR、H8、SH2等のマイコンを使った事例を想定しています。
このHPのADM3202を使った回路図では、ADM3202の2ピンにつながっている0.1μFのコンデンサをGndにつないで
実験していますが(図a)、ADM3202のデータシートでは、このコンデンサはVccにつなぐようになっています(図b)。
実験では、このようなつなぎ方でもICのチャージポンプは正常に動作していますが、データシートでは(図b)のように記述され
ているので、データシートの通りに(図b)のようにしたほうがいいと思います。
PIC、AVR、H8、SH2等のページで紹介した実験ボードを、ネットワークで接続するためのものです。
I2Cは、動作が単純ですし、2本の信号線のみ接続ができ、接続機器がマスターになったり、スレブになったりが自由なので、
ネットワークの構築が容易です。
但し、複数の機器を接続する場合、出力はオープンコレクタでアクセスしないと、マイコンを破壊する可能性があるので
注意が必要です。
ハイパーターミナルから文字を入力し、’e’をキーインすると、EEPに書き込みが行われます。
次に、書き込んだEEPの内容を読み込まれて、ハイパーターミナルに表示します。
EEPは、アトメル社のAT24C256を使用し、I2Cアドレスは0番で動作するようにしてありますが、アドレスの設定方法は、
EEPの容量や種類によって異なります。
アトメル社のAT24C256を使用した場合は、S1、S2を接続し、S3は接続しない状態で使用します。
I2Cバスに、
「(別室)AVRのページ」で作った「実験ボード・タイプ3A」をつないで、I2C−EEPをアクセスしてみた
サンプルです。
ハイパーターミナルから文字を入力し、’e’をキーインすると、EEPに書き込みが行われます。
次に、書き込んだEEPの内容を読み込まれて、ハイパーターミナルに表示します。
EEPは、アトメル社のAT24C256を使用し、I2Cアドレスは0番で動作するようにしてあります。
(アトメル社のAT24C256を使用した場合は、S1、S2を接続し、S3は接続しない状態で使用します。)
なお、このプログラムは、ATTiny2313のOSCが8MHzでないと正常に動作しません(USARTを8MHz用にしてあるため)。
1つのシリアルEEP−ROM(スレブ動作)を使った簡単なサンプルです。
2つのマイコンが、それぞれに別々のプログラムを実行しながら、お互いのリソースを共有して動作しようというものです。
なお、この記事の知識ベースバージョンが、
「(別室)動く作品のページ」にあります(ただいま準備中)。
このサンプルでは、ATTiny2313のOSCは、内部OSCでも水晶でも、どちらでもいいのですが、8MHzでないと正常に動作しません。
[このサンプルの動作イメージ]
・マイコンA(パラレルポート内蔵 I2Cアドレス:0x12)
− スレブ動作で待機して、I2Cで受信したデータをパラレルポート(ルーレットアダプタ)に送信する。
また、マスター動作で、受信したデータをマイコンBにI2Cで送信する(エコーバック)
・マイコンB(USART内蔵 I2Cアドレス:0x11)
− USART経由でパソコンからデータを受信すると、マスター動作となり、I2C−EEP(アドレス0x0)に書き込み、
また、EEPに書き込んだ内容をマイコンAにI2Cで送信する。
− スレブ動作で待機して、I2Cで受信したデータをUSART経由でパソコンに送信する。
・I2C−EEP(24型EEP−ROM I2Cアドレス:0x0)
− スレブ動作で待機して、受信したデータをEEPに書き込む
− スレブ動作で待機して、指示されたデータをI2Cで送信する
このサンプルは、動作を明示的に説明する事や、他のマイコンに容易に移植する事を意識しているので、I2Cを汎用プログラム
でアクセスしていますが、このマイコンは、I2Cを簡単にアクセスするためにUSIインターフェースを内蔵しています。
実際にI2Cを使う場合は、このインターフェースを使った方が、I2Cのプログラムは簡単です。
=>入力した文字が、EEPへ書き込まれ、このデータがEEPから読み込まれ、マイコンAに送られる。
=>マイコンAが、マイコンBから送られたデータを受信すると、パラレルポートに出力してLEDを点燈させ、
データをマイコンBに送り返す。
=>マイコンBが、マイコンAから送られたデータを受信すると、USARTでパソコンに送り、ハイパーターミナル
に表示する。
ハイパーターミナルから入力された文字が、ハイパーターミナルに表示されるまでに、数秒程度かかりますが、
その様子は、I2CバスのLEDの点滅で確認する事ができます。
※EEPの1〜3ピンの接続は、使用するEEPに合わせる必要があるが、アトメル社のAT24C256を
使用した場合は、1、2ピンをGNDに接続し、3ピンは、どこにも接続しない
上記I2Cバスに、
「(別室)H8で遊ぼうのページ」で作った実験ボードをつないで、I2C−EEPをアクセスしてみた
簡単なサンプルで、上記、AVRバージョンを移植したものです。
ハイパーターミナルから文字を入力し、’e’をキーインすると、EEPに書き込みが行われます。
次に、書き込んだEEPの内容が読み込まれて、ハイパーターミナルに表示されます。
上記I2Cバスに、
「(別室)SH−2(SH7125F/SH7144F)で遊ぼう」で作った実験ボードをつないだもので、
動作は、上記のH8バージョンと全く同じです。
USARTや、パラレルポート、EEPメモリー等を、複数のマスターCPU(このサンプルではSH2、H8)で共有した使い方を
意識した簡単なサンプルです。
CH9329(USB-シリアル変換IC)が、秋月電子で150円で購入できる ※R05.1.30現在 ので、
USB(HID)クラスを使った「USB-シリアル変換器」を作ってみました。
このICは、一般的に使われているUSB(CDCクラス)の「USB-シリアル変換器」と違って、
USBキーボードと同じ動きでシリアルデータをパソコンに取り込むことができます。
USBキーボードやマウスを自作したり、パソコンを遠隔操作したりという用途にはいいかも知れません。
サンプルは、パソコン(A)でメモ帳を開いて、このメモ帳にカーソルを当てておいて、UARTで文字を入力し、
この文字をパソコン(A)のメモ帳に表示するものです。
実験を簡単にするため、文字の入力には、パソコン(B)のTeraTermから文字を入力していますが、
この方法では2台のパソコンが必要になります。
実際の使い方では、TeraTermの部分は、UARTでつないだマイコンから文字を入力するような使い方になると思います。
シリアルのボーレートは、9600BPSです。
このICは、プログラムの開発が必要なわけではないので、このサンプルは、データシート通りに回路を作るだけです。
パソコン(B)のTeraTermから入力した文字が、パソコン(A)でカーソルを当てたメモ帳に表示されます。
XPORT
は、外見は単なるコネクタのように見えますが、内部に高性能のMPUが内蔵されていて、これ一つでイーサネット−シリアル
変換をしてくれる
(米国)LANTRONIX社
のデバイスサーバーです。
価格は少々高め(7000円くらいする)ですが、おそらく、最も簡単で確実に、マイコンをLAN経由でパソコンにつなぐ事ができます。
また、このXPORTは3ビットの汎用デジタルI/O端子(CP0〜CP2)を持っていて、例えば、これ一つで外部からインターネットで
スイッチをON/OFFしたり、スイッチの状態を監視したりといった使い方をする事もできます。
この端子の上限は、シンク及びソースいずれも4mAなので、LEDをつなぐ場合は、これを越えないように注意する必要があります。
XPORTは、パーティションで区切られた6つの大容量のメモリーエリアを持っていて、このエリアにユーザーが作成したJAVAアプレット
を書き込むことで、単体でWebサーバーにする事もできます。
LANコネクタと見間違えそうなほど小型の形状ながら、高性能で、応用範囲の広いデバイスサーバーです。
簡単な実験ボードを作ってみました。
XPORTは、イーサネット−シリアル変換をおこなうだけなら、購入時の設定の変更は不要で、全てのツールのインストールが
必ずしも必要なわけではないのですが、無償ですし、XPORTのIPアドレスの確認で必要になるので、「NetFramework(マイクロソフト社)」、
「DeviceInstaller(LANTRONIX社)」、「Com Port Redirector(LANTRONIX社)」の順に事前にインストールしておきます。
実験イメージ(B)では、パソコンとXPORTを「クロスLANケーブル」でつなぐ必要があります
実験イメージ(A)では、XPORTとハブを「ストレートLANケーブル」でつなぐ必要があります。
ただし、接続するポートに「Auto MDI/MDI−X」機能が付いている場合は、ケーブルの種類を
間違えても、障害はおこりません。
(現在販売されているハブは、この機能が内蔵されているものが多くなっています)。
PIC12F1822のUARTをつかって、LANでパソコンのハイパーターミナルにつないでみました。
サンプル@は、単なるエコープログラムです。
XPORTの設定は、購入時のまま何も変更していませんが、ハイパーターミナルと接続する時に、XPortのIPアドレスの
入力が必要になるので、IPアドレスを調べるために、DeviceInstallerを使用しています。
実験では、XPortをハブにつなぐ「実験イメージ(A)」、クロスケーブルを使ってパソコンのLANコネクタとXPortを直接
つなぐ「実験イメージ(B)」の両方のパターンでテストしていますが、もちろん、どちらのつなぎ方をしても問題はありません。
但し、IPアドレスは接続方法により変わるので、注意が必要です。
このサンプルでは、パソコン側の設定は特にありません。
なお、実験では、LAN環境で、新しいネットワーク機器が接続された場合、機器が認識されるまでに時間がかかる場合が
あるので、ハイパーターミナルは、XPORTをネットワークにつないでリンクが完全に開始されてから接続しないと、
ハイパーターミナルの接続が失敗する事があります。
XPortが正常につながれている場合、DeviceInstallerを起動すると、ネットワークに接続されている
XPortの情報が表示されるので、IPアドレスをチェックし、ハイパーターミナルの設定画面で入力します
XPortとパソコンの接続は、(1)のように、TCP/IP接続してもいいのですが、Com Port Redirector(CPR)を
使って仮想COMポートを作ってやると、パソコン側からは、COMポートをアクセスするのと同じ感覚で、XPortに
接続する事ができます。
これは、パソコン側で作ったCOMポートをアクセスするアプリケーションの多くが、XPortでもそのまま使える事を
意味します。
ただし、この機能を使うためには、パソコン側にCPRをインストールして、仮想COMポートを定義しておく必要が
あります。
実験では、仮想COMポートをアクセスしたままXPortの電源を切ってしまうと、パソコンがフリーズしてしまう事が
あるので、XPortを外す場合は、仮想COMポートをアクセスアプリケーションを終了しておく必要があります。
XPORTには、ファームウエア及びWebページを保存するための大容量のフラッシュメモリーが内蔵されていて、
「DeviceInstaller」を使って、ユーザーが自由にJAVAプログラムを書き込む事ができます。
この機能を使えば、XPORTは単体でWebサーバーとして使う事ができます。
例えば、ユーザーが作成したJAVAアプレットをXPORTに書き込んでおけば、クライアントWebブラウザーから、
XPORTの特定ポートにアクセスして、XPORTの機能をコントロールする事もできます。
というより、こういう使い方のほうが、XPORTの本来の使い方かも知れません。
JAVAの事例は、
「(別室)JAVAのページ」
で取り上げていく予定です。
※Javaを使うためには、Javaのインストール(無償)が必要です
Webブラウザから、XPORTのIPアドレスを入力すると「Webマネージャ」が起動します
XPORTの設定は、「Webマネージャ」から変更する事もできます
Webブラザーにメッセージを表示するサンプルを作ってみました。
サンプルは、「hello !!」とメッセージを表示する簡単なJAVAアプレットをXPORTに書き込んだだけのものです。
XPORTに書き込むまでの手順は、「トランジスタ技術」誌を参考にしているだけなので、詳細はそちらを参考にした
ほうが、説明が丁寧に書かれているのでいいと思います。
XPORTのメモリーは、6つのパーティションに分かれていますが、プログラムを書き込む時は、パーティションの#1〜
#3に書き込むようにします。
復元は可能らしいですが、パーティションの#4〜#6に書き込むと、Webマネージャが上書きされて消えてしまう
そうです(Webマネージャを使わないないなら、上書きしても問題ありません)。
なお、「.cob」の作成に必要な「web2cob.exe」、「mimetype.ini」ファイルは、有償のCPKの一部になっていますが、
なければ、最新版が
「(米国)LANTRONIX社のSupportサイト」
※注)このHPの作成時点でのリンク先
から無償でダウンロードできます。
下記のサンプルフォルダ中にある「web2cob.exe」ファイルは、このHPの作成時点での最新であり、更新されるわけ
ではないので、将来的にはバージョンが古い可能性があります。上記サイトから最新版をダウンロードしたほうがいい
と思います。
「web2cob.exe」の引数は、/oが出力ファイル名、 /dが作業ディレクトリーです
「Cygwin」
がインストールされていないパソコンの場合、「ls」コマンドは、「DIR」コマンドに置き換えてください
このサンプルプログラムは、1KBにも満たないほど小さなものなので、表示は0KBになっています
この中のcobファイルを、デバイスインストーラを使ってXPORTへ書き込んで使います
XPORTをWebサーバーにして、データを表示するサンプルを作ってみました。
サンプルは、PICのポート(PORTA[0]〜[2])の情報を、1秒毎にPICがXPORTポートの送信し、これをJAVA
アプレットのソケットで受け取って表示し、タイマーで表示を1秒毎に更新しているものです。
動作の実験なので何の装飾もしていませんが、表示をグラフィックにしたり、PICにセンサーをつないでA/Dコンバータ
の電圧の情報表示したりすれば、いろいろ面白い使い方ができそうです。
PICから文字列を送る時は、文字列の終わりに「0A」をつけてやります。
なお、cobファイルの作成から、デバイスインストーラを使ったXPORTへ書き込みまでの手順は、上の3−1)と同じです。
XPORTの情報は、Web上に情報を公開している人がたくさんいますし、このサンプルも、そういう情報を参考にして
作ったものです。
この類のデバイスは、情報が少なく、使いにくいものが多いのですが、XPORTは事例や多くの情報が公開されていて、
初めて使っても扱いやすい感じです。
※1)IPアドレスは、LANの接続状態で変わるため、デバイスインストーラで調べておく必要があります
※2)このサンプルでは、PICの送信を1秒間隔、Javaアプレットのタイマーを1秒間隔にしているため、
データの反映に最大2秒程度かかる場合があります
この中のcobファイルを、デバイスインストーラを使ってXPORTへ書き込んで使います
上記同様、プログラムを書き込む時は、パーティションの#1〜#3に書き込むようにします。
(#4〜#6に書き込むと、Webマネージャが上書きされてなくなります)
XPORTをWebサーバーにして、WebからXPORTにデータを送信するサンプルを作ってみました。
サンプルは、JavaアプレットでWebにボタンを表示し、ボタンを押すと、XPORTにデータを送信し、
PICのポート(PORTA[0]〜[2])につながれた3つのLEDをON/OFFするものです。
動作の実験なので何の装飾もしていませんが、表示をグラフィックにしたり、多ピンPICを使って、沢山のI/O
を制御したりすれば、面白い使い方ができそうです。
Javaアプレットのcobファイルの作成から、デバイスインストーラを使ったXPORTへ書き込みまでの手順は、
上の3−1)と同じです。
※1)このアダプタは、他のMPUでも共通で使っているので、LEDをトランジスタでドライブしていますが、
PICのポートにLEDをつなぐ場合、トランジスタは必要ありません。
※2)電圧が低いので、LEDは赤以外では点灯しません
※1)IPアドレスはLANの接続状態で変わるため、IPアドレスはデバイスインストーラで調べておく必要があります
この中のcobファイルを、デバイスインストーラを使ってXPORTへ書き込んで使います
上記同様、プログラムを書き込む時は、パーティションの#1〜#3に書き込むようにします。
(#4〜#6に書き込むと、Webマネージャが上書きされて使えなくなくなります)
Web
XPORTは、3ビットの汎用デジタルI/O端子(CP0〜CP2)を持っているので、これを直接制御してもいいのですが、
同じ機能はXPORTにPICをつないで作る事もできます。
多ピンPICを使えば、より多くのI/Oを制御できますし、万が一、入出力の設定を間違えてしまったり、想定外の入出力が
あってもXPORTを壊す事もありませんし、XPORTの設定が不要になるので、プログラムも簡単になります。
また、必要なら、XPORTに書き込んだJAVAアプレットからPICをコントロールする事もできます。
サンプルは、PICのポートを3ビットの汎用デジタルI/O端子にしたもので、XPORTデフォルト機能のTCP/IP−
シリアル接続変換機能でPICとつないでいるので、XPORTは購入時のままの設定で使用できます。
(但し、XPORTのIPアドレスを調べるために、「DeviceInstaller」は必要になります)
プログラムは、パソコンのRS232コネクタにつなぐタイプの一般的なシリアル接続のプログラムですが、XPORTを使って
LAN接続にした場合、LANにつながっている、どこのパソコンからでも、I/O端子を制御できるメリットがあります。
電圧が低いので、LEDは赤以外では点灯しません
LEDの電流制限抵抗が470Ωと大きめなのは、このアダプタを他の実験でも共用で使っているからです。
3.3V専用で使うなら、470Ωはもっと小さくしたほうが、LEDを明るく点灯できます。
LANにつないだ場合、LANにつながっているどのパソコンからでもI/O制御できるメリットがあります
O(オー)コマンドを入力すると、指定された番号のポートは出力になり、I(アイ)コマンドを入力すると、
指定された番号のポートは入力になります。
ポートの各入出力は、O(オー)コマンド、I(アイ)コマンドが入力される毎に入力になったり、出力になったり
と変更され、次のコマンドが入力されて変更されるまで、その状態を維持します。
この図は、上の(1)の説明図で、IPアドレスはLANにつないだ時のイメージではありません。
IPアドレスは、デフォルトでは自動割当てされるので、LANに接続されている機器の状況により異なります。
私の場合は、「192.168.0.4」か、「192.168.0.3」でした。
HI_TECH PICCコンパイラは、バージョンによってレジスタや環境変数の定義が変更されているため、
バージョンが異なるとコンパイルエラーが発生し、簡単な修正が必要になる場合があります
「InterFace誌」付録の「ColdFire(Freescale Semiconductor社 )」を使ったWebサーバーの事例です。
「ColdFire」は、あの有名な「X68000」の流れを汲むMPUと言ったほうが、分かりやすいかも知れません。
このマイコンを使うと、簡単なプログラムで、マイコンで取り込んだデータをそのまま使ってWebサーバーにしたり、
I/Oを制御する事ができます。
この事例は、
「(別室)おまけのページ」
で取り上げていく予定です。
最も簡単なWebサーバーにする場合、必要なものはACアダプタとLANケーブル程度です
このマイコンボードは、簡単なWebサーバーにするだけなら、ほとんど開発は必要ありません
HTMLプログラムを、外部のパソコンからFTPでこのマイコンにコピーするだけで、最も簡単なWebサーバーになります
RTL8019ASは、昔から一般的に使われている
「REALTEK Semiconductor社」
のイーサネットコントローラで、
パソコンのNIC(Network Interface Contoroller)として、一般的に使われていたようです。
対応が、10Base2や、10Base5、10BaseT等なので、現在の超高速化されたパソコンのNICには力不足ですが、
趣味の組み込み型コンピュータの分野では、広く使われているようです。
これ以上高速のものは、自作基板で扱うのは難しいかもしれません。
(秋月電子では、より高速の10/100/1000BASE対応のRTL8211Cは400円、10/100BASE対応の
AX88796BLFは680円で販売しています)
このICは入手性もよく、例えば秋月電子では、他に必要になるパルストランスやMACアドレス書き込み済みEEP、
LANコネクタ等も合わせても1500円程度で購入できるほか、
このデバイスを装着した「H8/3069Fネット対応マイコンLANボード(完成品)」や、「H8/3052LAN開発キット」
も販売されています。
秋月電子のマイコンボードは安いので、手間をかけたくない人は、マイコンボードで購入した方がいいかも知れません。
このデバイスは趣味で使っている人も多く、H8やPIC、R8C等の5V系のMPUを使ったキットも各社から販売されて
いますし、資料も多いので、扱いやすいデバイスだと思います。
RTL8019ASの詳細については、「ドランジスタ技術」誌に使い方が詳しく書かれているので、そちらを参考にすると
いいと思います。
RTL8019AS(パルストランス、MACアドレス書込済EEPROM付) 800円
RTL8019ASモジュール 700円
H8/3069Fネット対応マイコンLANボード 3,750円
AKI−H8/3052LAN開発キット 8,200円
ラビット・イーサネット開発キット RCM3720 9,000円
CPU:Rabbit 3000 at 22 MHz
Webラジオ・キット(BB−SHOUT) 8,200円
CPU:H8/3069
※RTL8019ASの取り扱い例(秋月電子:H25.2現在)
秋月電子では、変換ボードに取り付けられたものも購入できます。
このデバイスは、パッケージに印刷されたカニのようなトレードマークから、「かにチップ」の名称で、
古くから使われている有名なものです
ピンレイアウト(RTL8019ASデータシートより抜粋)
RTL8019ASのレジスタ(RTL8019ASデータシートより抜粋)
RJ−45コネクタ接続イメージ(10BASE−T/100BASE−TX)
「ネットワーク プロトコル アナライザー(Wireshark)」とパケットのイメージ
(Pingコマンドを実行した場合のパケットの例)
LANコントローラ(RTL8019AS)が行なうのは、パケットの送受信までなので、個々のパケットは、
ユーザーが自分のプログラムで作る必要があります。このような場合、「ネットワーク プロトコル
アナライザー」があると便利です。このようなツールには、フリーのものもいくつかありますが、
サンプルは、フリーの
「Wireshark」を使った場合の例です。
使い方は簡単で、初期画面の「Interface List」をクリックするとパソコンに内蔵されているイーサネット
アダプタの一覧が表示されるので、モニタするイーサネットアダプタを選択し、「Startボタン」を押すだけで
上の図の画面が表示され、パケットの内容をデバッグする事ができる便利なものです。
自分のIPアドレス、MACアドレスを確認する
ARPテーブルを確認する
pingコマンド等を実行してARPテーブルを更新してから「apr −a」コマンドを実行すると、
相手のMACアドレスが得られます
ネットワーク機器の一覧を表示する
LANに接続されている機器のIPアドレスやMACアドレスの一覧を表示するツールは、フリーでも
いろいろあるので、使いやすいものを用意しておくと、デバッグで便利です
パケットを作成する
任意の形式のパケットを作成するツールは、フリーでもいろいろあるので、用意しておくと受信の検証で便利です
簡単な実験ボードを作ってみました。
この類のボードは、ネットワークの入門には最適だと思います。
MPUにPIC18F4520を使ったのは、RTL8019ASが5V系デバイスだからで、
PLLで40MHz動作させるようにしています。
93C46の代わりに、沖電子のM16811を使っていますが、これは秋月電子八潮店のジャンクについてきたEEPで、
昔のH8/3069キットに使われていた「MACアドレス書き込済みEEP」で、93C46と同じです
●パルストランスについて
秋月電子で購入できるパルストランスは、現在は20F001NGから、HN1622Gに変更されています。
秋月電子では、パルストランス内臓モジュラージャック・LANコネクタが200円と安く購入できるので、
パルストランスを単体で購入するより、そちらを使った方が安くて回路も簡単になるのでいいと思います。
※1) 説明資料で、実際の「MACアドレス書き込み済みEEP」のデータイメージではありません。
実際の「MACアドレス書き込み済みEEP」のデータイメージは、秋月電子のHPで説明されているように、例えば、
40-00-10-00-(00)-(02)-(CB)-(00)-(00)-(01)-00-00-00・・・・FF-FF-・・・(カッコのMACアドレス部分は全てのEEPで
異なる)です
※2) 「MACアドレス書き込済みEEP」のデフォルト設定(このサンプルの回路図)で使う場合、このライターは必要ありません
また、EEP ROMへの書き込みプログラムは、PICで簡単に作る事もできます。
「PIC奮闘記」を参照してください。
●アドレスバス(SA**)、割り込み要求信号(INT**)について
例えば回路図中のINT4(100ピン)は、INT0〜7から選択する事ができますし、アドレスバス(SA**)の接続を
変更する事もできるのですが、これらの設定(I/OベースアドレスやIRQ等)は、ジャンパレスモードでは93C46の
00h〜03hの値がCONFIG1〜4にロードされるようになっていて、秋月電子で販売されている「MACアドレス書き
込み済みEEP」を購入した場合は、MACアドレスのみでなく、これらの設定値も秋月電子が書き込んであります。
もしも、これらのピンを変更する場合は、他にEEPライターを用意して、EEPのデータを変更するか、モードの修正
(JP端子をデフォルト(開放)でなくプルアップする)とプログラムの修正が必要になるので、他のピンを割り当てる場合は
注意が必要です。
「Serial EEP ROM Writer」がある場合、からの93C46は40円程度ですし、自分でデータを書き込んでも
ほとんど手間もかかりませんが、個人で、IEEEの承認を得てMACアドレスを入手できる人は少ないと思われますし、
秋月電子の「MACアドレス書き込済みEEP」は200円と安いので、仮に設定を変更する場合でも、基本的には
これを購入して該当箇所を変更したほうがいいと思います。
パケットの送信・受信をする簡単なプログラムを作ってみました。
LANコントローラ(RTL8019AS)が行なうのは、パケットの送信・受信までなので、パケットの作成や受信したパケット
の処理は、ユーザーが自分でプログラムを作る必要があります。
RTL8019ASは最大サイズの1518バイトのパケットにも対応していますが、18F452や18F4520のRAM容量は
1536バイトなので、パケットだけで1518バイトものRAMエリアを使う事はできませんし、8ビット系PICのRAMは、
256バイト毎のBANK切り替え方式になっていて、簡単に大きな連続エリアを確保する事ができないので、
このサンプルでは、送受信データは、仮に最大100バイト程度までにしてあります。
これを越えるパケットも受信はできますが、このプログラムが読み出せるのは、先頭から100バイト程度にしてあります。
一般的に組み込み型マイコンが使われるような測定データを送受信をするような使い方なら問題はありませんが、
汎用的なNICのような使いかたをするなら、大きな連続エリアを扱う事ができる16ビット系PICや、PIC32、その他の
高性能なMPUを使用するか、8ビット系PICで作るなら、例えばピンレイアウトが同じで、そのまま置き換えが可能な
18F4525(RAM容量:3968バイト)でプログラムを工夫して使ったり、外部にRAMを増設するなり、何らかの対応を
した方がいいと思います。
大きなパケットが送受信できる汎用的なNICバージョンは、追って紹介していく予定です。
このサンプルプログラムは、使用する18F4520のRAM容量が少ないため、受信と送信のバッファの一部を共用させて
使っていて、見苦しいプログラムになっています。
RAM容量に余裕がある場合は、これらのバッファは完全に分けたほうがいいと思います。
サンプル@プログラムは、パケットの送信プログラムで、
あて先MACアドレスにブロードキャスト(FF−FF−FF−FF−FF−FF)を指定して、イーサネットの全ての接続機器に
1秒毎に、「00〜3B」までの60バイトのパケットを送信します。
FCSは、TCRレジスタのCRCビットをゼロにする事で、自動的に付加されます(ユーザーが意識する必要はありません)。
パケットの内容に意味はないので、機器によってはエラーメッセージがでるかも知れません。
特定の相手に送信したい場合は、「prog01」関数の、「send_mac_address」に、相手のMACアドレスを指定すれば
OKです。
自分のMACアドレスは、「prog01」関数の、「system_mac_address」で、仮に(00−01−02−03−04−05)に
してありますので、ここは各自の入手した正規のMACアドレス(例えば秋月電子の「MACアドレス書き込み済みEEP」)
の内容を記入したほうがいいと思います。
このパケットは、ゲートウエイを越えるフォーマットでは書いてはいませんが、重複したMACアドレスが存在すると、先方に
迷惑をかけたり、障害を起こす可能性があるので、
仮のMACアドレスを指定してテストする場合は、インターネットには
つながないで下さい。
デバイスが正常に稼動していれば、LINKのLEDが点灯し(初期化処理が終了してネットワークにつながると点灯する)、
1秒毎にTX(送信)のLEDが点滅します。
パケットの内容は、上記で紹介した「ネットワーク プロトコル アナライザー(Wireshark)」で確認する事ができます。
なお、このサンプルプログラムは、上記の理由により、他のMPUへの移植性を考えているので、特殊なライブラリは使用
していません。
8ビットPICで動かすだけなら、便利なライブラリーもあるので、ライブラリを活用したほうがプログラムは簡単になると思います。
サンプルAプログラムは、サンプル@プログラムの自分のMACアドレスを、「MACアドレス書き込み済みEEP」)から
読み込んで設定するように修正したもので、RTL8019ASの本来の使い方です。
RTL8019ASでのMACアドレスの読み込み方法は、少々特殊ですが(リモートDMAで読み込んだMACアドレスは
16ビットで設定されるので、2バイトで読み込み、偶数(奇数でも同じ値)アドレスの値を使用する)、「秋月電子の質問と
回答コーナー」の説明を見ると、この値で正しいようです。
サンプルBプログラムは、受信・送信によるパケットのエコープログラムです。
パソコンから、RTL8019ASのMACアドレス(「MACアドレス書き込み済みEEP」に書き込まれているMACアドレス)宛に
パケットを送信すると、これを受信し、パケットの内容をコピーして、コピーをブロードキャストで全接続機器に返信します。
RTL8019ASのMACアドレスが分からなければ、ブロードキャスト(ff-ff-ff-ff-ff-ff)を設定して送信しても受信できます。
返信したパケットには、RTL8019ASのMACアドレスが入るようにしてありますので、この情報からRTL8019ASの
MACアドレスを知ることもできます。
テスト用パケットは、フリーのパケット作成ツールを使用し、結果は、上記の「Wireshark」でモニタしています。
なお、このMPUのメモリー上の制約があるので、100バイトを越えるパケットを受信した場合は、ヘッダー+100バイトを
返すようにしています。
バッファーオーバーフローの処理(MPUの処理がパケットの受信スピードに追いつけない時)は省略していますので、一度に
大量のパケットを受信した場合は、パケットの一部が消失したり、受信できなくなる可能性があります。
正常に稼動していれば、パケットを受ける毎に受信(RX)のLEDが点滅し、もしもパケットがブロードキャストか、自分宛だった
場合は、返信をおこなうので、送信(TX)のLEDが点滅します。
この宛先の判断は、RTL8019ASが自動的におこなってくれます。
なお、このサンプルはマルチキャストを使用していません(全てゼロを設定している)が、グループ分けが必要なら、初期化で
MAR0〜5レジスタに設定し、RCRレジスタのAMビット(ビット3)に1を立てるだけで使用できます。
サンプルCプログラムは、MACアドレスではなく、IPアドレスを指定してパケットを送信する事例で、
このサンプルでは、IPアドレス:192.168.0.4(0xC0.0xA8.0x00.0x04)のパソコンに、1秒毎にテストパケットを送信します。
パソコンのIPアドレスはネットワークにより異なるので、サンプルCプログラム中のIPアドレスは、自分のパソコンのIPアドレス
に合わせて修正する必要があります。
パケットの送信に必要な送信先のMACアドレスは、ブロードキャストでARPパケットを送信し、上記のIPアドレスを持つ接続
機器からARPパケットの返信を受ける事で得ています。
この方法は、イーサネットの基本的な仕組みで、例えば、PINGコマンドを実行してパケットをモニタして見てみると、このサンプル
と同じように、最初にARPパケットを発行してIPアドレスからMACアドレスを得てから、このMACアドレスを使ってPINGを実行
していることがわかります。
このデバイスやイーサネットの仕組みは「トランジスタ技術」誌を参考にしているだけなので、詳細は、そちらを参考にしたほうが
いいと思います。
秋月電子の説明コーナー
テスト用のパケットはフリーのパケット作成ツール(ipsendwin)で作成しています
このツールは使いやすく、「ネットワーク プロトコル アナライザー」と組み合わせて使うと重宝します
受信したパケットにヘッダーをつけて、全ユーザーに返します(パケットのエコー)
UDP/IP(User Datagram Protocol、RFC768)プロトコル・スタックは、複雑なパケットの引渡しが必要な
TCP/IPとは異なり、単純なパケットの送受信のみで扱えるので、測定データ等を単純に送受信するだけのような
用途では扱いやすいプロトコルだと思います。
TCP/IPの場合もそうですが、パケットには「ポート」という仮想の接続口が追加されていて、同じ接続機器(IPアドレス
[MACアドレス])でも、サービスによってパケットを区別する事ができます。
アプリケーション側からは、ソケットという単位(IPアドレス+ポート番号)でデータをやり取りできます。
なお、UDP/IPの説明は「トランジスタ技術」誌を参考にしているだけなので、詳細は、そちらを参考にしたほうが
いいと思います。
チェックサムの値が異なると、アプリケーションはパケットを処理しません
チェックサムの計算プログラムは、少なくともMPUのエディアンによって修正が必須になるので、もしも
MPUをPIC18シリーズ以外に変更する場合は、チェックサムプログラムの修正が必要になる場合があります。
Javaの送信プログラムで「1234」の文字を送信すると、RTL8019ASボードがこれを受信し、パソコンに
「1234」の文字を返信するので、これをJavaの受信プログラムで受信します。
パソコンからは、2つのコマンドプロンプト画面を開き、1つの画面で受信プログラムを動作させておいてから、
もう一つの画面で、送信プログラムを動かして、パケットを送信するようにします。
「(1)パケットの送信・受信サンプル」でも書いたように、Javaのプログラムを起動すると、パソコンのNCUは、
「RTL8019ASボード」のMACアドレスを得るために、UDP/IPパケットの前に、ARPパケットのやり取りを
おこなう事があります。プログラム中のARPプログラムは、この返信機能です。
このサンプルでは、「RTL8019ASボード」のIPアドレスを「192.168.0.20」に固定してありますが、この
アドレスは、使用しているネットワーク環境によっては、他の接続機器と重複する可能性がありますので、
その場合はJava及びC言語のプログラムの修正が必要になります。
このアプリケーションのポート番号は、仮に10000番(10000〜17000はユーザーが使用可能)で定義して
います。
このアプリケーションは、他に機能がないのでポート番号は何でもいいのですが、もしも汎用的なNCUとして
使用するなら、ポート番号やプロトコルは、システムによって割り当てられている機能があるので、それぞれ決めら
れた機能をプログラミングして装着しておいたほうがいいと思います。
(個人の趣味で、そこまで本格的なNICを作る人は、少ないと思いますが。)
なお、Javaのサンプルプログラムは、UDP/IPのテストパケットを送信するために使っているもので、ネットで
公開されているJavaのソケットサンプルに、簡単な修正をしただけです。
送受信のサンプルなので、Javaの画面には何の装飾もしていません。
なお、IPヘッダのチェックサムはわかりやすいと思いますが、UDPヘッダのチェックサムの計算には、UDPヘッダ以外に、
IP,プロトコル番号、データ長を加える必要があるので、注意が必要です。
必要な項目は、サンプルプログラム中に明示的に書いてあります。
(パソコンのNCUのARPテーブルに登録されます)
サンプルプログラム@には、この機能がついていますが、これ以下で紹介するサンプルプログラムにもARP機能は
つけていく予定です(パケットの返信に必須の機能で、たいした機能ではありませんが。)
パソコン側のIPアドレスは、このサンプルの実行に関係ありません
初めに受信プログラム(上の画面)を起動してから、送信プログラム(下の画面)を動かします。
送信プログラムを動かす毎に、「1234」の文字が「RTL8019AS」に送信され、「RTL8019AS」が
これを受信してパソコンに返信するので、受信プログラムの画面に、「1234」が表示されます。
LANに接続されたパソコンから、8個の機器のスイッチをON/OFFするような使い方を想定するものです。
このアプリケーションのポート番号は、仮に「10001番」にしてあります。
それ以外の仕様は、上の「1)Javaを使った事例@」と同じで、ポート番号「10000番」をアクセスすると、
上記のサンプルが、そのまま動くようにしてあります。
(Javaプログラムのポート番号を「10000番」に修正すれば、そのままエコーしますが、このJavaプログラムは、
4バイトまでの入力でないとパケットを出力しません)
このサンプルも、Javaの画面に何の修飾もしていませんが、このようなものを実際に作る場合は、グラフィカルな画面も
作ったほうがいいかと思います(Javaの場合は画面を作るのが容易です)。
JAVAの画面作成の事例は、
「(別室)JAVAのページ」
で取り上げていく予定です。
Javaの画面は、「Ctlr」+「C」で抜ける事ができます
「Cygwin」がインストールされていないパソコンでは、「ls」コマンドは「dir」に置き換えてください
パソコン側のIPアドレスは、このサンプルの実行に関係ありません
組み込み型MPUポートで主に使われる機能(パソコンからLAN接続機器を操作したり、測定結果をパソコンに送ったり、
接続機器間で通信をおこなったり等)は、上記でも紹介しているように、UDP/IPだけで容易に実現できるのですが
パソコンのネットワークアプリケーションの中には、TCP/IPにしか対応していないものも多いので、
趣味のレベルのNICでも、TCP/IPの機能はあったほうが重宝するように思います。
(例えば、一般的に使われる「ハイパーターミナル」や「Tera Term」等のターミナルソフトは、シリアル通信かTCP/IP
にしか対応していない)
ENC28J60/SPは、マイクロチップ社のLANコントローラで、10BASE−Tに対応しています。
このデバイスは、SPIインターフェースを内蔵する事でインターフェース回路を簡単にする事ができるようになっていて、
日本語の資料やサンプルが豊富な扱いやすいデバイスだと思います。
また、このデバイスは、何社かのベンダーから実験ボードが販売されている他、マイクロチップ社からも純正のデモボードが
用意されています。
このデバイスは、電源が3.3Vなので、最近の高性能な3.3V系のMPUを使ってイーサネットにつなげば、いろいろ
面白い使い方ができそうです。
SPIイーサネット・コントローラ ENC28J60/SP 600円
新PIC−NICキット(旧PIC−NICから下記の点が変更されています) 7,800円
・PICを16F877から18F87J50に変更
・LANコントローラを、RTL8019ASからENC28J60に変更
※ENC28J60/SPの取り扱い例(秋月電子:H25.2現在)
ENC28J60/SPの写真
ENC28J60のピンレイアウト ※マイクロチップ社のデータシートより抜粋
ENC28J60の接続例 ※マイクロチップ社のデータシートより抜粋
回路はとても簡単で、MPUとはSPIと割り込みのラインをつなぐだけで使用できます
ENC28J60のマニュアルは丁寧で分かりやすく、日本語のマニュアルが
マイクロチップ社のHPから
無償でダウンロードできるので、
このデバイスが初めての人でも、容易に使えると思います
パルストランス内蔵モジュラージャックのイメージ/モジュラージャック内部の回路図(データシートより抜粋)
回路や接続ピンの番号は商品により異なります
パルストランスは、単体で購入して自分で周辺回路を組むより、モジュラージャックに内蔵されたタイプのほうが、
安くて回路も簡単になるのでいいと思います。内臓されている回路は、単体のパルストランスで組んだものと同じです。
秋月電子では、2種類のものを販売していますが、どちらもあまり変わらない感じなので、このサンプルでは
安価な200円で購入できるものを使用しています。このモジュラージャックは、2つのLEDも内蔵されています。
この2つのLED(緑/黄)のVFは、暗めの5mAで実測してみると2V以下なので、3.3Vでも使えそうです。
イーサネットパケットのイメージ
32ビットPIC(PIC32MX120F032B)
を使って、イーサネットの実験ボードを作ってみました。
PICも、さすがにこのクラスのものを使えば、NICとして充分なものが作れそうです。
クロックは、内臓オシレータ(8MHz)をPLLで40MHz動作させる事を想定していますが、必要なら水晶も取り付けられる
ように、RA2,RA3にはピンヘッダーをつけています。
PIC32MXを使った場合は1ステップ1クロックなので、同じ40MHzでも、処理速度は1ステップ4クロックのPIC18シリーズ
(8ビットPIC)の4倍になります。
このMPUには、「Peripheral Pin Select」のSPIインターフェースが内蔵されていますが、8ビットパラレルポートとUART、
ADCを取るとマッピングできないので、SPIは簡単なプログラムで処理します。
回路図は、マイクロチップ社のマニュアルの指示通りにしたかったのですが、フェライトビーズが入手できなかったので、仮に
フェライトビーズの代わりに33μHのインダクターを使用しています。
データシートには、この部分はEMIを削減する目的と書かれていますが、実験してみると、パルストランス周辺の回路は
この通りの回路で作らないと(回路図中の黄色の部分を省略してしまうと)、ENC28J60/SPがイーサネットにつながりま
せんでした。適切なフェライトビーズが入手できない場合、代わりの33μHのインダクターは必須です。
なお、この33μHのインダクターは、最低でも80mA以上流せるものを使う必要があります。
回路図では省略していますが、Vdd−Vss間には、てきとうな間隔で、0.1μFのチップコンデンサを入れています。
MPUの性能が高い場合、これを入れないと、MPUの動作が不安定になる事があります。
作り方にもよりますが、例えば、16ビットのdsPIC(dsPIC33FJ256GP710)の事例では、これを怠ると動作が不安定になりました。
なお、LEDに流せる電流は、絶対最大定格で12mAなので、LEDをあまり明るくすると、ENC28J60が壊れてしまうかも
知れません。
LEDは、ジャンパーピンの設定で、基板上のLEDと、LANコネクタ内臓のLEDとを切り替えられるようにしています。
ENC28J60は、リセット時にLEDに流れるシンク電流でモードを自動設定するので、このLEDを省略したり、LEDを明るく
する目的でトランジスタをつないだりはしないほうがいいと思います。
例えばLEDの極性を逆につなぐと、全二重モードが自動設定されて、プログラムが動作しなくなる可能性があります。
「ENC28J60/SP」と「PIC32MX120F032B」は、外見が似ていて、性能的にも相性が良さそうです。
ボードの下にあきスペースを作ったのは、後日、追加したい回路があるからです。
チップコンデンサは、ピンの隙間にでも取り付けられるので、このような用途には最適だと思います。
Vcapの10μFも、チップコンデンサ(10μFの積層セラミックコンデンサ)を使用しています。
チップコンデンサは安いので(私が使っている0.1μFは、Z級品(容量の誤差が大きいがパスコンの
用途では容量の精度は関係ない)で秋月電子で、100個で100円)、多用してもお金はあまりかかりません。
上記の回路図では、Vcapを電解コンデンサのように書いていますが、このサンプルでは、積層セラミックコンデンサ
を使っているので、実際には、コンデンサに極性はありません。
積層セラミックコンデンサを使っているのは単に基板スペースの都合(電解コンデンサは形状に高さがあるので、
自作の8MHz水晶アダプタを装着すると、基板がぶつかってしまう)ですが、できれば、Vcapは、電解コンデンサより
積層セラミックコンデンサを使ったほうが、一般的に低ESRで高信頼性と言われているのでいいと思います。
バイアスの2.32KΩは、データシートで1パーセントと指定されています。
ここは適当な抵抗値のものが購入できなかったので、値が近い1パーセントの金属皮膜抵抗器を購入し、
あとは、カーボン抵抗器で微調整して、2.32KΩ(誤差1パーセント)抵抗値を調整して作っています。
PORTB(0〜1)はISP端子と共用なので、ここに重い負荷をかける場合や、入力に設定して直接
または低抵抗で入力をつないだりする場合は、PICKIT3は、はずしておく必要があります。
パケットの送信・受信をする簡単なプログラムを作ってみました。
ENC28J60/SPがおこなうのは、パケットの送受信までなので、パケットの作成や処理は、ユーザーが自分で
プログラムを作る必要があります。
MPUに、高性能な32ビットPIC(PIC32MX)を使っているので、送受信できるパケットの大きさに制限はありません。
LEDの機能は、PHLCONレジスタでいろいろな機能が設定できますが、このサンプルでは、仮に、LED(A)を送受信
アクティブ(赤色)、LED(B)をリンクステータス(緑色)にしてあります。
イーサネットと正常にリンクされると、LED(B)が点灯し、パケットを送信したり、受信するとLED(A)が点滅します。
MACアドレスは、仮に、[00-01-02-03-04-05]にしてありますが、ここは、正規のMACアドレスを指定する必要が
あります(プログラム中のPI_MAC_1〜PI_MAC_6で指定する)。
上記に、秋月電子の「MACアドレス書込済みEEP」を購入し、正規のMACアドレスを入手するツールを紹介する予定
なので、仮のMACアドレスではインターネットにつながないで下さい。
万が一、MACアドレスが重複していると、先方に迷惑をかける可能性があります。
EEPライターを持っている人は、「MACアドレス書込済みEEP」を購入してROMの内容をダンプしてやれば、自分の
MACアドレスを得る事ができます。
私は、テストに使っているプログラムでは、この方法でMACアドレスを得ています。
(実際には、このフォーマットのパケットがゲートウエイを超えることはないので、問題は起こらないはずですが)
特殊なライブラリは使用していないので、他のMPUへの移植は容易だと思います。
FCSは、このデバイスが自動的に付加するように指定できるので、通常、ユーザーが意識する必要はありません。
サンプル@は、1秒間隔で、ブロードキャストで100バイトのテストパケットを出力するもので、上記、「RTL8019AS」
の検証でも使用した「ネットワーク プロトコル アナライザー(Wireshark)」を使って、パケットが出力されている事を
確認できます。
このサンプルは、ボードの稼動確認のために作ったものなので、パケットの内容に意味はありません。
また、このサンプルは1秒間隔でパケットを送信する事しか考えていないので、送信・受信の参考にするなら、サンプルA
を参照してください。
サンプルAは、受信・送信サンプルで、フィルターで自分宛(MAC:00-01-02-03-04-05)またはブロードキャスト
(FF-FF-FF-FF-FF-FF)のパケットを受信し、送信元に受信したパケットのコピーを返します。
必要ならマルチキャストの設定をする事も容易です。
なお、このサンプルは、電源投入直後の1〜2パケットは、正常に受信できない事があります。
サンプルBは、IPアドレスを使った送信サンプルで、最も一般的な使い方だと思います。
1秒間隔で、パソコンにテストパケットを送信します。
パケットの送信に必要なMACアドレスは、IPアドレスからARPパケットで得る事ができます。
このサンプルでは、パソコンのIPアドレスを仮に(192-168-0-4)にしてあるので、このアドレスは実際に使用するパソコンに
合わせて修正する必要があります。
IPアドレスは、修正しやすいように、main関数の中に目立つように書いてあります。
ENC28J60は、他のLANコントローラ(例えばRTL8019AS)同様、内部にイーサネットバッファ(リングバッファ)を
持っていますが、ENC28J60を使った場合は、リングバッファの折り返し処理を考える必要がありません。
これは、他のLANコントローラを触った事がある人には、受信プログラムを作るのが驚くほど楽に感じると思います。
(実際にはパケット長の算出等で考える必要がありますが、例えばRTL8019にあるようなCURRやBNRY、受信した
パケットのPAGE等を意識する必要はなく、基本的にはデータシートに書かれたレジスタを設定するだけで、受信プロ
グラムが作れます。パケットはページ単位ではなく、バイト単位で収納されるので、バッファには無駄がでません。)
イーサネットヘッダを含めて100バイトのパケットを出力しています
テストパケット作成には、パケット作成ツール「ipsendwin」を使用してテストしています
このサンプルでは、パケットが64バイトに満たない時、64バイトにして送信します(後はゼロ埋めされます)
上記の「RTL8019AS」で作ったサンプルと、同じ機能のものです。
このアプリケーションは、仮に、IPアドレス「192−168−0−21」、ポート番号は「10001番」にしてあります。
このIPアドレスを他の機器で使用している場合は、プログラム中のIPアドレスの修正が必要です。
IPアドレスは、PIC32MX120F032B・プログラム中の「PI_IP_1」〜「PI_IP_4」で設定しています。
IPアドレスを変更した場合は、JAVAプログラムのIPアドレスの変更も必要です。
また、MACアドレスは、プログラム中の「PI_MAC_1」〜「PI_MAC_6」で、仮に「00−01−・・−05」にしてあるので、
ここは、正規のMACアドレスを入手して、正規のMACアドレスに置き換える必要があります。
このサンプルのパケットがゲートウエイを越える事はないので、問題は起こらない筈ですが、万が一、MACアドレスが
他の機器と重複すると、先方に迷惑をかける可能性があります。
このサンプルは、電源投入直後は、1〜2パケットのコマンドの入力をしないと、機能が安定しない事があります。
このような場合は、LEDが2秒間点滅し、自動でリセットがかかりますので、その後でコマンドを再入力する必要があります。
また、コマンドをあまり高速で入力すると、受信バッファーの処理が間に合わずにオーバーフローする可能性があるので、
コマンドはキーボードから人間的なふつうの速さで入力してください。
このサンプルは、動作を確実にする目的で、処理の間に長めのWait文を入れているので、処理は速くはありません。
(遅いといってもコンピュータの処理ですし、未処理の受信パケットはイーサネットバッファに100件程度まで保存できる容量が
あるので、このようなトラブルは起こらないとは思いますが。)
このサンプルは、Javaの画面に何の修飾もしていませんが、このようなものを実際に作る場合は、グラフィカルな画面も
作ったほうがいいかと思います(Javaの場合は画面を作るのが容易です)。
JAVAの画面作成の事例は、
「(別室)JAVAのページ」
で取り上げていく予定です。
電圧が低いので、LEDは赤以外では点灯しない可能性があります
Javaの画面は、「Ctlr」+「C」で抜ける事ができます
「Cygwin」がインストールされていないパソコンでは、「ls」コマンドは「dir」に置き換えてください
パソコン側のIPアドレスは、このサンプルの実行に関係ありません
データをエコーするサンプルです。
Javaでパソコンとデータをやり取りする事例として作ったものです。
ENC28J60ボードは、仮にIPアドレス:192−168−0−21、ポート番号:10000番にしてあります。
もしも、このIPアドレスを他の機器で使用している場合は、C言語、及びJAVAプログラム中のIPアドレスの修正が必要です。
このサンプルは、上記の事例@に機能追加して作っているので、仮にIPアドレス:192−168−0−21、ポート番号:
10001番を使用すると、事例@のサンプルがそのまま使用できます。
この場合は、Javaフォルダ一式に含まれているsend2.javaを使用します。
それ以外の機能は、上記の「RTL8019AS」で作ったサンプルと同じです。
「Windows」画面中に「コマンドプロンプト」画面を2つ開き、
送信画面(左側の画面)で文字を入力し「Enter」キーを押すと、受信画面(右側の画面)に入力した文字が表示されます
画面を抜ける場合は、「Ctrl」+「C」を押します
なお、このJavaプログラムは、4バイトを超える入力をすると、パケットを出力しません
入力はAN0(RA0)端子にしてあります。
何の保護回路もつけていないので、入力が一瞬でも電源電圧を越えたり、マイナス以下になったりするとデバイス
が壊れますので注意が必要です。
なお、このサンプルは、上記の事例Aに機能を追加しただけなので、事例@、事例Aもそのまま動かす事ができます。
Javaの画面に何の修飾もしていませんが、Javaでこのデータを加工したり、グラフィカルな画面も作ったりしたほうが
いいと思います。
入力が一瞬でも電源電圧を越えたり、マイナス以下になると、デバイスが壊れますので注意が必要です
電源を供給していない時に、入力に電圧を加えてはいけません。!!!
IPアドレスを自動で割り当てる事もできます。
このような設定にしておけば、新規でイーサネット機器を接続しても、個々のIPアドレスの設定が不要になりますし、
個人のLAN環境ではユーザーがIPアドレスを意識しておく必要が少ないですし、イーサネットの設定では一般的な
使い方だと思います。
パラレルポートは初心者でもアクセスが容易で、過去にはプリンタポートとして一般的でした。
現在でも「USB−パラレルポート変換コード」や、「パラレルポートの増設ボード」等は安価で
販売されているため、シリアルポート(RS232)同様、使用するのは容易です。