Dear All,
Firt...let me thank you guys working very hard with all these Ardu-things (ArduPilot, ArduCopter, APM, ...). Very nice and I love it!
I have bought a set of APC220 RF sender/receivers for using as telemtry link for my ArduCopter. I could not connect with the APM Mission Planner...got a time-out for "no heartbeat sent". It did however work with HK GCS and QGroundStation so I started to dig into why it did not work with APM. Luckily, the code is available and hence I have now managed to get it to work.
The APC220 requires the RTS and DTR to be false at all times as no handshaking can be used. I also found that the version of ArduCopter (2.4.1) that I have does not send heartbeats on the telemetry port...have I set something up badly here?
To get this to work you can edit the code to change how the OpenBg() is executed in the MavLink.cs according to:
lock (objlock) // so we dont have random traffic
{
log.Info("Open port with " + BaseStream.PortName + " " + BaseStream.BaudRate);
if (useAPC220)
{
// No RTS/DTR at all for this one...
BaseStream.RtsEnable = false;
BaseStream.DtrEnable = false;
BaseStream.Open();
BaseStream.DiscardInBuffer();
}
else
{
BaseStream.Open();
BaseStream.DiscardInBuffer();
BaseStream.toggleDTR();
}
Thread.Sleep(1000);
}
I added a small "useAPC220" propery that I set to "true".
I also added/changed a setting where the code expects the heartbeats to come:
if (useAPC220)
{
// No hearbeats coming from my 2.4.1 FW using APC220...why?
// firmware issue?
sysid = 1;
compid = 1;
mavlinkversion = 2;
aptype = 2;
break;
}
else
{
// incase we are in setup mode
BaseStream.WriteLine("planner\rgcs\r");
buffer = getHeartBeat();
// incase we are in setup mode
BaseStream.WriteLine("planner\rgcs\r");
System.Threading.Thread.Sleep(1);
buffer1 = getHeartBeat();
}
So, I hardcoded some values (version, id's etc) that is coming from the heartbeat package normally.
Anyhow, this is a rather bad approach (but quick and dirty and works for my special case). So, now I wonder if it would be possible to add a few settings in the APM Mission Planner to handle this? Maybe one can have a setting for "use handshake" and one for "expect heartbeat". This would make the APM to be compatible with the APC220 as well.
Well...that was what I had in mind. Thanx once again for your hard work!
/Stefan
Replies
Just tried with v1.1.52, but still no luck with APM2 - doesn't connect, just times out.
Still connects fine to APM1, refresh params works once but not the second time - all params go blank but still get live flight data through. If I power down APM1 (and the APC220 connected to it) and then refresh the params it refreshs fine (but not a second time).
EDIT: I have now just been able to connect to APM2, (after restarting MP and APM2). Have live flight data but cannot read or write params.
I can also confirm that 1.1.51 now works with APC220! The disabling of the RTS worked. Thank you Michael for adding this patch into the code so quick! Very happy and glad that I could contribute back to all you have done!
Hello,
I am using these modules & I am duplexing them for more bandwidth. I do have connection issues from Tim to time but I am sure it user error. do not keep updating you MP after you have lorded your code on to the APM . that seems to have corected miy issues for me.
This work very well even it signal is lost MP start back up when the craft is back in range. I will try APM2 board today to see how well it works.
P.S. MP v1.1.51 also connects fine through the APC220's to APM1, does not however connect to APM2.
I've tested Stefan's fix and it works fine on APM1. So far APM2 doesn't connect with the error below.
Sorry for the OT, but I wanted to get wo of these modules from time ... are well enough? But do not come up to 19200 baud? Enough?
Just wanted to say that I have the same problem, also using APC220, ACM firmware 94c14cef91ab and mission planner .50 . Cannot connect to mission planner due to no heartbeat packets received.
I used to be able to connect just fine with older versions.
what happens if you mode toggledtr() and add
BaseStream.RtsEnable = false; BaseStream.DtrEnable = false;
at the end of the function?