Firmware and Windows Client are made from a modified version of the orginal one found here : arducam-osd
Update 30 January 2013, new version include :
- Possibility to choose what parameter to tune with CH6
To enable this feature and display selectable parameter screen (screen 1) :
- motors must be disarmed
- CH7 switch is engaged
- Full throttle and full pitch
After you'll we see a check screen (screen 2) where you have to :
- Put throttle in low position
- Put pitch in middle position
- Put CH6 in middle position
Then you can select parameter (screen 3) to tune with CH6, those parameters are :
- STABILIZE_KP
- RATE_KP
- RATE_KI
- LOITER_KP
- LOITER_RATE_KP
- LOITER_RATE_KI
- NAV_KP
- NAV_KI
- Move pitch stick to move between parameter list
- Select with full throttle a parameter to be tune with CH6
- Quit screen and start tuning the selected paramter with CH7 switchin off position
After tuning a paramter, go back to screen 3, and save new parameter value with yaw stick to the left.
Compiled firmware : 20130129_ArduCAM_OSD_.rssi.time.status.climb.current.tuning.mavlink1.0.hex
Firmware sources : Arducam_osd_src.zip
Update 16 August 2012, new version include :
- Mavlink 1.0 support
- Flying time (count when throttle is above 20%)
Compiled firmware : ArduCAM_OSD_.rssi.time.status.mavlink1.0.hex
Firmware sources : Arducam_osd_src.zip
Windows client sources : OSD_IDE.zip
Update 23 May 2012, new version include :
- RSSI Display
- T° display (maybe useless :) )
- Climb rate
- Armed / Disarmed status (with Flight Mode)
- Speed in km/h
- No more "Charset update"
- Battery remaining (not tested)
"Charset update" was removed hardcoded, so to upload a new charset, you'll have to use the orginal firmware to do it and after you can use this firmware.
This new version need a new charset (MinimOSD_20.mcm) and the new client
Firmware : ArduCAM_OSD.rssi.amp.status.hex
Client : OSD_Config_RSSI_Status_Amp.exe
Charset : MinimOSD_20.mcm
Comments
Just incase someone wanted the info.
Rssi on APM 2.50 ArduPlane changes needed
In
GCS_Mavlink find
static void NOINLINE send_radio_in(mavlink_channel_t chan)
{
uint8_t rssi = 1;
mavlink_msg_rc_channels_raw_send(
chan,
millis(),
0, // port
g.channel_roll.radio_in,
g.channel_pitch.radio_in,
g.channel_throttle.radio_in,
g.channel_rudder.radio_in,
g.rc_5.radio_in, // XXX currently only 4 RC channels defined
g.rc_6.radio_in,
g.rc_7.radio_in,
g.rc_8.radio_in,
rssi);
}
comment out the "uint8_t rssi = 1;"
should look like this
static void NOINLINE send_radio_in(mavlink_channel_t chan)
{
//uint8_t rssi = 1;
mavlink_msg_rc_channels_raw_send(
chan,
millis(),
0, // port
g.channel_roll.radio_in,
g.channel_pitch.radio_in,
g.channel_throttle.radio_in,
g.channel_rudder.radio_in,
g.rc_5.radio_in, // XXX currently only 4 RC channels defined
g.rc_6.radio_in,
g.rc_7.radio_in,
g.rc_8.radio_in,
rssi);
}
This will allow the message to send a value, instead of a fixed 1.
Next in the sensors section find the following section
static void read_battery(void)
{
if(g.battery_monitoring == 0) {
battery_voltage1 = 0;
return;
}
if(g.battery_monitoring == 3 || g.battery_monitoring == 4) {
static AP_AnalogSource_Arduino bat_pin(BATTERY_PIN_1);
battery_voltage1 = BATTERY_VOLTAGE(bat_pin.read_average());
}
if(g.battery_monitoring == 4) {
static AP_AnalogSource_Arduino current_pin(CURRENT_PIN_1);
current_amps1 = CURRENT_AMPS(current_pin.read_average());
current_total1 += current_amps1 * (float)delta_ms_medium_loop * 0.0002778; // .0002778 is 1/3600 (conversion to hours)
}
#if BATTERY_EVENT == ENABLED
if(battery_voltage1 < LOW_VOLTAGE) low_battery_event();
if(g.battery_monitoring == 4 && current_total1 > g.pack_capacity) low_battery_event();
#endif
}
a whole section will be added. it should look like this for APM2
static void read_battery(void)
{
static AP_AnalogSource_Arduino RSSI_pin(8); //on amp1 is A7 pin closes to xbee pins.
temprssi = RSSI_pin.read_average(); //need rssi to be 8 bit value so div by 4, highest value is 1024
temprssi = temprssi - 4;
if (temprssi < 0 ){
temprssi = 0;
}
rssi = temprssi / 4; // by now rssi should be 0 to 255, on decode * by 4 for full value, lose 4 points
if(g.battery_monitoring == 0) {
battery_voltage1 = 0;
return;
}
if(g.battery_monitoring == 3 || g.battery_monitoring == 4) {
static AP_AnalogSource_Arduino bat_pin(BATTERY_PIN_1);
battery_voltage1 = BATTERY_VOLTAGE(bat_pin.read_average());
}
if(g.battery_monitoring == 4) {
static AP_AnalogSource_Arduino current_pin(CURRENT_PIN_1);
current_amps1 = CURRENT_AMPS(current_pin.read_average());
current_total1 += current_amps1 * (float)delta_ms_medium_loop * 0.0002778; // .0002778 is 1/3600 (conversion to hours)
}
#if BATTERY_EVENT == ENABLED
if(battery_voltage1 < LOW_VOLTAGE) low_battery_event();
if(g.battery_monitoring == 4 && current_total1 > g.pack_capacity) low_battery_event();
#endif
}
if you have a AMP1 then just one change,static AP_AnalogSource_Arduino RSSI_pin(8), to static AP_AnalogSource_Arduino RSSI_pin(7)
There seems to be a new command in the APM libarys "AP_AnalogSource_Arduino", this seems to override the analogRead() command?
last add the next two varables.
static uint8_t rssi = 1;
static uint16_t temprssi = 0;
I put then in the ArduPlane section, radio area, see sample.
////////////////////////////////////////////////////////////////////////////////
// Radio
////////////////////////////////////////////////////////////////////////////////
// This is the state of the flight control system
// There are multiple states defined such as MANUAL, FBW-A, AUTO
byte control_mode = INITIALISING;
// Used to maintain the state of the previous control switch position
// This is set to -1 when we need to re-read the switch
byte oldSwitchPosition;
// This is used to enable the inverted flight feature
bool inverted_flight = false;
// These are trim values used for elevon control
// For elevons radio_in[CH_ROLL] and radio_in[CH_PITCH] are equivalent aileron and elevator, not left and right elevon
static uint16_t elevon1_trim = 1500;
static uint16_t elevon2_trim = 1500;
// These are used in the calculation of elevon1_trim and elevon2_trim
static uint16_t ch1_temp = 1500;
static uint16_t ch2_temp = 1500;
// These are values received from the GCS if the user is using GCS joystick
// control and are substituted for the values coming from the RC radio
static int16_t rc_override[8] = {0,0,0,0,0,0,0,0};
// A flag if GCS joystick control is in use
static bool rc_override_active = false;
static uint8_t rssi = 1;
static uint16_t temprssi = 0;
Be sure if compiling for a APM2 that you have
# define CONFIG_APM_HARDWARE APM_HARDWARE_APM2
in the APM_Config.h.
I have tested it on the APM2 in flight, and it doesn't seem to afect the operation of the 2.50 APM code. I have also loaded it into the APM1, and tested on the MiniOsd.
Of course code for the MiniOsd has to have changes to but should be posted soon, see the following link for info on that.
Could you explain how to, where to, connect rssi wires to APM1??
THX :)
Hi
How can i connect my receiver?
Is there a picture? :)
OK... thanks for the information :) I will try that
No mavlink 1.0 version done and planed yet. If you want to use my custom firmware with arducopter 2.6, you can disable Mavlink 1.0 and then it will ouput mavlink 0.9 messages
I just wanted to check if you have made a mavlink 1.0 version of your minimosd firmware... I was using your firmware before and that solved the problem having to restart the minimosd at every startup of the APM.. but now when the newest firmware of the APM is using mavlink 1.0 your minim osd firmware does not work...
I got a problem with Arducopter 2.6, it's impossible de read any value from analog pin A9 to A4 (issue 417), so RSSI display is always 0 for me. Anybody has the same problem here ?
Add this parameter #define MAVLINK10 DISABLED in APM_Config.h to make firmware working with MAVLink 0.9
Yes