DRONEFIGHTER2017 / Protocol / Structs
Modified : 2017.10.18
데이터 송수신 시에 사용하는 구조체들을 소개합니다.
Protocol::Ping
특정 장치가 존재하는지를 확인할 때 사용합니다. 응답은 Ack를 받습니다.
namespace Protocol
{
struct Ping
{
u32 systemTime; // Ping을 전송하는 장치의 시각
};
}
- 이 데이터를 받은 장치는 Protocol::Ack를 응답으로 보냄
Protocol::Ack
특정한 데이터를 요청하지 않은 경우에 Ack를 응답으로 전송합니다. 수신 받은 데이터의 crc16을 포함하여 돌려보내기 때문에 데이터를 전송한 측에서 정상적으로 데이터를 전송했는지 판별하는데 사용합니다.
namespace Protocol
{
struct Ack
{
u32 systemTime; // 수신 받은 시간
u8 dataType; // 수신 받은 데이터 타입
u16 crc16; // 수신 받은 데이터의 crc16
};
}
- dataType : Protocol::DataType::Type
- 명확하게 데이터를 요청한 경우에는 해당 데이터를 응답을 보내고, 그 이외에는 모두 Protocol::Ack를 응답으로 전송.
- 수신 받은 데이터의 crc16을 다시 응답으로 보냄. 데이터를 전송한 장치에서 해당 데이터가 정상적으로 전달되었는지를 확인하는 용도로 사용.
Protocol::Request
PETRONE에 데이터를 요청할 때 사용합니다.
namespace Protocol
{
struct Request
{
u8 dataType; // 요청할 데이터 타입
};
}
- dataType : Protocol::DataType::Type
Control::Double8
PETRONE 자동차 조종 시에 사용합니다. 드론 모드일 때 이 명령을 전송하면 무시합니다.
namespace Control
{
struct Double8
{
s8 wheel; // wheel
s8 accel; // accel
};
}
Control::Double8 입력 값의 범위는 다음과 같습니다
이름 | 형식 | 범위 | 방향 | 음수 값(-) | 양수 값(+) |
---|---|---|---|---|---|
wheel | s8 | -100 ~ 100 | 좌우 회전 | 좌회전 | 우회전 |
accel | s8 | -100 ~ 100 | 전후진 속도 | 후진 | 전진 |
Control::Quad8
PETRONE 드론 및 자동차 조종 시에 사용합니다.
namespace Control
{
struct Quad8
{
s8 roll; // roll
s8 pitch; // pitch
s8 yaw; // yaw
s8 throttle; // throttle
};
}
Control 입력 값의 범위는 다음과 같습니다. Drive 모드에서는 throttle(전후)과 roll(좌우)만 사용합니다.
이름 | 형식 | 범위 | 방향 | 음수 값(-) | 양수 값(+) |
---|---|---|---|---|---|
roll | s8 | -100 ~ 100 | 좌우 이동 | 좌측 | 우측 |
pitch | s8 | -100 ~ 100 | 전후 이동 | 후방 | 전방 |
yaw | s8 | -100 ~ 100 | 좌우 회전 | 반시계 | 시계 방향 |
throttle | s8 | -100 ~ 100 | 승하강 | 하강 | 상승 |
Protocol::Command
PETRONE의 설정을 변경하거나 데이터를 요청할 때 사용합니다.
namespace Protocol
{
struct Command
{
u8 commandType; // 명령 타입
u8 option; // 명령에 대한 옵션
};
}
- commandType : Protocol::CommandType::Type
- option : Mode::Vehicle::Type, Coordinate::Type, System::Trim::Type, System::FlightEvent::Type, Protocol::DataType::Type, UserInterface::Preset::Type
Protocol::Address
장치 주소를 반환합니다.
namespace Protocol
{
struct Address
{
u8 address[8];
};
}
- BLE나 Zigbee 등의 통신 장치이면서 고유 주소가 부여된 경우 해당 장치의 고유 주소를 반환(DroneFighter는 통신에 Zigbee를 사용하고 있고, 통신 칩의 MAC Address를 Address로 사용함.)
Protocol::State
PETRONE의 현재 상태값을 반환합니다.
namespace Protocol
{
struct State
{
u8 modeVehicle; // 동작 모드
u8 modeSystem; // 시스템 모드
u8 modeFlight; // 비행 모드
u8 modeDrive; // 주행 모드
u8 sensorOrientation; // 센서 방향
u8 coordinate; // 방위
u8 battery; // 배터리량(0 ~ 100)
};
}
- modeVehicle : Mode::Vehicle::Type
- modeSystem : Mode::System::Type
- modeFlight : Mode::Flight::Type
- modeDrive : Mode::Drive::Type
- sensorOrientation : SensorOrientation::Type
- coordinate : Coordinate::Type
Protocol::Attitude
자세값을 반환합니다.
namespace Protocol
{
struct Attitude
{
s16 roll; // Roll
s16 pitch; // Pitch
s16 yaw; // Yaw
};
}
드론의 자세를 확인할 때의 사용 범위는 다음과 같습니다.
이름 | 형식 | 범위 | 설명 |
---|---|---|---|
roll | s16 | -180 ~ 180 | 좌우 기울기 각도 |
pitch | s16 | -180 ~ 180 | 전후 기울기 각도 |
yaw | s16 | 0 ~ 360 | 중력 방향을 축으로 회전할 때의 각도 |
자이로 센서 데이터를 확인할 때의 사용 범위는 다음과 같습니다.
이름 | 형식 | 범위 |
---|---|---|
roll | s16 | -32768 ~ 32767 |
pitch | s16 | -32768 ~ 32767 |
yaw | s16 | -32768 ~ 32767 |
Protocol::GyroBias
자이로 바이어스 값을 반환합니다.
namespace Protocol
{
struct GyroBias
{
s16 roll; // Roll
s16 pitch; // Pitch
s16 yaw; // Yaw
};
}
Protocol::TrimFlight
비행 Trim을 조정할 때 사용합니다.
namespace Protocol
{
struct TrimFlight
{
s16 roll; // Roll
s16 pitch; // Pitch
s16 yaw; // Yaw
s16 throttle; // Throttle
};
}
Protocol::TrimDrive
자동차 Trim을 조정할 때 사용합니다.
namespace Protocol
{
struct TrimDrive
{
s16 wheel; // Wheel
};
}
Protocol::TrimAll
비행 및 자동차 Trim을 한 번에 조정할 때 사용합니다.
namespace Protocol
{
struct TrimAll
{
TrimFlight flight;
TrimDrive drive;
};
}
- flight : Protocol::TrimFlight
- drive : Protocol::TrimDrive
Protocol::CountFlight
비행과 관련된 저장값을 읽을 때 사용합니다.
namespace Protocol
{
struct CountFlight
{
u32 timeFlight; // 비행 시간
u16 countTakeOff; // 이륙 횟수
u16 countLanding; // 착륙 횟수
u16 countAccident; // 충돌 횟수
};
}
Protocol::CountDrive
주행과 관련된 저장값을 읽을 때 사용합니다.
namespace Protocol
{
struct CountDrive
{
u32 timeDrive; // 주행 시간
u16 countAccident; // 충돌 횟수
};
}
countAccident 변수는 주행 중 충돌을 카운트 하기 위해 만든 변수이나 실제 주행 시 노면이 고르지 못할 때의 충격에 의해서도 카운트가 증가하는 문제가 있습니다. 현재로는 크게 의미가 없는 값으로 생각하시면 됩니다.
Protocol::IrMessage
IR 데이터를 전송하는데 사용하거나, IR 데이터를 수신 받았을 때 외부 장치로 전송하는 데이터입니다.
namespace Protocol
{
struct IrMessage
{
u32 irData; // IR 메세지
};
}
- 페트론에서는 4바이트를 모두 사용하나 현재 드론파이터에서는 7비트만 사용합니다. 따라서 0 ~ 127 사이의 값만 전달 가능합니다.
Protocol::Imu
자이로 센서에서 출력한 값과 내부에서 계산한 드론의 자세 값을 반환합니다.
namespace Protocol
{
struct Imu
{
u32 systemTime;
s16 accX;
s16 accY;
s16 accZ;
s16 gyroRoll;
s16 gyroPitch;
s16 gyroYaw;
s16 angleRoll;
s16 anglePitch;
s16 angleYaw;
};
}
Protocol::Button
버튼 입력 값입니다.
namespace Protocol
{
struct Button
{
u8 button;
};
}
Protocol::Motor
모터를 동작시키거나, 현재 모터에 입력된 값을 확인할 때 사용합니다. 주로 모터 4개를 동시에 작동하거나 동작을 확인하는 데 사용합니다. 이 때에는 아래의 구조체를 배열로 사용합니다.
namespace Protocol
{
struct Motor
{
u8 direction;
s16 value;
};
}
- 데이터 영역에 Protocol::Motor 배열 4개를 사용하여 전송. 차례대로 0, 1, 2, 3 번 모터에 적용함. 순서는 좌측 앞 모터부터 시계 방향. 드론파이터는 모터 역회전이 안되는 관계로 Motor::Direction::None 또는 Motor::Direction::Forward 사용. Motor::Direction::None 사용 시 해당 값은 모터 제어에 적용하지 않음.
- direction : Motor::Direction::Type
- value : 0 ~ 4095
Protocol::MotorSingle
하나의 모터를 동작시키거나, 현재 모터에 입력된 값을 확인할 때 사용합니다.
namespace Protocol
{
struct MotorSingle
{
u8 target;
u8 direction;
s16 value;
};
}
- 지정한 번호의 모터를 작동시킬 때 사용. 드론파이터는 모터 역회전이 안되는 관계로 Motor::Direction::None 또는 Motor::Direction::Forward 사용. Motor::Direction::None 사용 시 해당 값은 모터 제어에 적용하지 않음.
- target : Motor::Part::Type
- direction : Motor::Direction::Type
- value : 0 ~ 4095
Protocol::JoystickBlock
조종기 조이스틱 한 축의 입력 값입니다.
namespace Protocol
{
struct JoystickBlock
{
s8 x; // X축의 값(-100 ~ 100)
s8 y; // Y축의 값(-100 ~ 100)
u8 direction; // 조이스틱의 방향(Joystick::Direction::Type)
u8 event; // 조이스틱의 방향 이벤트(Joystick::Event::Type)
u8 command; // 조이스틱 명령(Joystick::Command::Type)
};
}
- x : 조이스틱 가로축, -100 ~ 100
- y : 조이스틱 세로축, -100 ~ 100
- direction : Joystick::Direction::Type
- event : Joystick::Event::Type
- command : Joystick::Command::Type
Protocol::Joystick
조종기 좌우 조이스틱의 입력 값입니다.
namespace Protocol
{
struct Joystick
{
Protocol::JoystickBlock left;
Protocol::JoystickBlock right;
};
}
- left : Protocol::JoystickBlock
- right : Protocol::JoystickBlock
Protocol::Buzzer
조이스틱 버저 소리를 낼 때 사용합니다.
namespace Protocol
{
struct Buzzer
{
u8 mode; // 버저 작동 모드
u16 value; // 옥타브 또는 주파수
u16 time; // 연주 시간(ms)
};
}
- mode : Buzzer::Mode::Type
- value : mode에서 ScaleInstantly 또는 ScaleContinually를 선택한 경우 Buzzer::Scale::Type, HzInstantly 또는 HzContinually를 선택한 경우 0 ~ 8000(Hz)
- time : 0 ~ 65535(ms)
Protocol::Vibrator
조이스틱 진동 모터를 제어할 때 사용합니다.
namespace Protocol
{
struct Vibrator
{
u8 mode; // 모드(0은 set, 1은 reserve)
u16 on; // 진동을 켠 시간(ms)
u16 off; // 진동을 끈 시간(ms)
u16 total; // 전체 진행 시간(ms)
};
}
- mode : Vibrator::Mode::Type
- on : 0 ~ 65535(ms)
- off : 0 ~ 65535(ms)
- total : 0 ~ 65535(ms)
Protocol::UserInterface
조이스틱 설정 모드에서 각 버튼 및 조이스틱 방향에 원하는 기능을 지정할 때 사용합니다.
namespace Protocol
{
struct UserInterface
{
u8 command; // 명령
u8 function; // 기능
};
}
- command : UserInterface::Commands
- function : UserInterface::Functions
Protocol::Pairing
장치 페어링 시 사용합니다.
namespace Protocol
{
struct Pairing
{
u16 addressLocal;
u16 addressRemote;
u8 channel;
};
}
- addressLocal : 0x0001 ~ 0xFFFE, 0x0000은 사용하지 않음, 0xFFFF는 Broadcasting에 사용
- addressRemote : 0x0001 ~ 0xFFFE, 0x0000은 사용하지 않음, 0xFFFF는 Broadcasting에 사용
- channel : 0 ~ 255(미확정)
DRONE FIGHTER 2017
- Intro
- Typedef
- DataType
- Definitions
- Structs
- Structs - Light