Mechマイコンボードと移動ロボットのためのJAVA CLASS

西脇 光一

1  はじめに

KVMは、SunのJ2ME CLDCのリファレンス実装であり、JAVAのプログラムを書く上で 利用可能なクラス群は、通常のJAVA(J2SE)のサブセットとなっている。 どのクラスが利用可能であるかは、kvmをインストールしたディレクトリから
j2me_cldc/docs/CLDCAPI.pdf
j2me_cldc/docs/CLDCAPIhtml.zip
を参照することにより確認できる。

また、KVMは、C言語でかかれた関数をJAVAのメソッドとして呼び出す仕組みを持つ。 例えば、Myclasses.Test1クラスのmethod1メソッドをC言語で実装したいとすれば、
package Myclasses;

public class Test1 {
    public static native void method1();
}
とし、
void Java_Myclasses_Test1_method1(void);
で宣言される関数を定義し、予めKVMにリンクしておけばよい。 引数のある場合の受け渡し、非staticメソッドの実装法等、詳しいことは、 j2me_cldc/docs/KVM_porting.pdf の Native Code の節に載っている。

本演習では、Mechマイコンボードと移動ロボットの各機能を利用するための JAVAのクラスをこの仕組みを利用して用意してある。 以下の節で、各Class の使用法を説明する。 これらのソースは、JAVAで記述された部分は、 utmech/api/src/utmech/mechanompu以下に、 C言語で記述された部分は、utmech/kvm/src/native_functions.cにある。

2  timerクラス

utmech.mechanompu.timerクラスは、唯一のメソッドとして、
public static native long gettime();
を持つ。このメソッドは、static methodであり、java起動時からの経過時刻を ミリ秒を単位として返す。

経過時刻をLCDに表示 (Mechマイコンボード上のKVMでは、標準 出力はLCDに割り当てられている。)
import utmech.mechanompu.*;

public class TimeTest {
    public static void main(String arg[]) {
        System.out.print(timer.gettime());
    }
}

3  bumperクラス

utmech.mechanompu.sensor.bumperクラスは、バンパーの状態を返す2つのスタティック メソッド
public static boolean l();
public static boolean r():
を持つ。

それぞれのメソッドは、左あるいは右のバンパスイッチが押されていれば、 trueをそうでなければ、falseを返す。

4  psdクラス

utmech.mechanompu.sensor.psdクラスは、PSD(赤外距離センサー)の出力を 返す2つのスタティック メソッド
public static boolean readl();
public static boolean readr():
を持つ。

それぞれのメソッドは、左あるいは右のpsdの出力をADコンバータで 読みとった値を返す。

5  ledクラス

utmech.mechanompu.io.ledクラスは、Mechマイコンボード上に 4つ並んだLEDの点灯を制御する。4灯は、int型の下位4bitに割り当てられ、 次のメソッドにより操作できる。
public static void on(int val); 1のbitに対応するLEDを点灯
public static void off(int val); 1のbitに対応するLEDを消灯
public static void set(int val); bitパターン通りに点灯
public static void clear(); 全消灯
public static void reverse(); 反転
public static int get(); 点灯状態を取得

6  serialクラス

utmech.mechanompu.io.serialクラスは、Mechマイコンボード上のシリアル インタフェースによる入出力の機能を提供する。 同クラスの変数
  public final static SerialInputStream in; 
  public final static SerialOutputStream out; 
は、それぞれ、InputStream, OutputStreamの派生クラス型として実装されて いるので、InputStream, OutputStreamとして扱うことができる。 例えば、
 PrintStream pw = new PrintStream(serial.out);
 pw.println(true);
 pw.println('A');
 pw.println(1000);
のように、PrintStreamクラスのインスタンスを作れば、println等のメソッドを使って、簡単に様々な型のデータを出力できる。

7  keyクラス

utmech.mechanompu.io.keyクラスは、Mechマイコンボードのキー入力 に関する機能を提供する。 メソッドとして
public static int scan(); キー読みとり(入力を待たない)
public static int read(); キー読みとり(入力を待つ)
public static read_dec(); 10進数入力 ADRSETで符号反転、DATASETで入力確定
public static read_hex(); 16進数入力 ADRSETで符号反転、DATASETで入力確定
が準備されている。また、0からFまで以外のキーコードは、同クラス中に 定数として準備されている。
    public static final int run=0x10;
    public static final int f1=0x11;
    public static final int dataset=0x12;
    public static final int f2=0x13;
    public static final int adrdec=0x14;
    public static final int f3=0x15;
    public static final int adrset=0x16;
    public static final int f4=0x16;
    public static final int nokey=-1;

8  wheelsクラス

utmech.mechanompu.actuator.wheelsクラスは、移動ロボットの車輪の制御に 関する機能を提供する。エンコーダ値の直接読みとり、PWM指令の直接指定、 速度制御モードにおける目標速度指定を行うことができる。
public static void setpwml(int val); 左車輪モータPWM指令設定
public static void setpwmr(int val); 右車輪モータPWM指令設定
public static long getencl(); 左車輪のエンコーダ値取得
public static long getencr(); 右車輪のエンコーダ値取得
public static void resetencl(); 左車輪のエンコーダ値リセット
public static void resetencr(); 右車輪のエンコーダ値リセット
public static void set_servo_mode(boolean b) 速度制御のon/off
public static void set_goal_lvel(int val) 左車輪の目標速度設定 (rpm)
public static void set_goal_rvel(int val) 右車輪の目標速度設定 (rpm)
public static int get_lvel() 左車輪の速度取得 (rpm)
public static int get_rvel() 右車輪の速度取得 (rpm)
public static int gain=1; 速度制御サーボゲイン
public static final int cpr = 184; 1回転あたりのエンコーダカウント数
public static final int max_pwm = 500; PWM指令の最大値

9  adクラス

utmech.mechanompu.sensor.adクラスは、QADCのAD読みとり値を取得するメソッド
  public static int read(int ch);
を提供する。

10  memoryクラス

utmech.mechanompu.memoryクラスは、メモリへの直接入出力を実現する次のメソッドを 提供する。
public static byte peek(int addr); 1byte 読み込み
public static void poke(int addr, byte data); 1byte 書き込み
public static short peekw(int addr ); 2byte 読み込み
public static void pokew(int addr, short data); 2byte 書き込み


This document was translated from LATEX by HEVEA.