Академический Документы
Профессиональный Документы
Культура Документы
COMUNICACION RF (433MHz)
SIMPLEX CRC
Autores: Catherine Rendón Acosta, Daniela Quintero Romero, Ian Alexander López
Peña, Wilson Fernando López Santacruz y Andrés Felipe Martin Gaviria
Universidad Tecnológica de Pereira, Risaralda, Colombia
Correo-e: Fernando.lopez1@utp.edu.co, Catherine.rendon@utp.edu.co,
ian.lopez@utp.edu.co daniela.quintero12@utp.edu.co, anfema@utp.edu.co
Actualmente es altamente demandado ciertos instrumentos de 3. Se consultan la hoja de datos de los módulos RF (433MHz).
medición para el sector de la agroindustria y el control de riegos, Así como la del Arduino UNO y Arduino Mega para visualizar la
teniendo en cuenta la temperatura, humedad y demás parámetros resolución y características del dispositivo que se va a usar.
importantes es por esto que un higrómetro es una pieza clave al
4. Se hacen las respectivas conexiones del Arduino con el sensor y
igual que la comunicación y el reporte de datos que se envían para
la conexión con el emisor de RF. La recepción se hace a través de
el control y la automatización del mismo
la adaptación de un Arduino Mega.
Los módulos RF de 433Mhz son muy populares por su bajo costo
5. Posteriormente se diseñó el protocolo de transmisión
y fácil uso. Vienen en pareja, emisor (FS1000A) y receptor (XY-
(HandShaking). Para esto se realizó una trama de datos como guía
MK-5V) y son de baja velocidad de transmisión, pero para
para adaptarlo posteriormente al código (ver anexos). Las
aplicaciones básicas son muy útiles. [1]
componentes del, crc, checksum y el data se definieron a partir del
Este proyecto integra las cualidades de los módulos RF para la código, con la adquisición de la señal. Por ello no aparecen en la
generación de una comunicación simplex usando un protocolo que trama guía como valores constantes. Asimismo, se integró al
permite detectar errores en la trama. código que ya se tenía de la comunicación simplex, la parte del
CRC, para ello se declararon las diferentes variables, se crearon emisión como para la recepción.
rutinas que cumplieran con los parámetros establecidos en la guía
y se dispuso a desarrollar los programas necesarios tanto para la 6. Se acondiciona las antenas a los módulos ya que es necesario
realizarle una antena de cobre de 30cm para la emisión y 17cm Por su parte, los módulos RF también presentan una conexión
para la recepción esto con el fin de lograr una correcta transmisión simple, cada uno tiene sus respectivas conexiones a 5V y a GND.
de los datos. Adicional a eso se conectan a los pines Tx y Rx del arduino para
desarrollar el proceso de transmisión y recepción inalámbrica. (ver
7. Se hacen las pruebas para verificar que el sensor si este
anexos)
funcionado y que si se estén leyendo sus datos conectando
directamente ambos Arduinos, una vez verificado que la 3) Módulos RF (433MHz)
información es correcta se procede a realizar la verificación con
los módulos RF. (ver anexos) [3] Los módulos de radio frecuencia RF 433MHz son
transmisores/receptores inalámbricos que podemos emplear como
8. Se hacen las pruebas con el aplicativo proporcionado por el forma de comunicación entre procesadores como Arduino. Este
docente (APPX433). tipo de módulos emisor (FS1000A) y el receptor (XY-MK-5V) se
c. Reseña bibliográfica han hecho populares como medio de comunicación,
1) Higrómetro FC-28 [2] principalmente, por su bajo coste.
Un higrómetro de suelo FC-28 es un sensor que mide la humedad La frecuencia de operación es de 433MHz, aunque también
del suelo. Son ampliamente empleados en sistemas automáticos de existen módulos similares a 315MHz. Ambas frecuencias
riego para detectar cuando es necesario activar el sistema de pertenecen a bandas libres, por lo que su uso es gratuito.
bombeo. El FC-28 es un sensor sencillo que mide la humedad del
El alcance depende del voltaje con el que alimentemos el módulo
suelo por la variación de su conductividad. No tiene la precisión
y la antena que usemos. A 5V y con la antena del módulo, el
suficiente para realizar una medición absoluta de la humedad del
alcance difícilmente excederá de los 2 metros. Alimentando a 12V
suelo, pero tampoco es necesario para controlar un sistema de
y con una antena de cobre de 16.5cm el rango en exteriores puede
riego.
alcanzar 300 metros. La comunicación es simplex (canal único y
El FC-28 se distribuye con una placa de medición estándar que unidireccional) y tienen baja velocidad de transmisión
permite obtener la medición como valor analógico o como una (típicamente 2400bps). Se realiza, básicamente, por modulación
salida digital, activada cuando la humedad supera un cierto ASK (amplitude shift keying). No disponen de filtro ni ID por
umbral. hardware, por lo que si queremos una comunicación robusta
tendremos que implementarlo por software
Los valores obtenidos van desde 0 sumergido en agua, a 1023 en
el aire (o en un suelo muy seco). Un suelo ligeramente húmero
daría valores típicos de 600-700. Un suelo seco tendrá valores de
800- 1023.
e. Recomendaciones
f. Bibliografía
1. Conexiones
2. Trama de datos
3. Códigos
void crc()
{
CRC = 0x0000FFFF;
for(int i=1; i<=15;i++)//15 de 19 datos
{CRC = CRC^Tx[i];
for(int j=0;j<8;j++)
{ flag = bitRead(CRC,0);
CRC = CRC>>1;
//VALOR POLINOMIO GENERADOR X12+X10+X8+X6+X4+X2+1=0X1555
//1 0 1 0 1 0 1 0 1 0 1 0 1
if(flag==1) CRC = CRC^0x1555;
}
}
Tx[16]=CRC;
Tx[17]=CRC>>8;
}
void imprime()
{ crc();
for(int i=0;i<19;i++)
{ Serial.write(Tx[i]);
}
Serial.println();
}
void setup() {
Serial.begin(2400,SERIAL_8N1);
Tx[0]=SOH;
Tx[1]=command;
Tx[3]=destino;//destino nible bajo L
Tx[2]=destino>>8;//destino nible alto H
Tx[5]=origen;//=origL
Tx[4]=origen>>8;//=origH
Tx[18]=EOT;//caracter de finalizacion
void loop()
{ dato1=" ";
dato=analogRead(1);
F=(dato*0.0977);
F=100-F;
if(F==100)dato1=" ";
if(F<10)dato1=" ";
dato1=F+dato1;
dato1=dato1+"%";
for(byte i=0;i<10;i++)
{ Tx[i+6]=dato1[i] ;}//almacenamos lectura de datos de la posicion 6 hasta 15
imprime();
delay(1000);
byte otra,lectura[19]={0x00,0x00,0x00,0x00,0x00,0x00,48,48,48,48,48,48,48,48,48,48,0x00,0x00,0x00};
byte Tx[19]={0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00, 0x00};
int incremento, dato;//variable de 2 bytes
int origen=44444;
int destino=32429;
int CRC;
byte csH=0,crcH=0;
byte csL=0,crcL=0;
bool espera,valido,flag=0,crcOK;
String dato1=" ";
int checksum=0;
#define STX 2
#define ETX 3
#define SOH 1
#define EOT 4
#define command 192
void crc()
{
CRC = 0x0000FFFF;
for(int i=1; i<=15;i++)//15 de 19 datos
{CRC = CRC^lectura[i];
for(int j=0;j<8;j++)
{ flag = bitRead(CRC,0);
CRC = CRC>>1;
//VALOR POLINOMIO GENERADOR X12+X10+X8+X6+X4+X2+1=0X1555
//1 0 1 0 1 0 1 0 1 0 1 0 1
if(flag==1) CRC = CRC^0x1555;
}
}
crcL=CRC;//captura
crcH=CRC>>8;
//VERIFICACION COINCIDENCIA CRC/////
if((lectura[16]==crcL)&&(lectura[17]==crcH))
{crcOK=1;}
else{crcOK=0;}
}
void check()
{ for(int i=1; i<=15;i++)//15 de 19 datos
{checksum+=Tx[i];
}
Tx[17]=checksum;
Tx[16]=checksum>>8;
}
void imprime()
{ check();
for(int i=0;i<19;i++)
{ Serial.write(Tx[i]);
}
void recibe()
{while(Serial1.available())
{
if(espera == false)
{
if(Serial1.read ()== SOH)
{
espera = true;
incremento = 1;
}
}
else
{
otra = Serial1.read();
lectura[incremento] = otra;
incremento++;
if(incremento > 18)//17
{
espera = false;
}
if(otra ==EOT)valido=1;
else{valido=0;}
}
}
}
//////////////////////////programa principal
void setup()
{pinMode(13,OUTPUT);
Serial.begin(9600,SERIAL_8N1);
Serial1.begin(2400,SERIAL_8N1);
Tx[0]=STX;
Tx[1]=command;
Tx[3]=destino;//destino nible bajo L
Tx[2]=destino>>8;//destino nible alto H
Tx[5]=origen;//=origL
Tx[4]=origen>>8;//=origH
Tx[18]=ETX;//caracter de finalizacion
void loop()
{
recibe();///////////////////////////////////////////////////
/////VERIFICACION CRC Y CARACTERES SOH Y EOT
if((valido==1)&&(crcOK==1)) //
{ for(int i=6;i<16;i++)
{Tx[i]=lectura[i];
}
imprime();
delay(1000);
}
checksum=0;
}