Comunicazione mkrfox e arduino pro [Risolto]

Ciao a tutti, ho bisogno del vostro aiuto per un problema banale che purtroppo non riesco a risolvere.

Devo collegare una scheda mkrfox 1200 e una scheda DFrobot con le caratteristiche di un Arduino Pro (ATMEGA328P, 3.3V). Ho pensato di farlo attraverso un collegamento seriale, alimentando entrambe le schede via USB (con due PC diversi) e connettendo i pin in questo modo:

mkrfox1200 | Arduino Pro
Rx ----------> Tx
Tx ----------> Rx
Gnd ----------> Gnd

Lavorano entrambe a 3.3V.

Ho quindi utilizzato un codice banale (forse troppo?):

mkrfox 1200:

int a = 0;
int b = 0;

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {
    if(Serial1.available()){
    a =Serial1.read();
    b = Serial1.read();
    Serial.print("Valore di a = ");
    Serial.println(a);
    Serial.print("Valore di b = ");
    Serial.println(b); 
    delay(100);
  }
}

Arduino Pro (Dopo aver caricato lo sketch ho effettuato il reset):

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

int a = 0;
int b = 0;

void setup() {
  mySerial.begin(9600);
  pinMode(5,INPUT);    // sensore digitale
  pinMode(6,INPUT);    // sensore digitale
}

void loop() {
  a = digitalRead(5);
  b = digitalRead(6);
  delay(100);

  if(mySerial.available())
  {
    mySerial.flush();
    mySerial.write(a);
    mySerial.write(b);
    delay(100);
  }
}

La risposta che ottengo è una serie di 0 (a = 0, b = 0), anche quando il segnale in ingresso nei pin 5 e 6 è pari a 1. Ho provato a semplificare il codice chiedendo solo di inviare due valori (a = 5, b = 8 ) ottenendo ancora 0.

Ho chiesto al supporto tecnico di DFrobot, e loro possono confermare il collegamento seriale solo con Arduino UNO.
Il collegamento I2C non funziona; per questo caso il supporto tecnico di DFrobot conferma la problematica senza suggerire alcuna soluzione.

Avete dei suggerimenti per me? Ogni osservazione/consiglio/critica è di grande aiuto.
Grazie.

  1. metti un paio di Serial.println() dopo le letture dei pin così da essere sicura che li stai leggendo bene ...

  2. Prova a non usare mySerial.write() che trasmette i dati in binario, ma prova ad usare mySerial.print() che li trasmette in ASCII e quindi facilmente visualizzabili.

  3. il test sulla disponibilità di caratteri ( if Serial1.available() ) va fatto prima di OGNI lettura dalla seriale dato che nessuno ti garantisce che siano arrivati entrambi i bytes (anzi, quasi sicuramente è il conrario).

Guglielmo

Togli il mySerial.flush();

UweFederer: Togli il mySerial.flush();

... giusto :) , quindi aggiungiamo a quanto già indicato:

  1. elimina quella mySerial.flush() che li non serve assolutamente a nulla.

Guglielmo

Grazie mille. Ho seguito i vostri suggerimenti ma ancora non riesco a risolvere. Ottengo sempre “0” come risposta. Questo indica che la connessione è presente (diversamente non otterrei nessuna informazione sul monitor seriale), ma la comunicazione è problematica.

Ho provato anche a non utilizzare la libreria SoftwareSerial e a inserire questa scheda per agevolare i collegamenti, ma ottengo ancora “0”. A questo punto potrebbe essere un problema di incompatibilità tra le schede?

Questi sono i codici corretti:

mkrfox 1200:

[code]
int a = 0;
int b = 0;

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {
    if(Serial1.available()){
    a = Serial1.read();
    Serial.print("Valore di a = ");
    Serial.println(a); 
    }
    delay(1000);
    if(Serial1.available()){
    b = Serial1.read();
    Serial.print("Valore di b = ");
    Serial.println(b); 
    } 
    delay(1000);
}

[/code]

Arduino Pro:

[code]
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

int a = 0;
int b = 0;

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(5,INPUT);    // sensore digitale
  pinMode(6,INPUT);    // sensore digitale
}

void loop() {
  a = digitalRead(5);
  a = a+1;  // prova in alternativa al sensore
  b = digitalRead(6);
  b = b+1;  // prova in alternativa al sensore
  Serial.print("a = ");
  Serial.println(a);
  Serial.print("b = ");
  Serial.println(b);
  delay(1000);
  if(mySerial.available())
  {
    mySerial.print(a);
    mySerial.print(b);
    delay(1000);
  }
}

[/code]

Cosa c'entra il " if mySerial.available() " nella parte che trasmette ? ? ? :o :o :o

NON entrerai mai in quella IF (... perché dovrebbero esserci dei caratteri disponibili sulla seriale di chi invia ? ? ?) e quindi non trasmetterai mai nulla ... ::)

Guglielmo

E’ vero…grazie, mi stavo perdendo! sono riuscita a far funzionare la comunicazione. Era una banalità…

questo è il codice corretto dell’Arduino Pro:

 #include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

int a = 0;
int b = 0;

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(5,INPUT);    // sensore digitale
  pinMode(6,INPUT);    // sensore digitale
}

void loop() {
  a = digitalRead(5);
  b = digitalRead(6);
  Serial.print("a = ");
  Serial.println(a);
  Serial.print("b = ");
  Serial.println(b);
  delay(1000);
    mySerial.print(a);
    mySerial.print(b);
    delay(1000);
}