Sie sind auf Seite 1von 59

Robtica

Prof. Reinaldo Bianchi Prof. Paulo Santos Centro Universitrio da FEI 2010

Laboratrio de Robs Mveis

1a. 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 S3

outA

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 Escolhe o programa a executar

Liga/desliga

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.

Comandos de controle do rob

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(motor, 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.

Exemplo 1

Meu primeiro programa NQC.


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

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

until

until (SENSOR_1 == 1);


Until = at que. O programa fica parado nessa linha at que o SENSOR_1 Seja igual a 1.

Comando de espera por um sensor. Primeiro comando de deciso.

Sensor de luz

Usado para cores em objetos, no chao e distncias. Retorna:


0 mnimo. 80 mximo.

Na prtica:
< 30 preto > 50 branco

Expresses e variveis

Expresses

Expresses avaliam (computam) o valor de uma seqncia de variveis, valores, operadores e chamada de mtodos. Exemplos:
2 2*4 a=3 5+2*3a

Variveis

Local onde as informaes so armazenadas dentro de um programa. Uma varivel tem este nome porque o seu valor pode mudar durante a execuo do programa. Cada varivel possui um tipo que define que tipos de valores ela capaz de armazenar

Declarao de variveis

Para ser utilizada, uma varivel deve ser primeiro declarada Declarar uma varivel significa criar um local para armazenar o seu valor Declarao em Java:
int numDeSinalizadores = 0;

Tipo da varivel Nome da varivel

Valor Inicial

Variveis
task main() { int move_time, turn_time; move_time = 20; turn_time = 85; OnFwd(OUT_A+OUT_C); Wait(move_time); OnRev(OUT_C); Wait(TURN_TIME); OnFwd(OUT_A+OUT_C); Wait(move_time); Off(OUT_A+OUT_C); }

S existem variveis inteiras (35 no mximo)

Comandos de Deciso e Repetio

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.

Comandos de Deciso

Para resolver a maioria dos problemas necessrio decidir-se entre a execuo de uma instruo ou outra. Os comandos de deciso permitem especificar uma condio que se for verdadeira levar execuo de um determinado bloco de programa.

Operadores

Operadores para nmeros e char: Relacionais:


< > <= >= == != (result booleano)

Aritmticos:
+ - * / % ++ -& (and) ^ (xor) (resultado numrico) (incremento/decremento) | (or) (para bits)

Operadores (II)

Operadores lgicos: Booleanos:


= = != (resultado lgico) && (and) || (or) (resultado lgico)

Atribuio:
= += -=

Operadores relacionais

A == B A igual a B? A != B A diferente de B? A<B A menor que B? A>B A maior que B? A <= B A menor ou igual a B? A >= B A maior ou igual a B? Expresses Lgicas:
&& (e), || (ou), ! (no)

If

Usado para decidir se uma instruo deve ou no ser realizada: if (expresso_booleana) { instrues; }

If ... Else

Usada para escolher entre duas instrues possveis: if (expresso_booleana){ instrues; } else { instrues; }

Exemplos If:

If:
if (SENSOR_1> 50) Off(OUT_A);

If ... else:
if (SENSOR_1> 50) Off(OUT_A); else Off(OUT_C);

If ... Else aninhados


Podemos usar if ... else aninhados: if (expresso_booleana1){ instrues1; } else if (expresso_booleana2){ instrues2; } else instruo3;

Exemplo if aninhados
if (SENSOR_1> 50) Off(OUT_A); else if (SENSOR_1 < 50) Off(OUT_C); else Off(OUT_A+OUT_C);

Comandos de Repetio

repeat:
usado quando se sabe, a priori, quantas vezes deve ser realizada uma repetio

do - while ou while:
usados quando no se sabe quantas vezes deve ocorrer a repetio, apenas a condio de parada.

Repeat
repeat(<quantidade de vezes>) { <comando>; ... }

Exemplo: repeat
task main() { int move_time = 20, turn_time = 85; repeat(4) { OnFwd(OUT_A+OUT_C); Wait(move_time); OnRev(OUT_C); Wait(TURN_TIME); } Off(OUT_A+OUT_C); }

do - while
do { <comando>; ... } while (<condio de parada>);

do ... while
int move_time, turn_time, total_time; task main() { total_time = 0; move_time = 85; turn_time = 25; do { 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
while (<condio>) { <comando>; ... }

while
int move_time, turn_time; task main() { total_time = 0; move_time = 85; turn_time = 25; while (true) { OnFwd(OUT_A+OUT_C); Wait(move_time); OnRev(OUT_C); Wait(turn_time); } }

Macros

Pode-se definir macros com o comando:


#define <NOME> <VALOR>

No cdigo do programa, <NOME> ser trocado por <VALOR>. Uso de macros uma maneira de organizar o programa e facilitar a programao.

Macros: 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); }

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

Programando o LEGO

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.. Dificuldade:


Rob no simplesmente diferencial, mas possui deslizamento. Outros tipos de robs nas prximas aulas.

Fim

Das könnte Ihnen auch gefallen