Você está na página 1de 39

Robtica

Prof. Reinaldo Bianchi


Centro Universitrio da FEI
2007

10a. Aula

Objetivos desta aula

Programao real de um rob mvel.


Breve introduo a programao NQC para
robs LEGO.
Resultado esperado:
Rob seguidor de pista reta ao final da aula.

Baseado em:
Aula do professor Paulo Santos.
Programming Lego Robots, de Mark Overmars.

O rob a ser usado

Trs sensores:
1 e 3 so de luz
(SENSOR_LIGHT)
2 de toque
(SENSOR_TOUCH)

Dois motores:
A e C (sada B no
utilizada!!)

O Rob usado

O rob usado
Sensor 3

Sensor 1

S1

outA

S3

outC

O LEGO Brick RCX

CPU do rob.
Permite at 5
programas
armazenados na
memria.
Permite visualizar
sensores.
Controla motores.

O LEGO Brick RCX


Visualiza Valores
dos sensores

Liga/desliga

Escolhe o programa a
executar

Executa/para
programa

A linguagem Not Quite C

Uma pequena introduo a NQC.

A linguagem NQC
(not quite C)

NQC uma linguagem de programao


desenvolvida por Dave Baum especialmente
para robs LEGO.
No entre em pnico se voc nunca
programou!
Subconjunto de Linguagem C.
NQC fcil de usar.
Programar um rob em NQC muito mais fcil
do que programar um computador.

NQC: aspectos bsicos

Cada programa em NQC deve ter uma task


main():
Ela inicia a execuo do programa.

Um programa pode ter diversas tarefas sendo


executadas em paralelo:
multitasking.

Possui dois tipos de comandos:


De controle do rob.
De controle do fluxo do programa.

Exemplo 1

Meu primeiro programa NQC.


Anda para frente e para trs.
task main()
{
OnFwd(OUT_A);
// Liga motor A
OnFwd(OUT_C);// Liga motor B
Wait(400);
// Espera 4 segundos
OnRev(OUT_A+OUT_C);
// Reverte.
Wait(400); // Espera 4 segundos
Off(OUT_A+OUT_C); // Desliga motores.
}

Comandos de controle do rob

Comandos que acionam os sensores e


atuadores do rob.
Permitem ligar e desligar os motores,
ajustar a potncia dos mesmos.
Permitem definir os sensores usados e ler
os valores dos mesmos.

Usados em conjunto com os comandos


de controle de fluxo.

Entradas e Sadas

Todo controle do rob realizado sobre


3 entradas e 3 sadas.
OUT_A, OUT_B e OUT_C:
So as 3 sadas de controle do rob.

SENSOR_1, SENSOR_2 E
SENSOR_3:
So as 3 entradas de sensores do rob.

Comandos de controle do motor

OnFwd(OUT_A);
Inicia a sada A
Se um motor estiver conectado a porta A, ele ser
ligado no sentido direto com mxima velocidade.

OnRev(OUT_A+OUT_C);
Reverte as sadas A e C.
Se existirem motores ligados a estas sadas, eles
sero acionados no sentido reverso com mxima
velocidade.

Comandos de controle do motor

Off(OUT_A+OUT_C);
Desliga os motores.

SetPower(fora).
A fora um nmero inteiro entre 0 e 7:
7 o mais rpido.
0 o mais lento, mas ainda com movimento.

Comando wait

O comando wait faz com que a tarefa


pare por um determinado tempo, dado
em centsimos de segundos.
Wait(400);
Note que as sadas so mantidas no
mesmo estado pelo tempo em que a
espera durar.

Definindo um sensor

Para definir um sensor necessrio


especificar a porta e o tipo do sensor:
SetSensor(SENSOR_2,SENSOR_TOUCH);
Define um sensor de toque na porta 2.
SetSensor(SENSOR_1,SENSOR_LIGHT);
Define um sensor de luz na porta 1.

Para usar o sensor:


Use o nome da porta como varivel:
SENSOR_2 == 1

Sensor de toque

Usado para detectar


toques ou barreiras.
Retorna:
0 se aberto
1 se pressionado.

O sensor mais
simples possvel

Exemplo sensor de toque

Anda at bater em algo e o sensor de


toque for pressionado:
task main()
{ SetSensor(SENSOR_1,SENSOR_TOUCH);
OnFwd(OUT_A+OUT_C);
until (SENSOR_1 == 1);
Off(OUT_A+OUT_C);
}

Sensor de luz

Usado para cores


em objetos, no chao
e distncias.
Retorna:
0 mnimo.
80 mximo.

Na prtica:
< 30 preto
> 50 branco

Comandos de controle de fluxo.

NQC possui comandos de controle de fluxo


iguais as linguagens procedimentais
convencionais, como linguagem C ou Pascal:
if... else
while
do ... while
repeat ... until
e outras.

repeat
task main()
{
repeat(4)
{
OnFwd(OUT_A+OUT_C);
Wait(MOVE_TIME);
OnRev(OUT_C);
Wait(TURN_TIME);
}
Off(OUT_A+OUT_C);
}

do ... while
int move_time, turn_time, total_time;
task main()
{
total_time = 0;
do
{
move_time = Random(100);
turn_time = Random(100);
OnFwd(OUT_A+OUT_C);
Wait(move_time);
OnRev(OUT_C);
Wait(turn_time);
total_time += move_time; total_time += turn_time;
}
while (total_time < 2000);
Off(OUT_A+OUT_C);
}

while e if/else
Anda e gira aleatoriamente para esquerda ou direita
#define MOVE_TIME
100
#define TURN_TIME
85
task main()
{
while(true){
OnFwd(OUT_A+OUT_C);
Wait(MOVE_TIME);
if (Random(1) == 0){
OnRev(OUT_C);
}
else{
OnRev(OUT_A);}
Wait(TURN_TIME);
}
}

Funo random

A funo random () gera um nmero


aleatrio entre 0 e o nmero passado
como parmetro da funo:
Random(60)
Gera um nmero aleatrio entre 0 e 60.
Nmeros sempre inteiros.

Operadores

Operadores relacionais:

= =,
!=

<, <=, >


, >=
(diferente)

Operadores Booleanos:

&& (conjuno lgica)


|| (disjuno lgica)
! (negao)

Variveis
#define TURN_TIME
85
int move_time;
task main()
{move_time = 20;
repeat(50)
{
OnFwd(OUT_A+OUT_C);
Wait(move_time); OnRev(OUT_C);
Wait(TURN_TIME);
move_time += 5; }
Off(OUT_A+OUT_C);
}

S existem variveis inteiras (35 no mximo)

Macros
#define turn_around
OnRev(OUT_C);Wait(340);OnFwd(OUT_A+OUT_C);
task main()
{
OnFwd(OUT_A+OUT_C);
Wait(100);
turn_around;
Wait(200);
turn_around;
Wait(100);
turn_around;
Off(OUT_A+OUT_C);
}

Macros 2: Mudando de direo


#define MOVE_TIME
100
#define TURN_TIME
85
task main()
{
OnFwd(OUT_A+OUT_C);
Wait(MOVE_TIME);
OnRev(OUT_C);
Wait(TURN_TIME);
Off(OUT_A+OUT_C);
}

Programando o LEGO

Utilizamos o programa BricxCC para


programar o LEGO.
Permite:
Editar e testar o programa.
Carregar o programa no rob.

Bricx Command Center pode ser


executado em Windows (95, 98, ME, NT,
2K, XP).

Bricx Command Center

Templates

Aviso: no perca seu tempo!

COMPILE E DEPURE SEU


PROGRAMA ANTES DE TEST-LO
NO ROB!!
Caso contrrio, voc s descobrir os
erros depois de um bom tempo...
Atrapalha a todos...

Tarefa da aula de hoje

Fazer o rob andar em linha reta,


seguindo a pista, corrigindo os
eventuais desvios.
Dividir a turma em equipes de 2 alunos!
Cada dupla deve fornecer um nome para a
sua equipe.

Pista usada.

Ao final do curso (4 aulas), a equipe


que fizer o trajeto a seguir no menor
tempo ser a campe!

Exemplo bsico

Exemplo de rob que anda at mudar a cor de


seu sensor
#define THRESHOLD 40
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
OnFwd(OUT_A+OUT_C);
while (true)
{
if (SENSOR_2 > THRESHOLD)
{
OnRev(OUT_C);
until (SENSOR_2 <= THRESHOLD);
OnFwd(OUT_A+OUT_C);
}
}
}

Concluso

O Controle de robs reais no to


complicado.
Usem material das aulas de controle
(aula 9) e das aulas de robtica mvel.
Dificuldade:
Rob no simplesmente diferencial, mas
possui deslizamento.
Outros tipos de robs nas prximas aulas.

Fim

Você também pode gostar