NXT-Ultrasonic

Dari IgosCenter

Langsung ke: Navigasi, Cari

Robot dengan sensor ultrasonik ini bisa berjalan bebas di ruangan tanpa menabrak dinding. Hebatnya lagi, jika sudah mendekati dinding dia akan berhenti, kemudian berputar menjaci jalan yang tidak ada halangannya.

Konstruksi

Dari mobil NXT-Base, tambahkan sensor ultrasonic sehingga kita punya:

  • Dua roda yang masing-masing terhubung ke motor port B dan C.
  • Satu sensor ultrasonic, terhubung ke masukan Port-3.

Gambar:NXT-base_sonic.png

Program iCommand

Untuk menyetir mobil ini, kita akan pakai dua kelas, yaitu:

  • Kelas Pilot, untuk menyetir kedua roda.
  • Kelas UltrasonicSensor, yang bisa memberikan informasi jarak penghalang di depan.
/*
 * BaseUltrasonic.java
 */
 
package robotnxj;
 
import icommand.nxt.comm.NXTCommand;
import icommand.navigation.Pilot;
import icommand.nxt.*;
 
/**
 * Menjalankan robot base memakai kelas pilot, dengan panduan sensor ultrasonik
 * - Awal, robot berjalan maju
 * - Jika ada penghalang didepan dalam jarak 20 cm, robot berhenti
 * - Robot berputar sampai arah didepan cukup jauh, lalu melanjutkan
 * Program ini menggunakan pakem state machine
 *
 * @author kocil
 */
public class BaseUltrasonic {
    static final float WHEEL_DIAMETER=5.6F;
    static final float TRACK_WIDTH=20.0F;
 
    static final int STATE_STOP=0;
    static final int STATE_RUN=1;
    static final int STATE_TURN=2;
 
    static int rotation = 15;
    static int state;
    static int count;
    static Pilot pilot;
    static UltrasonicSensor sonic;
 
    public static int doStop() {
        if (sonic.getDistance() > 100) {
            pilot.forward();
            System.out.println("Robot JALAN ! ");
            return STATE_RUN;
        }
        System.out.println("Robot PUTAR ! ");
        return STATE_TURN;
    }
 
    public static int doRun() {
        if (sonic.getDistance() < 20) {
            pilot.stop();
            if (Math.random() > 0.5) {
                rotation = -rotation;
            }
            System.out.println("Robot PUTAR ! ");
            return STATE_TURN;
        }
        return STATE_RUN;
    }
 
    public static int doTurn() {
        switch (state) {
            case STATE_TURN :
                if (Math.random() > 0.5) {
                    pilot.rotate(90);
                } else {
                    pilot.rotate(-90);
                }
                pilot.forward();
                System.out.println("Robot JALAN ! ");
                return STATE_RUN;
        }
        System.out.println("Robot STOP ! ");
        return STATE_STOP;
    }
 
    public static void main(String[] args ) throws Exception
    {
        int distance;
        System.out.println("Koneksi ke robot ... ");
        NXTCommand.open();
        NXTCommand.setVerify(true);
 
        // siapkan sensor, ke port 3
        sonic = new UltrasonicSensor(SensorPort.S3);
 
        // siapkan pilot, motor di port B dan C
        pilot = new Pilot(WHEEL_DIAMETER, TRACK_WIDTH, Motor.B, Motor.C,true);
	pilot.setSpeed(500);
 
        // state machine, bergerak sampai 5 kali belok
        count = 10;
        state = STATE_STOP;
        System.out.println("Robot mulai bekerja ... ");
        do {
            switch (state) {
                case STATE_RUN : state = doRun(); break;
                case STATE_TURN : state = doTurn(); break;
                default : state = doStop(); break;
            }
        } while (count > 0);
 
        System.out.println("Tutup koneksi ke robot");
        NXTCommand.close();
 
    }
}

Mencoba

Setelah selesai diprogram, jalankan robot di lantai datar, dengan dinding dan kabinet di sekitarnya.


Kontributor: Kocil

(c) Igos Center Bandung, 2009