PASSO A PASSO
BRAÇOS E MÃO, 19
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.
C
ontinuando 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. COMPONENTES 1. 2 parafusos de 2,3 x 6 mm 2. Tampa da caixa 1. 2.
A TAMPA DO COMANDO
À DISTÂNCIA
A TAMPA DO COMANDO
À DISTÂNCIA
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).
PROGRAMAÇÃO
PASSO A PASS0
N
o 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
DUPLICAR EM C-LIKE O
COMPORTAMENTO VISÃO
DUPLICAR EM C-LIKE O
COMPORTAMENTO VISÃ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.
«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 importaçã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.
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).
DUPLICAR EM C-LIKE O COMPORTAMENTO VISÃO
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.
EXEMPLOS DE PROGRAMAÇÃO
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_off(LED_ALL); 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() { led_off(LED_ALL); end(); } void OrdemUm() {
set_tracking_color(-,-,-,40); // Substituir os guiões pelos valores RGB led_off(LED_ALL);
led_on(LED_RED); }
void OrdemDois() {
set_tracking_color(-,-,-,40); // Substituir os guiões pelos valores RGB led_off(LED_ALL);
led_on(LED_YELLOW); }
Código C-like do programa clone de VViissããoo, descrito nestas páginas. O código terá que ser memorizado num arquivo denominado vviissiioonn..cclliikkee, carregado no robot e compilado utilizando o software Visual C-like Editor. Além do comportamento principal (MMaaiinn) há outros dois
comportamentos, SSeegguueeCCoorr e OOrrddeennssOOrraaiiss. Lembramos que é preciso personalizar o código do programa introduzindo o correspondente trio de valores (RGB) nas instruções sseett__ttrraacckkiinngg__ccoolloorr.
C
om 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.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
PROGRAMAÇÃO
PASSO A PASSO
UM MONITOR PARA
A TEMPERATURA
UM MONITOR PARA
A TEMPERATURA
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.
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 importaçã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
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.
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.
UM MONITOR PARA A TEMPERATURA
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
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
CLASSE TEMPERATUREMONITOR
package communication.examples; import communication.handler.ProtocolHandler; import communication.handler.internal.InternalHandler; import communication.transport.ConnectionProvider; import communication.handler.internal.InternalModule; import communication.handler.internal.VoiceRegister; import communication.handler.internal.ArmsRegister; import java.io.IOException; import javax.swing.*; import java.awt.*; import 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;
public static void main { [...] }
public TemperatureMonitor() { [...] }
private class RefreshDisplay implements Runnable { 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
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.
PASSO A PASSO
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.
EXEMPLOS DE PROGRAMAÇÃ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
Código Java dos métodos da classe TTeemmppeerraattuurreeMMoonniittoorr. 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 (cchheecckkTTeemmppeerraattuurree) e o segundo para o anúncio da referida temperatura por parte de O SEU ROBOT mediante o módulo Voz (ssaayyTTeemmppeerraattuurree). Os métodos lliiggaarr e ddeesslliiggaarr 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.