PASSO A PASSO A TAMPA DO COMANDO À DISTÂNCIA COMPONENTES 1. 2. Com este fascículo também são entregues algumas das peças necessárias para completar o comando à distância universal. Neste caso são dois parafusos e a tampa da carcaça. Continuando com as peças que compõem o comando à distância universal, agora entregam-se a tampa da caixa. Este elemento, de cor preta, protegerá as peças do interior do comando, concretamente o emissor e o receptor, de pancadas e do pó. Embora pareça opaca, a tampa permite a passagem dos raios infravermelhos. Assim, o funcionamento do comando não é influenciado pela presença deste elemento protector. Por esta razão, a tampa é parecida, em termos de função e constituição, com as peças análogas utilizadas nas portas de comunicação por infravermelhos para PC e telemóveis ou nos comandos à distância normais. Para evitar danificar a sua superfície é aconselhável manter a tampa no invólucro de plástico até que chegue a altura de montar o comando à distância. O mesmo conselho aplica-se ao resto das peças entregues até agora, incluindo os dois parafusos de 2,3 x 6 mm que completam o conjunto de elementos incluídos neste fascículo. Estes parafusos, em concreto, vão servir para fixar a placa de controlo do comando à distância à caixa que lhe serve de carcaça. BRAÇOS E MÃO, 19 1. 2 parafusos de 2,3 x 6 mm 2. Tampa da caixa Peças do comando à distância (à excepção da placa de controlo e da tampa). Primeira parte da caixa (à direita com as outras peças do fascículo 84); a segunda metade da caixa (à esquerda, fascículo 85); o cabo do tipo mini-usb (em cima, à esquerda, fascículo 87); o circuito (em cima, fascículo 88). 1371
PASSO A PASS0 DUPLICAR EM C-LIKE O COMPORTAMENTO VISÃO PROGRAMAÇÃO Alguns comportamentos pré-definidos que podem ser activados em O SEU ROBOT são facilmente reproduzíveis utilizando a linguagem de programação C-like. Com o código que apresentamos neste exemplo criaremos um clone do comportamento Visão introduzindo uma variante interessante. No seguinte exemplo em C-like vemos como implementar um programa clone do comportamento Visão, um dos pré-definidos em O SEU ROBOT. Recordemos que este último se encarrega de fazer com que o robot siga com a cabeça os movimentos de um objecto de uma cor determinada, detectado graças à câmara CMOS da cabeça do robot. O reconhecimento dos objectos produz-se processando as imagens captadas pelo sensor. Os píxeis que têm uma cor semelhante à indicada como «target» reagrupam-se para localizar áreas contíguas que correspondam aos objectos identificados. No comportamento pré-definido, a referida cor está configurada em tonalidades semelhantes às da pele de uma pessoa e não se pode modificar. Neste exemplo, no entanto, acrescentámos a possibilidade de personalizar a nosso gosto a cor dos objectos que o O SEU ROBOT segue. Concretamente, podem-se estabelecer, no código C-like do programa, duas cores distintas. Para passar de uma cor para outra basta dar as ordens orais «um» e «dois». Com a ordem «zero» fecha-se a aplicação. CONFIGURAÇÃO DAS CORES Para fazer com que O SEU ROBOT reconheça adequadamente as cores que queremos configurar é preciso defini-las com alguma precisão. A câmara CMOS não percebe as cores da mesma maneira que o sistema de visão humano. Aquilo que para a nossa vista é um amarelo forte, poderá ser captado pela câmara como um amarelo menos saturado. Calibrar as cores é uma operação bastante simples. Em primeiro lugar, temos que arranjar dois pedaços de cartão de duas cores diferentes e que meçam, aproximadamente, 15 x 15 centímetros. Cada um dos recortes será o objectivo que seguirá O SEU ROBOT quando receber, respectivamente, as ordens orais Imagem de um pedaço de cartão de cor captada por O SEU ROBOT e analisada com um programa de tratamento de imagem para se obterem as três componentes de cor (vermelho, verde e azul). «um» e «dois». Depois, indica-se ao robot que tire uma fotografia a cada um dos pedaços de cartão. Para se obter a cor captada pela câmara CMOS é necessário abrir as imagens com um programa de tratamento de imagem (como o Photoshop ou o GIMP, que pode ser descarregado gratuitamente de www.gimp.org) e utilizar a ferramenta «conta-gotas» para se ter a referência exacta da cor nas imagens, na RGB (vermelho, verde e azul). Para cada um dos três canais de cor é fornecido um valor situado entre 0 e 255. Anotam-se os três valores obtidos para cada um dos dois cartões pois vão servir de referência para configurar as cores do «target» no código C-like do programa. O CÓDIGO DO PROGRAMA Analisamos agora o código do programa. Depois da ação dos arquivos da biblioteca robot.h e c-like.h, necessários para o funcionamento da aplicação, aparecem as duas variáveis X e Y, dedicadas à memorização do ponto central do objecto identificado por O SEU ROBOT. 1372
DUPLICAR EM C-LIKE O COMPORTAMENTO VISÃO EXEMPLOS DE PROGRAMAÇÃO Código C-like do programa clone de Visão, descrito nestas páginas. O código terá que ser memorizado num arquivo denominado vision.clike, carregado no robot e compilado utilizando o software Visual C-like Editor. Além do comportamento principal (Main) há outros dois comportamentos, SegueCor e OrdensOrais. Lembramos que é preciso personalizar o código do programa introduzindo o correspondente trio de valores (RGB) nas instruções set_tracking_color. CÓDIGO C-LIKE DO PROGRAMA #include «c-like.h» #include «robot.h» int X = 0; int e = 0; declare( behavior(ordensorais) ); declare( behavior(seguecor) ); void OrdemZero(); void OrdemUm(); void OrdemDois(); define( behavior(main)) set_tracking_color(-,-,-,40); //Substituir os sublinhados pelo trio de valores RGB led_on(led_red); start(ordensorais); start(seguecor); // Main define( behavior(ordensorais) ) local(voice_cmd) = wait_for (voice_cmd, update); switch (local(voice_cmd)) case CMD_ZERO: OrdemZero(); break; case CMD_ONE: OrdemUm(); break; case CMD_TWO: OrdemDois(); break; // OrdensOrais define( behavior(seguecor) ) local(vision) = wait_for (vision, update); X = local(vision).x; Y = local(vision).y; lcd_clear(); lcd_write_int(1,1,x); lcd_write_int(2,1,y); if (X > 35) head_pan_r(1); else if (X < -35) head_pan_r(-1); if (Y > 20) head_tilt_r(1); else if (Y < -20) head_tilt_r(-1); // SegueCor void OrdemZero() end(); void OrdemUm() set_tracking_color(-,-,-,40); // Substituir os guiões pelos valores RGB led_on(led_red); void OrdemDois() set_tracking_color(-,-,-,40); // Substituir os guiões pelos valores RGB led_on(led_yellow); Além do comportamento Main existem outros dois: OrdensOrais e SegueCor. O primeiro ocupa-se de mudar a cor objectivo, consoante a ordem oral («um» ou «dois») ou de encerrar o programa (ordem «zero»). Além disso, configuram-se duas cores diferentes para os led dos olhos, com base na ordem recebida. O segundo comportamento configura o coração do programa. Com base no ponto central do objecto identificado pelo robot, a cabeça desloca-se para manter o enquadramento «centrado». No seu código terás que o guardar num arquivo chamado vision.clike; lembre-se de substituir os primeiros parâmetros (relativos à cor) nas instruções set_tracking_color de acordo com as suas medições. O último parâmetro (o limite) terá que ficar configurado num valor equivalente a 40. As coordenadas do ponto central são mostradas no display do robot, através das instruções lcd_write. Main inicializa a cor objectivo por defeito (escolhendo uma cor entre as medidas experimentalmente) e acciona os outros comportamentos do programa. 1373
PASSO A PASSO UM MONITOR PARA A TEMPERATURA PROGRAMAÇÃO Nos exemplos de Java dos fascículos anteriores vimos que é possível, e relativamente simples, aceder aos registos de O SEU ROBOT para ler o valor medido por um dos seus sensores. No novo programa que propomos nestas páginas vamos criar um interface para monitorizar a temperatura ambiente. Com o programa Java de exemplo que aqui apresentamos poderá confirmar como é fácil criar um interface gráfico para monitorizar a temperatura que O SEU ROBOT mede. Desta medição encarrega-se um sensor colocado na frente do robot e controlado, tal como já referimos noutras ocasiões, pela placa electrónica Braços. O interface é bastante simples. Na parte esquerda aparece uma casa de texto que mostra a temperatura medida, ao passo que à direita há um botão que, quando carregado, faz com que o robot pronuncie a referida temperatura. A casa de texto mostra duas cores diferentes consoante o valor medido: verde quando é inferior a 30 graus centígrados e vermelho quando é igual ou superior a este valor. Em cima, o painel para monitorizar a temperatura, enquanto se mede um valor inferior a 30 graus centígrados. Em baixo, o mesmo display quando o sensor mede uma temperatura superior a 30 graus. TEMPERATUREMONITOR Esta aplicação é constituída por uma única classe: TemperatureMonitor. Esta tanto implementa os métodos para a gestão do interface gráfico como para o acesso aos registos do robot. Dado que o programa é composto apenas por uma classe, só é preciso introduzir o código completo num único arquivo chamado TemperatureMonitor.java. Para a compilação e a execução deste programa pode Screenshot dos comandos correspondentes ao início do programa TemperatureMonitor. Indica-se como parâmetro de início a cadeia COM3, que indica a porta de série virtual utilizada neste caso para estabelecer a ligação Bluetooth entre o robot e o PC. aplicar-se aquilo que já vimos em fascículos anteriores. Na primeira parte do código Java encontram-se as declarações do pacote e de ação das classes auxiliares necessárias ao funcionamento do programa. Além das classes para a gestão dos elementos gráficos encontram-se também as que permitem a comunicação com o robot e o acesso aos seus registos. Aqui intervêm os pacotes correspondentes às placas electrónicas Braços e Voz. O sensor de temperatura é controlado pelo primeiro destes dois módulos, ao passo que o segundo é necessário para que o robot possa anunciar a temperatura média. A classe TemperatureMonitor extende JFrame, cuja função é a realização da janela gráfica da aplicação. Como se podem confirmar pelos screenshots que ilustram estas páginas, o interface do programa é minimalista. Como já foi referido, existe uma casa de texto para a visualização da temperatura e um botão para activar a pronúncia desta última por parte do 1374
86-paso a paso (3) 10/24/08 12:17 AM Page 1359 UM MONITOR PARA A TEMPERATURA EXEMPLOS DE PROGRAMAÇÃO Exemplos de código Java para a implementação de uma classe para a realização de um interface gráfico para a monitorização da temperatura ambiente, medida pelo correspondente sensor electrónico montado na frente de O SEU ROBOT. public static void main [...] public TemperatureMonitor() [...] private class RefreshDisplay implements Runnable CLASSE TEMPERATUREMONITOR package communication.examples; communication.handler.protocolhandler; communication.handler.internal.internalhandler; communication.transport.connectionprovider; communication.handler.internal.internalmodule; communication.handler.internal.voiceregister; communication.handler.internal.armsregister; java.io.ioexception; javax.swing.*; java.awt.*; java.awt.event.*; public class TemperatureMonitor extends JFrame private static String portname; private ProtocolHandler protocol; private InternalHandler internal; private JPanel panel; private JLabel temp; private JButton speak; Thread t; boolean active = false; robot. O método main cria uma instância de TemperatureMonitor, invocando o construtor. Antes de fazer isso, main confirma se foi indicada pelo utilizador, no início do programa, a porta de série virtual para comunicar com o robot. Vejamos agora como se estrutura o código do construtor. Em primeiro lugar, associa-se ao evento «fecho da janela» o encerramento do programa. Depois chamam-se e colocam-se no painel da aplicação os diferentes elementos gráficos. Para a sua disposição utiliza-se um «layout total» que estabelece a posição exacta de cada objecto gráfico mediante as chamadas aos métodos setbounds. Os dois primeiros parâmetros indicam as coordenadas (X e Y) nas quais ficará colocado o elemento, ao passo que a terceira e a quarta determinam a sua dimensão (largura e altura). Todos os parâmetros são expressos em píxeis. Quando se carrega no botão speak lança-se a invocação do método saytemperature. Finalmente int x = 0; public void run() while(active) x = checktemperature(); if (x < 30) temp.setbackground(color.green); temp.settext(«temperatura: «+ Integer.toString(x) + «C»); else temp.setbackground(color.red); temp.settext(«temperatura: «+ Integer.toString(x) + «C»); try Thread.sleep(2000); catch (Exception e) // class RefreshDisplay private void saytemperature() [...] private boolean conectar() [...] private void desconectar() [...] // class TemperatureMonitor activa-se a ligação com o robot e executa-se o fio t de tipo RefreshDisplay. Analisando este último, o método run é formado por um ciclo while, executado repetidamente até que o valor da variável booleana active se estabelece em «true» (verdadeiro). Com uma cadência de dois segundos, estabelecida mediante a instrução Thread.sleep(2000), mede-se a temperatura ambiente com o sensor. Por isso recorre-se a outro método, checktemperature (do qual falaremos mais adiante). Uma vez memorizado o valor da temperatura na correspondente variável X, configura-se a cor de fundo da casa de visualização: verde se X é inferior a 30 e vermelho no caso contrário. Ocupemo-nos agora do método checktemperature. Como já foi referido, este último realiza uma leitura no registo de O SEU ROBOT correspondente ao controlo do gestor de temperatura. Na eventualidade de se detectarem erros durante 1375
PASSO A PASSO EXEMPLOS DE PROGRAMAÇÃO Código Java dos métodos da classe TemperatureMonitor. Aparecem em primeiro lugar o método principal e o construtor. Este último também se ocupa da visualização do interface gráfico no monitor do PC e de executar a ligação com o robot, invocando o método ligar. Depois indicam-se outros dois métodos, o primeiro especial para a leitura da temperatura que o sensor mede (checktemperature) e o segundo para o anúncio da referida temperatura por parte de O SEU ROBOT mediante o módulo Voz (saytemperature). Os métodos ligar e desligar permitem, como de costume, activar e desactivar a ligação entre o robot e o PC através da ligação Bluetooth. Para o código destes últimos podem-se consultar as páginas 1229 e 1230 desta colecção. MÉTODOS DA CLASSE TEMPERATUREMONITOR public static void main(string[] args) if (args.length < 1) System.err.println(«Determina a porta a utilizar para a ligação (ex. COM5)»); return; portname = args[0]; TemperatureMonitor gui = new TemperatureMonitor(); // main public TemperatureMonitor() super(«temperaturemonitor»); addwindowlistener( new WindowAdapter() public void windowclosing(windowevent e) active = false; desconectar(); System.exit(0); ); setbounds(0,0,240,95); panel = new JPanel(); panel.setlayout(null); temp = new JLabel(«Temperatura: «+ «C»); temp.setbounds(10,10,120,40); temp.setopaque(true); speak = new JButton(«Voz»); speak.setbounds(140,10,80,40); speak.setfocusable(false); speak.addactionlistener( new ActionListener() public void actionperformed(actionevent e) saytemperature(); ); panel.add(temp); panel.add(speak); getcontentpane().add(panel); if (!conectar()) System.exit(0); t = new Thread(new RefreshDisplay()); active = true; t.start(); setvisible(true); // class constructor private int checktemperature() int[] buf = new int[1]; try internal.readregister(internalmodule.arms, ArmsRegister.TEMPERATURE, buf); return buf[0]; catch (Exception e) e.printstacktrace(); return -1; // checktemperature private void saytemperature() int[] buf = new int[1]; try internal.readregister(internalmodule.arms, ArmsRegister.TEMPERATURE, buf); internal.writeregister(internalmodule.voice, VoiceRegister.TEMPERATURE, buf); System.out.println(«Speak!»); catch (Exception e) e.printstacktrace(); // saytemperature o acesso aos registos do robot, restitui-se o valor -1 para indicar a citada anomalia. O terceiro a começar pelo fim, saytemperature, lê o registo associado ao sensor de temperatura e activa o anúncio por parte de O SEU ROBOT do valor medido. Para isto é suficiente escrever essa quantidade num registo especial do módulo Voz, concretamente em VoiceRegister.TEMPERATURE. Os dois últimos métodos incluídos na classe TemperatureMonitor são os habituais ligar e desligar, que activam e desactivam respectivamente a ligação Bluetooth entre o robot e o PC. O código destes últimos métodos é idêntico ao explicado no fascículo 77 (e que já utilizámos em diferentes programas Java). Quando se testa este programa é imprescindível não submeter o sensor a temperaturas demasiado elevadas, pois isto poderia deteriorá-lo e danificar outros circuitos ou a estrutura do robot. 1376