Visualizza messaggio singolo
Vecchio 15 aprile 12, 00:15   #39 (permalink)  Top
gawain
User
 
L'avatar di gawain
 
Data registr.: 18-04-2008
Residenza: milano
Messaggi: 405
Citazione:
Originalmente inviato da faustog_2 Visualizza messaggio
ciao Tom sei della stessa annata mia!

allora oggi ho potuto fare una prova, funziona! l'ipotesi era corretta, solo che arduino legge i dati dalla ricevente portando con se piccole sbavature.. tenendo fermo lo stick della radio il segnale ogni tanto porta delle piccole variazioni.. che poi trasferite sul servo significano piccoli e fastidiosi movimenti.. ...occorre per tanto un'istruzione di controllo , che effettua l'assegnamento del nuovo valore solo se il valore assoluto della differenza è > 10 ..in modo da avere un margine..

if ( abs( pulseIn(ENG, HIGH) - RX_engine ) > 10)
RX_engine = pulseIn(ENG, HIGH);

Quindi aggiorna il valore di RX_engine solo se il valore assoluto della differenza con il precedente valore supera 10. Con questa istruzione le sbavature vengono corrette.

Questo software è il primo passo.. vale a dire prendo il segnale dalla ricevente... se non cambia rispetto all'ultimo ordine... allora legge dalla lista dei waypoint per andare ad eseguire il movimento del prox punto..



#include <Servo.h>

Servo myservo1,myservo2; // create servo object to control a servo

const int ENG = 2; // pin lettura ricevente segnale motore INGRESSO
const int DIR = 4; // pin lettura segnale servo di direzione INGRESSO
const int IR = 8; // pin lettura segnale infrarosso INGRESSO
const int ENG_OUT = 9; // pin per segnale motore da inviare USCITA
const int DIR_OUT = 10; // pin per segnale direzione servo da inviare USCITA

long engine; // segnale imposto per la potenza motore
long direct; // segnale imposto al servo di direzione

long RX_engine; // segnale proveniente dalla ricevente potenza motore
long RX_direct; // segnale proveniente dalla ricevente servo direzione

int val_1,val_2;


//__________________________________________________ ________________
void setup()
{
// initialize serial communication:
Serial.begin(38400);
myservo.attach(ENG_OUT);

pinMode(ENG, INPUT);
pinMode(DIR, INPUT);
pinMode(IR, INPUT);
}
//__________________________________________________ ________________
void loop()
{

RX_engine = pulseIn(ENG, HIGH);
RX_direct = pulseIn(DIR, HIGH);

val_1 = map(RX_engine, 1050, 1850, 0, 180);
val_2 = map(RX_direct, 1050, 1850, 0, 180);


myservo.write(val_1);
}
le sbavature sono dovute al fatto che non hai disattivato l'interrupt per far funzionare i vari delay()
aggiungerei che il pulsein e la libreria servo non sono i metodi piu efficienti ...
gawain non è collegato   Rispondi citando