Transmitir y recibir a traves de Modulacion PSK.

Hola noter te cuento,

he estado probando el código, y me di cuenta que algunas veces se quedaba el pitido continuo y otras veces no, hice lo de ir quitando writePSK y seguía el pitido continuo, entonces empecé a dudar sobre el código y cargue el código original y que paso?, que el pitido siguió continuo???, la verdad no entiendo porque?, y se me ocurrió que podría ser la transferencia del código a la placa que en un momento determinado no lo estuviese haciendo correctamente, descargue la última versión del IDE de Arduino que ponía que se actualizo la última vez el 18 de septiembre, cargue el codigo y lo primero que hizo fue saltar un error con la declaración del puerto serial, cambie la declaración de static void, y la deje solo void, y compilo y cargo bien.

Entonces cargue de nuevo el código que hemos estado probando, y dejo de hacer el pitido continuo, empezó a funcionar bien, pero solo haciendo una de las dos cosas TX o RX, entonces lo que hice fue poner una variable para hacer un switch entre las dos funciones TX/RX, ósea:

define RX // TX or RX firmware

define TX // TX or RX firmware

define INTVREF // use internal 1.1V ref for AD

define LED 13

define BAUDRATE 115200

//#define TESTRXLEVEL

// PWM out is pin 9 and 10 // AFSK out is pin 11 // AFSK in is pin A3

uint16_t time, lasttime; uint16_t timediff;

int sw = 1; //Si es "1" RX, si es "0" TX.

void setup() { pinMode (LED, OUTPUT); SerialOpen(BAUDRATE); initPsk(); digitalWrite(LED, 1); lasttime = millis(); }

void loop() { time = millis(); timediff = time - lasttime; if (timediff > 1500) { lasttime = time;

if (sw == 0){ writePSK('$'); writePSK('T'); writePSK('G'); writePSK('H'); writePSK('H'); writePSK('O'); writePSK('L'); writePSK('A');

} }

if (sw == 1){ if (PskAvailable()) { SerialWrite(readPSK()); } } }

más o menos esto es lo que hice, cambiando el valor de la variable, realiza una o la otra función, ósea semi duplex.

ahora lo que hare es poner un botón externo para probar cambiar el valor de sw entre 1 y 0, a ver como se comporta y luego empezare a jugar con el tamaño de writePSK a ver hasta cuanto es el valor máximo de caracteres que se puede enviar antes de que empiece a fallar.

Bueno, usando este ejemplo, he puesto un boton para cambiar el valor de la variable sw, si se presiona el boton, transmite y cuando se suelta, se queda recibiendo.

|500x370

#define RX  // RX firmware
#define TX  // TX firmware
#define INTVREF  // use internal 1.1V ref for AD
#define BAUDRATE 115200
//#define TESTRXLEVEL

// AFSK out is pin 9
// AFSK in is pin A3

unsigned long time,lasttime;
uint16_t timediff;

int sw = 0; //Si es 1, recibe.
int boton = 6;

void setup() 
{  
  pinMode( boton  , INPUT) ;            //botón  como entrada
               
  SerialOpen(BAUDRATE);
  initPsk();
  time = millis();
  lasttime = time;
}

//uint16_t missedframes = 0;
//uint16_t goodframes = 0;
//uint8_t c;

void loop()
{
  int valor = digitalRead(boton) ;          // lee el valor de boton

  if(valor == 0){sw = 0;}
    else{sw = 1;}
                
  time = millis();
  timediff = time - lasttime;

  if (timediff > 1500) {
    lasttime = time;
 if(sw == 0){
    writePSK('

Seguire haciendo pruebas, he ire contando.);     writePSK('T');     writePSK('G');     writePSK('H');     writePSK('O');     writePSK('L');     writePSK('A');     writePSK(' ');     writePSK(13);   } }   if(sw == 1){   if (PskAvailable())   {     SerialWrite(readPSK());   } } ```

Seguire haciendo pruebas, he ire contando.

Bueno. Para este viaje no hacían falta estas alforjas ;) Quiero decir que para transmitir/recibir en semiduplex podríamos habernos apañado sólo con timer2 y cambiar la configuración cuando cambiamos el sentido de transmisión; aunque ahora que hemos conseguido "destripar" los entresijos del timer1, mucho mejor así. Una cosa. Tampoco podemos descartar que el pitido continuo no sea lo correcto cuando no se está enviando alguna trama de datos. ¿Has intentado que el arduino se reciba a sí mismo enlazando la salida psk a la entrada? Mediando, claro está, los componentes necesarios (supongo que algún tipo de filtro al menos). Si con el ejemplo que te proponía van apareciendo caracteres por serial, significa que estamos haciendo ambas cosas (tx y rx) simultáneas.

Tiene razon, la intencion era la de poder hacer las dos cosas a la vez "full duplex", no quiere decir que no sigamos intentandolo si te parece bien?, lo que pasa que dentro de mi poco conocimiento voy haciendo pruebas para lo primero aprender de todo esto, y lo segundo saber que tan bien encamido estamos en caso de que tengas razon y el arduino no se lo suficiente para hacer las dos cosas a la vez.

Por otro lado, las pruebas que he hecho, han sido entre dos arduinos UNO, he usado un pequeño filtro que monte con unos pocos componetes despues de pasar dias en internet mirando proyectos de varias otras personas, pero con poca informacion al respecto.

Mas tarde intentare poner fotos y algun esquema del montaje.

Si el montaje con los dos arduinos funciona en el apartado electrónico, mira a ver si con el programa tx/rx simultáneo en ambos, aparecen caracteres en ambos monitores serial. Olvida lo del pitido, no sea que sencillamente se trate de portadora cuando no hay datos enviando. Recuerda; prueba primero con un solo carácter transmitido en el bucle, y si van saliendo datos por el monitor, ve añadiendo más caracteres a transmitir por loop. Si pudieras subir un pequeño vídeo (incluyendo el sonido) creo que sería bastante ilustrativo.

Hola, siento no haber escrito antes, subo un par de imagenes del pequeño montaje que utilizo para enviar a traves de las emisoras, luego subire un pequeño video como sugires.

en la imagen del circuito, la pata que va al pin 7 no se conecta ya que esta funcion la hace internamente el codigo por lo que entiendo.

Hola, siguiendo con el proyecto ya que he tenido algo de tiempo libre, he grabado un pequeño video con el telefono y lo he subido a un servidor:

http://www.4shared.com/zip/-ltVvo1mba/Psk_arduino.html

Lo primero que se muestra es la patalla del Arduino que esta transmitiendo, luego la emisora conectada a este, el modem y el propio arduino que transmite.

Lo segundo es el Arduino que recibe, el modem y la emisora conectada a este, luego el terminal donde esta recibiendo la palara "$TGHOLA 1".

Por ultimo el codigo donde esta la palabra almacenada en una variable para ser enviada.

Aunque en el video se ve un arduino transmitiendo y otro recibiendo, claro esta que ambos pueden enviar y recibir con el mismo codigo que era el objetivo principal gracias a la ayuda de "noter".

Por otro lado, he realizado varias pruebas con diferentes cantidades de envio de caracteres y no he tenido problemas siempre y cuando la funcion sea semi duplex.

Ahora estoy en proceso de poner un bluetooth para enviar y recibir desde un android atraves de la conexion entre los dos arduinos via PSK.