XY-MK-5V no recibirá mensajes

3

Soy nuevo en arduino y en los módulos de RF, así que compré un juego barato (XY-MK-5V y FS1000A) para transferir datos entre dos arduinos. La transmisión de los datos me parece bien, pero no puedo recibir ningún dato hasta ahora.

Esta es mi fuente de Receiver. Está conectado al pin 11.  Cuando inicio la placa receptora, el TX-LED no se apaga, en caso de que esto sea importante de alguna manera. El RX-LED está apagado, el TX-LED de mi envío arduino se enciende y apaga cuando envío un mensaje.

Establecí el tamaño de mi búfer en VW_MAX_MESSAGE_LEN (30). Simplemente no voy a transferir "hola" por primera vez. ¿Es esta la configuración correcta?

 /*
      SimpleReceive
      This sketch  displays text strings received using VirtualWire
      Connect the Receiver data pin to Arduino pin 11
    */
    #include <VirtualWire.h>

    byte message[VW_MAX_MESSAGE_LEN];    // a buffer to hold the incoming messages
    byte msgLength = VW_MAX_MESSAGE_LEN; // the size of the message


    void setup()
    {
        Serial.begin(9600);
        Serial.println("Ready");

        // Initialize the IO and ISR
        vw_setup(2000);             // Bits per sec
        vw_rx_start();              // Start the receiver
    }

    void loop()
    {
        if (vw_get_message(message, &msgLength)) // Non-blocking
        {
            Serial.print("Got: ");
        for (int i = 0; i < msgLength; i++)
        {
            Serial.write(message[i]);
        }
        Serial.println();
        }
    }

Arduino transmisor:

/*
  SimpleSend
  This sketch transmits a short text message using the VirtualWire library
  connect the Transmitter data pin to Arduino pin 12
*/

#include <VirtualWire.h>

void setup()
{
    // Initialize the IO and ISR
    vw_setup(2000);           // Bits per sec
    Serial.begin(9600);
        Serial.println("Ready  transmitter");

}

void loop()
{
    send("hello");
    Serial.println("transmitted");
    delay(100);
}

void send (char *message)
{
  vw_send((uint8_t *)message, strlen(message));
  vw_wait_tx(); // Wait until the whole message is gone
}

¿Es posible que el módulo de recepción no esté funcionando?

    
pregunta Wolfen

2 respuestas

2

En primer lugar, es recomendable asegurarse de agregar una antena al transmisor y al receptor. Esto puede ser simplemente una pieza simple de cable trenzado aislado conectado a los terminales ANT del módulo TX y RX. La longitud del cable se sigue de la frecuencia. He usado cables de aproximadamente 6,8 pulgadas de longitud para módulos de 433 MHz.

Para obtener comunicaciones confiables con estos módulos de RF de bajo costo, es necesario comprender que los receptores a menudo detectan tanto ruido de RF aleatorio del entorno que constantemente emiten transiciones de señal en el pin de salida del receptor. Por lo tanto, el receptor necesita ver una buena señal fuerte para bloquear que anulará el ruido aleatorio y aleatorio del entorno cercano. Los módulos receptores también requieren algún "tiempo de captura" para poder instalarse y ver la señal de transmisión.

He descubierto que estos módulos de bajo costo son casi inútiles para comunicaciones confiables cuando solo intento ser utilizado como un extensor UART con modulación de señal NRZ. Peor aún con un esquema de tipo UART es el espaciado variable que puede ocurrir entre los bytes individuales que se envían.

Cuando uso estos módulos, he ideado un protocolo que envía bits de datos a una velocidad de 500 bits por segundo. Los datos se envían con un patrón de codificación de Manchester utilizando un diseño de máquina de estado con una tasa de interrupción de 1 mseg en el lado TX del enlace. Se utiliza un preámbulo de entrada de aproximadamente 30 bits de todos los 1s para bloquear el receptor.

Para que la transmisión de Manchester sea exitosa, es necesario tener un patrón de SINCRONIZACIÓN en el flujo de datos que use un patrón de tiempo diferente al ancho de pulso normal de 1T y 2T que se ve en el flujo normal. En mi protocolo, tengo mi sincronización a un nivel bajo de 3T seguido de un pulso alto de 3T que viene inmediatamente después de la secuencia del preámbulo. La parte de datos del flujo se produce inmediatamente después de SYNC en un flujo continuo hasta el final del paquete de datos.

En mi receptor MCU instalo una máquina de estado de decodificación que se apaga dos interrupciones, una en el borde positivo de la señal del receptor y la otra en el borde negativo de la señal recibida. En las rutinas de interrupción del receptor, se comprueba la validez del intervalo de tiempo de borde a borde de la señal detectada dentro de un rango esperado. Puede haber un poco de distorsión de ancho de pulso a través del par de enlace de RF, por lo que esta validación en el ancho de pulso debe ser liberal en el margen pero lo suficientemente ajustada para calificar la posible temporización de intervalo de pulso de Manchester (1T, 2T y 3T). Si se produce algún error, el receptor cancela el estado actual y vuelve a un estado inicial inactivo buscando nuevamente la secuencia SYNC.

Al usar este esquema, he podido implementar enlaces de RF razonablemente confiables que funcionan hasta aproximadamente 100 pies o menos. Cualquier sistema que despliegue un enlace como este debe diseñarse de modo que la falla de cualquier flujo de datos dado no bloquee las operaciones en el extremo del receptor. Como tal, el transmisor debe estar diseñado para repetir la transmisión de manera periódica. (Piense en esto como los abridores de puertas de garaje de bajo costo. Usan un esquema similar y transmiten mientras el usuario presiona el botón y ve que el receptor ha detectado la señal, es decir, la puerta se está abriendo o cerrando). Una de las aplicaciones en las que he implementado estos módulos es donde tengo un transmisor maestro de reloj de tiempo que cuenta con batería RTC precisa. Transmite un paquete con la hora y fecha actuales una vez por minuto. Los objetivos son unidades de visualización de reloj de tiempo que simplemente ejecutan un reloj de software desde la sincronización de cristal de MCU. Estos son precisos para el corto plazo, pero pueden derivar muchos segundos por día. Las unidades de destino verán los paquetes del transmisor y, cuando se descodifiquen correctamente, sincronizarán sus relojes de software con el tiempo visto desde el paquete recibido. Como tal, incluso si los dispositivos de destino no pueden ver los paquetes de actualización de tiempo durante varios minutos o incluso una hora o así, siguen funcionando normalmente hasta que se detecta un paquete validado.

A través del uso de interrupciones tanto en el transmisor como en el receptor, este sistema solo coloca un par del porcentaje de carga de procesamiento en las MCU que funcionan a velocidades de reloj de 25 a 50 MHz.

    
respondido por el Michael Karas
0

Mi tutorial puede o no puede ayudarte ... Si no, puede ayudar a alguien más.

enlace

    
respondido por el ScottC

Lea otras preguntas en las etiquetas