Você está na página 1de 12

E-puck Tutorial

Renato Florentino Garcia


Laboratrio de Viso Computacional e Robtica - VeRLab Universidade Federal de Minas Gerais - UFMG

20 de setembro de 2008

Sumrio
1 2 3 4 5 Introduo O rob Compilando um programa Carregando um programa compilado no e-Puck O hardware e a biblioteca do projeto e-puck
5.1 5.2 5.3 5.4 5.5 Motores LEDs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 3 4 5 5
6 6 6 7 7

Chave seletora

Portas seriais e bluetooth

Sensor infravermelho de proximidade . . . . . . . . . . . . . . . .

6 7

Comunicao computador/e-puck Player


7.1 7.2 Compilando e instalando o driver . . . . . . . . . . . . . . . . . . Usando o driver . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7 8
9 9

A Apndices
A.1 A.2 Leds.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Leituras dos sensores infravermelhos

10
10 11

Figura 1: E-puck e indicao de alguns componentes.

Introduo

O objetivo deste tutorial explicar como utilizar e criar programas para um rob e-puck usando a biblioteca de software padro do projeto, e como a partir dos fontes do driver para o Player compil-lo e us-lo. Para programar um e-puck necessrio ter um computador equipado com algum dispositivo bluetooth, pois os programas desenvolvidos sero enviados ao rob utilizando-se o bluetooth. Nos exemplos mostrados os comandos que devem ser feitos do lado do computador so para o ambiente Linux, caso se esteja utilizando o Windows existe um outro tutorial que se encontra disponvel tanto no site ocial do projeto e-puck [2] quanto no site do VeRLab [5]. Neste tutorial, escrito por Francesco Mondada e Michael Bonani, da Ecole Polytechnique Fdrale de Lausanne (EPFL), est explicado como o mesmo resultado do ser obtido no Windows. A distribuio Linux usada na construo dos exemplos foi a Ubuntu 8.04, mas o mesmo procedimento poder ser feito em outras distribuies com pouca ou nenhuma alterao.

O rob

O e-puck(gura 1) um rob diferencial de pequeno porte que possui vrios sensores e atuadores. Alguns de seus componentes so: uma cmera com resoluo de 640x480, oito sensores infra-vermelho, dez LEDs, trs microfones, um autofalante, um acelermetro 3D, dois motores de passo, e duas portas seriais, sendo que uma delas est ligada a um dispositivo bluetooth. Ele embarcado com um dsPIC modelo 30F6014A, que programvel por meio da interface bluetooth. Cada e-puck possui um nmero de identicao de quatro dgitos. Este nmero nico, e geralmente pode ser lido em um papel adesivo que se encontra colado em algum local visvel do mesmo. Este mesmo nmero de identicao tambm encontrado no nome do dispositivo bluetooth representado pelo rob, que aparece sempre no seguinte formato: e-puck_XXXX, onde XXXX deve ser substitudo pelo prprio nmero de identicao.

O projeto e-puck aberto, tanto a especicao do hardware quanto a biblioteca de software que fornece acesso a este hardware. Todo o projeto est disponvel sob uma licena[1] que permite a qualquer pessoa montar um exemplar, modic-lo e/ou redistribu-lo. No site do projeto[2] esto disponveis para download os esquemticos para a montagem do hardware, a biblioteca ocial, e alguns outros tutoriais e exemplos.

Compilando um programa

Os programas feitos para um e-puck podem ser escritos na linguagem C ou em assembly, porm, por causa da facilidade de se programar em C quando comparado ao assembly, alm de toda a interface da biblioteca ocial do projeto estar codicada em C, todos os exemplos e programas neste tutorial tambm sero escritos nesta linguagem. O compilador utilizado ser o MPLABC30, verso 3.01 e edio de estudante, que pode ser obtido gratuitamente no site da Microship[3]. Apesar de ser nativo para Windows esse compilador funciona muito bem no Linux se executado pelo Wine. No site ocial do projeto e-puck[2] possvel fazer o download de uma cpia da biblioteca ocial do projeto, juntamente com alguns programas teis para o desenvolvimento na plataforma. Quando este tutorial estava sendo feito a verso mais atual datava de 29/02/08, e por ser mais prtico foi escolhida a opo que continha os fontes e os binrios j compilados da mesma. Para facilitar o processo de compilao e integrar o MPLABC30 ao make, foram criados dois scripts: compile.py e linker.py, ambos podem ser encontrados no site do VeRLab[5]. Antes de compilar algum programa pela primeira vez, deve ser congurado o script linker.py. varivel MPLAB_C30_PATH deve ser atribudo o caminho absoluto da pasta onde o MPLABC30 foi instalado. Da mesma forma, varivel STD_LIB_DIR dever ser atribudo o caminho absoluto da pasta onde se encontram os arquivos compilados da biblioteca ocial do projeto e-puck. Os fontes do projeto a ser compilado podem estar em um nico diretrio base ou distribudos em subdiretrios. Seja qual for a congurao, para compilCaso lo o script compile.py dever ser executado a partir do diretrio base. subdiretrio deve ser dado como argumento para o compile.py. Onde houver arquivos fontes a serem compilados, tanto no diretrio base quando nos subdiretrios, dever haver tambm um Makele indicando como compilar estes arquivos. Alm do Makele, dever existir um arquivo Linkle listando as libs da biblioteca padro do e-puck que devero ser utilizadas. Por exemplo, se o projeto utiliza alguma funo para acender os LEDs, a libmotor_LED.a dever ser ligada aos arquivos objeto obtidos na compilao. Para que isso seja feito, em uma linha do arquivo Linkle dever estar escrito motor_LED. No site do VeRLab [5] se encontra um projeto com todos estes arquivos para exemplicar o processo de compilao. Dentre eles est o fonte leds.c que o programa que ser compilado como exemplo, ele tambm est listado no apndice A.1. O nome do arquivo com o projeto projetoExemplo.tar.gz, e aps ser descompactado, no diretrio base estaro os scripts compile.py e linker.py,

os arquivos dentro de algum subdiretrio devam ser compilados, o nome deste

alm da pasta chamada leds. executar o comando:

Para compil-lo, aps atribuir o valor correto

s variveis MPLAB_C30_PATH e STD_LIB_DIR do script linker.py, basta

$ ./compile.py leds
Como resultado da compilao devero ter sido criados trs arquivos no diretrio base: output.cof, output.hex e proj.map.

Carregando um programa compilado no e-Puck

Uma vez que o projeto tenha sido compilado, o resultado obtido ser um arquivo .hex, que dever ser carregado na memria do e-puck. Uma informao que ser necessria o numero de identicao do e-puck, que tambm ser descrito como pode ser obtido. O programa utilizado para copiar o arquivo .hex para a memria do e-puck ser o epuckuploadbt, cujo cdigo fonte distribudo junto da biblioteca ocial do projeto. Caso o nmero de identicao do e-puck no esteja colado no mesmo, podese descobri-lo entrando com o seguinte comando em um terminal:

$ hcitool scan
Se houver algum e-puck ligado e ao alcance do sinal bluetooth do computador, a sada dever ser parecida com a seguinte:

Scanning ... 10:00:E8:52:A9:69

e-puck_1107

Neste caso o nome do e-puck e-puck_1107, donde se tira que o nmero de identicao nico do mesmo 1107. Para carregar o arquivo .hex, neste exemplo com o nome output.hex, o epuckuploadbt dever ser executado tendo como argumento o arquivo a ser carregado e o nmero do e-puck. Com o nome do arquivo .hex e o nmero do e-puck dados acima, o comando seria:

$ epuckuploadbt output.hex 1107


O programa pedir que se resete o rob, o que feito apertando-se o boto que se encontra na parte superior de mesmo, e que pode visto prximo ao nmero 3 na gura 1.

O hardware e a biblioteca do projeto e-puck

Todo o acesso ao hardware do e-puck pode ser feito atravs da biblioteca ocial do projeto, utilizando os cabealhos C e as libs compiladas. A documentao da biblioteca ocial pode ser gerada a partir dos comentrios nos fontes usando o programa doxygen, ou pode ser obtida em formato html do site do VeRLab[5]. Todo programa feito para um e-puck deve ter uma funo main, que de onde o cdigo comear a ser executado. Porm, como o programa ser o nico na memria do rob, assim que a funo main terminar ela ser novamente chamada, e assim indenidamente.

Quando se carrega um programa na memria do e-puck preciso que ele seja resetado no processo, porm, de acordo com o cdigo que estiver sendo executado no momento o reset pode falhar, e ter que ser repetido at que funcione. Isto no acarreta maiores problemas, mas um pouco inconveniente. Uma soluo encontrada foi colocar um loop innito antes do m da funo main, como pode ser visto no cdigo fonte mostrado no apndice A.1, uma vez estando dentro do loop o reset funcionar sem problemas. Para o caso de programas mais complexos, onde no se alcanar o m da funo main, logo no inicio do programa pode ser colocada uma condio que entrar em um loop innito para uma dada posio da chave seletora. Como trabalhar com a chave seletora explicado na subseo 5.3.

5.1

Motores

Um e-puck equipado com um motor de passo para cada uma de suas duas rodas. O cabealho da biblioteca ocial que descreve o acesso a esses motores o e_motors.h, e existem trs cabealhos diferentes, em cada um deles os motores sero controlados pelos timers do dsPIC de forma diferente. Os motores funcionam com vinte passos por revoluo, e so ligados s rodas por uma reduo

50 : 1,

portanto, a cada

1000 passos do motor as rodas descre-

vem um giro completo. As velocidades dos motores so atribudas pelas funes e_set_speed_left e e_set_speed_right, cujo argumento diz a quantos passos por segundo os motores devem girar. A velocidade mxima dos motores de

1000

passos por segundo, o que equivale uma velocidade angular de

2rad/s

nas rodas. As funes e_get_steps_left e e_get_steps_right retornam a quantidade de passos que j foi dada por cada motor. J as funes e_set_steps_left e Isso e_set_steps_right atribuem um valor quantidade de passos j dados. pode ser til para implementar um sistema de hodometria por exemplo.

5.2

LEDs

Os e-pucks possuem oito LEDs distribudos radialmente (um deles pode ser visto junto ao nmero 5 na gura 1), um na base, e outro na frente. Eles so teis para serem usados no processo de debug, ou como indicadores de algum estado interno. Os LEDs so acessados pelo cabealho e_led.h, e so ligados pela mesma lib usada pelos motores.

5.3

Chave seletora

Outro dispositivo presente nos e-pucks uma chave seletora de 16 estados, item prximo ao nmero 2 na gura 1. O estado da chave fornece uma ag que pode ser usado para qualquer propsito dentro de algum programa. Para obter um inteiro representando a atual posio basta calcular a seguinte equao:

SELECT OR0 + 2 SELECT OR1 + 4 SELECT OR2 + 8 SELECT OR3.


Onde SELECTOR0, SELECTOR1, SELECTOR2 e SELECTOR3, so macros denidas no cabealho e_epuck_ports.h.

5.4

Portas seriais e bluetooth


Estas

H em cada e-puck duas interfaces seriais UART, UART1 e UART2. interfaces podem ser acessadas usando o cabealho e_uart_char.h.

A interface UART1 est ligada ao dispositivo bluetooth, porm no existe nenhuma diferena no cdigo que deve ser feito para acess-la quando comparada com a UART2. Caso se use a UART1 em conjunto com o bluetooth, o computador com o qual se comunica dever estar tambm equipado com um dispositivo bluetooth, e do seu ponto de vista os dados transmitidos podem ser tratados como aqueles provenientes de uma conexo serial RS-232 usando os. J a UART2 est ligada a um conector que se encontra na parte superior do e-puck, que pode ser visto junto ao nmero 1 na gura 1, e necessrio usar os como o meio fsico para o transporte dos dados.

5.5

Sensor infravermelho de proximidade

Esto distribudos ao longo do permetro do corpo dos e-pucks oito sensores infravermelhos para detectar algum objeto que esteja prximo, um deles pode ser visto junto ao nmero 4 na gura 1. O cabealho da biblioteca ocial que os descreve o e_prox.h. A qualidade do sensor infravermelho no boa, olhando um nico sensor h uma grande variao quando o e-puck se inclina para trs e para frente durante o deslocamento; e quando se compara os vrios sensores entre si, novamente h uma grande variao entre os valores lidos para uma mesma distncia. Alm do mais, para distncias maiores que

3cm

a diferena entre as leituras dadas

pelos sensores em funo da distncia muito pequena, sendo difcil fazer uma estimativa convel. Na seo A.2 esto alguns grcos mostrando estes valores.

Comunicao computador/e-puck

A forma mais prtica de comunicao entre os e-pucks e um computador atravs dos mdulos UART. Cada e-puck possui dois controladores UART, UART1 e UART2, sendo que o UART1 est conectado ao mdulo bluetooth. Do lado do computador, possvel associar os dados recebidos pelo mdulo bluetooth uma interface serial, e desta forma cria-se um canal de comunicao sem os entre um e-puck e um computador. Uma segunda possibilidade usar a UART2, que acessvel via um conector que utiliza o padro RS-232, esse conector pode ser visto na indicao de nmero 1 da gura 1. Esta segunda opo exige o uso de os como meio fsico para a transmisso dos dados. Pela inconvenincia de se ter que lidar com os conectando o e-puck ao computador, ser utilizado o UART1 juntamente com o mdulo bluetooth para que a comunicao possa ser feita sem os. Do lado do e-puck, o envio e recebimento de mensagens feito usando as funes denidas no cabealho e_uart_char.h, pertencente biblioteca ocial do projeto. No programa feito para o e-puck no existir nenhuma diferena entre uma comunicao serial com ou sem os. Do lado do computador, necessrio associar o bluetooth a um dispositivo serial, e toda a comunicao ser feita como se houvesse uma ligao serial comum por meio de os. O primeiro passo a ser feito descobrir o endereo bluetooth do e-puck que se quer trabalhar. Com um terminal aberto, entra-se com o seguinte comando:

$ hcitool scan
Se houver algum e-puck ligado e ao alcance do sinal bluetooth do computador, a sada dever ser parecida com a seguinte:

Scanning ... 10:00:E8:52:A9:69

e-puck_1107
Outra informao

Neste caso especco o endereo 10:00:E8:52:A9:69. identicao nico do mesmo 1107.

disponvel o nome do e-puck: e-puck_1107, donde se tira que o nmero de Uma vez tendo-se o endereo, chama-se o programa rfcomm, que emular uma porta serial RS-232 no computador. A sintaxe do comando a seguinte:

$ rfcomm connect <dev> [bdaddr] [channel]


Onde campo [bdaddr] o endereo bluetooth do e-puck, o campo <dev> especica o device no qual a porta serial ser emulada, e [channel] qual o canal rfcomm que usado pelos e-pucks. A porta serial ser mapeada em /dev/rfcommX, onde X o nmero passado em <dev>. J a opo [channel], para a comunicao com os e-pucks dever ser sempre 1, que a opo padro, e podendo portanto ser omitida. Caso se queira criar uma porta serial em /dev/rfcomm0, e que esteja ligada com o e-puck encontrado pelo comando hcitool scan feito acima, o comando seria o seguinte:

$ rfcomm connect 0 10:00:E8:52:A9:69


Neste ponto, pode-se usar o device criado como se fosse uma porta serial fsica tradicional.

Player

Uma das formas de se construir programas para controlar os e-pucks atravs da biblioteca disponvel no site ocial do projeto e-puck, como j foi visto at agora. Essa opo apresenta algumas desvantagens, entre elas esto o baixo poder de processamento de um dsPIC quando comparado a um PC, a nica linguagem de programao disponvel C, e o cdigo dos programas que forem feitos no ser portvel entre outros robs. Uma alternativa que contorna boa parte destes problemas construir o programa usando a biblioteca Player[4]. O Player implementa uma camada de abstrao entre o programa desenvolvido e o rob, e com isso a programao feita para um rob genrico, no se tem mais a preocupao em controlar uma arquitetura de hardware especca. Alm disso, ocialmente o projeto disponibiliza bibliotecas para a programao em C, C++, e Python. O Player est disponvel sob a licena GPL, e roda somente em sistemas operacionais compatveis com o padro POSIX; que inclui o Linux, mas que exclui o Windows. No existe ocialmente o driver para que um e-puck funcione com o Player, mas um est sendo desenvolvido no VeRLab[5], e pode ser usado para este propsito. Como compil-lo e us-lo ser explicado a seguir.

7.1

Compilando e instalando o driver

No site do VeRLab possvel baixar o pacote .tar.gz com o cdigo do driver. Uma vez com o pacote no computador, descompacte-o e de um terminal entre na pasta criada. Digite ento:

$ ./configure $ make
Agora a biblioteca com o driver j deve estar compilada. Para installa existem duas alternativas, a primeira fazer a instalao no sistema, e a segunda instalar a biblioteca em um diretrio local. Como se est instalando a biblioteca diretamente, sem se criar um pacote no formato ocial da distribuio Linux qualquer que se esteja usando, recomendvel instalar em um diretrio local para que seja mais simples uma possvel desinstalao. driver: Para isso basta digitar o seguinte comando, estando com o terminal ainda dentro da pasta do

$ make install DESTDIR=<caminho>


Onde <caminho> o local onde o driver ser instalado, por exemplo home do usurio.

/driverEpuck,

que indicar uma instalao em um diretrio chamado driverEpuck, dentro do

7.2

Usando o driver

O arquivo de congurao do Player que dever ser usado com o driver do e-puck dever ser parecido com o abaixo:

driver ( name "epuck" plugin "libepuck" provides ["position2d:0" "ir:0"] port "/dev/rfcomm0" )
Onde a opo port indica qual ser a porta serial em que o e-puck est conectado, e no pode ser omitida. Quando se for executar o programa Player, o local onde a biblioteca com o driver do e-puck foi instalada deve ser de conhecimento do sistema, sendo que para isso basta exportar uma varivel de ambiente com essa informao. Seguindo o exemplo mostrado na subseo 7.1, o comando seria o seguinte:

$ export LD_LIBRARY_PATH='/home/<usurio>/driverEpuck/usr/local/lib'
Onde <usurio> representa o nome da pasta pessoal do usurio em questo. Caso a biblioteca tenha sido instalada em alguma pasta que j esteja no path do sistema este ltimo passo no necessrio. Agora o Player j dever estar sendo executado, e o ambiente j est preparado para executar os programas desenvolvidos.

A
A.1

Apndices
Leds.c

include <p30f6014A.h> #include <motor_led/e_epuck_ports.h> #include <motor_led/e_init_port.h> #include <motor_led/e_led.h> #define LED_ON 1 int getselector() { return SELECTOR0 + 2*SELECTOR1 + 4*SELECTOR2 + 8*SELECTOR3; } int main() { int selector; e_init_port(); //Reset if Power on (some problem for few robots) if (RCONbits.POR) { RCONbits.POR=0; __asm__ volatile("reset"); } selector = getselector(); if(selector == 0) { e_set_led(0, LED_ON); } else { e_set_led(1, LED_ON); } while(1); return 0;

10

A.2

Leituras dos sensores infravermelhos

Mdia entre os valores mdios de cada sensor individual


3500
q

3000

Mdia da leitura do sensor

2000

2500

1500

1000

500

q q q q q q q q

Distncia do alvo (cm)

Desvio padro entre os valores mdios dos sensores individuais


1000
q

Percentagem do desvio padro no valor mdio


0.35
q

800

0.30

Desvio padro / valor mdio

q q

Desvio padro

600

0.25

q q q

0.20

400

0.15

200

q q

q q q q q q q q

0.10
q

Distncia do alvo (cm)

Distncia do alvo (cm)

11

Referncias
[1] Licena do projeto e-puck.

http://www.e-puck.org/index.php?option= com_content&task=view&id=18&Itemid=45. http://www.e-puck.org.

[2] Pgina ocial do projeto e-puck. [3] Pgina microship.

http://www.microchip.com. http://playerstage.sourceforge.net.

[4] Pgina do projeto player.

[5] Projeto e-puck player driver do verlab.

http://www.verlab.dcc.ufmg.br/ doku.php?id=projetos:epuck-player:index.

12