Upload
lengoc
View
213
Download
0
Embed Size (px)
Citation preview
Treinamento
Plataforma
Radiuino
Treinamento Plataforma Radiuino
Título: Guia de Projeto com Radiuino
Autoria e Revisões
Dr. Omar Branquinho
Resumo: Este documento apresenta um guia de projeto para a plataforma Radiuino,
através de uma aplicação que mede temperatura, luminosidade, controle de um relé e
LEDs.
www.radiuino.cc 1
Sumário 1 INTRODUÇÃO 3
2 PLATAFORMA ARDUINO 4
3 DESCRIÇÃO SISTÊMICA 14
4 DK101 20
4.1 PLACA DE APLICAÇÃO 21
4.2 TRANSDUTOR DE TEMPERATURA 24
4.3 TRANSDUTOR DE LUMINOSIDADE 25
4.4 RELÉ 26
4.5 BE900 E PROGRAMADOR 28
5 PROJETO DO HARDWARE 29
6 FIRMWARE RADIUINO4APP 31
6.1 AJUSTE DE PARÂMETROS 32
6.2 ACIONAR LEDS E RELÉ 35
6.3 LEITURA DE GRANDEZAS 36
6.4 UPLOAD DO FIRMWARE 37
7 SOFTWARE 38
7.1 RADIUINO TEST 38
7.2 PYTHON 40
8 OBSERVAÇÕES FINAIS 46
REFERÊNCIAS 47
ANEXO 1 – MAPA DO PACOTE DE 52 BYTES
ANEXO 2 – CÓDIGO PYTHON
www.radiuino.cc 2
1 Introdução
Este documento apresenta passo a passo como desenvolver um projeto com a
plataforma Radiuino. O projeto é separado em fases bem definidas, que permitem tratar
de cada necessidade, saindo da aplicação desejada até o software para exibição no
computador dos resultados medidos. Para ilustrar o desenvolvimento será utilizado um
exemplo hipotético de uma aplicação que deve ter as seguintes funções como na Tabela
1.
Tabela 1
Neste será apresentado um software que mostra na tela do computador um menu
que permita medir as grandezas e controlar os dispositivos mencionados acima. Em
seguida é utilizado o ScadaBR para realizar o armazenamento dos dados e controle do
relé e do led amarelo.
O exemplo que aqui será apresentado utiliza o hardware DK101 ou DK103 (este
último possui um relé a mais). Devese lembrar que a plataforma Radiuino foi concebida
para facilitar a implementação de rede de sensores sem fio, esta surgiu da dificuldade
das plataformas existentes não permitirem de forma fácil formar este tipo de rede. Esta
plataforma Radiuino utiliza o ambiente de programação do Arduino que por sua vez
facilita em muito o desenvolvimento do firmware. Entretanto, a plataforma Radiuino
possui as suas peculiaridades e foram desenvolvidas bibliotecas específicas para sua
funcionalidade.
Para seguir uma sequência lógica este material está dividido nas seguintes partes:
Plataforma Arduino, Descrição sistêmica, Aplicação, Hardware, Firmware e Software.
www.radiuino.cc 3
2 Plataforma Arduino
A Figura 1 mostra o local correto para download do IDE Arduino/Radiuino
(disponibilizado em www.radiuino.cc).
Figura 1 download Radiuino
Clicar em downloads e baixar do source forge o IDE com o Radiuino. Importante
frisar novamente que deve ser este o IDE a ser utilizado com o Radiuino, uma vez que
todas as bibliotecas já estão preparadas. Após descompactar o IDE Arduino já está
pronto para usar. Para isto devese abrir o IDE do Arduino como mostra a Figura 2:
Figura 2 IDE Arduino
www.radiuino.cc 4
Vamos usar o exemplo de radio_sensor para o nó sensor e o radio_base para o
nó base. Neste exemplo mais simples basta acertar os parâmetros do rádio para que seja
realizada a comunicação. Devese existir agora determinados subdiretórios como mostra a Figura 3:
Figura 3 IDE Arduino – Exemplo Radiuino
A plataforma Arduino permite o desenvolvimento fácil de firmware, que pode ser
usado integralmente com o Radiuino. Vale a pena analisar este firmware para verificar a
facilidade na utilização da plataforma Arduino, totalmente herdado pelo Radiuino. Para
exemplificar a facilidade desta plataforma existe disponível um exemplo de acender e
apagar um led utilizando o Arduino. Este led está disponível no hardware do Arduino
como ilustrado na Figura 4.
Figura 4 Hardware Arduino Duemilanove
Este hardware, no caso o Duemilanove, simplifica em muito a utilização do
microcontrolador Atmega328 (são as mesmas do Atmega 168).
www.radiuino.cc 5
A Figura 5 apresenta a abstração do microcontrolador e a identificação das
funções dos pinos pelo Arduino.
Figura 5 Abstração do Atmega328
Em preto na figura estão as descrições das funções dos pinos do
microcontrolador. Em vermelho estão as funções utilizadas no IDE do Arduino. Para
facilitar esta análise abrir o exemplo do firmware de acender e apagar o led, como
mostrado na Figura 6.
Figura 6 Exemplo Blink
www.radiuino.cc 6
Abrindo este exemplo temse o código do firmware para acender e apagar o led
como mostrado na Figura 7.
Figura 7 Firmware para Blink
A Figura 8 mostra a primeira parte do código faz o setup do hardware
determinando no caso a função do pino 13 do Arduino.
Figura 8 Firmware
A função pinMode, que é uma função do Arduino, estabelece que o pino 13 será
uma saída, que no exemplo vai acender o led que está ligado neste pino.
www.radiuino.cc 7
O loop para acender e apagar o led utiliza o seguinte código mostrado naFigura
9:
Figura 9 Firmware
Analisando o código fica claro que primeiramente a função digitalWrite, que é do
Arduino, faz o pino 13 ir para nível alto. Esta ação faz o led ligar. A função delay dá um
atraso de 1 segundo (esta função do Arduino estabelece o valor em mili segundos). Após
um segundo é executada a função digitalWrite, que faz o pino 13 ir para o nível baixo.
Novamente existe o delay e entra em loop permanente fazendo com que o led acenda e
apague a intervalos de 1 segundo.
Falaremos agora do hardware BE900 conectado em um conversor serial USB.
Este hardware é totalmente equivalente ao Arduino. Ou seja, tendo o firmware para o
Arduino é possível graválo no BE900 através do conversor serial USB. A única diferença
é que o Arduino possui 13 IO e o BE900 possui 6 IO. O número de conversores analógico
digital é o mesmo, ou seja, todos os dois possuem 6 ADC. A Figura 10 mostra um
Radiuino e um Conversor serial.
Figura 10 – Hardware Radiuino e Conversor serial
www.radiuino.cc 8
Para facilitar a compreensão e relação existente entre os hardwares Arduino e
Radiuino, a Figura 11 e a Figura 12 ilustram a as pinagens correspondentes.
Figura 11 – Hardware Arduino/Radiuino
Figura 12 – Hardware Arduino/Radiuino
www.radiuino.cc 9
A Correspondência entre o Arduino e o BE900 é mostrado Tabela 2 e na Tabela
3.
Entradas e Saídas.
Função Pino Arduino Pino BE900
IO0 4 4
IO1 5 17
IO2 6 18
IO3 7 8
IO4 8 7
IO5 9 6
Tabela 2 Entradas e Saídas
Conversores Analógico Digital.
Função Pino Arduino Pino BE900
ADC0 0 15
ADC1 1 13
ADC2 2 12
ADC3 3 11
ADC4 4 20
ADC5 5 19
Tabela 3 – Conversores AD
www.radiuino.cc 10
Para gravar o firmware no Radiuino é necessário fazer upload do código utilizando
a USB. Primeiramente é necessário selecionar o tipo de placa a ser
utilizada, no caso o BE900, como mostra a Figura 13.
Figura 13 – Selecionando Board
Em seguida é necessário escolher a porta serial. Ao ser conectado o Radiuino no
computador é criada uma COM com um número XX (COMXX). Na Figura 14 é mostrado
um exemplo no qual o computador criou a COM19, que deve ser selecionada.
Figura 14 – Selecionando COM
www.radiuino.cc 11
É possível rodar o código do blink no Radiuino, para isto devese trocar no código
do pino 13 para o pino 09 para gravar no Radiuino. No entanto continuaremos a terminar o exemplo no Arduino, com a board e a
COM selecionadas corretamente, é possível carregar o firmware no Arduino clicando no
botão de compilação e download como mostrado na Figura 15.
Figura 15 Fazendo upload do firmware
Após o upload deve aparecer uma mensagem na área de baixo do IDE do Arduino
como na Figura 16.
Figura 16 Mensagem de upload feito
Após fazer o upload do firmware para o Arduino o led vai acender e apagar a
intervalos de 1 segundo. Caso queira alterar o tempo é só mudar o delay, lembrando que
está em mili segundos.
www.radiuino.cc 12
Existem infinidades de outras aplicações para o Arduino, esta plataforma tem sido
utilizada intensamente no ambiente acadêmico. No caso do Radiuino, em sua versão
completa, está sendo usado para pesquisas na área de Engenharia Elétrica e da
Computação.
Estas considerações são necessárias para desmistificar esta plataforma que pode
ser utilizada em pesquisa. Como Exemplo disto, um interessante material foi publicado
pela revista Spectrum do IEEE sobre o Arduino (Disponivel em:
http://spectrum.ieee.org/geeklife/handson/themakingofarduino).
www.radiuino.cc 13
3 Descrição Sistêmica
Para o funcionamento da rede é necessário a presença de uma base Radiuino ligada
a computador via USB e um nó sensor Radiuino. No computador deve existir um software
para solicitação das grandezas medidas e também para o controle de algum dispositivo
ligado ao relé. Na base deve ser gravado o firmware apropriado, que faz uma interface
entre o computador e o nó sensor. No sensor é gravado o firmware desenvolvido para
atender as necessidades do projeto. A Figura 17 que apresenta o sistema.
Figura 17 Diagrama em blocos
A política de comunicação que será apresentada neste material é do computador
enviando um pacote de 52 bytes para o nó sensor através do nó base. Este pacote é
montado pelo computador em concordância com o firmware preparado para executar as
funções desejadas pelo nó sensor. O sensor recebe e processa este pacote executando
o que foi determinado e responde com outro pacote no qual se encontram as grandezas
medidas.
Para entender como funciona a plataforma Radiuino, o mais simples é saber que
todo o processo de comunicação acontece através da transmissão do pacote de 52
bytes. Para facilitar, foi construído um mapa do pacote que está no Anexo1, as
informações presentes no pacote não necessariamente precisam respeitar esta estrutura
proposta, entretanto, é importante mencionar que deve ser respeitado o número de 52
bytes que não pode ser alterado. A plataforma foi preparada desta forma e somente
programadores experientes possuem os conhecimentos em software para alterar o
tamanho do pacote.
www.radiuino.cc 14
Uma rede de sensores sem fio necessita que sejam estabelecidos alguns
parâmetros fundamentais para seu funcionamento. Os seguintes parâmetros devem ser
ajustados tanto na base quando no nó sensor:
Na Camada Física (PHY), tanto no sensor quando na base devem ser colocados estes
parâmetros:
Potência de TX – é a potência utilizada pelo rádio para transmitir o pacote.
Este valor deve ser informado e sua unidade é dBm. Em geral a base e o nó
sensor utilizam a mesma potência. Para aplicações estes valores podem ser
diferentes, para economia de energia, por exemplo;
Canal – é um número que determina a frequência central que será utilizada.
Tanto a base quanto o nó sensor devem estar no mesmo canal para que seja
possível a comunicação. É o mesmo princípio do canal da TV, que determina
qual a frequência será utilizada na recepção;
Offset de Frequência – este é um parâmetro que deve ser informado para
que seja calibrado o rádio em função da precisão do cristal. Basta dizer que
em função de características construtivas existe uma precisão que deve ser
corrigida. Esta informação está escrita no rádio;
A Figura 18 mostra a camada física e os parâmetros citados acima.
Figura 18 – Camada Física
www.radiuino.cc 15
A Figura 19 mostra a alteração feita na freq._offset, comparando com a Figura 18,
mudase apenas os dois últimos números, colocase o número que vem no BE900 como
mostrado na Figura 20.
Figura 19 Camada de Física – Sensor e Base
Figura 20 – BE900 – Sensor e Base
www.radiuino.cc 16
Na camada de rede (Net) deve ser identificado o sensor e a base. Este é o endereço
que deve ser colocado para que o pacote chegue no destino correto.
ID da Base – é a identificação da base que deve ser fornecida para que a
base seja identificada na rede. A rigor a base só tratará pacotes que chegam
com seu ID. Pacotes com ID diferente são descartados;
ID do Nó Sensor – a exemplo do ID da base esta é a identificação do nó
sensor na rede. Certamente não podem existir dois nós com o mesmo ID.
A Figura 21 a posição para colocar a identificação. Por default esta identificação é 0
para base e 1 para o sensor. A base em geral fica sempre com o endereço 0. Conforme
forem sendo acrescentados sensores vai alterando o ID.
Figura 21 – Camada de Rede
A seguir é apresentado em mais detalhe, a política de comunicação entre o
computador e o nó sensor:
www.radiuino.cc 17
No computador deve existir um software capaz de montar o pacote de 52
bytes. Este pacote terá as instruções para o nó sensor, como por exemplo:
ligar um relé, acionar um led, fazer medida de temperatura, fazer a medida
de luminosidade;
O computador envia o pacote para a base via USB;
A base recebe o pacote coloca o endereço da base e transmite em um
canal de rádio e com potência previamente programados na base;
O nó sensor recebe o pacote e mede a intensidade de sinal recebida,
chamada de RSSI (Radio Signal Strengh Indicator) de downlink (da base
para o sensor);
Sensor analisa pacote para verificar se deve ligar ou desligar o relé e leds;
Sensor realiza a medida de temperatura e luminosidade e coloca no pacote
Sensor transmite o pacote para a base
A base recebe o pacote e mede a intensidade de sinal recebida (RSSI de
upling) e envia pacote para o computador
O computador recebe e processa o pacote exibindo na tela as grandezas
solicitadas.
A Figura 22 apresenta um diagrama temporal das comunicações entre os
elementos da rede.
Figura 22 Diagrama temporal
www.radiuino.cc 18
A plataforma Radiuino está preparada para implementar outras funções mais
sofisticadas, como por exemplo, o sensor transmitir quando existir alguma necessidade.
Também existe uma versão para pesquisa com a pilha de protocolo equivalente à
TCP/IP, para criação, por exemplo, de protocolos de roteamento e MAC.
Uma importante informação é a definição do significado de cada um dos 52 bytes,
que está no Anexo 1. Por exemplo, a identificação do sensor que vai receber o pacote
está no byte 8. Se tiver um só sensor o ID=1. No byte 10 está a identificação de quem
está enviando, no caso da base o ID=0. Lembrando que nunca se deve colocar um
sensor com mesmo ID de uma base.
4 DK101
O kit de desenvolvimento DK101 está apresentado na Figura 23.
www.radiuino.cc 19
Figura 23 – Kit DK101
O DK101 é composto das seguintes partes:
2 módulos BE900.
1 programador – UartSBee V4.
1 placa de aplicação – DK101.
1 fonte de alimentação – 12 V.
1 cabo USB.
Com estes itens é possível criar uma rede de sensor utilizando a plataforma Radiuino.
4.1 Placa de Aplicação
A placa de aplicação possui determinados componentes indicados na Figura 24.
www.radiuino.cc 20
Figura 24 Placa aplicação
Para definir em que pinos onde está cada tipo de grandeza a ser monitorada e
cada controle a ser executado temos que montar uma tabela (Tabela 4). Neste caso,
para o DK101 estão os pinos do BE900 que são utilizados.
Função Função
Arduino Pino BE900 DK101
Conversores
Analógico para Digital
ADC0 A0 15 Temperatu
ra
ADC1 A1 13 Luminosid
ade
ADC2 A2 12 Tensão
Bateria
ADC3 A3 11 Tensão
Auxiliar
ADC4 A4 20 Não
Utilizado
ADC5 A5 19 Não
Utilizado
Entradas ou Saídas Digitais
IO0 4 4 Led
Vermelho IO1
(PWM) 5 17 Liga LDR
IO2 6 18 Led Verde
www.radiuino.cc 21
Indicação de Pacote
IO3 7 8 Relé
IO4 8 7
Não Utilizado no DK101
IO5 9 6 Led
Amarelo Tabela 4 – Pinagens de Grandezas
Observar que a identificação dos pinos que vão ser ligados os sensores deve ser
feito de forma prévia. No nosso exemplo, no pino 15 do BE900 está o conversor
analógico número 0. Observase que para realizar a medida através deste conversor AD
é utilizado na mesma forma do Arduino:
AD0 = analogRead(A0);
A variável AD0 é um número de 0 a 1023. Para encontrar a tensão basta fazer
uma regra de 3, sabendose que o valor 1023 é a tensão de 3,3 Volts. Este conversor é
de 10 bits, portanto, vamos precisar de dois bytes para levar a informação da
temperatura, que no caso do DK101 ou DK103, temse um sensor de temperatura
analógico no pino 15. A Tabela 5 foi criada para facilitar a compreensão.
Função Função
Arduino Pino BE900
variável Pacote
Bytes no Pacote
DK101
www.radiuino.cc 22
Conversores
Analógico para Digital
ADC0
A0 15 AD0[0] 16 Tipo de Sensor
Temperatura AD0[1] 17 Inteiro AD0[2] 18 Resto
ADC1
A1 13 AD1[0] AD1[1] AD1[2]
19 20 21
Luminosidade
ADC2
A2 12 AD2[0] AD2[1] AD2[2]
22 23 24
Tensão Bateria
ADC3
A3 11 AD3[0] AD3[1] AD3[2]
25 26 27
Tensão Auxiliar
ADC4
A4 20 AD4[0] AD4[1] AD4[2]
28 29 30
Não Utilizado
ADC5
A5 19 AD5[0] AD5[1] AD5[2]
31 32 33
Não Utilizado
Entradas ou Saídas Digitais
IO0 4 4
IO0[0] IO0[1] IO0[2]
34 35 36
Led Vermelho
IO1 5 17
IO1[0] IO1[1] IO1[2]
37 38 39
Liga LDR
IO2 6 18
IO2[0] IO2[1] IO2[2]
40 41 42
Led Verde Indicação de Pacote
IO3 7 8
IO3[0] IO3[1] IO3[2]
43 44 45
1 Aciona TBD TBD
Relé
IO4 8 7
IO4[0] IO4[1] IO4[2]
46 47 48
Não Utilizado no DK101
IO5 9 6
IO5[0] IO5[1] IO5[2]
49 50 51
1 Liga LED TBD TBD
Led Amarelo
Tabela 5 – Pinagens
www.radiuino.cc 23
4.2 Transdutor de Temperatura
Como transdutor de temperatura utilizado foi o MCP9700 da empresa Microchip. A
Figura 25 e a Figura 26 à seguir apresentam a pinagem, a aparência deste transdutor e
algumas características.
Figura 25 Aparência física do transdutor MCP9700A TO92
Figura 26 – Características do transdutor
A tensão de saída do transdutor de temperatura é uma tensão que pode variar de
0 a 3,3 Volts, que é a alimentação do BE900, que ao ser lida pelo ADC0, no caso, vai
www.radiuino.cc 24
gerar um número de 0 a 1023, como já comentado. Para transformar esta tensão em
temperatura deve ser utilizada a seguinte expressão.
Temperatura = Valor decimal * (3,3/1023)*10050
4.3 Transdutor de Luminosidade
Para medir a luminosidade é utilizado um LDR. A Figura 27 mostra a descrição e
aparência do LDR.
Figura 27 Descrição e Aparência física do Resistor LDR
A Tabela 6 apresenta as características básicas deste componente.
Tabela 6 Características do LDR
www.radiuino.cc 25
No DK101 o LDR está ligado em um divisor resistivo que é alimentado pela
saída digital 5 como mostrado anteriormente. A razão para ser ligado por um pino digital é
para não consumir energia quando não estiver medindo a luminosidade.
Observar que podemos acionar o divisor resistivo tanto pelo firmware fazendo o
pino 17 do BE900 ser ligado pela instrução: digitalWrite (5, HIGH); Também será possível
ligar este pino 17 através do pacote de 52 bytes.
4.4 Relé
O relé utilizado possui contato normalmente aberto e outro normalmente fechado.
A Figura 28 Disposição dos contatos e Disposição mecânica dos pinos
apresentam o esquema do relé e suas dimensões.
Figura 28 Disposição dos contatos e Disposição mecânica dos pinos
www.radiuino.cc 26
A Tabela 7 e Tabela 8 apresentam as características do relé.
Tabela 7 Características relé
Tabela 8 Dados da bobina DC
Obs: Para o caso do DK103 o relé 1 está no pino 8 e o relé 2 no pino 7.
www.radiuino.cc 27
4.5 BE900 e Programador
Este módulo é composto de um microcontrolador Atmega328 e um transceptor
CC1101 da Texas. A Figura 29 apresenta o módulo BE900.
Figura 29 BE900
A programação do microcontrolador é feito pelo Usart apresentado na Figura 30.
Figura 30 Programador Usart
www.radiuino.cc 28
5 Projeto do Hardware
O projeto da placa de aplicação deve ser feito considerando os pinos do BE900. É
necessário fazer um mapeamento dos pinos físicos nos pinos lógicos do firmware. Os
transdutores devem ser ligados aos conversores analógico digital e os controles em
saídas digitais. Basicamente devem ser definidos os pinos que serão utilizados para cada
uma das tarefas, verificar sua correspondência nas funções do Arduino. Adicionalmente
cada uma das funções tem sua correspondência no pacote de 52 bytes. O projeto do
DK101 tem as seguintes funções:
A escolha de quais conversores analógicos digitais e saídas digitais serão utilizadas
depende única e exclusivamente do projeto da placa, para facilitar a implementação do
layout. Foram escolhidos os seguintes pinos do BE900 para cada uma das funções:
Um detalhe, a medida da luz pelo LDR é feita através de um divisor resistivo.
Entretanto, seria desperdício deixar este divisor resistivo permanentemente ativo. Para
evitar este desperdício foi utilizado um pino do BE900 como saída digital para alimentar o
divisor resistivo, quando for feita a medida e desligado em seguida. Foi escolhido o IO1 –
Pino 17. Portanto, para medir a intensidade luminosa deve ser colocado nível alto neste
pino.
Deve ser projetado um circuito elétrico para ligar os transdutores no BE900, bem
como a parte de alimentação, onde deve ser previsto um regulador para 3,3 Volts. No
DK101 foram previstos três leds que podem ser ligados para indicar diferentes funções.
Estes leds podem ser úteis para verificar o funcionamento do sensor.
www.radiuino.cc 29
A Tabela 9 apresenta este mapeamento físico para lógico.
Função Função Pino BE900
Variável Leitura AD Radiuino
variável Pacote
Bytes no Pacote DK101
Conversores Analógico para Digital
ADC0 15 AD0_PIN AD0[0] AD0[1] AD0[2]
16 17 18
Temperatura
ADC1 13 AD1_PIN AD1[0] AD1[1] AD1[2]
19 20 21
Luminosidade
ADC2 12 AD2_PIN AD2[0] AD2[1] AD2[2]
22 23 24
Tensão Bateria
ADC3 11 AD3_PIN AD3[0] AD3[1] AD3[2]
25 26 27
Tensão Auxiliar
ADC4 20 AD4_PIN AD4[0] AD4[1] AD4[2]
28 29 30
Não Utilizado
ADC5 19 AD5_PIN AD5[0] AD5[1] AD5[2]
31 32 33
Não Utilizado
Entradas ou Saídas Digitais
IO0 4 IO0_PIN IO0[0] IO0[1] IO0[2]
34 35 36
Led Vermelho
IO1 17 IO1_PIN IO1[0] IO1[1] IO1[2]
37 38 39
Liga LDR
IO2 18 IO2_PIN IO2[0] IO2[1] IO2[2]
40 41 42
Led Verde Indicação de
Pacote
IO3 8 IO3_PIN IO3[0] IO3[1] IO3[2]
43 44 45
Relé
IO4 7 IO4_PIN IO4[0] IO4[1] IO4[2]
46 47 48
Não Utilizado no DK101
IO5 6 IO5_PIN IO5[0] IO5[1] IO5[2]
49 50 51
Led Amarelo
Tabela 9 Mapeamento
www.radiuino.cc 30
6 Firmware Radiuino4App
O firmware foi estruturado em camadas, a exemplo da pilha TCP/IP utilizada na
Internet, para facilitar o desenvolvimento de rede de sensores sem fio. A Figura 31
mostra as funcionalidades de cada camada.
Figura 31 – Camadas
No nó sensor é montada toda a pilha de camadas, já na base somente até a
camada de rede, como mostrado na Figura 32.
Figura 32 – Camadas da base e do sensor
www.radiuino.cc 31
Foi desenvolvido um firmware para atender as necessidades do projeto do DK101.
Este firmware pode ser acessado diretamente do IDE do Arduino, que deve ser baixado
do site: http://sourceforge.net/projects/radiuino/files/IDE%20Arduino%2020Radiuino%20Ready/Windows/
Neste IDE já existe o Radiuino nos exemplos , existe um firmware para a base e
um firmware para o nó sensor como mostrado anteriormente na Figura 3 IDE Arduino
– Exemplo Radiuino.
Estes firmwares devem ser carregados em dois rádios BE900, que serão a base e
o sensor.
6.1 Ajuste de Parâmetros
Os parâmetros de ajuste geral estão na aba Radiuino_Sensor e Radiuino_Base.
Estes parâmetros, como já comentados antes, são Potência, Canal, Offset de frequência,
ID do sensor, Taxa da serial. Na Descrição Sistêmica a Figura 18, Figura 19, Figura
20, Figura 21, é mostrado de forma mais detalha, repetiremos então as Figuras para
facilitar a compreensão destes parâmetros.
Figura 18 – Camada Física
www.radiuino.cc 32
Um dos parâmetros é a potência que está com o número 7, esta equivale à potência
de 10 dBm. A Tabela 10 apresenta as potências possíveis de serem ajustadas.
Número Potência em dBm 0 30
1 20
2 15
3 10
4 0
5 5
6 7
7 10
Tabela 10 – Parâmetro de potência
Outro parâmetro é o canal que vai de 0 a 65 canais que corresponde aos canais
espaçado de 200 kHz dentro da faixa de 915 MHz e 928 MHz. No caso foi escolhido o
canal 0 que equivale a transmitir na frequência central de 915 MHz.
Alteração feita na freq._offset, comparando com a Figura 18, mudase apenas os
dois últimos números, colocase o número que vem no BE900 como mostrado na Figura
20.
Figura 19 – Camada de Física – Sensor e Base
www.radiuino.cc 33
Figura 20 – BE900 – Sensor e Base
Este offset de frequência é para corrigir a diferença da frequência do cristal. O
número está anotado no próprio rádio. Este valor está em hexadecimal, no caso está o
valor 13. Colocase o valor anotado no rádio que será usado como sensor. O próximo
parâmetro mostrado na Figura 18 é a taxa da serial de comunicação com a USB, que
sempre temos usado 9600 bps. No caso do sensor não será utilizada a serial, pois o rádio
do sensor não está conectado na base que permite conexão USB. Este recurso é útil no
caso de debug de código em aplicações avançadas.
Figura 21 – Camada de Rede
www.radiuino.cc 34
Como ilustrado acima na Figura 21, na variável my_addr colocase o número do
ID do sensor, que no exemplo está número 1. Na rede não pode existir outro sensor com
este mesmo número.
6.2 Acionar leds e relé
O DK101 possibilita os dois tipos de operações de um nó sensor: controle de
processos e medida de grandezas. No caso do controle de processos é possível acionar
um relé para ligar algum dispositivo e ligar três leds. Como já apresentado anteriormente
estes dispositivos devem estar ligados em pinos do radio BE900, como indicado na
Tabela 9 Mapeamento na página 30.
Com esta tabela em mãos é possível verificar que para acionar o led vermelho,
que está ligado no pino 4 do BE900, é necessário alterar o status da variável IO0_PIN do
valor 0 para o valor 1. Ou seja, se IO0_PIN = 0 o led deve apagar e se IO0_PIN = 1 o led
deve acender. Esta variável de estado do led vermelho está relacionada com a variável
de pacote IO0[#], que tem três bytes (34, 35, 36) e o valor que estará nestas variáveis é
aquela enviada pelo computador. Portanto, para alterar o estado do led é necessário que
o pacote montado no computador tenha esta instrução e a lógica do sensor entenda esta
instrução. Observase que existe uma flexibilidade para gerar esta instrução, uma vez
que temos 3 bytes para isto.
Na Figura 33 é mostrado o código disponível do Radiuino4App que foi
implementado a seguinte lógica para a variável IO0:
Figura 33
www.radiuino.cc 35
Esta instrução é a que lê o valor de um byte que veio do computador:
pkt – > IO0[0]
Isto significa que o valor que veio da base no byte 34 do pacote é mapeada na
variável IO0[0], que está no sensor. Ou seja, esta variável vai ter o valor que está no byte
34 recebido pelo rádio. Portanto, no software que monta o pacote no computador deve
ser escrito o valor 1 no byte 34 se o desejo for acionar o led vermelho.
Observase que o usuário pode mudar esta lógica para atender as necessidades
da aplicação que está sendo desenvolvida. Por exemplo, é possível criar uma alógica de
dupla checagem utilizando dois bytes. Todos os outros pinos possuem a mesma lógica. Por exemplo, para ligar o relé é
necessário que o byte 43 tenha o valor 1. Caso isto seja verdade a variável IO3_PIN será
igual a 1, pela lógica implementada e o relé vai atracar.
6.3 Leitura de Grandezas
Quando o nó sensor recebe um pacote este será processado e será executada a
leitura das grandezas. Ainda com a Tabela 9 temos a relação entre os pinos dos ADs e
as variáveis.
Pela tabela o sensor de temperatura está ligado no conversor analógico de
número 0. Portanto, o nó sensor deve fazer uma leitura da temperatura e escrever na
variável AD0. O conversor analógico digital do BE900 possui 10 bits e, portanto, são
necessários 2 bytes. Os bytes deste conversor analógico digital são 16, 17 e 18. Foi
convencionado que nestes bytes vão as seguintes informações como na Tabela 11.
Variável do Radiuino Byte do Pacote Informação
AD0[0] 16 Tipo de sensor
AD0[1] 17 Valor medido dividido por 256
AD0[2] 18 Reto da divisão por 256
Tabela 11
www.radiuino.cc 36
O código para implementar estas funções é apresentado na Figura 34.
Figura 34
Primeiramente é feita a amostragem do valor fornecido pelo sensor através da
instrução do Arduino analogRead. O valor lido é atribuído à variável AD0. Como este
valor varia de 0 a 1023 serão necessários dois bytes. Para escrever este valor no pacote
que será transmitido é utilizada a instrução pkt – >AD0[#]. Esta é uma instrução que
escreve os valores das variáveis AD0[#] nos bytes correspondentes no pacote. No byte
17 vai o valor inteiro da variável AD0[1] e no byte 18 vai o valor do resto da divisão que
corresponde a variável AD0[2].
Ao chegar no computador os bytes 17 e 18 recebidos do nós sensor são
convertidos no valor da temperatura.
6.4 Upload do Firmware
Após o ajuste de todos os parâmetros é necessário fazer o upload dos firmwares
da base e sensor. Para tanto além de selecionar a COM correta, como no caso do
firmware do led, é necessário selecionar o tipo de Board, que para o Radiuino é o BE900
que está disponível na lista fornecida pelo IDE do Arduino, como já mostrado
anteriormente na Figura 13 e Figura 14 da página 11.
Recomendase fazer primeiro o upload do sensor e depois da base, uma vez que o
programador também faz a conexão USB da base com o computador.
www.radiuino.cc 37
7 Software
Para acionar algum dispositivo e monitorar alguma grandeza através do computador é
necessário um software. Este software deve ser capaz de montar o pacote de 52 bytes
para transmitir as instruções de controle e receber o pacote do sensor com 52 bytes,
identificando os valores medidos. Portanto, conceitualmente é bastante simples, vai um
pacote e volta outro pacote.
Serão apresentadas três soluções: Pacote Radiuino, Docklight e Python. A primeira é
uma ferramenta desenvolvida exclusivamente para o Radiuino. A segunda é uma
ferramenta livre para avaliação da serial (no caso a USB) [DOCKLIGHT]. A terceira
ferramenta utiliza a linguagem Python para desenvolvimento de aplicações [PYTHON].
No site do Radiuino estão disponíveis os programas explicados nesta seção e os links
para download dos softwares.
7.1 RadiuinoTest
Como já explicado a plataforma Radiuino trabalha com um pacote com tamanho
fixo de 52 bytes. Esta ferramenta software apresenta a opção de montar o pacote de
forma fácil. A Figura 35 apresenta a tela deste software.
www.radiuino.cc 38
Figura 35 Pacote Radiuino
Para utilizar esta ferramenta deve ser definida a COM utilizada pela base e clicar
em conectar, a figura acima mostra um exemplo no qual foi criada a COM34.
No pacote devem ser colocados o ID do nó sensor e o ID da base, como indicado
na Figura 36. As funções de cada byte podem ser verificados colocando o cursor em
cima do byte. Na Figura 38 o cursor foi colocado no byte 8 indicando que neste byte deve
estar o ID do nó sensor, que neste caso é 1, pois o pacote é destinado ao nó sensor 1.
Outra opção que este software permite é repetir a transmissão do pacote a intervalos
periódicos em segundos.
Figura 36 Indicação da função dos bytes
www.radiuino.cc 39
Para acender o led vermelho o byte 34 deve ser igual a 1. Para isto basta que o
usuário vá neste byte e altere para 1, como indicado na Figura 37.
Figura 37 Byte 34
Portanto, este pacote ao ser enviado para o sensor com ID= 1 pela base com
ID=0 faz com que o led vermelho acenda.
7.2 Python
Para criar aplicações pode ser utilizado o Python, que é livre. Foi utilizada a
versão 2.6 do Python. No site do Radiuino é possível baixar o software. Esta é uma
linguagem de fácil assimilação e simples para desenvolver programas para controlar
processos e monitorar grandezas. O Python foi desenvolvido para facilitar o
desenvolvimento de programas. O código é bastante limpo sem a necessidade da
utilização de chaves, sendo que a endentação é utilizada para identificar os limites das
funções, como for e if. Comentários são feitos utilizado o sinal #. Também não é
necessária a declaração de variáveis. No Anexo 2 está o código completo da aplicação.
No resto desta seção é apresentado o código para o AN001.
www.radiuino.cc 40
A comunicação entre o sensor e o computador é feito via a base, que está
conectada ao computador via USB, como apresentado na Figura 38. A primeira parte do
código importa as bibliotecas necessárias:
Figura 38 – Importa Bibliotecas
A segunda parte abre a serial acerta os valores da comunicação como mostra a
Figura 39.
Figura 39 – Valores de comunicação
Em seguida na Figura 40 o código permite a entrada da identificação da base e do sensor:
Figura 40 – ID
Como já explicado no desenvolvimento do firmware a base do Radiuino é a utilização de um pacote de 52 bytes. A próxima parte como mostra a Figura 41 cria o vetor do pacote:
Figura 41 cria pacote
Será criado um loop infinito, como na Figura 42.
Figura 42 loop
O vetor é preenchido por zeros como mostra a Figura 43.
www.radiuino.cc 41
Figura 43 preenche pacote com zero
Mais a frente, no código são colocados os valores no pacote para realizar as
aplicações do AN001.
O loop para execução do código é obtido pela sequência: while True:
try:
CÓDIGO QUE SERÁ REPETIDO
except KeyboardInterrupt: ser.close() break
Na Figura 44 são apresentadas as opções do programa e a entrada da opção na
variável Opção.
Figura 44 – Opções do programa
A Figura 45 é o pedaço do código que limpa o buffer da serial:
Figura 45 – Limpa buffer
www.radiuino.cc 42
Na Figura 46 temse a identificação da base e do sensor, estes são colocados na
posição 8 e 10 do pacote.
Figura 46 ID base e sensor
No próximo pedaço do código existe uma sequência de if para checar qual a
opção selecionada. É possível observar na Figura 47 no código como se escreve os
valores no pacote de 52 bytes
Figura 47 Sequência de if
www.radiuino.cc 43
A Figura 48 mostra a parte do código onde o pacote é enviado para a base
através de um for que envia cada byte para a USB. Existe uma espera de 0,5 segundos
para dar tempo de o sensor receber, processar e transmitir de volta para a base o pacote.
O pacote é recebido e verificado se chegaram 52 bytes. Em caso positivo é apresentado
na tela EXECUTADO.
Figura 48 envio de pacotes
A parte final do código é mostrado na Figura 49, esta parte do código faz a
medida da temperatura, luminosidade e tensão da fonte e escreve na tela. É possível
também fazer log em arquivo .txt, muito útil para pósprocessamento.
Figura 49 Parte final do código
www.radiuino.cc 44
A temperatura e luminosidade foram colocados nas posições 17 e 18, como
apresentado no Anexo 1. Observar as operações para cálculo da temperatura, que foi
obtido no datasheet do sensor de temperatura. No caso da luminosidade é apresentado
somente o número decimal recebido.
A Figura 50 mostra o menu e o resultado do programa em Python executado.
Figura 50 – Python
Para editar o código do Python é necessário abrir o código no editor. Para isto
basta ir no subdiretório onde está o código clicar com o botão direito no arquivo. Vai
surgir uma janela que tem a opção de editar com o IDE do Python, como mostrado na
Figura 51.
Figura 51 editar código Python
www.radiuino.cc 45
8 Observações Finais
A plataforma Radiuino tem por objetivo principal permitir que alunos e pessoas
interessadas em rede de sensores sem fio tenham como implementar este tipo de rede.
As soluções disponíveis no mercado são proprietárias e dificultam muito o
desenvolvimento de experimentos e provas de conceito. Não se espera que o Radiuino
seja utilizado para chegar a um produto, embora seja possível. A proposta é de o
Radiuino servir para criar protótipos para teste. Para se tornar um produto é necessário
investir em plataformas para atingir este fim, com o intuito de reduzir custo e tratar de
questões como empacotamento mecânico.
www.radiuino.cc 46
Referências
[ARDUINO] www.arduino.cc
[DOCKLIGHT] http://www.docklight.de/download_en.htm
[PYTHON] http://www.python.org/getit/releases/2.6/
[RADIOIT] www.radioit.com.br
[RADIUINO] www.radiuino.cc
[SEEEDSTUDIO] www.seeedstudio.com
[TEXAS] http://www.ti.com/tool/smartrftmstudio
[WIRING] http://wiring.org.co/
www.radiuino.cc 47
Anexo 1 – Mapa do pacote de 52 bytes
* Tempo de sleep em segundos byte 1
**Tempo de sleep byte 2
www.radiuino.cc 48
Anexo 2 – Código Python
# PROGRAMA PARA APLICAÇÃO DO AP1
import serial
import math
import time
import struct
from time import localtime, strftime
# Configura a serial
# para COM# o número que se coloca é n1 no primeiro parâmetrso. Ex COM9
valor 8
n_serial = raw_input("Digite o número da serial:") #seta a serial
n_serial1 = int(n_serial) 1
ser = serial.Serial(n_serial1, 9600, timeout=0.5,parity=serial.PARITY_NONE) #
seta valores da serial
# Identificação da base e sensor
ID_base = raw_input('ID_base:')
ID_sensor = raw_input('ID_sensor:')
# Cria o vetor Pacote
Pacote =
while True:
www.radiuino.cc 49
try:
# Cria Pacote de 52 bytes com valor zero em todas as posições
for i in range(1,53): # faz um array com 52 bytes
Pacote[i1] = 0
# Imprime na tela o menu de opções
print 'Escolha um dos comandos abaixo e depois aperte enter'
print '0 Escolher outro sensor (',ID_sensor,')'
print '1 Ligar relê:'
print '2 Desligar relê:'
print '3 Liga LED Vermelho:'
print '4 Desliga LED Vermelho:'
print '5 Liga LED Amarelo:'
print '6 Desliga LED Amarelo:'
print '7 Liga LED Verde:'
print '8 Desliga LED Verde:'
print '9 Mede temperatura e luminosidade:'
print 's Para sair:'
# Leitura da opção do menu escolhida
Opcao = raw_input('Comando:')
if Opcao == "0": # troca id do sensor
# Identificação do sensor a ser acessado
ID_sensor = raw_input('ID_sensor:')
www.radiuino.cc 50
else:
#opção de saída
if Opcao == "s" or Opcao == "S":# caso o caracter digitado for s
ser.close() # fecha a porta COM
print 'Fim da Execução' # escreve na tela
break
# Limpa o buffer da serial
ser.flushInput()
# Coloca no pacote o ID_sensor e ID_base
Pacote[8] = int(ID_sensor)
Pacote[10] = int(ID_base)
# Verifica a opção de menu escolhida
if Opcao == "1": # Liga relé
Pacote[43] = 1
Pacote[44] = 1
if Opcao == "2": # Desliga relé
Pacote[43] = 1
Pacote[44] = 0
if Opcao == "3": # Liga led Vermelho
Pacote[34] = 1
www.radiuino.cc 51
Pacote[35] = 1
if Opcao == "4": # Desliga led Vermelho
Pacote[34] = 1
Pacote[35] = 0
if Opcao == "5": # Liga led Amarelo
Pacote[49] = 1
Pacote[50] = 1
if Opcao == "6": # Desliga led Amarelo
Pacote[49] = 1
Pacote[50] = 0
if Opcao == "7": # Liga led Verde
Pacote[40] = 1
Pacote[41] = 1
if Opcao == "8": # Desliga led Verde
Pacote[40] = 1
Pacote[41] = 0
# TX pacote envia pacote para a base transmitir
for i in range(1,53):
TXbyte = chr(Pacote[i1]) # Deve converter para caracter em ASCII para
escrever na serial
ser.write(TXbyte)
www.radiuino.cc 52
# Tempo de espera para que receba a resposta do sensor
time.sleep(0.1)
# RX pacote recebe o pacote enviado pelo sensor
line = ser.read(52) # faz a leitura de 52 bytes do buffer que recebe da serial
pela COM
# Checa se recebeu 52 bytes
if len(line) == 52:
print 'EXECUTADO'
# Leitura de temperatura e luminosidade
if Opcao == "9":
# Leitura do AD0
ad0t = ord(line[16]) # tipo de sensor no caso está medindo temperatura
ad0h = ord(line[17]) # alto
ad0l = ord(line[18]) # baixo
AD0 = ad0h * 256 + ad0l
Vout = 0.003223 * AD0
TEMP = (Vout*100)53
# Leitura do AD1
ad1t = ord(line[19]) # tipo de sensor no caso está medindo LDR
ad1h = ord(line[20]) # alto
ad1l = ord(line[21]) # baixo
www.radiuino.cc 53
AD1 = ad1h * 256 + ad1l
# Leitura do AD2
ad2t = ord(line[22]) # tipo de sensor tensão
ad2h = ord(line[23]) # alto
ad2l = ord(line[24]) # baixo
AD2 = ad2h * 256 + ad2l
Vten = (0.003223 * AD2) * 11
print'Tensão de alimentação = ',Vten, ' Temp = ', TEMP, ' Luminosidade
= ',AD1
# Caso não receba os 52 bytes acusa erro
else:
print 'erro'
ser.flushInput()
except KeyboardInterrupt:
ser.close()
break
www.radiuino.cc 54