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
#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
#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?
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:
#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.
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');