Ciao a tutti, scusatemi se vi disturbo ancora.
Qualcuno di voi ha mai usato questa libreria http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1228137503 ?
Ho aspettato a compilarla e a provarla perchè non capisco come la ricevente vada collegata all'arduino..
Dice di connettere la sorgente del segnale PPM al pin 8 (You connect the PPM stream to arduino pin 8.)... Ma dove si trova questo "stream"? Intende forse il cavo dati di un canale qualsiasi?
Non vorrei bruciare la ricevente al primo tentativo..
Grazie
Per avere il segnale PPM devi modificare la ricevente.
Praticamente devi prelevare il segnale che va dall' uscita amplificatore all' ingresso del demultiplexer.
I chip variano a seconda della ricevente, comunque l'amplificatore dovrebbe avere 8 pin e il demux 14 ed essere posizionato vicino ai connettori dei servi.
Io sto usando una ricevente cinese 6 canali ultraeconomica, funziona perfettamente.
L'unico problema e' stato saldare il cavo sul piedino del chip SMD
Ora sto tentando di pilotare i servi, la libreria Servo non va bene perche' utilizza lo stesso interrupt della ServoDecode.
Scoperto dopo averci perso una mattinata
se hai non vuoi modificare la ricevente ma leggere direttamente i canali puoi usare questa classe:
#include "InputPin.h"
/*
Let You read digital pin 2,4,5,6
FROM BIRONPILOTV59, tnx to ciskje
*/
#define MASKPCINT0 (1<<2)
#define MASKPCINT1 (1<<4)
#define MASKPCINT2 (1<<5)
#define MASKPCINT3 (1<<6)
InputPin::InputPin(){
pinMode(2, INPUT); // 3 is used for esc
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
// interrupt on pin change PCINT2
PCICR |= (1 << PCIE2);
PCMSK2 = (1 << PCINT18) | // pin2
(1 << PCINT20) | // pin4
(1 << PCINT21) | // pin5
(1 << PCINT22); // pin6
}
//putted here because interrupt dosn't want it in .h
unsigned long _startIn[4];
unsigned long _rawIn[4];
unsigned long _time;
byte _oldbit, _newbit, _changed;
boolean _hasChanged=false;
ISR(PCINT2_vect) {
_time=micros();
_newbit=PIND;
_changed=_newbit^_oldbit;
if (_changed&MASKPCINT0){
if (_newbit&MASKPCINT0) {
_startIn[0]=_time;
}else{
_rawIn[0]=_time-_startIn[0];
}
}
if (_changed&MASKPCINT1)
if (_newbit&MASKPCINT1)
_startIn[1]=_time;
else
_rawIn[1]=_time-_startIn[1];
if (_changed&MASKPCINT2)
if (_newbit&MASKPCINT2)
_startIn[2]=_time;
else
_rawIn[2]=_time-_startIn[2];
if (_changed&MASKPCINT3)
if (_newbit&MASKPCINT3)
_startIn[3]=_time;
else
_rawIn[3]=_time-_startIn[3];
_hasChanged=true;
_oldbit=_newbit;
// blockedRX=0;
}
bool InputPin::getAndSetFalseHasChanged(){
bool temp = _hasChanged;
_hasChanged = false;
return temp;
}
int InputPin::getDuration(int i){
// Serial.print("ok:");
// Serial.print(rawIn[i]);
// Serial.println(rawIn[0]);
// Serial.print("okIND2:");
//Serial.println(rawIn, BIN);
return _rawIn[i];
}