製作12 Xportによるネットワーク計測

1. 概要

LANTRONIX社からXPortという超小型のシリアル-イーサネット変換器が出されています。
日本での代理店は日新システムズという会社です。

日新システムズから「Network 入門キット」というのが9,800円で入手できます。
これは、XPortとRS232Cの変換ICが同一基板上に搭載されており、ここが主催する一日セミナーの無料クーポンが付くのでお得です。

ただ、マイコンとシリアル接続しようとすると、マイコン側にもRS232Cの変換ICが必要となるため、にけは若松通商から販売されている基板を通販で購入しました。

こちらの基板は、XPort-BASEキット、XPort-RS232Cキット、XPort-POWERキットと3種類の基板が別々に購入できますが、3枚セットで購入すると若干お得です。

XPortはBASEキットのみに搭載され、それ以外の基板はBASEキットとのケーブル接続となります。
今回の実験では、XPort-BASEキットと、AVRマイコンの自作基板とでシリアル通信を行います。

AVRマイコン側は、1秒毎に可変電圧の電圧値をシリアルデータとして出力します。
XPort側は、それを受信するとXPort自身に書込んだWEB上にその電圧値を表示します。

2. 構成

XPort部       : XPort-BASEキット(若松電子通商)
マイコン部     : マイコン(ATmega88)
             リセットスイッチ(XPort初期化用)
             ボリューム(電圧可変用)

3.動作概要

測定範囲       : 0~Vcc
測定分解能     : 0.1V
測定誤差       : データテーブル設定値による
表示桁        :小数点以下1桁表示方法   : 電源ON時に3段階表示(LED点灯による)
表示方法      : XPortに転送したWebコンテンツのJava Appletによる表示

<画像>

1.若松通商から購入したLANTRONIX Cセット。

基板3枚セットです。製作にはハンダ付けが必要です。

2.これがXPort本体です。この中にネットワーク機能満載です。

3.ATmega88を搭載したマイコン側とXPortを10芯リボンケーブルで接続。XPortにはイーサネットケーブルを挿します。

4.こちらは日新システムズから販売されているキットです。9800円ですが、6300円相当のセミナークーポンが付いてきます。ただしセミナー会場は東京・京都に限られます。

5.シリアル転送された電圧値をWeb上に表示した画像です。

6.マイコン側の電圧を変化させてみました。

 

<ハードウェア設計>

回路図

回路図です。

今回は実験なので、非常に簡単にしています。

シリアル通信用にマイコン側のTxD-XPortのRxD、マイコン側のRxD-XPort側のTxDを接続します。

マイコン側は1秒毎にA/D変換を行い、その結果をシリアル通信で送出するとともに、LED0の出力を反転します。
(すなわちLED0は2秒周期の点滅となります)

LED1とLED2はデバッグ用ですが、将来I/O制御の実験を行う際のO(出力)制御に使用します。

XPortのリセット用にSW0を実装します。

 

<ソフトウェア設計>

■ マイコン側

プログラム

特に難しい設定はしていないので、プログラムを見れば容易に理解できると思います。

注意点としては、シリアル通信プロトコルをXPort側の初期設定値である9600bps、8データビット、1ストップビット、ノンパリティに設定します。

 

■ XPort側

Volt.htmlに、インターネットでXportにアクセスした際に表示させるWebコンテンツを記述します。

そのWebコンテンツ上で動作させるjavaアプレットとして、Volt.javaを記述します。

プログラム

XPort上で動作させるために、Volt.htmlおよび、Volt.javaをコンパイルした結果であるVolt.classをweb2cob.exeを用いてcobファイルにまとめます。

それを、XPortのデバイスインストーラを用いてXPortのパーティション#1に書込みます。

<Java アプレットについて>

Java アプレットとは、Webプラウザ内のアプレット記述から呼び出される、クライアント(閲覧者)に動的な表示を行うためのアプリケーションです。

本プログラムにおいては、Volt.javaという名前とし、Volt.htmlというWebプラウザから呼び出すようにしています。

ただし実行の実体は、javacコマンドによりコンパイルされたVolt.classと、Volt.htmlをひとつにまとめたvolt.cobというファイルになります。

下記はvolt.htmlのプログラムです。

<APPLET CODE="Volt.class" WIDTH="150" HEIGHT="150"></APPLET>でアプレットプログラムを読み込みます。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=shift_jis">
<TYTLE>Xport電圧計</TITLE>
</HEAD>
<BODY>

<P STYLE="text-align: center; font-size: xx-large;">
Xport電圧計
</P>

<HR>

<APPLET CODE="Volt.class" WIDTH="150" HEIGHT="150"></APPLET>
<UL>
<LI>約1秒毎にAVRマイコンで電圧を計測します。</LI>
<LI>測定値をXport経由でパソコンに転送しています。</LI>
<LI>AVRマイコン~Xport間は9600bpsシリアル接続です。</LI>
</UL>

<HR>
</BODY>
</HTML>

下記はvolt.javaのプログラムの解説です。

<Volt.java>

文中、エラー処理(catch)についての説明は省略します。

Runnableインタフェースを利用したマルチスレッドで作成します。

必要となるクラスライブラリとして下記をインポートします。

java.applet.*
java.awt.*
java.net.*
java.io.*
java.text.*

java.appletは、アプレットの作成、およびアプレットとアプレットコンテキストとの通信に使用するクラスの作成に必要なクラスを提供します。
java.awtは、ユーザインタフェースの作成およびグラフィックスとイメージのペイント用の全てのクラスを含みます。
java.netは、ネットワークアプリケーションを実装するためのクラスを提供します。
java.ioは、データストリーム、システム入出力用に提供します。
java.textは、テキスト、日付、数値、メッセージを処理するためのクラスとインタフェースを提供します。

Runnableインタフェースを用いて、AppletクラスをVoltにオーバーライドさせます。

public class Volt extends Applet implements Runnable

Threadクラスのインスタンスとしてtimerを生成します。

Thread timer;

処理用の変数として下記を定義します。

xport_ip InetAddressクラス 初期値=null
port int型 初期値=10001
xport_socket Socketクラス
socketin BufferedReaderクラス
buff String型

初期処理としてinit()の定義を行います。

InetAddressクラスのインスタンスを作成するために、静的メソッドのInetAddress.getByName()メソッドを使用します。

xport_ip = InetAddress.getByName(getCodeBase().getHost());

xport_socketという名称の、Socketクラスのストリームソケットインスタンスを生成し、前述のxport_ipアドレスの、指定されたport番号(10001)に接続します。

xport_socket = new Socket(xport_ip,port);

Runnableインタフェースのstart()メソッドを呼び出します。これにより後述するrun()メソッドが並行して動作を始めます。

public void start()
{
timer = new Thread(this);
timer.start();
}

stop()メソッドは、プラウザ(アプレットビューア)によって呼び出され、アプレットの実行停止を通知します。
具体的には、入力ストリームを閉じ、そのストリームに関連する全てのシステムリソースを開放します。

public void stop()
{
try
{
socketin.close();
xport_socket.close();

run()メソッドを記述します。
実行スレッドとして、meという名前のインスタンスを生成します。
スレッドtimer と me が等しい間ループします。

public void run()
{
Thread me = Thread.currentThread();
while(timer == me)

100ミリ秒の待ち時間を入れます。

try
{
Thread.currentThread().sleep(100);

1バイトのデータを読み込みます。

try
{
buff = socketin.readLine();

repaint()メソッドを呼び出し、強制的に再描画を実行します。
具体的には、update()メソッドが実行された後、後述するpaint()メソッドが実行されます。

repaint();

paint()メソッドを定義します。

public void paint(Graphics g)

getSize()により、アプレットの描画領域の大きさを取得します。この大きさはアプレットを呼びだしたHTMLファイルで記述されています。

Dimension d = getSize();
String t = buff + "V";

マイコンから送られる文字のスタイルを設定します。

Font CurrentFont = g.getFont();

font font = new Font("MS明朝" , Font.BOLD , 36);
g.setFont(font);
FontMetrics metrics = getFontMetrics(font);

アプレット描画領域を赤で塗りつぶします。

g.setColor(Color.red);
g.clearRect(0, 0, d.width, d.height);

電圧表示文字を黒色に、表示位置の座標を設定します。

g.setColor(Color.black);
g.drawString(t,
(d.width-metrics.stringWidth(t)/2,
(d.height+metrics.getHeight())/2);

g.setFont(CurrentFont);
}

updateメソッドを定義します。

public void update(Graphics g)
{
paint(g);
}

 

<製作後記>

この製作に入ったそもそもの動機は、ネットワークを使用したセンサ制御を試してみたかったことです。

今回Javaアプレットを初めて使ってみましたが、Javaアプレットを使用したネットワークプログラムについて書かれた書籍というのがなかなかなく、必要なほとんどの情報はインターネットで入手しました。

ネットで調べたところ、同様な製作を行っている方達が多くいて、いまさら私が説明するまでもないと思います。

プログラムについても多くの部分で流用させていただきましたが、その内容について理解するのが大変でした。(いまだに理解できていない部分が多くありますが (汗))

今回はシリアルデータを一方向で送りましたが、今後は逆方向(クライアント→マイコン)に送る方法や、XPortが持つ3点のI/Oについて制御できるようにしていきたいと思います。

またXPortはメール送信機能も持っており、XPortの監視下にあるセンサが発生させたイベントによって指定あて先にメールを送ることも可能なので、そちらも試してみたいと思います。