programming with lejos part 1. what is lejos? cut-down version of java for the rcx platform...

33
Programming with Lejos Part 1

Post on 21-Dec-2015

217 views

Category:

Documents


1 download

TRANSCRIPT

Programming with Lejos

Part 1

What is lejos?

• Cut-down version of Java for the RCX platform

• Includes:– Lejos API– JVM

• API includes functionality needed to control motors, sensors, buttons as well as many components from the standard Java API

How it works

• Lego firmware is replaced with lejos JVM (only has to be done once)

• Program source code is written & compiled on PC

• Compiled code (Java byte code) is downloaded to & runs on RCX

JVM & RCX technical specifications

• RCX has 32k of RAM– 4K unusable– 16K for Lejos– 12K free memory for user code!

• Built-in support for:– Floating-point numbers (useful for trig/navigation)– Limited multithreading– 2-dimensional Arrays– Limited recursion

Events & the lejos API

• Objects & their listeners:– Timer: TimerListener– Button: ButtonListener– Sensor: SensorListener

• Object acts as event source; when event occurs, all registered listeners we notified & can execute appropriate code

Exception Handling & Garbage Collection

• Lejos follows standard Java exception-handling model

• Lejos does NOT have automatic garbage collection– Important to re-use objects rather the just

creating new ones– Forces good memory “hygiene”

• josx.platfom.rcx: includes classes for controlling– 3 output ports (A, B & C)– 3 input ports (1, 2 & 3)– 3 buttons (Prgm, Run, View)– LCD display– Speaker output– IR communication

• There are also classes for accessing system time & monitoring battery power

Packages in the Lejos API

Packages in the Lejos API

• java.lang: Includes some of the most commonly used standard classes– Math– String– StringBuffer: mutable version of String– System– Thread– Throwable

Packages in the Lejos API

• java.util: like java.lang, includes some familiar and/or useful classes– Random– Vector: dynamic array– BitSet: series of bits

Packages in the Lejos API

• java.io: provides support for transmitting data streams via the IR port– Serializable interface– InputStream, OutputStream,

DataInputStream, DataOutputStream and IOException classes

Packages in the Lejos API

• josx.robotics: generic classes & methods for robot-specific tasks– Behavior Control classes: includes Behavior

interface & Arbitrator class– Navigation classes

Classes in josx.platform.rcx

• Sound class contains a set of static methods that can produce predefined or custom sounds:– Sound.beep() // beeps once– Sound.twoBeeps() // beeps twice– Sound. buzz() // emits almost inaudible tone– Sound. beepSequence() // series of

// downward tones– Sound. playTone (int frequency, int duration)

• MinSound class is a cut-down version - contains only the (deprecated) playTone method

Classes in josx.platform.rcx

• Unlike most Java environments, robots running Lejos are physical objects

• The RCX brick has 3 programmable buttons, 3 sensor connections and 3 power output ports

• When programming for the RCX, these components are represented by predefined static objects; it wouldn’t make sense to instantiate more sensor ports, for example, because physically there are just 3

Classes in josx.platform.rcx

• The LCD, MinLCD and TextLCD classes relate to various aspects of the RCX’s LCD display

• MinLCD, like MinSound, is a cut-down version primarily used to conserve memory

• LCD is used for number display, while TextLCD can display Strings

LCD class methods (all are static)

• void refresh()• void setNumber (int code, int value, int

point) - parameters:– code: value Indicates use of signed or

unsigned number, use of 5th digit– value: number to display– point: code indicating position of decimal point

• These 2 methods are also found in MinLCD

LCD class methods (all are static)

• void clear(): clears display

• void showNumber(int i): displays an unsigned, up to 4-digit number

• void setSegment (int code): activates the display segment indicated by code; codes are defined by static constants in the Segment interface

Example 1: Sounds & Displayimport josx.platform.rcx.*;

public class MakeNoise { public static void main(String[] args) throws InterruptedException {

int freq; // frequency of tone for (freq = 440; freq < 10000; freq = 110 * freq / 100) {

// ascending tones LCD.showNumber(freq); Sound.playTone(freq, 50); Thread.sleep(500); } for (freq = 440; freq > 20; freq = 90 * freq / 100) {

// descending tones LCD.showNumber(freq); Sound.playTone(freq, 50); Thread.sleep(500); } }}

Classes in josx.platform.rcx

• Button class methods include:– public void addButtonListener (ButtonListener

b)– public boolean isPressed()– public static int readButtons()

• Returns int with bits set: 0x02 (view button pressed) 0x04 (prgm button pressed), 0x01 (run button pressed). If all buttons are released, this method returns 0.

– void waitForPressAndRelease () throws InterruptedException

• stops execution until button pressed & released

Classes in josx.platform.rcx

• Button class also contains static fields that represent the RCX buttons:– Button.PRGM– Button.RUN– Button.VIEW

• ButtonListener interface specifies 2 methods:– public void buttonPressed (Button b)– public void buttonReleased (Button b)

Classes in josx.platform.rcx

• ROM class: provides access to embedded routines in the RCX ROM; includes static method int getBatteryPower()

• Motor class: includes methods controlling DC output to ports A, B and C

• Sensor class: includes methods to communicate with sensor controllers 1, 2 and 3

Motor class methods: mutators

• void forward(): motor rotates forward

• void backward(): motor rotates backward

• void stop(): stops with braking action

• void flt(): motor floats to a stop

• void reverseDirection(): changes from forward to backward, or vice-versa

• void setPower(int power): sets motor power; 7 is high, 0 low

Motor class methods: accessors

• int getPower(): returns current power setting• char getID(): returns motor ID (A, B or C)• All of the following methods return a boolean

value– isBackward()– isFloating()– isForward()– isMoving()– isStopped()

Example

import josx.platform.rcx.*;

public class Patrol { public static void main(String[] args) throws InterruptedException { Motor.A.forward(); while (true) { Motor.C.forward(); // go forward Thread.sleep (5000); Motor.C.reverse(); // turn around Thread.sleep (1000); } }

Sensor class

• There are several types of sensors available for the RCX, including:– Touch– Light– Rotation

• Because each operates differently, there is more complexity built into this class than in most of the rest of the lejos API

Sensor Type and Mode

• A predefined set of constants is used to describe:– the kind of sensor attached to a particular

connector (type) and – the kind of readings that are recorded by the

sensor (mode)

• These values as used as arguments to the Sensor class’s setTypeAndMode method, which is used to initially set up a sensor

Type and Mode examples

Sensor.S1.setTypeAndMode(1, 0x20);// 1 represents touch sensor;

// 0x20 is boolean mode

Sensor.S1.setTypeAndMode(3, 0x80);// 3 represents light sensor;

// 0x80 is percent mode

Exampleimport josx.platform.rcx.*;

public class GoForward implements SensorConstants { public static void main(String[] args) { Sensor.S2.setTypeAndMode(SENSOR_TYPE_TOUCH,

SENSOR_MODE_BOOL); // sets up touch sensor using constants from SensorConstants interface Motor.A.forward(); Motor.C.forward();

while( Sensor.S2.readValue() != 1 ) ; // loop ends (& robot stops) when bumper is touched } }

Methods of Sensor class

• public void activate ()– activates sensor– should be called after setTypeAndMode

• Methods that return Sensor readings:– public final boolean readBooleanValue()– public final int readValue()– public final int readRawValue()

• Sensor readings can also be handled by a SensorListener as described on the next slide

Sensor Listeners

• Sensor Listener interface specifies a single method:public void stateChanged(Sensor s, int old, int new)

• s: event source• old: previous value• new: new value

• As with the GUI components we have looked at before, the steps are– define a class that implements the interface, and with the

code for the method– add the listener to the appropriate Sensor

Serial class Methods

• The Serial class is used for RCX to IR and RCX to RCX communication

• Methods work on the most basic level of network communication, passing around packets in the form of arrays of bytes

• A separate communications API provides support for higher-level operations

One more exampleimport josx.platform.rcx.*;public class ListenerExample implements SensorConstants, SensorListener {

public static void main(String[] args) { ListenerExample exam = new ListenerExample(); Sensor.S1.setTypeAndMode(SENSOR_TYPE_TOUCH,

SENSOR_MODE_BOOL); Sensor.S3.setTypeAndMode(SENSOR_TYPE_TOUCH,

SENSOR_MODE_BOOL); Sensor.S1.addSensorListener(exam); Sensor.S3.addSensorListener(exam); exam.patrol(); }

Example continuespublic void patrol () { try {

Motor.A.forward(); while (true) { Motor.C.forward(); Thread.sleep(3000); Motor.C.backward(); Thread.sleep(1000); }

} catch (Exception e) { }

}

End of examplepublic void stateChanged(Sensor source, int oldValue, int newValue) {

if (newValue == 1) if (source.getId() == 0) // left bumper Sound.playTone(220, 50); else if (source.getId() == 2) // right bumper Sound.playTone(660, 50);

}

} // end class ListenerExample