Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando
-- Tutorial de iniciación a Arduino --
Volver al índice del tutorial
___________________________
27C.- Radio Frecuencia. FS1000A y JY-JS03. 433 MHz. Distancia. Errores.
- En estos ejemplos no voy a utilizar App Inventor ni Bluetooth.
- Simplemente el módulo Transmisor enviará automáticamente datos al módulo Receptor, se vizualizarán en una pantalla LCD.
- Este montaje está destinado a comprobar a qué distancia se pueden comunicar.
- En este ejemplo los dos módulos están alimentados con pilas para poder hacer las comprobaciones en el exterior.
___________________________
1.- Envío de paquete de datos y comprobación de consistencia.
- Lo primero que se me ocurrió en enviar datos del TX al RX y comprobar si esos datos han llegado correctamente.
- El Transmisor envía un paquete de la forma: 4-83-23-110
- El primer elemento, es el número de paquetes se están enviando, va evolucionando progresivamente: 1, 2, 3, 4, 5... hasta el 9999 y vuelve a 0.
- El segundo y tercer número son números aleatorios comprendidos entre 10 y 99. alea1 y alea2.
- El tercer cuarto número es la suma de los tres anteriores, por ejemplo 4 + 83 + 23 = 110
- Se envía el Paquete = "4-83-23-110"
Transmisor.ino |
// Juan A. Villalpando
// kio4.com
// Código del Emisor.
// Conectar el módulo al terminal 12 del Arduino.
#include <RH_ASK.h>
#include <SPI.h>
RH_ASK rf_driver;
String Paquete = "";
int paquetes = 0;
int alea1;
int alea2;
int suma_TX;
String suma_r;
void setup() {
Serial.begin(9600);
rf_driver.init();
}
void loop() {
paquetes++;
if (paquetes >= 9999){paquetes = 0;}
alea1 = random(10,99);
alea2 = random(10,99);
suma_TX = paquetes + alea1 + alea2;
Paquete = (String) paquetes + "-" + (String) alea1 + "-" + (String) alea2 + "-" + (String) suma_TX;
Serial.println(Paquete);
char *msg = Paquete.c_str();
rf_driver.send((uint8_t *)msg, strlen(msg));
rf_driver.waitPacketSent();
delay(100);
}
|
- El Receptor recibe en Paquete = "4-83-23-110"
- Descompone esa cadena de caracteres:
paquetes = 4
alea1 = 83
alea2 = 23
suma_TX = 110
Realiza la suma_RX de paquetes + alea1 + alea2, en caso que sea igual a la suma_TX es que el paquete ha llegado correctamente, en este caso las dos sumas dan 110.
- En caso que llegara erróneamente "4-83-24-110" el paquete habría llegado de forma errónea ya que 4+83+24 no es 110.
jReceptor.ino |
// Juan A. Villalpando
// kio4.com
// Código del Receptor.
// Conectar el módulo al terminal 11 del Arduino.
#include <RH_ASK.h>
#include <SPI.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
RH_ASK rf_driver;
String Paquete;
int paquetes = 0;
int alea1;
int alea2;
int suma_TX; // Suma del Transmisor.
int suma_RX; // Suma recibida.
int ind1;
int ind2;
int ind3;
int ind4;
int errores = 0;
void setup(){
Serial.begin(9600);
rf_driver.init();
lcd.begin(16,2);// Columnas y filas de LCD.
}
void loop(){
uint8_t buf[16] = {""}; // Tamaño del buffer 16.
uint8_t buflen = sizeof(buf);
if (rf_driver.recv(buf, &buflen)){
Paquete = (char*)buf;
ind1 = Paquete.indexOf('-');
paquetes = Paquete.substring(0, ind1).toInt();
ind2 = Paquete.indexOf('-', ind1+1);
alea1 = Paquete.substring(ind1+1, ind2).toInt();
ind3 = Paquete.indexOf('-', ind2+1);
alea2 = Paquete.substring(ind2+1, ind3).toInt();
ind4 = Paquete.indexOf('-', ind3+1);
suma_TX = Paquete.substring(ind3+1).toInt();
suma_RX = paquetes + alea1 + alea2;
if(suma_TX != suma_RX) {errores ++ ;}
Serial.println(Paquete);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(Paquete);
lcd.setCursor(0,1);
lcd.print(errores);
}
}
|
___________________________
2.- Envío de paquete de datos y comprobación de secuencia.
- En el ejemplo anterior se comprueba la consistencia, es decir si el dato que ha llegado es correcto.
- Pero no indica si se ha perdido Paquetes en el envío.
- Si pones en el Emisor un delay pequeño, por ejemplo delay(1), observará que algunos paquetes no llegan, por ejempo, aquí no ha llegado el paquete 912:
910-20-52-982
911-78-87-1076
913-58-30-1001
914-25-74-1013
915-76-41-1032
916-12-27-955
917-29-21-967
918-22-46-986
919-95-12-1026
- Vamos a realizar otro código en el Receptor donde compruebe si ha llegado un paquete.
- Guardaremos el número del paquete actual en paquetes_anterior.
- Cuando llegue un paquete lo compararemos con el número del paquetes_anterior, si paquetes es distinto a paquetes_anterior + 1 resultará que el paquete anterior no ha llegado, y se sumara un errores.
- En la pantalla aparece el número de errores desde que se reinicia el Receptor.
jReceptor.ino |
// Juan A. Villalpando
// kio4.com
// Código del Receptor.
// Conectar el módulo al terminal 11 del Arduino.
#include <RH_ASK.h>
#include <SPI.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
RH_ASK rf_driver;
String Paquete;
int paquetes = 0;
int alea1;
int alea2;
int suma_TX; // Suma del Transmisor.
int suma_RX; // Suma recibida.
int ind1;
int ind2;
int ind3;
int ind4;
int errores = -1;
int paquetes_primero = 0;
int paquetes_anterior = 0;
void setup(){
Serial.begin(9600);
rf_driver.init();
lcd.begin(16,2);// Columnas y filas de LCD.
uint8_t buf[16] = {""}; // Tamaño del buffer 16.
uint8_t buflen = sizeof(buf);
while(!rf_driver.recv(buf, &buflen)){
Serial.print(".");
delay(200);
}
Serial.println();
Paquete = (char*)buf;
ind1 = Paquete.indexOf('-');
paquetes_primero = Paquete.substring(0, ind1).toInt();
Serial.println(paquetes_primero);
}
void loop(){
uint8_t buf[16] = {""}; // Tamaño del buffer 16.
uint8_t buflen = sizeof(buf);
if (rf_driver.recv(buf, &buflen)){
Paquete = (char*)buf;
ind1 = Paquete.indexOf('-');
paquetes = Paquete.substring(0, ind1).toInt();
ind2 = Paquete.indexOf('-', ind1+1);
alea1 = Paquete.substring(ind1+1, ind2).toInt();
ind3 = Paquete.indexOf('-', ind2+1);
alea2 = Paquete.substring(ind2+1, ind3).toInt();
ind4 = Paquete.indexOf('-', ind3+1);
suma_TX = Paquete.substring(ind3+1).toInt();
suma_RX = paquetes + alea1 + alea2;
errores = errores + (paquetes - paquetes_anterior - 1);
paquetes_anterior = paquetes;
Serial.println(Paquete);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(Paquete);
lcd.setCursor(0,1);
lcd.print(errores - paquetes_primero);
}
}
|
________________________________
|