金曜日 6 06, 2008

[ English version is here

Sun SPOT アプリケーション (MIDlet) のクラスは "javax.microedition.midlet.MIDlet" を拡張して作成し、ライフサイクルは startApp() メソッドから始まります。

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
// ...
public class SunSpotApplication extends MIDlet {
// ...

protected void startApp() throws MIDletStateChangeException {
System.out.println("Hello, world");
// ...
Sun SPOT を使ってサーボをまわすために必要なコードは以下の2行だけです。
Servo serv0 = new Servo(EDemoBoard.getInstance().getOutputPins()[EDemoBoard.H0]);
serv0.setValue(2000);

サーボモータの動かしかたや動作原理の詳細については Servomechanism などを参照ください。Google で検索してもたくさんヒットすると思います。ここでは定期的に方形波・パルス(一定周期で "High" or "Low" を瞬間的に繰り返す波形)をサーボに送り続けるとサーボが回転し、方形波の周期中の "High" の長さによって回転角度(または continuous rotation の場合は速度)が変化するということが分かれば十分です。一般のサーボの場合は、このパルスの周期が 20 ミリ秒で 1500 マイクロ秒(つまり 1.5 ミリ秒) "High" が続くパルスを送った場合に 90 度回転します(この位置を "Neutral" position といいます)。他のパルスではこの 1500 を中心として、

  • 1500 - value マイクロ秒: 0 度
  • 1500 + value マイクロ秒: 180 度

回転します。上の "value" というパラメータはサーボによって異なりますが、一般的には 250 から 500 の間になっているようです(使用前に確認する必要があるかもしれません)。上の "Servo#setValue(2000)" はパルス中の "High" の長さを 2000 マイクロ秒にセットし、そのパルスをサーボに送り続けるコードになります。Sun SPOT においてサーボを動作させるコードはこれですべてです!

組み込みのプログラミングを組んだ方なら、同じことを C で書くのがこれほど簡単ではないことにお気づきかもしれません。もちろん使用しているマイコンの種類とか、どれだけライブラリが整備されているかによりますが、基本的には多くの include ファイルを取り込んだ後、使用するレジスタやシリアル通信用のコマンドシンタックス(フォーマット)を調べる必要があります。それからパルスを手動で発生させる場合はデジタルポートに対して "high" の送出 → 1.5 ms 待つ → "low" の送出を繰り返すコードを書く必要があります。またたとえ ATmega88 "8-bit Timer/Counter2 with PWM and Asynchronous Operation" などのような少し高レベルなオペレーションを使って PWM (pulse-width modulation) を発生させたとしても組み込み C における根本的な複雑さを解決できたとはいえません。

どうでしょうか?少しでもいいかも?と感じていただければ Sun SPOT への乗り換えを試してみる時期かもしれません!!

投稿されたコメント:

コメント
  • HTML文法 不許可