quinta-feira, 15 de agosto de 2013

Envio da Temperatura Entre Dois Arduinos Utilizando LM35 e RF 433MHz

Palavras-chave: Arduino, Temperatura, LM35, RF, 433, 433MHz, Bootloader, AVRDUDE, ATMega328P-PU.

Nota: todos os links para sites e ferramentas encontram-se no final do post. Os softwares utilizados foram instalados no Slackware64 v.13.37.

O objetivo deste trabalho é enviar a temperatura obtida através do sensor LM35 entre Arduinos via RF 433MHz.

Aproveito para agradecer ao BeatSlayer, fórum Robocore, pela ajuda no código.

MATERIAIS

- 1 Arduino Uno;
- 1 Arduino Stand-alone *;
- 1 Sensor de temperatura LM35;
- 1 Módulo RF TX 433MHz - transmissor;
- 1 Módulo RF RX 433MHz - receptor;
- 1 Conversor USB / Serial;
- 2 Protoboards;
- 1 Resistor de 1kΩ;
- 1 Led;
- Fios 22 AWG.

* Para o Arduino stand-alone há duas opções. A primeira opção é comprar um kit que vem com todos os componentes necessários bastando apenas soldar. A segunda é adquirir os componentes e montar no protoboard.

Neste trabalho optei por montar e os materiais necessários são:

- 1 ATMega328P-PU;
- 1 Soquete de 28 pinos;
- 1 Xtal (cristal) de 16MHz;
- 2 Capacitores cerâmico de 22pF;
- 1 Led;
- 1 Push-button;
- 1 Resistor de 10kΩ;
- 1 Resistor de 220Ω;
- 1 Capacitor de 100nF.

MONTAGEM

A montagem do arduino é muito simples e o diagrama elétrico pode ser visto na Figura 1.

Fig. 1 - Diagrama elétrico do Arduino stand-alone.

A Figura 2 mostra a pinagem do ATMega328P-PU relacionando com a pinagem do Arduino.

Fig. 2 - Pinagem ATMega328P-PU e Arduino.

Na sequência grava-se o bootloader do Arduino Uno. Maiores informações podem ser obtidas em [1].

Instale a IDE do Arduino. Para usuários do Slackware Linux, os passos para instalação podem ser vistos em [2].

Abra a IDE, conecte o Arduino Uno na USB e clique em File, ExamplesArduinoISP. Faça o upload.

Seguindo, conecte o Arduino stand-alone no Arduino Uno conforme a Figura 3.
Fig. 3 - Gravação do bootloader no ATMega328P-PU.

O capacitor eletrolítico conectando o pino Reset ao Gnd no Arduino Uno serve para desativar o auto-reset. Para informações mais detalhadas, acesse [3].

Copie do diretório /opt/arduino/hardware/arduino/avr/bootloaders/optiboot o arquivo optiboot_atmega328.hex para /opt/arduino/hardware/tools/avr/bin.

Abra o konsole e digite:
$ su 
$ senha de root 
# avrdude -p atmega328P -c avrisp -P /dev/ttyACM0 -b 19200 -U flash:w:optiboot_atmega328.hex
O resultado do comando acima é observado na Figura 4.

Fig. 4 - Salvando o bootloader na memória flash.


E para finalizar deve-se acertar os fuses [4].
# avrdude -p atmega328P -c avrisp -P /dev/ttyACM0 -b 19200 -u -U efuse:w:0x05:m -U hfuse:w:0xDA:m -U lfuse:w:0xFF:m -U lock:w:0x0F:m 
A Figura 5 mostra a conclusão do comando.

Fig. 5 - Ajuste dos fuses.

Caso apareça a mensagem "avrdude: stk500_recv(): programmer is not responding", certifique-se que o capacitor para desligar o auto-reset e os leds dos Arduinos stand-alone e Uno estejam ligados corretamente.

A partir deste ponto comece a montar o transmissor e o receptor. Observe na Figura 6, a pinagem dos módulos de RF.

Fig. 6 - Pinagem dos módulos de RF.

No protoboard livre será montado o transmissor com o Arduino Uno e o sensor de temperatura LM35, Figura 7.

Fig. 7 - Montagem do transmissor de temperatura.

Já a Figura 8 mostra a ligação do lado receptor utilizando o Arduino stand-alone.

Fig. 8 - Montagem do receptor.
PROGRAMAÇÃO

Faça o download da biblioteca VirtualWire [5] e descompacte na pasta libraries localizada no diretório do Arduino.

Instale o driver do conversor USB / Serial. No Slackware siga os procedimentos descritos em [6].

Transmissor: conecte o Arduino Uno na porta USB. Abra a IDE do Arduino e configure para a porta /dev/ttyACM0.

Copie o código abaixo integralmente e faça o upload.
/*--------------------------------------------------
* Medidor de Temperatura com LM35 e RF 433 MHz
*
* RF TX - 433 MHz
*
* www.binarycodec.blogspot.com
* Data: 06/08/2013
* v.1.0
-------------------------------------------------*/

#include <VirtualWire.h>

// Declarando pinos para transmissao (RF TX 433 MHz)
const int SENSOR = A0;
const int LED = 13;
const int TX = 10;

void setup() {
// Comunicacao com o Serial Monitor
Serial.begin(9600); // baud-rate
Serial.println("Transmissor");

// Inicializando E/S do transmissor
vw_set_tx_pin(TX);
vw_set_ptt_inverted(true); // Requerido para DR3100
vw_setup(2000); // Bits por segundos
}

void loop() {
// Funcoes do Sensor - Calculos
int D = analogRead(SENSOR);
int T = (D * 5 * 100) / 1023;

Serial.print(T);
Serial.println(" *C");
delay(1000);

// Funcoes para transmissao

//Lendo e armazenando o valor da temperatura
// Convertndo int para char
char SensorCharMsg[10];
itoa(T, SensorCharMsg,10);

digitalWrite(LED, HIGH); // Pisca LED no pino 13 enquanto esta transmitindo
vw_send((uint8_t *)SensorCharMsg, strlen(SensorCharMsg));
vw_wait_tx(); // Espera o envio da informacao
digitalWrite(LED, LOW);
delay(1000);
}

Receptor: ligue o Arduino stand-alone no conversor USB / Serial, Figura 9, seguindo a relação abaixo.

Conversor (5Vcc) || Arduino (ATMega328P-PU)
pino 5V || pino 7 - Vcc
pino Gnd || pino 8 - Gnd
pino TX || pino 2 - RX
pino RX || pino 3 - TX
pino RTS || liga no capacitor de 100nF e do capacitor no pino 1 - RST
pino CTS || pino 7 - Vcc

Fig. 9 - Conversor USB / Serial.
Conecte o conversor na porta USB. Abra outra IDE do Arduino e configure a para a porta /dev/ttyUSB0.

Copie o código abaixo integralmente e faça o upload.
/*--------------------------------------------------
* Medidor de Temperatura com LM35 e RF 433 MHz
*
* RF RX - 433 MHz
*
* www.binarycodec.blogspot.com
* Data: 06/08/2013
* v.1.0
--------------------------------------------------*/

#include <VirtualWire.h>

const int LED = 13;
const int RX = 12;

void setup() {
// Comunicacao com o Serial Monitor
Serial.begin(9600);
Serial.println("Receptor");

// Inicializando E/S do receptor
vw_set_rx_pin(RX);
vw_set_ptt_inverted(true); // Requerido para DR3100
vw_setup(2000); // Bits por segundo

vw_rx_start(); // Inicia a recepcao
}

void loop() {
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen)) { // Sem bloqueios na recepcao
digitalWrite(LED, HIGH); // Pisca LED no pino 13 se receber a mensagem integra
Serial.print("Msg. OK - "); // Verifica checksum. Se mensagem integra, escreve Msg. OK - :

char SensorCharMsg[10]; // conteudo da transmissao
for (int i = 0; i < buflen; i++) {
SensorCharMsg[i] = (char)buf[i];
}
//verifica se terminou a transmissao
SensorCharMsg[buflen] = '\0';

//Convertendo char para inteiro
int T = atoi(SensorCharMsg);

Serial.print("temp.: ");
Serial.print(T);
Serial.println(" *C");
digitalWrite(LED, LOW);
}
}

TESTE

Abra o Serial Monitor da IDE que corresponde ao receptor. O resultado deve ser como a Figura 10.

Fig. 10 - Resultado do teste.

MATERIAIS/LINKS RELACIONADOS






Nenhum comentário: