I have so far had Mavlink communication between a PIxhawk with ArduCopter 4.2.3 installed and an Arduino.
There, Arduino was able to receive information such as the attitude angle without any problems.
However, when I updated Pixhawk’s firmware to ArduCopter 4.3, I couldn’t communicate.
I changed the Arduino board and flight controller to a new one, but I was able to confirm that communication would not be possible if I changed to ArduCopter 4.3.
Other than that, Mavlink communication (connection to mission planner) is possible, but communication with Arduino is not possible.
Has there been any change in the Serial specification with ArduCopter 4.3?
Any help would be much appreciated.
Mavlink communication method between PIxhawk and Arduino for reference.
I’m not aware of any changes between 4.2 and 4.3 but it may help to set SERIALx_PROTOCOL = 1 to force the autopilot to use MAVLink1 instead of MAVLink2.
//#define RXpin 0
//#define TXpin 1
//SoftwareSerial SerialMAV(RXpin, TXpin); // sets up serial communication on pins 3 and 2
float pitch=0,roll=0,Z=0;
int count=0,count2=0;
unsigned long times=0,timee=0,timeprint;
void setup() {
Serial1.begin(115200); //RXTX from Pixhawk (Port 19,18 Arduino Mega)
Serial.begin(115200); //Main serial port for console output
//function called by arduino to read any MAVlink messages sent by serial communication from flight controller to arduino
void MavLink_receive()
{
mavlink_message_t msg;
mavlink_status_t status;
//Get new message
if(mavlink_parse_char(MAVLINK_COMM_0, c, &msg, &status))
{
//Handle new message from autopilot
switch(msg.msgid)
{
case MAVLINK_MSG_ID_ATTITUDE:
{
mavlink_attitude_t packet;
mavlink_msg_attitude_decode(&msg, &packet);
roll=packet.roll * 180/M_PI;
pitch=packet.pitch * 180/M_PI;
timeprint=packet.time_boot_ms;
count++;
}
break;
}
}
}
}
void request_datastream() {
//Request Data from Pixhawk
uint8_t _system_id = 255; // id of computer which is sending the command (ground control software has id of 255)
uint8_t _component_id = 2; // seems like it can be any # except the number of what Pixhawk sys_id is
uint8_t _target_system = 1; // Id # of Pixhawk (should be 1)
uint8_t _target_component = 0; // Target component, 0 = all (seems to work with 0 or 1
uint8_t _req_stream_id = 0;
uint16_t _req_message_rate = 0x5A; //number of times per second to request the data in hex
uint8_t _start_stop = 1; //1 = start, 0 = stop
I did not find anything obvious with your code, but here are some things you could try:
I would recommend to use the official Mavlink c library. Put this into your libraries folder and to make this work with Arduino you will have to create a new file, named e.g. mavlinkv2.h and put this line into it: “#include “ardupilotmega/mavlink.h””. In your sketch just inlcude the file you just created (#include <mavlinkv2.h> in this example).
Also you only have to call REQUEST_DATA_STREAM or SET_MESSAGE_INTERVAL once in setup(), so delete it from your loop(). You will however have to make sure, that Ardupilot has already booted before you send this message to it. You could use a delay() first to test, but it would be better to wait for the first heartbeat from Ardupilot.
Make sure to use the correct quotation mark “” with strings. You are using the wrong one in your debug messages with Serial.print("roll: ") for e.g.
What are you trying to do with times, timee and timeprint? They don´t do anything in your code.