programming with lejos part 1. what is lejos? cut-down version of java for the rcx platform...
Post on 21-Dec-2015
217 views
TRANSCRIPT
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) { }
}