Probé con un voltímetro sobre GND y DI10 y al medir mostró 0V.
Eso no suena bien. Cuando una UART no está transmitiendo ningún dato, permanece en el estado "1" de reposo. Esperaba que los cables conectados al Arduino tuvieran los llamados niveles RS232TTL de +5V en el estado "1" y cerca de GND en el estado "0". (d) Cuando la UART es transmitiendo muchos datos, un multímetro suele mostrar algún tipo de tensión media entre el estado "1" y el estado "0", rebotando entre 2 V y 4 V. ¿Quizás una línea de alimentación o de datos se desconectó o se conectó mal?
Como nota adicional, si elimino la línea pinMode(rxPin, INPUT) entonces nunca se recibe nada (y rf.available() es siempre 0).
Eso es muy inesperado. La mayoría de la documentación de Arduino dice cosas como "Los pines de Arduino (Atmega) son por defecto entradas, por lo que no es necesario declararlos explícitamente como entradas con pinMode()". (a)
Algunos tutoriales de SoftwareSerial sugieren declarar explícitamente que los pines TX sean de salida. (b) ¿Quizás lo que está escuchando a "txPin" está captando ruido, haciendo que haga algo inesperado?
La mayoría de los tutoriales de Arduino parecen utilizar 9600 bps para el hardware Serial uart. (c)
rf.available() es siempre > 0 (y también se convierte en 63)
¿Cómo puedes saber eso? Empiezo a sospechar que el código de tu Arduino es algún programa otros que lo que has publicado.
¿Qué sucede cuando se prueba exactamente el mismo programa, pero con una fuente de serie conocida? Por ejemplo, en lugar de conectar Arduino D10 (tu SoftwareSerial rxPin) a la radio, conecta D10 a Arduino D0 (los datos que escribes en el monitor serie de tu PC), y escribe algunas palabras. ¿Qué sucede entonces?
Puede que el SoftwareSerial funcione bien con datos UART normales, pero no puede manejar los fallos de alta frecuencia comunes en los receptores de radio de bajo coste. En ese caso, tal vez funcionaría mejor
- (a) Conecta la UART hardware de Arduino (D0 Rx y D1 Tx) a la radio, y el SoftwareSerial a tu monitor serial de depuración. O
- (b) utilizar un hardware más sofisticado que haga la recuperación del reloj, etc. como el HopeRF RFM12B utilizado en el JeeNode y el Moteino, o
- (c) utilizar programas más sofisticados, como el protocolo que Roman Black inventó y describe en "Módulos de radiofrecuencia de forma sencilla" o el sistema de manipulación de frecuencias desarrollado por Tom Boyd en "Detección del tren de impulsos con un Arduino" .
Algunos códigos de prueba:
#include <SoftwareSerial.h>
#define rxPin 10
#define txPin 11
SoftwareSerial rf(rxPin, txPin);
void setup() {
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
Serial.begin(9600);
rf.begin(2400);
Serial.println("Hello, I was compiled " __DATE__ );
}
void loop() {
if( rf.available() ){
int incomingByte = rf.read();
Serial.print(incomingByte, DEC);
Serial.print(" ");
Serial.println( rf.available(), DEC);
}
}