
|

26-07-2013, 21.55.44
|
 |
Robottaro senior
|
|
Data registrazione: 14-06-2012
Residenza: Italy
Età : 45
Messaggi: 73
Potenza reputazione: 47
|
|
2 Arduino 2 xbee e segnale analogico "AIUTO"
Salve a tutti , ultimamente sto trovando alcune difficoltà nello scrivere un po di codice per Arduino ! Ho cominciato la realizzazione di un controller personalizzato per alcuni miei Mech !
Per inviare e ricevere comandi ho deciso di utilizzare due arduino e due xbee !
Sono riuscito ad inviare caratteri sia come valori digitali e valori analogici !
Il problema che non riesco a risolvere è quello di capire come posso inviare il valore del segnale analogico per muovere due servo in Pan&Tilt !
Utilizzando una sola scheda la cosa era più semplice !
Codice:
#include <Servo.h>
Servo PanServo; // Crea l'oggetto per il movimento pan
Servo TiltServo; // Crea l'oggetto per il movimento tilt
int PanPin = 2; // Input analogico per lo stick asse orizzontale
int TiltPin = 3; // Input analogico per lo stick asse verticale
int PanVal; // Legge il valore del Pan
int TiltVal; // Legge il valore del Tilt
void setup()
{
PanServo.attach(5); // PanServo pin 5
TiltServo.attach(6); // TiltServo pin 6
}
void loop()
{
PanVal = analogRead(PanPin); // Legge la posizione dello stick
PanVal = map(PanVal, 0, 1023, 0, 179); // Scala di lettura
PanServo.write(PanVal); // Muove il servo al valore
TiltVal = analogRead(TiltPin); // Legge la posizione dello stick
TiltVal = map(TiltVal, 0, 1023, 0, 179); // Scala di lettura
TiltServo.write(TiltVal); // Muove il servo al valore
delay(15); // Pausa
}
Ma nel mio caso ho un Arduino trasmittente e un Arduino ricevitore !
Per quanto riguarda il trasmittente ho realizzato questo tipo di codice !
Codice:
int PanPin = 2; // Input analogico per il joystick asse orizzontale
int PanVal ;
int TiltPin = 3; // Input analogico per il joystick asse verticale
int TiltVal ;
void setup() {
Serial.begin(9600);
}
void loop(){
PanVal = analogRead(PanPin);
PanVal = map(PanVal, 0, 1023, 0, 179);
TiltVal= analogRead(TiltPin);
TiltVal = map(TiltVal, 0, 1023, 0, 179);
}
if (PanVal>100) {
Serial.print("P");
Serial.println(PanVal);
Serial.print("T");
Serial.println(TiltVal);
delay (500);
} else if (PanVal<90) {
Serial.print("P");
Serial.println(PanVal);
Serial.print("T");
Serial.println(TiltVal);
delay (500);
} else if (TiltVal>100) {
Serial.print("T");
Serial.println(TiltVal);
Serial.print("P");
Serial.println(PanVal);
delay (500);
} else if (TiltVal<80) {
Serial.print("T");
Serial.println(TiltVal);
Serial.print("P");
Serial.println(PanVal);
delay (500);
}
Ora per non avere sempre la seriale impegnata e per distinguere i due valori analogici ho utilizzato le lettere P e T rispettivamente pan e tilt ! che scriveranno sulla seriale solo dopo un certo valore ! Ho deciso di inviare in coppia i due valori per non avere solo un movimento per volta !
esempio
P120
T70
Ora nel ricevitore Arduino come devo comportarmi !
Piuttosto che continuare a scrivere codice senza senso gradirei l'aiuto di una anima Pia !  
Io sono alla frutta ! 
Grazie comunque per l'attenzione !
|

26-07-2013, 22.58.57
|
 |
Administrator
|
|
Data registrazione: 15-10-2009
Residenza: Ferrara
Età : 53
Messaggi: 2,962
Potenza reputazione: 346
|
|
Dai un'occhiata a questo controllo e rielabora la sequenza del codice.
Ciao
Antonio
|

27-07-2013, 11.25.07
|
 |
Robottaro senior
|
|
Data registrazione: 14-06-2012
Residenza: Italy
Età : 45
Messaggi: 73
Potenza reputazione: 47
|
|
Ciao Caronte grazie per la tempestiva risposta !
Questo fine settimana è dedicato alla famiglia !
Anche se negli ultimi tre giorni non ho concluso niente, ed ora la mia testa va sempre li !
Lunedì comincerò a riprovare qualcosa anche se non riesco a intuire come far capire ad Arduino ricevente quale sia il segnale P , e quale il T !
Ho dato una occhiata alla funzione matematica
constrain(x,a,b) - dove x è il valore costretto tra "a" e "b" ed usando min e max dovrei costringere il servo a non andare oltre certi valori !
Spero di riuscire anche se la vedo dura !
|

27-07-2013, 12.46.28
|
 |
Administrator
|
|
Data registrazione: 15-10-2009
Residenza: Ferrara
Età : 53
Messaggi: 2,962
Potenza reputazione: 346
|
|
Citazione:
Orginalmente inviato da Ostrogoto0101
Lunedì comincerò a riprovare qualcosa anche se non riesco a intuire come far capire ad Arduino ricevente quale sia il segnale P , e quale il T !
|
Appunto! Che ti importa di farglielo sapere? ServoPan, ServoTilt.... lo sa già!
Ciao
Antonio
|

28-07-2013, 22.32.35
|
 |
Robottaro senior
|
|
Data registrazione: 14-06-2012
Residenza: Italy
Età : 45
Messaggi: 73
Potenza reputazione: 47
|
|
Ciao Caronte , non potendo provare nessun codice fino a domani , le tue parole mi hanno fatto riflettere , passando il fine settimana con la testa fra le nuvole !
Con il telefono ho difficoltà a scrivere del codice !
Sulla trasmittente impostando questo valore ho ottenuto ben poco
PanVal = map(PanVal, 0, 1023, 0, 179);
Serial.print("P");
Serial.println(PanVal);
portando cosi a inviare
Es. P50
L'altro Arduino ha un programma che richiama le routine con switch (ch)
case 'W': ecc. ecc. Ed ad ogni case corrisponde un lettera o numero !
Avevo provato assegnando il case 'P' al pan ma l'unica cosa che ottenevo un movimento casuale del servo
Codice:
PanVal=Serial.read();
myservoPan.write(analogRead(PanVal));
delay(PanVal);
break;
Il risultato migliore lo avuto dichiarando sul trasmettitore Arduino
Codice:
PanVal = analogRead(PanPin);
PanVal = map(PanVal, 0, 1023, 0, 5);
creando solo 5 "casi"
Codice:
case '5':
myservoPan.write(140);
delay(500);
break;
case '4':
myservoPan.write(120);
delay(500);
break;
case '3':
myservoPan.write(90);
delay(500);
break;
Ma ho la limitazione di un sistema pan poco preciso con poca risoluzione nel movimento !
Sarei stato disposto a mapparmi anche 179 casi per servo
|

29-07-2013, 09.09.44
|
 |
Administrator
|
|
Data registrazione: 15-10-2009
Residenza: Ferrara
Età : 53
Messaggi: 2,962
Potenza reputazione: 346
|
|
Infatti questo è il valore giusto
PanVal = map(PanVal, 0, 1023, 0, 5);
Comunque non sono mai andato oltre anche perchè uso cubloc e bx24 per le comunicazioni. Per gli arduini uso l'i2c.
Comunque se fossi in te mi andrei a studiare le stringhe e metterei tutte le letture in una stringa, trasmetterei quella (con opportuni limiter) e in ricezione andrei ad estrarre i valori. Perlomeno io faccio così. Per arduino non sono ferrato sulla 'manipolazione' delle stringhe (non ne ho avuto bisogno) ma al limite ci si guarda e ci si arriva.
Ciao
Antonio
|

29-07-2013, 09.50.50
|
 |
Robottaro senior
|
|
Data registrazione: 14-06-2012
Residenza: Italy
Età : 45
Messaggi: 73
Potenza reputazione: 47
|
|
Citazione:
Orginalmente inviato da Caronte
Infatti questo è il valore giusto
PanVal = map(PanVal, 0, 1023, 0, 5);
|
Ciao Caronte ringrazio per la tua disponibilità , e per avermi indicato la strada da percorrere !
Spesso rimango vittima della mia ignoranza , ma essendo duro come un caprone non mi arrendo facilmente ! 
Continuerò come da tua indicazione , poi farò sapere !
Saluti ... e GRAZIE !
Ps.
Ho ricevuto messaggi privati da spammer controllare washkvartal !
So che è una lotta continua !
|

29-07-2013, 10.47.51
|
 |
Administrator
|
|
Data registrazione: 15-10-2009
Residenza: Ferrara
Età : 53
Messaggi: 2,962
Potenza reputazione: 346
|
|
Citazione:
Orginalmente inviato da Ostrogoto0101
Ciao Caronte ringrazio per la tua disponibilità , e per avermi indicato la strada da percorrere !
Spesso rimango vittima della mia ignoranza , ma essendo duro come un caprone non mi arrendo facilmente ! 
Continuerò come da tua indicazione , poi farò sapere !
Saluti ... e GRAZIE !
Ps.
Ho ricevuto messaggi privati da spammer controllare washkvartal !
So che è una lotta continua ! 
|
Approvo la testardaggine. Vai su settorezero e/o gioblu: vedrai che trovi sicuramente qualche esempio. Comunque ho dato un'occhiata alla manipolazione di stringhe con arduino: sembra complicata ma non lo è.
Tranquillo, vai qui e leggiti ogni comando e vedrai che ci riesci. La strada che avevi preso va bene per un servo o due ma nel caso del tuo robot....
Ciao
Antonio
P.s. Cacciato fuori washschifochesegliprendeunaccidentecattivofaunfavo realmondo
|

29-07-2013, 14.21.43
|
 |
Robottaro senior
|
|
Data registrazione: 14-06-2012
Residenza: Italy
Età : 45
Messaggi: 73
Potenza reputazione: 47
|
|
Grazie Caronte
Spero non aver esagerato per gli standard del forum !
Ti ringrazio per avermi fatto arrivare alla soluzione con le mie forze ! Amo capire quello che faccio ! Anche se in alcuni casi il mio "Hobby" diventa quasi un lavoro a tempo pieno ! E durante la giornata trovo sempre meno tempo ......
Alla fine ho risolto così !
Trasmettitore Arduino dopo le inizializzazioni
Codice:
PanVal = analogRead(PanPin);
PanVal = map(PanVal, 0, 1023, 1, 3);
TiltVal= analogRead(TiltPin);
TiltVal = map(TiltVal, 0, 1023, 4, 6);
Ricevente Arduino
Codice:
case '1':
if(anglePan > ANGLEPAN_STEP) {
anglePan = anglePan + ANGLEPAN_STEP; // step a sx
} else {
anglePan = 0;
}
myservoPan.write(anglePan);
break;
}
Spero possa essere utile per generazioni future , anche perché in rete non avevo trovato nulla di simile !
Grazie Caronte ! Da oggi hai un nuovo fan !! 
|

29-07-2013, 15.33.26
|
 |
Administrator
|
|
Data registrazione: 15-10-2009
Residenza: Ferrara
Età : 53
Messaggi: 2,962
Potenza reputazione: 346
|
|
Citazione:
Orginalmente inviato da Ostrogoto0101
Spero non aver esagerato per gli standard del forum !
Ti ringrazio per avermi fatto arrivare alla soluzione con le mie forze ! Amo capire quello che faccio ! Anche se in alcuni casi il mio "Hobby" diventa quasi un lavoro a tempo pieno ! E durante la giornata trovo sempre meno tempo ......
Alla fine ho risolto così !
Trasmettitore Arduino dopo le inizializzazioni
Codice:
PanVal = analogRead(PanPin);
PanVal = map(PanVal, 0, 1023, 1, 3);
TiltVal= analogRead(TiltPin);
TiltVal = map(TiltVal, 0, 1023, 4, 6);
Ricevente Arduino
Codice:
case '1':
if(anglePan > ANGLEPAN_STEP) {
anglePan = anglePan + ANGLEPAN_STEP; // step a sx
} else {
anglePan = 0;
}
myservoPan.write(anglePan);
break;
}
Spero possa essere utile per generazioni future , anche perché in rete non avevo trovato nulla di simile !
Grazie Caronte ! Da oggi hai un nuovo fan !!  
|
Di niente! Ne bastava uno. Poi hai fatto tutto tu!
Alla prox!
Ciao!
Antonio
|
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
|
|
Strumenti discussione |
|
Modalità visualizzazioe |
Modalità lineare
|
Regole di scrittura
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
Il codice HTML è Disattivato
|
|
|
Tutti gli orari sono GMT. Adesso sono le: 21.29.20.
Realizzazione siti web Cobaltica Foligno
|

|