You are on page 1of 5

Disciplina de Introdução à Robótica

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

Software — Alternativas de programação do RCX 3

Disciplina de Introdução à Robótica Disciplina de Introdução à Robótica

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

Software — Roteiro 2 Software — LeJOS 4


Disciplina de Introdução à Robótica Disciplina de Introdução à Robótica

Exemplo Exemplo atuador

import josx.platform.rcx.*; import josx.platform.rcx.*;


class Hello {
public static void main(String[] args) class GoStopBack {
throws InterruptedException public static void main(String[] args)
{ throws InterruptedException {
TextLCD.print("HELLO");
Button.RUN.waitForPressAndRelease(); Motor.A.forward();
Thread.sleep(1000);
}
Motor.A.stop();
}
Thread.sleep(1000);
Utilização: Motor.A.backward();
• Compilação: lejosc Hello.java Thread.sleep(1000);
Motor.A.flt();
• Linkedição e download: lejos Hello
} }

Software — Exemplo 5 Software — Exemplo atuador 7

Disciplina de Introdução à Robótica Disciplina de Introdução à Robótica

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

Software — Motores 6 Software — Configuração dos sensores 8


Disciplina de Introdução à Robótica Disciplina de Introdução à Robótica

Exemplo sensor ativo


modo valores
observação
import josx.platform.rcx.*;
SENSOR MODE BOOL valores altos são mapeados 0, 1 class LCDShowLight {
para falso e valores baixos para public static void main(String[] args) {
verdadeiro
SENSOR MODE RAW retorna o valor digital corre- 0...1023 Sensor.S1.setTypeAndMode(
spondente à voltagem SensorConstants.SENSOR_TYPE_LIGHT,
SENSOR MODE PCT retorna o valor em uma escala 0...100 SensorConstants.SENSOR_MODE_PCT);
de porcentagem (0 = high raw Sensor.S1.activate();
value, 100 = low raw value)
SENSOR MODE ANGLE acumula os sinais do sensor de while(true) {
rotação (1/16 de volta) LCD.showNumber(Sensor.S1.readValue());
SENSOR MODE DEGC retorna o valor em graus -20 ... +70 // 80% durante o dia
centı́grados // 20% em um quarto escuro
} } }

Software — Configuração dos sensores 9 Software — Exemplo sensor ativo 11

Disciplina de Introdução à Robótica Disciplina de Introdução à Robótica

Exemplo sensor passivo


import josx.platform.rcx.*;

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());
} } }

Software — Exemplo sensor passivo 10 Software — Exercı́cio 12


Disciplina de Introdução à Robótica Disciplina de Introdução à Robótica

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();
} }

Software — Polling × Callbacks 13 Software — Exemplo de listener 15

Disciplina de Introdução à Robótica Disciplina de Introdução à Robótica

Exemplo de listener Exemplo de listeners com classes anonimas


import josx.platform.rcx.*; import josx.platform.rcx.*;
class ShowTouchAnonymous {
public static void main(String[] args)
class LightViewer implements SensorListener { throws InterruptedException {
public void stateChanged(Sensor s, int old, int nu) {
Sensor.S1.setTypeAndMode(
LCD.showNumber(nu);
SensorConstants.SENSOR_TYPE_TOUCH,
} }
SensorConstants.SENSOR_MODE_BOOL);

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();
} }

Software — Exemplo de listener 14 Software — Exemplo de listeners com classes anonimas 16


Disciplina de Introdução à Robótica Disciplina de Introdução à Robótica

Exemplo de listener dos botões Erros


import josx.platform.rcx.*; Rodando o programa abaixo
class ButtonClick {
public static void main(String[] args) class BombOut {
throws InterruptedException { public static void main(String[] args) {
int i = 1;
Button.VIEW.addButtonListener(new ButtonListener() {
int j = 0;
public void buttonPressed(Button b) {
Sound.playTone(50, 10); int k = i/j;
// produz um som de 50 Hz por (10 * (1/100)) de segundo } }
}
public void buttonReleased(Button b) {
aparecerá no display . Os primeiros quatro dı́gitos
Sound.playTone(5000, 10);
} indicam o método que causou o erro (o main) e o último dı́gito indica
}); a classe (número da classe mod 10).

Button.RUN.waitForPressAndRelease(); Para encontrar os números dos métodos e classes, execute lejos -o


} } /dev/null -verbose BombOut.

Software — Exemplo de listener dos botões 17 Software — Erros 19

Disciplina de Introdução à Robótica Disciplina de Introdução à Robótica

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();

Qual o paradigma utilizado nos exemplos?

Software — Solução do Exercı́cio 18 Software — Bibliografia 20

You might also like