Shuichi Machida's Weblog

« [Sun SPOT Demo(7)]... | メイン | [Sun SPOT Demo(8)]... »

http://blogs.sun.com/machida/date/20080519 2008年 5月 19日 月曜日

[Sun SPOT でリモコンカーを作ろう(4)] 車体を組み上げてちょっと動かしてみる。

間にいろいろ作りたいものが出てきて、リモコンカーの製作がすっかり遅れていました orz たしか目標は、半田付けをしないで、できるだけ安い費用で作成することでした。キット化に向けたプロトタイプ作成という意味合いもあります。

今までのエントリはこちら:


最終的に、いくつか部品を追加、変更して、以下のパーツを使用することにしました(太字が今回追加した部分):

 品名  参考価格  数量
 無限回転サーボモータ(SX-01改)  3150  2
 スイッチ付き電池ボックス(単三×3: SBH331AS)
 147  1
 ブレッドボード(165-40-3010E)  210  1
ホクセイ マイクロ・テールギア 350  1
TAMIYA 楽しい工作シリーズ ナロータイヤセット(58mm径) -> MODELING ACCESSORIES Eタイヤ 44mm 2ヶ入り(OK MODEL CO, LTD.)

400  600

 1
ジャンプワイヤ(SPP-70)
 483  1
ジャンプワイヤキット(SKS-140)  1103  1
マウンティングストラップ  525  1
420GUR25 キャスター(ウレタン)
 138  1
ピンヘッダ(オス) 6P  50  1
(必要に応じて)サーボ延長ケーブル  数百円  2

何とか10,000円以内に収まりました ;-) 予算の半分以上はサーボです。。ジャンプワイヤは数本ずつ、マウンティングストラップは1本しか使わないので、シェアすればもう少し安くなります。また、前輪についてはちょうどいいものがなかなか見つからずしばらく探していたのですが、先日ツクモロボット王国に行った際に手頃なキャスターを見つけたので、マイクロ・テールギアの代わりに使うことにしました(こういうのはハンズにも売ってますね)。あ、あとサーボとキャスターを電池ボックスにくっつけるのに、強力接着剤が要りますね。

それでは早速組み上げます。

。。。。

# 完成!意外にまともな外観になりました。

 # ケーブリング部分を拡大

 # 前面から

 # 裏はこんな感じです↓

車体も完成したので、簡単に動かしてみます。今回は単純に、左回り、右回りなどの定型動作を自律的に繰り返すプログラムを作成してみました↓

package org.sunspotworld;

import com.sun.spot.peripheral.Spot;
import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.sensorboard.peripheral.ITriColorLED;
import com.sun.spot.sensorboard.peripheral.LEDColor;
import com.sun.spot.util.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class ServoCarSpot extends MIDlet {
    private ServoCar servoCar;
    private ITriColorLED[] leds;

    /** ここからスタート */
    protected void startApp() throws MIDletStateChangeException {
        new BootloaderListener().start();   // monitor the USB (if connected) and recognize commands from host
        Spot.getInstance().getSleepManager().disableDeepSleep();

        servoCar = new ServoCar(EDemoBoard.H0, EDemoBoard.H1);
        leds = EDemoBoard.getInstance().getLEDs();

        while (true) {
            initLeds(LEDColor.BLUE);
            blinkLeds();
            Utils.sleep(1000L);

            // 左前回り
            servoCar.leftForward();
            Utils.sleep(5000L);
            servoCar.stop();

           // 右前回り
            servoCar.rightForward();

            Utils.sleep(5000L);
            servoCar.stop();

            // 右後ろ周り
            servoCar.rightBackward();

            Utils.sleep(5000L);
            servoCar.stop();

            // 左後ろ周り
            servoCar.leftBackward();

            Utils.sleep(5000L);
            servoCar.stop();

            // 極地左回り
            servoCar.pivotLeft();

            Utils.sleep(5000L);
            servoCar.stop();

            // 極地右回り
            servoCar.pivotRight();

            Utils.sleep(5000L);
            servoCar.stop();

            initLeds(LEDColor.RED);
            blinkLeds();
            Utils.sleep(5000L);
        }
    }

    private void initLeds(LEDColor color) {
        for (int i = 0; i < leds.length; i++) {
            leds[i].setOff();
            leds[i].setColor(color);
        }
    }

    private void blinkLeds() {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < leds.length; j++) {
                leds[j].setOn();
            }
            Utils.sleep(150L);
            for (int j = 0; j < leds.length; j++) {
                leds[j].setOff();
            }
            Utils.sleep(150L);            
        }
    }

    protected void pauseApp() {
    }

    protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
    }
}

package org.sunspotworld;

import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.sensorboard.IDemoBoard;
import com.sun.spot.sensorboard.peripheral.Servo;

public class ServoCar {
    private static final int MIN_VALUE = 1000;
    private static final int MID_VALUE = 1500;    
    private static final int MAX_VALUE = 2000;
    private Servo rightServo;
    private Servo leftServo;


    public ServoCar(int rightPinId, int leftPinId) {
        IDemoBoard demo = EDemoBoard.getInstance();
        /** 右側のタイヤを制御 */
       rightServo = new Servo(demo.getOutputPins()[rightPinId]);
        /** 左側のタイヤを制御 */
       leftServo = new Servo(demo.getOutputPins()[leftPinId]);
        stop();
    }

    /** 停止 */
    public void stop() {
        rightServo.setValue(MID_VALUE);
        leftServo.setValue(MID_VALUE);
    }

    /** 左前回り */
    public void leftForward() {
        rightServo.setValue(MAX_VALUE);
    }

    /** 右前回り */
    public void rightForward() {
        leftServo.setValue(MIN_VALUE);
    }

    /** 右後ろ回り */
    public void rightBackward() {
        rightServo.setValue(MIN_VALUE);
    }

    /** 左後ろ回り */
    public void leftBackward() {
        leftServo.setValue(MAX_VALUE);
    }

    /** 極地左回り */
    public void pivotLeft() {
        rightServo.setValue(MAX_VALUE);
        leftServo.setValue(MAX_VALUE);
    }

    /** 極地右回り */
    public void pivotRight() {
        rightServo.setValue(MIN_VALUE);
        leftServo.setValue(MIN_VALUE);
    }

}

プログラムをSun SPOT本体に流し込んで、いざ実行です。

。。。

無事、動きました ;-) 

動画はこちら↓

投稿されたコメント:

ありがとうございます。参考にさせていただきます。

Posted by 武蔵工業大学 学生 on 5月月 19日, 2008年 at 11:03 午後 JST #

コメント
  • HTML文法 不許可

Valid HTML! Valid CSS!

This is a personal weblog, I do not speak for my employer.