Go Down

Topic: comunicazione TTL tra 2 arduino (Read 185 times) previous topic - next topic

guido91

Salve a tutti, sto progettando un ROV.
Sono arrivato al punto di avere due unità, una di surface e una subsea. Il mio problema è che non riesco a capire come creare lo sketch per comunicare tramite porte seriali software.
La mia idea di prova, è con l'unita surface leggere il valore di due potenziometri, creare due variabili separte e in fine mandarli tramite porta seriale alla subsea che si dovrebbe occupare di ricevere tali valori ed elaborarli per poi muovere due servomotori, inviare un feedback  al surface che a sua volta lo invierà al monitor seriale.

Surface

Code: [Select]
#include <SoftwareSerial.h>

SoftwareSerial PortSerial1=SoftwareSerial(7,8);

int const potPin = A0;  // primo potenziometro collegato a A0
int const potPin2 = A1;  // secondo potenziometro collegato a A1
int potVal1; // variabile pot1
int potVal2; // variabile pot2
int pan;        // variabile pan
int tilt;       // variabile tilt

void setup() {
  pinMode(7,INPUT);
  pinMode(8,OUTPUT);
  PortSerial1.begin(9600);
  Serial.begin(9600);
}

void loop() {
  potVal1 = analogRead(potPin);   // leggi i valori su A0
  potVal2 = analogRead(potPin2);  // leggi i valori su A2
  pan = map(potVal1, 0, 1023, 0, 179);
  tilt = map(potVal2, 0, 1023, 0, 179);
   PortSerial1.print(potVal1,potVal2);

  delay(15);
}
 


pan & tilt sono i valori che dovranno far muovere i due servi

Subsea
Code: [Select]
#include <SoftwareSerial.h>

#include <Servo.h>

Servo myServo1;  // primo servo
Servo myServo2; // secondo servo

SoftwareSerial PortSerial1=SoftwareSerial(7,8);

int pan=0; // variabile pot1
int tilt=0; // variabile pot2

void setup()
{
  myServo1.attach(9);  // primo servo al pin 9
  myServo2.attach(10); // secondo servo al pin 10
  pinMode(7,INPUT);
  pinMode(8,OUTPUT);
  PortSerial1.begin(9600);
}

void loop() {

  pan=PortSerial1.read();
  tilt=PortSerial1.read();
  myServo1.write(pan);
  myServo2.write(tilt);
  delay(15);
}                         


Il risultato di tutto questo è che i servi non si muovono quando giro i potenziometri e sembrano disturbati da qualcosa.
provando a isolare il pan esclundendo il tilti sia da Surface che da Subsea il servo risponde ma i disturbi rimangono.
Sono giorni che ci sbatto la testa e non riesco a trovare il problema. dove sbaglio?

cyberhs

Il primo sketch presenta un errore:
PortSerial1.print(potVal1,potVal2);
che invece dovrebbe essere:
PortSerial1.print(pan);
PortSerial1.print(tilt);

Inoltre, se perdi il sincronismo cioè perdi un dato nella ricezione, quello che pan diventa tilt e viceversa

Meglio se spedisci un frame cosi' composto
'P' + pan + 'T' + tilt + CR
ove CR è il carriage return ('\n') oppure un altro carattere a tua scelta

guido91

#2
Jul 17, 2014, 12:18 pm Last Edit: Jul 17, 2014, 12:25 pm by guido91 Reason: 1
Grazie della risposta, l'errore è mio che ho postato lo sketch sbagliato, chiedo scusa.
Per non perdere la traccia di ogni passaggio e ogni cambiamento li salvo tutti
in pratica dovrei scrivere così?

PortSerial1.print('P' + pan + 'T' + tilt + '\A');

questo è il Surface giusto per quel subsea:
Code: [Select]
#include <SoftwareSerial.h>

SoftwareSerial PortSerial1=SoftwareSerial(7,8);

int const potPin = A0;  // primo potenziometro collegato a A0
int const potPin2 = A1;  // secondo potenziometro collegato a A1
int potVal1; // variabile pot1
int potVal2; // variabile pot2
int pan;        // variabile PAN
int tilt;       // variabile tilt

void setup() {
  pinMode(7,INPUT);
  pinMode(8,OUTPUT);
  PortSerial1.begin(9600);
  Serial.begin(9600);
}

void loop() {
  potVal1 = analogRead(potPin);   // leggi i valori su A0
  potVal2 = analogRead(potPin2);  // leggi i valori su A2
  pan = map(potVal1, 0, 1023, 0, 179);
  tilt = map(potVal2, 0, 1023, 0, 179);
  PortSerial1.write(pan);
  PortSerial1.write(tilt);
//l'ultima parte si può omettere
  //Serial.print("Pan: "); // feedback PAN
  //Serial.print(pan);            // valore PAN
  //Serial.print("Tilt: "); // feedback TILT
  //Serial.println(tilt);         // valore TILT
 
  delay(15);
}
 


ho cercato parecchio on-line su come far comunicare 2 schede arduino 1 insieme, ma non ho trovato nulla di esaustivo.
inoltre le spiegazioni sulle funzioni della comunicazione seriale sono molto limitate al PC o al processing, o forse sono io che non capisco( probabile )
L'idea è arrivare a far comunicazione  i due arduino,  tramite fibra ottica. ( la parte hardware è pronta per il test ) Se i risultati saranno apprezzabili e soddisfacenti, li pubblicherò  per metterli a disposizione di tutti visto che non è molto trattato come argomento.

cyberhs

No, non ci siamo: ti mancano alcuni rudimenti del C di Arduino.
1 - #include <SoftwareSerial.h> - non è necessario includere la libreria poiché già inserita nelle librerie standard
2 - PortSerial1.print('P' + pan + 'T' + tilt + '\A'); - non puoi "sommare" direttamente un carattere con un intero; meglio separare i vari print
  PortSerial1.print('P');
  PortSerial1.write(pan);  // con write spedisci un solo carattere ASCII  (Es. 0x19 = 25), mentre con print spedisci più caratteri (Es. "25")
  PortSerial1.print('T');
  PortSerial1.write(tilt);
  PortSerial1.print('A');

guido91

Ok, la domanda ora è, per ricevere e usare quei dati che invio?

per esempio:
Code: [Select]
void loop() {
  if (PortSerial1.available()>0) {
    pan = PortSerial1.read();
    myServo.write(pan);
  }
}


è corretto?

cyberhs

No, perché devi sincronizzarti sul frame ricevuto.

Code: [Select]

    char valore = 0;
...
void loop()  {
  if (PortSerial1.available() > 0)  {
    while (PortSerial1.read() == 'P')   {   // inizio frame
      pan = PortSerial1.read();          // pan
      valore = PortSerial1.read();     // 'T'
      tilt = PortSerial1.read();           // tilt
    }
    myServo.write(pan);
...
}


guido91

Grazie mille, ora ho capito   XD XD XD
lo stesso posso fare con gli array?

cyberhs

Non comprendo cosa vuoi dire, spiegati meglio.

Go Up