Pages: [1]   Go Down
Author Topic: comunicazione TTL tra 2 arduino  (Read 162 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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:
#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?
Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1513
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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.
« Last Edit: July 17, 2014, 05:25:14 am by guido91 » Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1513
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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');
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

è corretto?
Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1513
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

No, perché devi sincronizzarti sul frame ricevuto.

Code:
    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);
...
}

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie mille, ora ho capito   smiley-lol smiley-lol smiley-lol
lo stesso posso fare con gli array?
Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1513
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non comprendo cosa vuoi dire, spiegati meglio.
Logged

Pages: [1]   Go Up
Jump to: