Posicionamiento con RSSI de módulo 433

 

         
          El geoposicionamiento en interiores no puede realizarse con GPS por falta de cobertura. Otro método para interiores son los Beacons o balizas bluetooth. Como simple experimentación en uso amateur para posicionar por ejemplo un robot es de lo que tratan estas líneas usando módulos de 433Mhz.

           El RSSI es el indicador de fuerza de la señal recibida (RSSI por las siglas del inglés Received Signal Strength Indicator), es una escala  para medir el nivel de potencia de las señales recibidas por un dispositivo inalámbrico.
          He usado módulos baratos de 443Mhz, transmisor y receptor. Hay que asegurarse que el receptor usa el chip SYN470R aunque en mi módulo el nombre estaba borrado. Es un chip de 16 patillas, el número uno está marcado con una señal grabada en el plástico del chip.

          El SYN470R dispone en el pin 13 un AGC o control automático de ganancia que sirve para controlar la entrada de señal y no saturar al chip.

          A nosotros nos servirá como señal RSSI, ya que varia su voltaje en función de la distancia de la señal de un transmisor, de tal forma que sin señal recibida da un valor de aproximadamente 1,7 voltios y con el transmisor a corta distancia pasa a 1,4v. La variación es pequeña, pero perfectamente mensurable en una entrada analógica del Arduino. Ganamos más precisión poniendo las entradas con voltaje de referencia a 3,3v en vez de a 5v.
             Arriba a la izquierda el montaje del receptor. El módulo tiene tres hilos, positivo, masa y datos que van al pin 9 del Arduino. El cable azul conecta la tensión de 3,3V interna de Arduino al pin AREF para aumentar la precisión de las lecturas.

             Además, he soldado un cable al pin 13 que nos da la señal RSSI y que se conecta al A0 del Arduino.

             A la derecha el módulo transmisor, que con 5 voltios, masa y datos va unido a otro Arduino. Este transmitirá una señal con una trama identificable y actuará de "faro" para medir con que "fuerza" (RSSI) nos llega al receptor dándonos una indicación de distancia.
            Los programas de prueba son simples. En el programa receptor se activa la referencia externa de 3,3v, en el loop se comprueba que la señal procede de nuestra baliza emisora (EmisorUno) y se hace una media de 5 valores de A0 donde está conectado el pin13 comentado. Como puede haber varios emisores, cada uno debe estar identificado y realizar medidas individualizadas de cada uno para saber su distancia y poder calcular nuestra posición por triangulación.
//Receptor 433
//www.jopapa.me 2019

#include <VirtualWire.h>
int sensorPin = A0;    //Al pin 13 del 433 (rssi)
const int dataPin = 9;
int sensorValue = 0; 
int integra=0;
String clave="";
String temp="";

void setup() {
Serial.begin(9600);
vw_setup(2000);
vw_set_rx_pin(dataPin);
vw_rx_start();
analogReference(EXTERNAL);  //A 3,3v, mide el votaje en A0 con más precisión
Serial.println(400);delay(200);
Serial.println(500);delay(200);  //Escala para Serial Plotter
}

void loop() {
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
   
if (vw_get_message(buf, &buflen)) {
  clave="";
  for (int i = 0; i < buflen; i++){
   clave += (char)buf[i];
  }
  delay(20);
  if (clave == "EmisorUno"){
   integra=0;
   for (int i = 0; i < 10; i++){  //Media de 5 valores
    sensorValue = analogRead(sensorPin);
    integra = integra + sensorValue;
    delay(50);
   }
   Serial.print("EmisorUno: ");
   Serial.println(integra/10);
   delay(100);
  }
}else{
   integra=0;
   for (int i = 0; i < 10; i++){
    sensorValue = analogRead(sensorPin);
    integra = integra + sensorValue;
    delay(50);
   }
   Serial.print("RSSI sin identificar: ");
   //Serial.println(integra/10);
   delay(50);
}
}
//Emisor 433
//www.jopapa.me 2019

#include <VirtualWire.h>
const int dataPin = 9;

void setup(){
vw_setup(2000);
vw_set_tx_pin(dataPin);
}

void loop(){
const char *msg = "EmisorUno";
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
delay(10);
}
             Aquí vemos los valores RSSI capturados del pin 13 en la entrada analógica A0 del Arduino. Los valores mas altos son con el transmisor apagado o muy alejado. En "C" encendido muy cerca del receptor, "A" y "B" en dos habitaciones distintas separadas por pared fina. Las "X" creo que corresponden a un sensor meteorológico que tengo en una terraza.

             Debido a la corta distancia medida, fue necesario eliminar la antena del emisor para no saturar el receptor (quizás también recortar o quitar la del receptor).

              En resumen, un divertimento sobre una caracteristica poco conocida de los baratos módulos 433 con chip SYN470R
Menu