[ 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 への乗り換えを試してみる時期かもしれません!!