Title: Programming%20with%20Lejos
1Programming with Lejos
2What 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
3How 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
4JVM 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
5Events 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
6Exception 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
7Packages in the Lejos API
- 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
8Packages 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
9Packages in the Lejos API
- java.util like java.lang, includes some familiar
and/or useful classes - Random
- Vector dynamic array
- BitSet series of bits
10Packages 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
11Packages in the Lejos API
- josx.robotics generic classes methods for
robot-specific tasks - Behavior Control classes includes Behavior
interface Arbitrator class - Navigation classes
12Classes 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
13Classes 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
wouldnt make sense to instantiate more sensor
ports, for example, because physically there are
just 3
14Classes in josx.platform.rcx
- The LCD, MinLCD and TextLCD classes relate to
various aspects of the RCXs 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
15LCD 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
16LCD 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
17Example 1 Sounds Display
import josx.platform.rcx. public class
MakeNoise public static void main(String
args) throws InterruptedException int
freq // frequency of tone for (freq
440 freq lt 10000 freq 110 freq / 100)
// ascending tones
LCD.showNumber(freq)
Sound.playTone(freq, 50)
Thread.sleep(500) for
(freq 440 freq gt 20 freq 90 freq / 100)
// descending tones
LCD.showNumber(freq)
Sound.playTone(freq, 50)
Thread.sleep(500)
18Classes 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
19Classes 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)
20Classes 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
21Motor 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
22Motor 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()
23Example
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)
24Sensor 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
25Sensor 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
classs setTypeAndMode method, which is used to
initially set up a sensor
26Type 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
27Example
import 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
28Methods 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
29Sensor 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
30Serial 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
31One more example
import 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, SE
NSOR_MODE_BOOL) Sensor.S3.setTypeAndMode(S
ENSOR_TYPE_TOUCH, SENSOR_MODE_BOOL)
Sensor.S1.addSensorListener(exam)
Sensor.S3.addSensorListener(exam)
exam.patrol()
32Example continues
public void patrol () try
Motor.A.forward() while (true)
Motor.C.forward()
Thread.sleep(3000)
Motor.C.backward()
Thread.sleep(1000)
catch (Exception e)
33End of example
public 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