Professional Documents
Culture Documents
Software
Alternativas de programação do RCX
(Programando o RCX)
• Que utilizam o firmware original da Lego
? Linguagem de programação visual da Lego
Jomi Fred Hübner ? NQC (Not Quite C)
jomi@inf.furb.br (32 variaveis globais)
FURB / BCC • Que alteram o firmware
? brickOS (http://brickOS.sourceforge.net)
Os programas são escritos em C/C++ e compilados pelo gcc
para o processador Hitachi.
Tem emulação de ponto flutuante, threads, armazenamento de
múltiplos programas no RCX.
Obs.: existem alternativas em Perl, TCL, VB, . . .
March 3, 2004
Roteiro
• Alternativas LeJOS
• LeJOS • O firmware do RCX é substituı́do por uma máquina virtual Java
? Sensores (16Kb da RAM).
? Atuadores • Os programas são escritos em Java e compilados pelo javac
? Listeners utilizando classes padrão (java.lang ) adaptadas para o RCX.
• Orientado a objetos
• Multi-thread e sincronização
• Ponto flutuante
• Arrays
Motores
A classe Motor possui três atributos estáticos, um para cada porta de
Configuração dos sensores
saı́da do RCX • Indicação do tipo de sensor ligado a uma das portas do RCX
• Motor.A SENSOR_TYPE_TOUCH
SENSOR_TYPE_LIGHT
• Motor.B SENSOR_TYPE_ROT
SENSOR_TYPE_TEMP
• Motor.C SENSOR_TYPE_RAW
Para cada motor, as seguintes mensagens podem ser enviadas: • Indicação do modo de leitura dos valores enviados pelos sensores
• forward(): faz o motor girar para frente Os valores enviados pelos sensores do Lego são digitalizados em
10 bits (0 - 1023), este valor é chamado de raw value. Para
• backward(): faz o motor girar para trás
simplificar a utilização, alguns modos de leitura são
• stop(): pára o motor e o bloqueia disponibilizados.
• flt(): deixa o motor girar livremente
class ShowTouch {
public static void main(String[] args) { Exercı́cio
• Faça um programa no leJOS que ligue o motor A para frende
Sensor.S1.setTypeAndMode(
quando o sensor de toque for apertado a primeira vez e inverta a
SensorConstants.SENSOR_TYPE_TOUCH,
rotação do motor quando o sensor for apertado novamente.
SensorConstants.SENSOR_MODE_BOOL);
while(true) {
LCD.showNumber(Sensor.S1.readValue());
} } }
class ShowAndBeep {
Polling × Callbacks public static void main(String[] args)
throws InterruptedException {
Como perceber que o sensor de toque encostou em algo:
Sensor.S1.setTypeAndMode(
• Polling: fica em um loop onde a cada 100 ms se olha o valor do
SensorConstants.SENSOR_TYPE_LIGHT,
sensor e se verifica a mudança de valor.
SensorConstants.SENSOR_MODE_PCT);
• Callback: pede para ser avisado pelo RCX quando o valor mudar. Sensor.S1.activate();
(economiza CPU, não precisa indicar o tempo de polling) Sensor.S1.addSensorListener(new LightViewer());
Sensor.S1.addSensorListener(new DropWatcher());
Para utilizar callback, são adicionados listeners aos sensores. Button.RUN.waitForPressAndRelease();
} }
Sensor.S1.addSensorListener(new SensorListener() {
class DropWatcher implements SensorListener { public void stateChanged(Sensor s, int old, int nu) {
public void stateChanged(Sensor s, int old, int nu) { LCD.showNumber(nu);
if(nu < old - 3) { }
Sound.beep(); });
} } }
Button.RUN.waitForPressAndRelease();
} }
Solução do Exercı́cio
Sensor.S1.setTypeAndMode(
SensorConstants.SENSOR_TYPE_TOUCH,
SensorConstants.SENSOR_MODE_BOOL);
Bibliografia
Sensor.S1.addSensorListener(new SensorListener() {
public void stateChanged(Sensor s, int old, int nu) {
[1] Dario Laverde, Giulio Ferrari, and Jurgen Stuber, editors. Programming
if (nu == 1) {
if (Motor.A.isStopped()) { Lego Mindstorms with Java. Syngress Media.
Motor.A.forward(); [2] R. Schiedermeier. Using LeJOS.
} else if (Motor.A.isForward()) {
http://www.informatik.fh-muenchen.de/~schieder/usinglejos.
Motor.A.backward();
} else { [3] Luis Villa. Lego mindstorm with linux mini-howto, 2000.
Motor.A.forward(); http://www.ibiblio.org/pub/Linux/docs/HOWTO/mini/
} } }
other-formats/pdf/Lego.pdf.
});
Button.RUN.waitForPressAndRelease();