35
Programando Robôs Lego NXT usando NXC Prof. Marcelo Santos Linder

Programando Robôs Lego NXT usando NXC - univasf.edu.brmarcelo.linder/MiniCursoScientex2014.pdf · Sumário •Robô (kit) Lego NXT •Linguagem NXC –Estrutura geral de um programa

  • Upload
    vunhi

  • View
    228

  • Download
    0

Embed Size (px)

Citation preview

Programando Robôs Programando Robôs Lego NXT usando NXC

Prof. Marcelo Santos Linder

Sumário

• Robô (kit) Lego NXT

• Linguagem NXC– Estrutura geral de um programa

– Estruturas de controle de fluxo

Programando Robôs Lego NXT usando NXC

– Estruturas de controle de fluxo

– Motores

– Sensores

– Exemplos de robôs executando programas escritos em NXC

• Bibliografia

Robô (kit) Lego NXT

• No dia 4 de janeiro de 2006, na feira ConsumerElectronics Show em Las Vegas, a LEGOapresentou ao público a nova geraçãodo Mindstorms. Lançada comercialmente emagosto desse ano.

Programando Robôs Lego NXT usando NXC

agosto desse ano.

• O Mindstorms NXT trata-se de um kit de robóticadirecionado para o público pré-adolescente,composto por sensores e atuadores, que visafomentar o estudo/interesse por ciências eengenharia.

Robô (kit) Lego NXT

• Sensores e atuadores presentes no kit LegoMindStorms NTX em sua primeira versão.

Programando Robôs Lego NXT usando NXC

Robô (kit) Lego NXT

• Sensores e atuadores presentes no kit LegoMindStorms NTX em sua segunda versão.

Programando Robôs Lego NXT usando NXC

12

2

3

4

5

Robô (kit) Lego NXT• O kit possui 431 peças

Programando Robôs Lego NXT usando NXC

Robô (kit) Lego NXT• O kit permite a construção de inúmeros robôs

com configurações diferentes.

• Exemplos:

Programando Robôs Lego NXT usando NXC

Robô (kit) Lego NXTComo pode ser indicado para crianças?

• Apresentando tutoriais de como montarconfigurações de robôs.

Programando Robôs Lego NXT usando NXC

• Utilizando o NXT-G que é uma linguagem gráficasimilar ao National Instruments LabVIEW, quevem junto com o conjunto vendido.

Vamos explorar o aplicativo/ambiente...

Linguagem NXC

• Visando ampliar a capacidade de explorar aarquitetura disponibilizada pelo MindstormsNXT foi proposta uma linguagem maisrobusta/flexível que a NXT-G.

Programando Robôs Lego NXT usando NXC

robusta/flexível que a NXT-G.

• Esta linguagem foi denominada NXC.

• NXC é uma linguagem de programaçãoinventada por John Hansen que foiespecialmente designada para os robôs Lego.

Linguagem NXC

• Visando facilitar a programação em NXC, foicriado o Bricx Command Center (BricxCC –Centro de Comando Bricx).

• BricxCC dá suporte a:

Programando Robôs Lego NXT usando NXC

• BricxCC dá suporte a:

– escrita de programas;

– download de programas para o robô;

– navegar na memória flash do NXT;

– e muito mais.

Linguagem NXC

• O BricxCC pode ser visualizado como umambiente de desenvolvimento integrado (IDE -Integrated Development Environment).

Programando Robôs Lego NXT usando NXC

• É possível fazer o download gratuito doBricxCC no link:

http://bricxcc.sourceforge.net/

Linguagem NXC

• BricxCC roda em PCs com Windows (95, 98,ME, NT, 2000, XP, Vista).

• A linguagem NXC também pode ser utilizadaem outras plataformas.

Programando Robôs Lego NXT usando NXC

em outras plataformas.

• Sendo possível fazer o download docompilador no link:

http://bricxcc.sourceforge.net/nxc/

Linguagem NXC

• A estrutura básica de um programa em NXC é:

task main()

{

Programando Robôs Lego NXT usando NXC

{

}

Linguagem NXC

• Seu tipos são:– bool– byte– char– int– short– long

• Exemplos de declarações de variáveis

task main(){

int x;bool y, z;long a=1,b;

Programando Robôs Lego NXT usando NXC

– long– unsigned– float– mutex– string– Structures– Arrays

long a=1,b;float f=1.15, g;int data[10];bool flags[] = {true, true, false, false};string msg = "hello world";…

}

Linguagem NXC

• Estruturas de controle de fluxo:

– if else• Sintaxe exatamente igual a da linguagem C

– while

Programando Robôs Lego NXT usando NXC

– while• Sintaxe exatamente igual a da linguagem C

– do while• Sintaxe exatamente igual a da linguagem C

– for• Sintaxe exatamente igual a da linguagem C

Linguagem NXC

• Acionamento dos motores (atuadores)

Os motores são conectados às saídas do console NXT.

Estas saídas estão associadas aos identificadores OUT_A,OUT_B e OUT_C.

Programando Robôs Lego NXT usando NXC

OUT_B e OUT_C.

Três funções básicas (existem outras) estão associadas àmanipulação dos motores:

– OnFwd (saída(s), velocidade);

– OnRev (saída(s), velocidade);

– Off (saída(s)).

Linguagem NXC

• Acionamento dos motores (atuadores)

Exemplo:task main(){

OnFwd(OUT_A, 75); //75% da velocidade máxima

Programando Robôs Lego NXT usando NXC

OnFwd(OUT_A, 75); //75% da velocidade máximaOnFwd(OUT_C, 75);Wait(4000); //valor em milissegundosOnRev(OUT_AC, 75);Wait(4000);Off(OUT_AC);

}

Linguagem NXC

• Sensores

Podem ser associados aos periféricos de entrada.

Os sensores do NXT permitem que o robô reaja aestímulos externos.

Programando Robôs Lego NXT usando NXC

estímulos externos.

Começaremos nossos estudos pelo sensor de sensorde toque.

Para uma melhor compreensão vamos observar umexemplo de utilização do sensor de toque (considerandoque este está conectado à entrada 1 do NXT.

Linguagem NXC

//Exemplo: movimentação dos motores para

// quando o sensor de toque é pressionado

task main()

{

SetSensor(IN_1, SENSOR_TOUCH);

Programando Robôs Lego NXT usando NXC

SetSensor(IN_1, SENSOR_TOUCH);

OnFwd(OUT_AC, 75);

until (SENSOR_1 == 1);

Off(OUT_AC);

}

Linguagem NXC

//Exemplo: sensor de toque utilizado como um para-choquetask main(){

SetSensorTouch(IN_1);OnFwd(OUT_AC, 75);while (true){

Programando Robôs Lego NXT usando NXC

{if (SENSOR_1 == 1){

OnRev(OUT_AC, 75); Wait(300);OnFwd(OUT_A, 75); Wait(300);OnFwd(OUT_AC, 75);

}}

}

Linguagem NXC

Além do sensor de toque, você também recebe um sensorde luz, um sensor de som e um sensor digital ultrassônico como sistema Mindstorms NXT (em sua primeira versão).

Os sensores que acompanham o kit NXT 2.0 são: o de toque(duas unidades), o de ultrassom e o de cor/luz .

Programando Robôs Lego NXT usando NXC

Sensor de luzO sensor de luz pode ser acionado para emitir luz ou não,

então você pode mensurar a quantidade de luz refletida ou deluz ambiente em uma direção particular.

Medir a luz refletida é particularmente útil quando, porexemplo, se deseja fazer o robô seguir uma linha no chão.

Linguagem NXC

Isso é o que vamos fazer no próximoexemplo, onde conectaremos o sensor de luz àentrada 3.

Para usar o sensor de cor (presente no kit NXT2.0) no lugar do sensor de luz, use a opção:

Programando Robôs Lego NXT usando NXC

2.0) no lugar do sensor de luz, use a opção:

SetSensor(IN_3, SENSOR_COLORRED);

Mais informações em:

http://bricxcc.sourceforge.net/nbc/nxcdoc/nxcapi/group___sensor_type_modes.html

Linguagem NXC#define THRESHOLD 40task main(){

SetSensorLight(IN_3); //ou SetSensor(IN_3, SENSOR_COLORRED);OnFwd(OUT_AC, 75);while (true){

if (Sensor(IN_3) > THRESHOLD)

Programando Robôs Lego NXT usando NXC

if (Sensor(IN_3) > THRESHOLD){

OnRev(OUT_C, 75);Wait(100);until(Sensor(IN_3) <= THRESHOLD);OnFwd(OUT_AC, 75);

}}

}

Linguagem NXC

O exemplo anterior representa uma implementaçãobem simples de um robô seguidor de linha.

Para um robô com a configuração abaixo:

Programando Robôs Lego NXT usando NXC

Onde consideraremos que o motor ligado na saída Cmove a esteira mais abaixo na imagem.

Neste caso, o programa apresentado serve apenaspara seguir trilhas no sentido horário.

Linguagem NXCNo exemplo anterior utilizamos o sensor para emitir

luz e verificar a intensidade da luz refletida.

Para ler a intensidade da luz ambiente com o LEDdesligado, configure o sensor da seguinte forma:

Para o sensor de cor (kit NXT 2.0)

SetSensorType(IN_3, IN_TYPE_COLORNONE);

Programando Robôs Lego NXT usando NXC

SetSensorType(IN_3, IN_TYPE_COLORNONE);

SetSensorMode(IN_3, IN_MODE_PCTFULLSCALE);

ResetSensor(IN_3);

Para o sensor de luz (kit NXT 1.0)

SetSensorType(IN_3, IN_TYPE_LIGHT_INACTIVE);

SetSensorMode(IN_3, IN_MODE_PCTFULLSCALE);

ResetSensor(IN_3);

Linguagem NXCSensor de som (não disponível na versão 2.0 do NXT)

Usando o sensor de som você pode transformar seuconjunto NXT em um dispositivo ativado por som.

Exemplo:#define THRESHOLD 40#define MIC SENSOR_2task main() {

OBS.1: Note que o SENSOR_2 não é apenas um nome, mas um macro que retorna o valor do som

Programando Robôs Lego NXT usando NXC

task main() {SetSensorSound(IN_2);while(true){

until(MIC > THRESHOLD);OnFwd(OUT_AC, 75);Wait(300);until(MIC > THRESHOLD);Off(OUT_AC);Wait(300);

}}

que retorna o valor do som lido pelo sensor.

OBS.2: Os sensores de luz e de som retornam uma leitura de 0 a 100.

Linguagem NXC

Sensor Ultrassônico

O sensor ultrassônico funciona como um sonar:falando grosseiramente, ele envia uma rajada de ondasultrassônicas e mede o tempo necessário para que asondas sejam refletidas de volta pelo objeto em vista.

Programando Robôs Lego NXT usando NXC

ondas sejam refletidas de volta pelo objeto em vista.

Com esse novo sensor você pode fazer um robôenxergar e evitar um obstáculo antes denecessariamente atingi-lo (como no caso de um sensorde toque).

Linguagem NXC//Exemplo da utilização do sonar#define NEAR 15 //cmtask main(){

SetSensorLowspeed(IN_4);while(true){

OnFwd(OUT_AC,50);

Programando Robôs Lego NXT usando NXC

OnFwd(OUT_AC,50);while(SensorUS(IN_4)>NEAR); //ou untilOff(OUT_AC);OnRev(OUT_C,100);Wait(800);

}}

Linguagem NXC

Mais sobre motores

Existe um número de comandos adicionais paramotor que podem ser usados para controlar osmotores mais precisamente.

Programando Robôs Lego NXT usando NXC

motores mais precisamente.

Linguagem NXC

• Parando suavemente

Quando você usa o comando Off(), o servo-motorpara imediatamente, freando o eixo e mantendo aposição.

Programando Robôs Lego NXT usando NXC

Também é possível parar os motores de um modomais suave, não usando os freios.

Para isso usa-se o comando Float() ou Coast() (não hádistinção), que simplesmente corta a força do motor.

Linguagem NXC

task main() //exemplo

{

OnFwd(OUT_AC, 75);

Wait(500);

Off(OUT_AC);

Programando Robôs Lego NXT usando NXC

Off(OUT_AC);

Wait(1000);

OnFwd(OUT_AC, 75);

Wait(500);

Float(OUT_AC);

}

Linguagem NXC

• Comandos avançados

Os comandos OnFwd() e OnRev()são as mais simplesrotinas para se mover motores.

Os servo-motores do NXT possuem um codificador

Programando Robôs Lego NXT usando NXC

Os servo-motores do NXT possuem um codificadorinterno (encoder) que permite que você controleprecisamente a posição do eixo e sua velocidade.

O Firmware do NXT implementa um controlador PIDem malha fechada para controlar a posição dosmotores e suas velocidades usando a informação dosencoders como realimentação (feedback).

Linguagem NXC

• Comandos avançados

Por exemplo, se você quer que seu robô se movaperfeitamente em linha reta, você pode usar umrecurso de sincronização que faz com que doismotores selecionados rodem juntos e esperem um pelo

Programando Robôs Lego NXT usando NXC

motores selecionados rodem juntos e esperem um pelooutro caso um deles fique lento ou bloqueado

Existem muitos comandos para liberar todo opotencial dos servo-motores, mas isto será assunto deum outro encontro...

Bibliografiahttp://pt.wikipedia.org/wiki/LEGO_Mindstorms_NXT, link visitado em 08 denovembro de 2014.

http://bricxcc.sourceforge.net/, link visitado em 08 de novembro de 2014.

Apostila Programming LEGO NXT Robots using NXC (beta 30 or higher)Autor: Danielle BenedettelliRevisão: John Hansen

Programando Robôs Lego NXT usando NXC

Revisão: John HansenVersão 2.2, 7 de junho de 2007.

Tradução: Rafael BermudesRevisão: Felipe Nascimento MartinsNER@ – Núcleo de Estudos em Robótica e Automação –http://nera.sr.ifes.edu.brIFES – Instituto Federal de Educação, Ciência e Tecnologia do Espírito SantoEdição: Janeiro de 2012.

ExemplosExemplos

Prof. Max Santana Rolemberg Farias