Comunicación Digital

Hola,

Utilizo este código en un Arduino Due y funciona perfectamente.. escribo una señal ALTO y BAJO y la leo por otro pin digital.
Adjunto código, la salida del monitor Serial y montaje.

void setup() {
  pinMode(23,OUTPUT);
  pinMode(41,INPUT);
  Serial.begin(9600);
}

void loop() {
  int valor = 0;
  String cadena = "101010101010101010101010101010101010101010101010101010101";
  Serial.print("Cadena enviada");
  Serial.println(cadena);
  char v;
  String valores="";
  for (int i = 0; i < cadena.length(); i++) {     
      char letra = cadena.charAt(i);
      int valor = atoi(&letra);
      digitalWrite(23, valor);
      valor = digitalRead(41);
      if(valor == 0){
        v='0';
      } else if (valor == 1) {
        v = '1';
      }
      valores = valores + String(v);
      delayMicroseconds(100);
  }  
  Serial.print("Cadena recibida");
  Serial.println(valores);
}

Salida monitor serial un arduino:
Salidaconunarduino.jpg

Montaje un arduino:

A continuación separo códigos... en un Arduino Due que escriba la señal ALTO, BAJO y en otro arduino Due que lea esa señal por el pinDigital pero deja de funcionar bien.
Adjunto los códigos, la salida del monitor serial y el montaje.

EMISOR:

void setup() {
  pinMode(23,OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int valor = 0;
  String cadena = "101010101010101010101010101010101010101010101010101010101";
  Serial.print("Cadena enviada");
  Serial.println(cadena);
  for (int i = 0; i < cadena.length(); i++) {     
      char letra = cadena.charAt(i);
      int valor = atoi(&letra);
      digitalWrite(23, valor);
      delayMicroseconds(100);
  }
}

RECEPTOR:

void setup() {
  pinMode(41,INPUT);
  Serial.begin(9600);
}

void loop() {
  int valor = 0;
  char v;
  String valores="";
      valor = digitalRead(41);
  
      Serial.println(valor);
      delayMicroseconds(100);


}

Salida monitor serial con dos arduino:

Montaje dos arduinos:

Mi duda es: Porque con un sólo arduino funciona perfectamente y cuando separo los códigos para utilizar con dos arduino deja de funcionar?, recibo siempre el 1 y a veces aparece algún 0.
Es problema de sincronización entre arduinos?.

Muchas gracias.

Salidaconunarduino.jpg

Si no usas un clock que sincronice los dos DUE no puedes pretender que el 2do esta siempre leyendo lo que dice el primero.
Entonces en el segundo en lugar de tener un delay de 100 useg lo que debes hacer es escuchar LISTEN el pin y sus cambios a toda velocidad y como tienes tiempo cuando esto ocurra que lo presente.

Esto arranca mostrando el primer 1

bool valor = false, valorAnt = false;

void setup() {
  pinMode(41,INPUT);
  Serial.begin(9600);
}

void loop() {
  valor = digitalRead(41);
  
  if (valor != valorAnt)
      Serial.println(valor);
  valorAnt = valor;
}

Muchas gracias. La modificación que propones funciona.

Pero tengo una duda más, a que te refieres con utilizar un clock, como puedo realizar la sincronización, usando interrupciones?.

Si pones un clock o sea un pin que bascule (va de 0 a 1 y otra vez a 0) a un ritmo X o sea a una frecuencia determinada y luego del flanco digamos 0 a 1 haces el cambio del pin que te importa leer, entonces, del otro lado un pin estará leyendo ese reloj y cuando vea el flanco sabrá que ahi debe leer el dato que le envies.

No entiendo muy bien a lo que te refieres con esto.

" del otro lado un pin estará leyendo ese reloj y cuando vea el flanco sabrá que ahi debe leer el dato que le envies"

El pin que bascule tengo que ponerlo en el receptor y cuando cambie de 1 a 0 leer?

El pin que bascula es el que hace una onda cuadrada de frecuencia fija, digamos cada 100 useg cambias de 1 a 0.
En el otro lado un pin lee este pin del emisor.
Cuando ve flanco de 0 a 1 el sabe que el emisor pone el dato entonces durante los 100 useg que dure el 1 del reloj estará presente el valor en otro pin.

Es una comunicación comun y silvestre con Reloj.

Es lo mismo que se usa en la comunicación SPI

Muchas gracias por tu ayuda surbyte,

Otra cosa más, si quiero hacer que el sistema sea inalámbrico(usando LIFI), es decir, usando un led de emisor y un fotodiodo en recepción, sabrías como puedo sincronizar los dos arduinos Due?.

Ya sabes que la codificación de Manchester es la solución…

surbyte:
Si no usas un clock que sincronice los dos DUE no puedes pretender que el 2do esta siempre leyendo lo que dice el primero.
../,,

Porque no ?

En las comunicacines serie, lo que yo entiendo "por normal", es que el receptor siempre este escuchando,
Si el receptor no puede atender al emisor, tienes el protocolo xon-xoff si solo hay un canal, cable, o led en este caso.

Si dispones de más cables, o canales, puedes implementar DTR o RTS

https://www.tldp.org/HOWTO/Serial-HOWTO-19.html

Por cierto, puedes mejorar un poco la calidad de la transmisión activando el bit de parada, el de paridad y para aplicaciones muy concretas incluso la cantidad de bits... aunque esto suene a antiguo :o

https://www.arduino.cc/en/serial/begin