Go Down

Topic: comunicazione TTL tra 2 arduino (Read 260 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy