mirror of https://github.com/ArduPilot/ardupilot
Working on RC_ChannelB example.
git-svn-id: https://arducopter.googlecode.com/svn/trunk@1260 f9c3cf11-9bcb-44bc-f272-b75c42450872
This commit is contained in:
parent
b88d96d111
commit
de5c16722a
|
@ -101,7 +101,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* The default constrcutor
|
* The default constrcutor
|
||||||
*/
|
*/
|
||||||
AP_EEPromVar(type data, const char * name = "", bool sync=false) :
|
AP_EEPromVar(type data = 0, const char * name = "", bool sync=false) :
|
||||||
AP_Var<type>(data,name,sync)
|
AP_Var<type>(data,name,sync)
|
||||||
{
|
{
|
||||||
eepromRegistry.add(this,_id,_address,sizeof(type));
|
eepromRegistry.add(this,_id,_address,sizeof(type));
|
||||||
|
|
|
@ -11,12 +11,10 @@
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <avr/eeprom.h>
|
#include <avr/eeprom.h>
|
||||||
#include "WProgram.h"
|
|
||||||
#include "RC_ChannelB.h"
|
#include "RC_ChannelB.h"
|
||||||
|
#include <AP_Common.h>
|
||||||
|
|
||||||
void
|
void RC_ChannelB::readRadio(uint16_t pwmRadio) {
|
||||||
RC_ChannelB::readRadio(uint16_t pwmRadio)
|
|
||||||
{
|
|
||||||
// apply reverse
|
// apply reverse
|
||||||
if(_reverse) _pwmRadio = (_pwmNeutral - pwmRadio) + _pwmNeutral;
|
if(_reverse) _pwmRadio = (_pwmNeutral - pwmRadio) + _pwmNeutral;
|
||||||
else _pwmRadio = pwmRadio;
|
else _pwmRadio = pwmRadio;
|
||||||
|
@ -77,34 +75,4 @@ RC_ChannelB::_pwmToPosition(uint16_t pwm)
|
||||||
return _scale * (_pwm - _pwmNeutral)/(_pwmMax - _pwmNeutral);
|
return _scale * (_pwm - _pwmNeutral)/(_pwmMax - _pwmNeutral);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
RC_ChannelB::loadEEProm()
|
|
||||||
{
|
|
||||||
if (_storageType == STORE_EEPROM)
|
|
||||||
{
|
|
||||||
eeprom_read_block((void*)&_scale,(const void*)(_address),sizeof(_scale));
|
|
||||||
eeprom_read_block((void*)&_pwmMin,(const void*)(_address + 4),sizeof(_pwmMin));
|
|
||||||
eeprom_read_block((void*)&_pwmMax,(const void*)(_address + 6),sizeof(_pwmMax));
|
|
||||||
eeprom_read_block((void*)&_pwmNeutral,(const void*)(_address + 8),sizeof(_pwmNeutral));
|
|
||||||
eeprom_read_block((void*)&_pwmDeadZone,(const void*)(_address + 10),sizeof(_pwmDeadZone));
|
|
||||||
eeprom_read_block((void*)&_filter,(const void*)(_address+12),sizeof(_filter));
|
|
||||||
eeprom_read_block((void*)&_pwmDeadZone,(const void*)(_address+13),sizeof(_pwmDeadZone));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
RC_ChannelB::saveEEProm()
|
|
||||||
{
|
|
||||||
if (_storageType == STORE_EEPROM)
|
|
||||||
{
|
|
||||||
eeprom_write_block((const void*)&_scale,(void*)(_address),sizeof(_scale));
|
|
||||||
eeprom_write_block((const void*)&_pwmMin,(void*)(_address + 4),sizeof(_pwmMin));
|
|
||||||
eeprom_write_block((const void*)&_pwmMax,(void*)(_address + 6),sizeof(_pwmMax));
|
|
||||||
eeprom_write_block((const void*)&_pwmNeutral,(void*)(_address + 8),sizeof(_pwmNeutral));
|
|
||||||
eeprom_write_block((const void*)&_pwmDeadZone,(void*)(_address + 10),sizeof(_pwmDeadZone));
|
|
||||||
eeprom_write_block((const void*)&_filter,(void*)(_address+12),sizeof(_filter));
|
|
||||||
eeprom_write_block((const void*)&_pwmDeadZone,(void*)(_address+13),sizeof(_pwmDeadZone));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------
|
// ------------------------------------------
|
||||||
|
|
|
@ -7,94 +7,32 @@
|
||||||
#define RC_ChannelB_h
|
#define RC_ChannelB_h
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <AP_EEProm.h>
|
#include <FastSerial.h>
|
||||||
|
|
||||||
/// @class RC_ChannelB
|
/// @class RC_ChannelB
|
||||||
/// @brief Object managing one RC channel
|
/// @brief Object managing one RC channel
|
||||||
|
//
|
||||||
class RC_ChannelB{
|
class RC_ChannelB{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
enum storage_t
|
|
||||||
{
|
|
||||||
STORE_EXTERNAL,
|
|
||||||
STORE_EEPROM
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
///
|
///
|
||||||
RC_ChannelB() :
|
RC_ChannelB(const float & scale, const uint16_t & pwmMin, const uint16_t & pwmNeutral,
|
||||||
_scale(0),
|
const uint16_t & pwmMax, const uint16_t & pwmDeadZone,
|
||||||
_pwmMin(1000),
|
const bool & filter, const bool & reverse) :
|
||||||
_pwmMax(2000),
|
_scale(scale),
|
||||||
_pwmNeutral(1500),
|
_pwmMin(pwmMin),
|
||||||
_pwmDeadZone(100),
|
_pwmMax(pwmMax),
|
||||||
|
_pwmNeutral(pwmNeutral),
|
||||||
|
_pwmDeadZone(pwmDeadZone),
|
||||||
_pwm(0),
|
_pwm(0),
|
||||||
_pwmRadio(0),
|
_pwmRadio(0),
|
||||||
_filter(true),
|
_filter(filter),
|
||||||
_reverse(false),
|
_reverse(reverse)
|
||||||
_address(0),
|
|
||||||
_storageType(STORE_EXTERNAL)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Constructor
|
|
||||||
///
|
|
||||||
RC_ChannelB() :
|
|
||||||
_scale(0),
|
|
||||||
_pwmMin(1000),
|
|
||||||
_pwmNeutral(1500),
|
|
||||||
_pwmMax(2000),
|
|
||||||
_pwmDeadZone(100),
|
|
||||||
_pwm(0),
|
|
||||||
_pwmRadio(0),
|
|
||||||
_filter(true),
|
|
||||||
_reverse(false),
|
|
||||||
_address(address),
|
|
||||||
_storageType(STORE_EEPROM)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Constructor
|
|
||||||
///
|
|
||||||
RC_ChannelB(uint16_t address) :
|
|
||||||
_scale(0),
|
|
||||||
_pwmMin(1000),
|
|
||||||
_pwmNeutral(1500),
|
|
||||||
_pwmMax(2000),
|
|
||||||
_pwmDeadZone(100),
|
|
||||||
_pwm(0),
|
|
||||||
_pwmRadio(0),
|
|
||||||
_filter(true),
|
|
||||||
_reverse(false),
|
|
||||||
_address(address),
|
|
||||||
_storageType(STORE_EEPROM)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// set configuration
|
|
||||||
void setScale(float scale) { _scale = scale; }
|
|
||||||
void setReverse(bool reverse) { _reverse = reverse; }
|
|
||||||
void setFilter(bool filter) { _filter = filter; }
|
|
||||||
void setPwmMin(uint16_t pwmMin) { _pwmMin = pwmMin; }
|
|
||||||
void setPwmMax(uint16_t pwmMax) { _pwmMax = pwmMax; }
|
|
||||||
void setPwmNeutral(uint16_t pwmNeutral) { _pwmNeutral = pwmNeutral; }
|
|
||||||
void setPwmNeutral() { _pwmNeutral = getPwm(); }
|
|
||||||
void setPwmDeadZone(uint16_t pwmDeadZone) { _pwmDeadZone = pwmDeadZone; }
|
|
||||||
|
|
||||||
// save/load
|
|
||||||
void saveEEProm();
|
|
||||||
void loadEEProm();
|
|
||||||
|
|
||||||
// get configuration
|
|
||||||
float getScale() { return _scale; }
|
|
||||||
bool getReverse() { return _reverse; }
|
|
||||||
bool getFilter() { return _filter; }
|
|
||||||
uint16_t getPwmMin() { return _pwmMin; }
|
|
||||||
uint16_t getPwmMax() { return _pwmMax; }
|
|
||||||
uint16_t getPwmNeutral() { return _pwmNeutral; }
|
|
||||||
uint16_t getPwmDeadZone() { return _pwmDeadZone; }
|
|
||||||
|
|
||||||
// set servo state
|
// set servo state
|
||||||
void readRadio(uint16_t pwmRadio);
|
void readRadio(uint16_t pwmRadio);
|
||||||
void setPwm(uint16_t pwm);
|
void setPwm(uint16_t pwm);
|
||||||
|
@ -112,19 +50,18 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
float _scale;
|
// configuration
|
||||||
AP_EEProm<uint16_t> _pwmMin;
|
const float & _scale;
|
||||||
uint16_t _pwmNeutral;
|
const uint16_t & _pwmMin;
|
||||||
uint16_t _pwmMax;
|
const uint16_t & _pwmNeutral;
|
||||||
uint16_t _pwmDeadZone;
|
const uint16_t & _pwmMax;
|
||||||
|
const uint16_t & _pwmDeadZone;
|
||||||
|
const bool & _filter;
|
||||||
|
const int8_t & _reverse;
|
||||||
|
|
||||||
|
// internal states
|
||||||
uint16_t _pwm; // this is the internal state, positino is just created when needed
|
uint16_t _pwm; // this is the internal state, positino is just created when needed
|
||||||
uint16_t _pwmRadio; // radio pwm input
|
uint16_t _pwmRadio; // radio pwm input
|
||||||
|
|
||||||
// configuration
|
|
||||||
bool _filter;
|
|
||||||
int8_t _reverse;
|
|
||||||
storage_t _storageType;
|
|
||||||
uint16_t _address;
|
|
||||||
|
|
||||||
// private methods
|
// private methods
|
||||||
uint16_t _positionToPwm(float position);
|
uint16_t _positionToPwm(float position);
|
||||||
|
|
|
@ -1,18 +1,35 @@
|
||||||
/*
|
/*
|
||||||
Example of RC_Channel library.
|
Example of RC_Channel library.
|
||||||
Code by Jason Short. 2010
|
Code by James Goppert. 2010
|
||||||
DIYDrones.com
|
DIYDrones.com
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <FastSerial.h>
|
||||||
|
#include <AP_Common.h>
|
||||||
#include <APM_RC.h> // ArduPilot Mega RC Library
|
#include <APM_RC.h> // ArduPilot Mega RC Library
|
||||||
#include <RC_ChannelB.h> // ArduPilot Mega RC Library
|
#include <RC_ChannelB.h> // ArduPilot Mega RC Library
|
||||||
#include <AP_Common.h>
|
|
||||||
#include <AP_EEProm.h>
|
#include <AP_EEProm.h>
|
||||||
|
|
||||||
|
AP_EEPromVar<float> scale(45.0,"RC1_SCALE");
|
||||||
|
AP_EEPromVar<uint16_t> pwmMin(1000,"RC1_PWMMIN");
|
||||||
|
AP_EEPromVar<uint16_t> pwmNeutral(1500,"RC1_PWMNEUTRAL");
|
||||||
|
AP_EEPromVar<uint16_t> pwmMax(2000,"RC1_PWMMAX");
|
||||||
|
AP_EEPromVar<uint16_t> pwmDeadZone(100,"RC1_PWMDEADZONE");
|
||||||
|
|
||||||
|
#define CH_1 0
|
||||||
|
|
||||||
|
// configuration
|
||||||
|
AP_Var<bool> filter(true,"RC1_FILTER");
|
||||||
|
AP_Var<int8_t> reverse(false,"RC1_REVERSE");
|
||||||
|
|
||||||
|
FastSerialPort0(Serial);
|
||||||
|
|
||||||
RC_ChannelB rc[] =
|
RC_ChannelB rc[] =
|
||||||
{
|
{
|
||||||
RC_ChannelB()
|
RC_ChannelB(scale.get(),pwmMin.get(),pwmNeutral.get(),pwmMax.get(),
|
||||||
|
pwmDeadZone.get(),filter.get(),reverse.get())
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
|
@ -22,12 +39,29 @@ void setup()
|
||||||
APM_RC.Init(); // APM Radio initialization
|
APM_RC.Init(); // APM Radio initialization
|
||||||
|
|
||||||
delay(1000);
|
delay(1000);
|
||||||
// setup radio
|
// setup radio
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
Serial.println("looping");
|
rc[CH_1].readRadio(APM_RC.InputCh(CH_1));
|
||||||
delay(1000);
|
Serial.printf("\nrc[CH_1].readRadio(APM_RC.InputCh(CH_1))\n");
|
||||||
|
Serial.printf("pwm: %d position: %f\n",rc[CH_1].getPwm(), rc[CH_1].getPosition());
|
||||||
|
delay(2000);
|
||||||
|
|
||||||
|
scale.set(100);
|
||||||
|
Serial.printf("\nscale.set(100)\n");
|
||||||
|
|
||||||
|
|
||||||
|
rc[CH_1].setPwm(1500);
|
||||||
|
Serial.printf("\nrc[CH_1].setPwm(1500)\n");
|
||||||
|
Serial.printf("pwm: %d position: %f\n",rc[CH_1].getPwm(),
|
||||||
|
rc[CH_1].getPosition());
|
||||||
|
delay(2000);
|
||||||
|
|
||||||
|
rc[CH_1].setPosition(-50);
|
||||||
|
Serial.printf("\nrc[CH_1].setPosition(-50))\n");
|
||||||
|
Serial.printf("pwm: %d position: %f\n",rc[CH_1].getPwm(),
|
||||||
|
rc[CH_1].getPosition());
|
||||||
|
delay(2000);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue