e_drone for python / Protocol

Modified : 2018.7.6


데이터 송수신과 관련된 정의를 소개합니다.



DataType

데이터 타입

전송하는 데이터의 형식을 알려줍니다.

class DataType(Enum):
    
    None_                       = 0x00      # 없음
    
    Ping                        = 0x01      # 통신 확인
    Ack                         = 0x02      # 데이터 수신에 대한 응답
    Error                       = 0x03      # 오류(reserve 비트 플래그는 추후에 지정)
    Request                     = 0x04      # 지정한 타입의 데이터 요청
    Message                     = 0x05      # 문자열 데이터
    Reserved_1                  = 0x06      # 예약
    SystemInformation           = 0x07      # 시스템 정보
    Monitor                     = 0x08      # 디버깅용 값 배열 전송. 첫번째 바이트에 타입 두 번째 바이트에 페이지 지정(수신 받는 데이터의 저장 경로 구분)
    SystemCount                 = 0x09      # 시스템 카운트
    Information                 = 0x0A      # 장치 정보
    UpdateLocation              = 0x0B      # 펌웨어 업데이트 위치 정정
    Update                      = 0x0C      # 펌웨어 업데이트
    Encrypt                     = 0x0D      # 펌웨어 암호화
    Address                     = 0x0E      # 장치 주소
    Administrator               = 0x0F      # 관리자 권한 획득
    Control                     = 0x10      # 조종 명령

    Command                     = 0x11      # 명령
    Pairing                     = 0x12      # 페어링
    Rssi                        = 0x13      # RSSI

    # Light
    LightManual                 = 0x20      # LED 수동 제어

    LightMode                   = 0x21      # LED 모드 지정
    LightModeCommand            = 0x22      # LED 모드 커맨드
    LightModeColor              = 0x23      # LED 모드 3색 직접 지정
    LightModeColorCommand       = 0x24      # LED 모드 3색 직접 지정 커맨드
    LightModeColors             = 0x25      # LED 모드 팔레트의 색상으로 지정
    LightModeColorsCommand      = 0x26      # LED 모드 팔레트의 색상으로 지정 커맨드

    LightEvent                  = 0x27      # LED 이벤트
    LightEventCommand           = 0x28      # LED 이벤트 커맨드
    LightEventColor             = 0x29      # LED 이벤트 3색 직접 지정
    LightEventColorCommand      = 0x2A      # LED 이벤트 3색 직접 지정 커맨드
    LightEventColors            = 0x2B      # LED 이벤트 팔레트의 색상으로 지정
    LightEventColorsCommand     = 0x2C      # LED 이벤트 팔레트의 색상으로 지정 커맨드

    LightModeDefaultColor       = 0x2D      # LED 초기 모드 3색 직접 지정

    # 상태, 센서
    State                       = 0x40      # 드론의 상태(비행 모드 방위기준 배터리량)
    Attitude                    = 0x41      # 드론의 자세(Angle)
    Altitude                    = 0x42      # 높이, 고도
    Motion                      = 0x43      # Motion 센서 데이터(IMU)
    Flow                        = 0x44      # Flow

    # 설정
    Count                       = 0x50      # 카운트
    Bias                        = 0x51      # 엑셀, 자이로 바이어스 값
    Trim                        = 0x52      # 트림
    Weight                      = 0x53      # 무게

    # Devices
    Motor                       = 0x60      # 모터 제어 및 현재 제어값 확인
    MotorSingle                 = 0x61      # 한 개의 모터 제어
    Buzzer                      = 0x62      # 부저 제어
    Vibrator                    = 0x63      # 진동 제어

    # Input
    Button                      = 0x70      # 버튼 입력
    Joystick                    = 0x71      # 조이스틱 입력

    # Display
    DisplayClear                = 0x80      # 화면 지우기
    DisplayInvert               = 0x81      # 화면 반전
    DisplayDrawPoint            = 0x82      # 점 그리기
    DisplayDrawLine             = 0x83      # 선 그리기
    DisplayDrawRect             = 0x84      # 사각형 그리기
    DisplayDrawCircle           = 0x85      # 원 그리기
    DisplayDrawString           = 0x86      # 문자열 쓰기
    DisplayDrawStringAlign      = 0x87      # 문자열 쓰기
    DisplayDrawImage            = 0x88      # 그림 그리기

    # Information Assembled
    InformationAssembledForController   = 0xA0      # 자주 갱신되는 비행 데이터 모음
    InformationAssembledForEntry        = 0xA1      # 자주 갱신되는 비행 데이터 모음

    # Navigation
    NavigationTarget                    = 0xD0,     # 네비게이션 목표점
    NavigationLocation                  = 0xD1,     # 네비게이션 가상 위치
    NavigationMonitor                   = 0xD2,
    NavigationHeading                   = 0xD3,
    NavigationCounter                   = 0xD4,

    GpsRtkNavigationState               = 0xDA,     # RTK RAW 데이터 전송
    GpsRtkExtendedRawMeasurementData    = 0xDB,     # RTK RAW 데이터 전송

    EndOfType                           = 0xDC



CommandType

명령 타입

단일 명령 또는 추가 옵션을 보내는 것으로 실행할 수 있는 기능들을 담고 있습니다.

class CommandType(Enum):
    
    None_                   = 0x00      # 없음

    Stop                    = 0x01      # 정지

    # 설정
    ModeControlFlight       = 0x02      # 비행 제어 모드 설정
    Headless                = 0x03      # 헤드리스 모드 선택
    Trim                    = 0x04      # 트림 변경

    ClearBias               = 0x05      # 자이로 바이어스 리셋(트림도 같이 초기화 됨)
    ClearTrim               = 0x06      # 트림 초기화

    FlightEvent             = 0x07      # 비행 이벤트 실행

    # Navigation
    NavigationTargetClear   = 0xE0      # 네비게이션 목표점 초기화
    NavigationStart         = 0xE1      # 네비게이션 시작(처음부터)
    NavigationPause         = 0xE2      # 네비게이션 일시 정지
    NavigationRestart       = 0xE3      # 네비게이션 다시 시작(일시 정지 후 다시 시작할 때 사용)
    NavigationStop          = 0xE4      # 네비게이션 중단
    NavigationNext          = 0xE5      # 네비게이션 목표점을 다음으로 변경
    NavigationReturnToHome  = 0xE6      # 시작 위치로 귀환
    
    GpsRtkBase              = 0xEA
    GpsRtkRover             = 0xEB

    EndOfType               = 0xA2



Header

헤더

헤더 뒤에 이어지는 데이터의 타입과 길이, 데이터를 전송하는 곳과 수신 받을 곳을 담고 있습니다.

class Header(ISerializable):

    def __init__(self):
        self.dataType    = DataType.None_
        self.length      = 0
        self.from_       = DeviceType.None_
        self.to_         = DeviceType.None_
변수 이름 형식 범위 크기 설명
dataType DataType - 1 Byte 데이터의 타입
length UInt8 0 ~ 255 1 Byte 데이터의 길이
from_ DeviceType - 1 Byte 데이터를 전송하는 장치
to_ DeviceType - 1 Byte 데이터를 수신하는 장치



Ping

Ping

다른 장치와의 연결 상태를 확인할 때 사용합니다. 상대 장치는 Ping에 대한 응답으로 Ack를 전송합니다.

조종기나 드론에서 Ping 전송 시 systemTime에는 Ping을 전송하는 장치의 시스템 시간 값이 들어갑니다.

class Ping(ISerializable):

    def __init__(self):
        self.systemTime     = 0
변수 이름 형식 범위 크기 설명
systemTime UInt64 - 8 Byte 시스템 시간



Ack

응답

드론이나 조종기에 데이터 요청을 전송한 경우 해당하는 데이터를 응답합니다. 만약 해당 데이터가 준비되지 않은 경우에는 Ack를 응답으로 전송합니다.

데이터를 전송한 장치는 Ack를 확인하여 데이터가 정상적으로 전달되었는지 확인할 수 있습니다.

class Ack(ISerializable):

    def __init__(self):
        self.systemTime     = 0
        self.dataType       = DataType.None_
        self.crc16          = 0
변수 이름 형식 범위 크기 설명
systemTime UInt64 - 8 Byte 시스템 시간
dataType DataType - 1 Byte 수신 받은 데이터 타입
crc16 UInt16 - 2 Byte 수신 받은 헤더와 데이터의 CRC16 값



Error

오류

드론에 문제가 생긴 경우 Error 클래스를 600ms 주기로 RF를 통해 전송합니다.

errorFlagsForSensor와 errorFlagsForState는 각각의 값에 해당하는 플래그를 조합하여 여러 오류들이 동시에 발생하는 것을 표시합니다.

문제가 완전히 없어진 경우 Error 플래그를 0으로 초기화하여 추가로 5회 전송 후 전송을 중단합니다.

class Error(ISerializable):

    def __init__(self):
        self.systemTime             = 0
        self.errorFlagsForSensor    = 0
        self.errorFlagsForState     = 0
변수 이름 형식 범위 크기 설명
systemTime UInt64 - 8 Byte 시스템 시간
errorFlagsForSensor ErrorFlagsForSensor - 4 Byte 센서 오류 플래그 조합
errorFlagsForState ErrorFlagsForState - 4 Byte 상태 오류 플래그 조합



Request

요청

드론이나 조종기에 데이터를 요청할 때 사용합니다.

class Request(ISerializable):

    def __init__(self):
        self.dataType    = DataType.None_
변수 이름 형식 범위 크기 설명
dataType DataType - 1 Byte 요청할 데이터 타입



Message

요청

문자열 데이터를 전송할 때 사용합니다.

class Message():

    def __init__(self):
        self.message    = ""
변수 이름 형식 범위 크기 설명
message ASCII String - 장치에 따라 다름 메세지



Version

버전

펌웨의 버전

class Version(ISerializable):

    def __init__(self):
        self.build          = 0
        self.minor          = 0
        self.major          = 0

        self.v              = 0         # build, minor, major을 하나의 UInt32로 묶은 것(버전 비교 시 사용)
변수 이름 형식 범위 크기 설명
build UInt16 0 ~ 65535 2 Byte 빌드 번호
minor UInt8 0 ~ 255 1 Byte 부 번호
major UInt8 0 ~ 255 1 Byte 주 번호
v UInt32 - 4 Byte build, minor, major를 하나로 묶은 것



SystemInformation

시스템 정보

드론과 조종기 간 장치 정보를 교환하는데 사용합니다. 추후에 계속 변경될 가능성이 있습니다.

class SystemInformation(ISerializable):

    def __init__(self):
        self.crc32bootloader    = 0
        self.crc32application   = 0
변수 이름 형식 범위 크기 설명
crc32bootloader UInt32 - 4 Byte Bootloader 영역의 CRC32
crc32application UInt32 - 4 Byte Application 영역의 CRC32



Information

펌웨어 정보

현재 펌웨어의 정보와 업데이트 진행 상황 등을 포함하고 있습니다.

class Information(ISerializable):

    def __init__(self):
        self.modeUpdate     = ModeUpdate.None_

        self.modelNumber    = ModelNumber.None_
        self.version        = Version()

        self.year           = 0
        self.month          = 0
        self.day            = 0
변수 이름 형식 범위 크기 설명
modeUpdate ModeUpdate - 1 Byte 업데이트 진행 상황
modelNumber ModelNumber - 4 Byte 모델 번호
version Version - 4 Byte 펌웨어의 버전
year UInt16 - 2 Byte 펌웨어 빌드 년
month UInt8 - 1 Byte 펌웨어 빌드 월
day UInt8 - 1 Byte 펌웨어 빌드 일



Address

장치 주소

장치에 부여되는 고유 번호입니다.

class Address(ISerializable):

    def __init__(self):
        self.address    = bytearray()
변수 이름 형식 범위 크기 설명
address UInt8 Array - 16 Byte 장치 주소



Command

명령

드론 또는 조종기에 명령을 전달할 때 사용합니다.

option에는 각 형식의 value 값 또는 숫자 값을 넣으셔야 합니다.

class Command(ISerializable):

    def __init__(self):
        self.commandType    = CommandType.None_
        self.option         = 0
변수 이름 형식 범위 크기 설명
commandType CommandType - 1 Byte 명령 타입
option ModeControlFlight - 1 Byte 옵션
  FlightEvent - 1 Byte  
  Headless - 1 Byte  
  Trim - 1 Byte  
  UInt8 - 1 Byte  



Pairing

페어링

장치의 페어링 정보를 확인하거나 변경할 때 사용합니다.

class Pairing(ISerializable):

    def __init__(self):
        self.address0       = 0
        self.address1       = 0
        self.address2       = 0
        self.scramble        = 0
        self.channel        = 0
변수 이름 형식 범위 크기 설명
address0 UInt16 0 ~ 65535 2 Byte 장치의 주소 0
address1 UInt16 0 ~ 65535 2 Byte 장치의 주소 1
address2 UInt16 0 ~ 65535 2 Byte 장치의 주소 2
scramble UInt16 0 ~ 127 1 Byte 스크램블
channel UInt8 0 ~ 81 1 Byte 채널



Rssi

RSSI

Received signal strength indication

http://www.metageek.com/training/resources/understanding-rssi.html

현재 무선으로 연결된 장치의 신호 세기를 반환합니다.

class Rssi(ISerializable):

    def __init__(self):
        self.rssi       = 0
변수 이름 형식 범위 크기 설명
rssi Int8 -100 ~ 0 1 Byte 신호 세기



ControlQuad8

비행 조종

비행 및 주행에 모두 사용할 수 있습니다.

class ControlQuad8(ISerializable):

    def __init__(self):
        self.roll       = 0
        self.pitch      = 0
        self.yaw        = 0
        self.throttle   = 0
변수 이름 형식 범위 크기 설명
roll Int8 -100 ~ 100 1 Byte Roll
pitch Int8 -100 ~ 100 1 Byte Pitch
yaw Int8 -100 ~ 100 1 Byte Yaw
throttle Int8 -100 ~ 100 1 Byte Throttle



Trim

비행 트림 설정

호버링 시 기체가 한쪽으로 쏠리는 현상이 발생하면 반대 방향으로 적절한 값을 주어 정상적으로 동작하게 만들 수 있습니다.

class Trim(ISerializable):

    def __init__(self):
        self.roll       = 0
        self.pitch      = 0
        self.yaw        = 0
        self.throttle   = 0
변수 이름 형식 범위 크기 설명
roll Int16 -200 ~ 200 2 Byte Roll
pitch Int16 -200 ~ 200 2 Byte Pitch
yaw Int16 -200 ~ 200 2 Byte Yaw
throttle Int16 -200 ~ 200 2 Byte Throttle



LightModeDrone

드론 LED 동작 모드

class LightModeDrone(Enum):
    
    None_                   = 0x00

    FrontNone               = 0x10
    FrontManual             = 0x11      # 수동 제어
    FrontHold               = 0x12      # 지정한 색상을 계속 켬
    FrontFlicker            = 0x13      # 깜빡임
    FrontFlickerDouble      = 0x14      # 깜빡임(두 번 깜빡이고 깜빡인 시간만큼 꺼짐)
    FrontDimming            = 0x15      # 밝기 제어하여 천천히 깜빡임

    RearNone                = 0x20
    RearManual              = 0x21      # 수동 제어
    RearHold                = 0x22      # 지정한 색상을 계속 켬
    RearFlicker             = 0x23      # 깜빡임
    RearFlickerDouble       = 0x24      # 깜빡임(두 번 깜빡이고 깜빡인 시간만큼 꺼짐)
    RearDimming             = 0x25      # 밝기 제어하여 천천히 깜빡임

    BodyNone                = 0x30
    BodyManual              = 0x31      # 수동 제어
    BodyHold                = 0x32      # 지정한 색상을 계속 켬
    BodyFlicker             = 0x33      # 깜빡임
    BodyFlickerDouble       = 0x34      # 깜빡임(두 번 깜빡이고 깜빡인 시간만큼 꺼짐)
    BodyDimming             = 0x35      # 밝기 제어하여 천천히 깜빡임

    ANone                   = 0x40
    AManual                 = 0x41      # 수동 제어
    AHold                   = 0x42      # 지정한 색상을 계속 켬
    AFlicker                = 0x43      # 깜빡임
    AFlickerDouble          = 0x44      # 깜빡임(두 번 깜빡이고 깜빡인 시간만큼 꺼짐)
    ADimming                = 0x45      # 밝기 제어하여 천천히 깜빡임

    BNone                   = 0x50
    BManual                 = 0x51      # 수동 제어
    BHold                   = 0x52      # 지정한 색상을 계속 켬
    BFlicker                = 0x53      # 깜빡임
    BFlickerDouble          = 0x54      # 깜빡임(두 번 깜빡이고 깜빡인 시간만큼 꺼짐)
    BDimming                = 0x55      # 밝기 제어하여 천천히 깜빡임

    CNone                   = 0x60
    CManual                 = 0x61      # 수동 제어
    CHold                   = 0x62      # 지정한 색상을 계속 켬
    CFlicker                = 0x63      # 깜빡임
    CFlickerDouble          = 0x64      # 깜빡임(두 번 깜빡이고 깜빡인 시간만큼 꺼짐)
    CDimming                = 0x65      # 밝기 제어하여 천천히 깜빡임

    EndOfType               = 0x66



LightFlagsDrone

드론 LED 플래그

class LightFlagsDrone(Enum):
    
    None_               = 0x0000

    Front               = 0x8000
    Rear                = 0x4000
    BodyRed             = 0x2000
    BodyGreen           = 0x1000
    BodyBlue            = 0x0800

    A                   = 0x0400
    B                   = 0x0200
    CRed                = 0x0100
    CGreen              = 0x0080
    CBlue               = 0x0040



LightModeController

조종기 LED 동작 모드

class LightModeController(Enum):
    
    None_               = 0x00

    # Body
    BodyNone            = 0x20
    BodyManual          = 0x21      # 수동 조작
    BodyHold            = 0x22
    BodyFlicker         = 0x23
    BodyFlickerDouble   = 0x24
    BodyDimming         = 0x25

    EndOfType           = 0x26



LightFlagsController

조종기 LED 플래그

class LightFlagsController(Enum):
    
    None_               = 0x00

    BodyRed             = 0x80
    BodyGreen           = 0x40
    BodyBlue            = 0x20



Color

RGB LED 색상 설정

0일 때 꺼지고 255일 때 가장 밝습니다.

class Color(ISerializable):

    def __init__(self):
        self.r      = 0
        self.g      = 0
        self.b      = 0
변수 이름 형식 범위 크기 설명
r UInt8 0 ~ 255 1 Byte Red
g UInt8 0 ~ 255 1 Byte Green
b UInt8 0 ~ 255 1 Byte Blue



Colors

색상 팔레트 인덱스

드론과 조종기 내부에 정의된 팔레트의 색상 인덱스입니다. 의도보다 색상이 더 밝게 표현되기 때문에 테스트 후 사용하기를 권해드립니다.

class Colors(Enum):

    AliceBlue              = 0
    AntiqueWhite           = 1
    Aqua                   = 2
    Aquamarine             = 3
    Azure                  = 4
    Beige                  = 5
    Bisque                 = 6
    Black                  = 7
    BlanchedAlmond         = 8
    Blue                   = 9
    BlueViolet             = 10
    Brown                  = 11
    BurlyWood              = 12
    CadetBlue              = 13
    Chartreuse             = 14
    Chocolate              = 15
    Coral                  = 16
    CornflowerBlue         = 17
    Cornsilk               = 18
    Crimson                = 19
    Cyan                   = 20
    DarkBlue               = 21
    DarkCyan               = 22
    DarkGoldenRod          = 23
    DarkGray               = 24
    DarkGreen              = 25
    DarkKhaki              = 26
    DarkMagenta            = 27
    DarkOliveGreen         = 28
    DarkOrange             = 29
    DarkOrchid             = 30
    DarkRed                = 31
    DarkSalmon             = 32
    DarkSeaGreen           = 33
    DarkSlateBlue          = 34
    DarkSlateGray          = 35
    DarkTurquoise          = 36
    DarkViolet             = 37
    DeepPink               = 38
    DeepSkyBlue            = 39
    DimGray                = 40
    DodgerBlue             = 41
    FireBrick              = 42
    FloralWhite            = 43
    ForestGreen            = 44
    Fuchsia                = 45
    Gainsboro              = 46
    GhostWhite             = 47
    Gold                   = 48
    GoldenRod              = 49
    Gray                   = 50
    Green                  = 51
    GreenYellow            = 52
    HoneyDew               = 53
    HotPink                = 54
    IndianRed              = 55
    Indigo                 = 56
    Ivory                  = 57
    Khaki                  = 58
    Lavender               = 59
    LavenderBlush          = 60
    LawnGreen              = 61
    LemonChiffon           = 62
    LightBlue              = 63
    LightCoral             = 64
    LightCyan              = 65
    LightGoldenRodYellow   = 66
    LightGray              = 67
    LightGreen             = 68
    LightPink              = 69
    LightSalmon            = 70
    LightSeaGreen          = 71
    LightSkyBlue           = 72
    LightSlateGray         = 73
    LightSteelBlue         = 74
    LightYellow            = 75
    Lime                   = 76
    LimeGreen              = 77
    Linen                  = 78
    Magenta                = 79
    Maroon                 = 80
    MediumAquaMarine       = 81
    MediumBlue             = 82
    MediumOrchid           = 83
    MediumPurple           = 84
    MediumSeaGreen         = 85
    MediumSlateBlue        = 86
    MediumSpringGreen      = 87
    MediumTurquoise        = 88
    MediumVioletRed        = 89
    MidnightBlue           = 90
    MintCream              = 91
    MistyRose              = 92
    Moccasin               = 93
    NavajoWhite            = 94
    Navy                   = 95
    OldLace                = 96
    Olive                  = 97
    OliveDrab              = 98
    Orange                 = 99
    OrangeRed              = 100
    Orchid                 = 101
    PaleGoldenRod          = 102
    PaleGreen              = 103
    PaleTurquoise          = 104
    PaleVioletRed          = 105
    PapayaWhip             = 106
    PeachPuff              = 107
    Peru                   = 108
    Pink                   = 109
    Plum                   = 110
    PowderBlue             = 111
    Purple                 = 112
    RebeccaPurple          = 113
    Red                    = 114
    RosyBrown              = 115
    RoyalBlue              = 116
    SaddleBrown            = 117
    Salmon                 = 118
    SandyBrown             = 119
    SeaGreen               = 120
    SeaShell               = 121
    Sienna                 = 122
    Silver                 = 123
    SkyBlue                = 124
    SlateBlue              = 125
    SlateGray              = 126
    Snow                   = 127
    SpringGreen            = 128
    SteelBlue              = 129
    Tan                    = 130
    Teal                   = 131
    Thistle                = 132
    Tomato                 = 133
    Turquoise              = 134
    Violet                 = 135
    Wheat                  = 136
    White                  = 137
    WhiteSmoke             = 138
    Yellow                 = 139
    YellowGreen            = 140
    
    EndOfType              = 141



LightManual

LED 수동 제어

flag로 지정한 LED의 밝기를 변경합니다. 지정하지 않은 LED의 밝기는 그대로 유지됩니다. 밝기 값은 0일 때 꺼지며 값이 커질수록 밝아집니다.

flags에는 LightFlagsDrone, LightFlagsController의 value 값을 사용하시거나 직접 플래그에 해당하는 비트를 선택하시면 됩니다.

class LightManual(ISerializable):

    def __init__(self):
        self.flags          = 0
        self.brightness     = 0
변수 이름 형식 범위 크기 설명
flags UInt8 0b00000000 ~ 0b11111111 1 Byte LED 선택 플래그
brightness UInt8 0 ~ 255 1 Byte 밝기



LightMode

LED 모드

mode 변수에는 LightModeDrone, LightModeController의 value 값을 사용합니다.

class LightMode(ISerializable):

    def __init__(self):
        self.mode        = 0
        self.interval    = 0
변수 이름 형식 범위 크기 설명
mode UInt8 - 1 Byte LED 동작 모드
interval UInt16 0 ~ 65535 2 Byte 내부 밝기 제어 함수 호출 주기



LightModeColor

LED 모드 변경(RGB)

RGB 색상을 직접 지정하여 LED 동작 모드를 변경합니다.

class LightModeColor(ISerializable):
    
    def __init__(self):
        self.mode       = LightMode()
        self.color      = Color()
변수 이름 형식 범위 크기 설명
mode LightMode - 3 Byte LED 동작 모드
color Color - 3 Byte LED RGB 색상



LightModeColorCommand

LED 모드 변경(RGB) + Command

LightModeColor에 Command를 추가하여 전송합니다.

class LightModeColorCommand(ISerializable):
    
    def __init__(self):
        self.mode       = LightMode()
        self.color      = Color()
        self.command    = Command()
변수 이름 형식 범위 크기 설명
mode LightMode - 3 Byte LED 동작 모드
color Color - 3 Byte LED RGB 색상
command Command - 2 Byte 명령



LightModeColors

LED 모드 변경(Palette)

팔레트 인덱스를 사용하여 LED 동작 모드를 변경합니다.

class LightModeColors(ISerializable):
    
    def __init__(self):
        self.mode       = LightMode()
        self.colors     = Colors.Black
변수 이름 형식 범위 크기 설명
mode LightMode - 3 Byte LED 동작 모드
colors Colors - 1 Byte LED 팔레트 인덱스



LightModeColorsCommand

LED 모드 변경(Palette) + Command

LightModeColors에 Command를 추가하여 전송합니다.

class LightModeColorsCommand(ISerializable):
    
    def __init__(self):
        self.mode       = LightMode()
        self.colors     = Colors.Black
        self.command    = Command()
변수 이름 형식 범위 크기 설명
mode LightMode - 3 Byte LED 동작 모드
colors Colors - 1 Byte LED 팔레트 인덱스
command Command - 2 Byte 명령



LightEvent

LED 이벤트

이벤트는 지정한 횟수만큼의 동작을 실행하고 끝나면, 이전에 Mode로 설정된 동작을 다시 실행합니다.

event 변수에는 LightModeDrone, LightModeController의 value 값을 사용합니다.

class LightEvent(ISerializable):

    def __init__(self):
        self.event      = 0
        self.interval   = 0
        self.repeat     = 0
변수 이름 형식 범위 크기 설명
event UInt8 - 1 Byte LED 동작 모드
interval UInt16 0 ~ 65535 2 Byte 내부 색상 변화 함수 호출 주기
repeat UInt8 0 ~ 255 1 Byte 반복 횟수



LightEventColor

LED 이벤트 변경(RGB)

RGB 색상을 직접 지정하여 LED 이벤트를 실행합니다.

class LightEventColor(ISerializable):
    
    def __init__(self):
        self.event      = LightEvent()
        self.color      = Color()
변수 이름 형식 범위 크기 설명
event LightEvent - 4 Byte LED 이벤트
color Color - 3 Byte LED RGB 색상



LightEventColorCommand

LED 이벤트 변경(RGB)

LightEventColor에 Command를 추가하여 전송합니다.

class LightEventColorCommand(ISerializable):
    
    def __init__(self):
        self.event      = LightEvent()
        self.color      = Color()
        self.command    = Command()
변수 이름 형식 범위 크기 설명
event LightEvent - 4 Byte LED 이벤트
color Color - 3 Byte LED RGB 색상
command Command - 2 Byte 명령



LightEventColors

LED 이벤트 변경(Palette)

팔레트 인덱스를 사용하여 LED 동작 모드를 변경합니다.

class LightEventColors(ISerializable):
    
    def __init__(self):
        self.event      = LightEvent()
        self.colors     = Colors.Black
변수 이름 형식 범위 크기 설명
event LightEvent - 4 Byte LED 이벤트
colors Colors - 1 Byte LED 팔레트 인덱스



LightEventColorsCommand

LED 이벤트 변경(Palette) + Command

LightEventColors에 Command를 추가하여 전송합니다.

class LightEventColorsCommand(ISerializable):
    
    def __init__(self):
        self.event      = LightEvent()
        self.colors     = Colors.Black
        self.command    = Command()
변수 이름 형식 범위 크기 설명
event LightEvent - 4 Byte LED 이벤트
colors Colors - 1 Byte LED 팔레트 인덱스
command Command - 2 Byte 명령



DisplayPixel

픽셀 색상

class DisplayPixel(Enum):
    
    Black               = 0x00
    White               = 0x01
    Inverse             = 0x02



DisplayFont

폰트

class DisplayFont(Enum):
    
    LiberationMono5x8   = 0x00
    LiberationMono10x16 = 0x01



DisplayAlign

문자열 정렬

class DisplayAlign(Enum):
    
    Left                = 0x00
    Center              = 0x01
    Right               = 0x02



DisplayLine

class DisplayLine(Enum):
    
    Solid               = 0x00
    Dotted              = 0x01
    Dashed              = 0x02



DisplayClearAll

화면 전체 지우기

class DisplayClearAll(ISerializable):

    def __init__(self):
        self.pixel       = DisplayPixel.White
변수 이름 형식 범위 크기 설명
pixel DisplayPixel - 1 Byte 채울 색상



DisplayClear

선택 영역 지우기

class DisplayClear(ISerializable):

    def __init__(self):
        self.x           = 0
        self.y           = 0
        self.width       = 0
        self.height      = 0
        self.pixel       = DisplayPixel.White
변수 이름 형식 범위 크기 설명
x Int16 -2000 ~ 2000 2 Byte X축 시작 위치
y Int16 -2000 ~ 2000 2 Byte Y축 시작 위치
width Int16 -2000 ~ 2000 2 Byte 너비
height Int16 -2000 ~ 2000 2 Byte 높이
pixel DisplayPixel - 1 Byte 채울 색상



DisplayClear

선택 영역 반전

class DisplayInvert(ISerializable):

    def __init__(self):
        self.x           = 0
        self.y           = 0
        self.width       = 0
        self.height      = 0
변수 이름 형식 범위 크기 설명
x Int16 -2000 ~ 2000 2 Byte X축 시작 위치
y Int16 -2000 ~ 2000 2 Byte Y축 시작 위치
width Int16 -2000 ~ 2000 2 Byte 너비
height Int16 -2000 ~ 2000 2 Byte 높이



DisplayDrawPoint

점 찍기

class DisplayDrawPoint(ISerializable):

    def __init__(self):
        self.x           = 0
        self.y           = 0
        self.pixel       = DisplayPixel.White
변수 이름 형식 범위 크기 설명
x Int16 -2000 ~ 2000 2 Byte X축 위치
y Int16 -2000 ~ 2000 2 Byte Y축 위치
pixel DisplayPixel - 1 Byte 점 색상



DisplayDrawLine

선 그리기

class DisplayDrawLine(ISerializable):

    def __init__(self):
        self.x1          = 0
        self.y1          = 0
        self.x2          = 0
        self.y2          = 0
        self.pixel       = DisplayPixel.White
        self.line        = DisplayLine.Solid
변수 이름 형식 범위 크기 설명
x1 Int16 -2000 ~ 2000 2 Byte X축 시작 위치
y1 Int16 -2000 ~ 2000 2 Byte Y축 시작 위치
x2 Int16 -2000 ~ 2000 2 Byte X축 끝 위치
y2 Int16 -2000 ~ 2000 2 Byte Y축 끝 위치
pixel DisplayPixel - 1 Byte 선 색상
line DisplayLine - 1 Byte 선 형태



DisplayDrawRect

사각형 그리기

class DisplayDrawRect(ISerializable):

    def __init__(self):
        self.x           = 0
        self.y           = 0
        self.width       = 0
        self.height      = 0
        self.pixel       = DisplayPixel.White
        self.flagFill    = True
        self.line        = DisplayLine.Solid
변수 이름 형식 범위 크기 설명
x Int16 -2000 ~ 2000 2 Byte X축 시작 위치
y Int16 -2000 ~ 2000 2 Byte Y축 시작 위치
width Int16 -2000 ~ 2000 2 Byte 너비
height Int16 -2000 ~ 2000 2 Byte 높이
pixel DisplayPixel - 1 Byte 색상
flagFill Bool - 1 Byte True인 경우 내부를 채움
line DisplayLine - 1 Byte 선 형태



DisplayDrawCircle

원 그리기

class DisplayDrawCircle(ISerializable):

    def __init__(self):
        self.x          = 0
        self.y          = 0
        self.radius     = 0
        self.pixel      = DisplayPixel.White
        self.flagFill   = True
변수 이름 형식 범위 크기 설명
x Int16 -2000 ~ 2000 2 Byte X축 중심점 위치
y Int16 -2000 ~ 2000 2 Byte Y축 중심점 위치
radius Int16 1 ~ 2000 2 Byte 반지름
pixel DisplayPixel - 1 Byte 색상
flagFill Bool - 1 Byte True인 경우 내부를 채움



DisplayDrawString

문자열 그리기

class DisplayDrawString(ISerializable):

    def __init__(self):
        self.x          = 0
        self.y          = 0
        self.font       = DisplayFont.LiberationMono5x8
        self.pixel      = DisplayPixel.White
        self.message    = ""
변수 이름 형식 범위 크기 설명
x Int16 -2000 ~ 2000 2 Byte X축 위치
y Int16 -2000 ~ 2000 2 Byte Y축 위치
font DisplayFont - 1 Byte 폰트
pixel DisplayPixel - 1 Byte 색상
message ASCII String - 30 Byte 이하 표시할 문자열



DisplayDrawStringAlign

문자열 정렬하여 그리기

x_startx_end 사이에 지정한 위치로 문자열을 정렬하여 표시합니다.

class DisplayDrawStringAlign(ISerializable):

    def __init__(self):
        
        self.x_start    = 0
        self.x_end      = 0
        self.y          = 0
        self.align      = DisplayAlign.Center
        self.font       = DisplayFont.LiberationMono5x8
        self.pixel      = DisplayPixel.White
        self.message    = ""
변수 이름 형식 범위 크기 설명
x_start Int16 -2000 ~ 2000 2 Byte X축 시작 위치
x_end Int16 -2000 ~ 2000 2 Byte X축 끝 위치
y Int16 -2000 ~ 2000 2 Byte Y축 위치
align DisplayAlign - 1 Byte 정렬
font DisplayFont - 1 Byte 폰트
pixel DisplayPixel - 1 Byte 색상
message ASCII String - 30 Byte 이하 표시할 문자열



BuzzerMode

버저 모드

class BuzzerMode(Enum):

    Stop                = 0     # 정지(Mode에서의 Stop은 통신에서 받았을 때 Buzzer를 끄는 용도로 사용, set으로만 호출)

    Mute                = 1     # 묵음 즉시 적용
    MuteReserve         = 2     # 묵음 예약

    Scale               = 3     # 음계 즉시 적용
    ScaleReserve        = 4     # 음계 예약

    Hz                  = 5     # 주파수 즉시 적용
    HzReserve           = 6     # 주파수 예약

    EndOfType           = 7



BuzzerScale

버저 음계

class BuzzerScale(Enum):

    C1 = 0x00; CS1 = 0x01; D1 = 0x02; DS1 = 0x03; E1 = 0x04; F1 = 0x05; FS1 = 0x06; G1 = 0x07; GS1 = 0x08; A1 = 0x09; AS1 = 0x0A; B1 = 0x0B;
    C2 = 0x0C; CS2 = 0x0D; D2 = 0x0E; DS2 = 0x0F; E2 = 0x10; F2 = 0x11; FS2 = 0x12; G2 = 0x13; GS2 = 0x14; A2 = 0x15; AS2 = 0x16; B2 = 0x17;
    C3 = 0x18; CS3 = 0x19; D3 = 0x1A; DS3 = 0x1B; E3 = 0x1C; F3 = 0x1D; FS3 = 0x1E; G3 = 0x1F; GS3 = 0x20; A3 = 0x21; AS3 = 0x22; B3 = 0x23;
    C4 = 0x24; CS4 = 0x25; D4 = 0x26; DS4 = 0x27; E4 = 0x28; F4 = 0x29; FS4 = 0x2A; G4 = 0x2B; GS4 = 0x2C; A4 = 0x2D; AS4 = 0x2E; B4 = 0x2F;

    C5 = 0x30; CS5 = 0x31; D5 = 0x32; DS5 = 0x33; E5 = 0x34; F5 = 0x35; FS5 = 0x36; G5 = 0x37; GS5 = 0x38; A5 = 0x39; AS5 = 0x3A; B5 = 0x3B;
    C6 = 0x3C; CS6 = 0x3D; D6 = 0x3E; DS6 = 0x3F; E6 = 0x40; F6 = 0x41; FS6 = 0x42; G6 = 0x43; GS6 = 0x44; A6 = 0x45; AS6 = 0x46; B6 = 0x47;
    C7 = 0x48; CS7 = 0x49; D7 = 0x4A; DS7 = 0x4B; E7 = 0x4C; F7 = 0x4D; FS7 = 0x4E; G7 = 0x4F; GS7 = 0x50; A7 = 0x51; AS7 = 0x52; B7 = 0x53;
    C8 = 0x54; CS8 = 0x55; D8 = 0x56; DS8 = 0x57; E8 = 0x58; F8 = 0x59; FS8 = 0x5A; G8 = 0x5B; GS8 = 0x5C; A8 = 0x5D; AS8 = 0x5E; B8 = 0x5F;

    EndOfType   = 0x60

    Mute        = 0xEE  # 묵음
    Fin         = 0xFF  # 악보의 끝



Buzzer

버저

BuzzerMode가 BuzzerMode.Scale이거나 BuzzerMode.ScaleReserve인 경우 value에는 BuzzerScale의 value 값을 사용하시면 됩니다.

BuzzerMode가 BuzzerMode.Hz이거나 BuzzerMode.HzReserve인 경우 value에는 Hz 값을 사용하시면 됩니다.

class Buzzer(ISerializable):

    def __init__(self):
        self.mode       = BuzzerMode.Stop
        self.value      = 0
        self.time       = 0
변수 이름 형식 범위 크기 설명
mode BuzzerMode - 1 Byte 버저 동작 모드
value UInt16 0 ~ 8000 2 Byte Scale 값 또는 Hz 값
time UInt16 0 ~ 65,535 2 Byte 소리를 지속할 시간(ms)



VibratorMode

진동 모드

class VibratorMode(Enum):

    Stop                = 0     # 정지

    Instantly         = 1     # 즉시 적용
    Continually         = 2     # 예약

    EndOfType           = 3



Vibrator

진동

class Vibrator(ISerializable):

    def __init__(self):
        self.mode       = VibratorMode.Stop
        self.on         = 0
        self.off        = 0
        self.total      = 0
변수 이름 형식 범위 크기 설명
mode VibratorMode - 1 Byte 진동 동작 모드
on UInt16 0 ~ 65,535 2 Byte 진동을 켠 시간(ms)
off UInt16 0 ~ 65,535 2 Byte 진동을 끈 시간(ms)
total UInt16 0 ~ 65,535 2 Byte 전체 동작 시간(ms)



JoystickDirection

조이스틱 방향

class JoystickDirection(Enum):

    None_   = 0         # 정의하지 않은 영역(무시함)

    VT      = 0x10      #   위(세로)
    VM      = 0x20      # 중앙(세로)
    VB      = 0x40      # 아래(세로)

    HL      = 0x01      #   왼쪽(가로)
    HM      = 0x02      #   중앙(가로)
    HR      = 0x04      # 오른쪽(가로)

    TL = 0x11;  TM = 0x12;  TR = 0x14
    ML = 0x21;  CN = 0x22;  MR = 0x24
    BL = 0x41;  BM = 0x42;  BR = 0x44



JoystickEvent

조이스틱 이벤트

class JoystickEvent(Enum):

    None_       = 0     # 이벤트 없음
    
    In          = 1     # 특정 영역에 진입
    Stay        = 2     # 특정 영역에서 상태 유지
    Out         = 3     # 특정 영역에서 벗어남
    
    EndOfType   = 4



JoystickBlock

조이스틱 하나의 축

class JoystickBlock(ISerializable):

    def __init__(self):
        self.x          = 0
        self.y          = 0
        self.direction  = JoystickDirection.None_
        self.event      = JoystickEvent.None_
변수 이름 형식 범위 크기 설명
x Int8 -100 ~ 100 1 Byte X축 값
y Int8 -100 ~ 100 1 Byte Y축 값
direction JoystickDirection - 1 Byte 조이스틱 방향
event JoystickEvent - 1 Byte 이벤트



Joystick

조이스틱 좌우 입력

class Joystick(ISerializable):

    def __init__(self):
        self.left       = JoystickBlock()
        self.right      = JoystickBlock()
변수 이름 형식 범위 크기 설명
left JoystickBlock - 4 Byte 왼쪽 조이스틱
right JoystickBlock - 4 Byte 오른쪽 조이스틱



ButtonFlagController

조종기 버튼 플래그

class ButtonFlagController(Enum):

    None_               = 0x0000
    
    FrontLeftTop        = 0x0001
    FrontLeftBottom     = 0x0002
    FrontRightTop       = 0x0004
    FrontRightBottom    = 0x0008
    
    TopLeft             = 0x0010
    TopRight            = 0x0020    # POWER ON/OFF
    
    MidUp               = 0x0040
    MidLeft             = 0x0080
    MidRight            = 0x0100
    MidDown             = 0x0200
    
    BottomLeft          = 0x0400
    BottomRight         = 0x0800



ButtonFlagDrone

드론 버튼 플래그

class ButtonFlagDrone(Enum):

    None_           = 0x0000
    
    Reset           = 0x0001



ButtonEvent

버튼 이벤트

class ButtonEvent(Enum):

    None_             = 0x0000
    
    Down              = 0x0001  # 누르기 시작
    Press             = 0x0002  # 누르는 중
    Up                = 0x0003  # 뗌
    
    EndContinuePress  = 0x0004  # 연속 입력 종료



Button

버튼 입력

button에는 ButtonFlagController 또는 ButtonFlagDrone 의 플래그가 조합된 값이 들어옵니다.

class Button(ISerializable):

    def __init__(self):
        self.button     = 0
        self.event      = ButtonEvent.None_
변수 이름 형식 범위 크기 설명
button UInt16 - 2 Byte 버튼 입력
event ButtonEvent - 1 Byte 버튼 이벤트



State

드론 상태

class State(ISerializable):

    def __init__(self):
        self.modeSystem         = ModeSystem.None_
        self.modeFlight         = ModeFlight.None_

        self.modeControlFlight  = ModeControlFlight.None_
        self.modeMovement       = ModeMovement.None_
        self.headless           = Headless.None_
        self.sensorOrientation  = SensorOrientation.None_
        self.battery            = 0
변수 이름 형식 범위 크기 설명
modeSystem ModeSystem - 1 Byte System 동작 모드
modeFlight ModeFlight - 1 Byte 비행 제어기 동작 모드
modeControlFlight ModeControlFlight - 1 Byte 비행 제어 모드
modeMovement ModeMovement - 1 Byte 이동 상태
headless Headless - 1 Byte Headless 설정 상태
sensorOrientation SensorOrientation - 1 Byte 센서 방향
battery UInt8 0 ~ 100 1 Byte 드론 배터리 잔량



Count

카운터

각 카운터 값은 드론 내부에 UInt32로 저장하고 있지만 전송 시에는 UInt16으로 변환하여 전송합니다. 만약 더 큰 값이 필요한 상황이 생기면 변경할 예정입니다.(6만번 이상 이착륙 등)

class Count(ISerializable):

    def __init__(self):
        self.timeFlight     = 0

        self.countTakeOff   = 0
        self.countLanding   = 0
        self.countAccident  = 0
변수 이름 형식 범위 크기 설명
timeFlight UInt64 - 8 Byte 비행 시간(ms)
countTakeOff UInt16 0 ~ 65535 2 Byte 이륙 횟수
countLanding UInt16 0 ~ 65535 2 Byte 착륙 횟수
countAccident UInt16 0 ~ 65535 2 Byte 충돌 횟수



Vector

벡터

class Vector(ISerializable):

    def __init__(self):
        self.x      = 0
        self.y      = 0
        self.z      = 0
변수 이름 형식 범위 크기 설명
x Int16 -32,768 ~ 32,767 2 Byte X
y Int16 -32,768 ~ 32,767 2 Byte Y
z Int16 -32,768 ~ 32,767 2 Byte Z



Bias

바이어스

가속도, 자이로에 대한 바이어스 설정값입니다. 읽기만 가능합니다.

class Bias(ISerializable):
    
    def __init__(self):
        self.accelX     = 0
        self.accelY     = 0
        self.accelZ     = 0
        self.gyroRoll   = 0
        self.gyroPitch  = 0
        self.gyroYaw    = 0
변수 이름 형식 범위 크기 설명
accelX Int16 -32,768 ~ 32,767 2 Byte Accel X
accelY Int16 -32,768 ~ 32,767 2 Byte Accel Y
accelZ Int16 -32,768 ~ 32,767 2 Byte Accel Z
gyroRoll Int16 -32,768 ~ 32,767 2 Byte Gyro Roll
gyroPitch Int16 -32,768 ~ 32,767 2 Byte Gyro Pitch
gyroYaw Int16 -32,768 ~ 32,767 2 Byte Gyro Yaw



Attitude

자세

class Attitude(ISerializable):

    def __init__(self):
        self.roll       = 0
        self.pitch      = 0
        self.yaw        = 0
변수 이름 형식 범위 크기 설명
roll Int16 -32,768 ~ 32,767 2 Byte Roll
pitch Int16 -32,768 ~ 32,767 2 Byte Pitch
yaw Int16 -32,768 ~ 32,767 2 Byte Yaw



Motion

Motion 센서 데이터와 드론의 자세

angleRoll, anglePitch, angleYaw는 Attitude에서 받을 수 있는 드론의 자세값과 같은 값입니다.

class Motion(ISerializable):

    def __init__(self):
        self.accelX     = 0
        self.accelY     = 0
        self.accelZ     = 0
        self.gyroRoll   = 0
        self.gyroPitch  = 0
        self.gyroYaw    = 0
        self.angleRoll  = 0
        self.anglePitch = 0
        self.angleYaw   = 0
변수 이름 형식 범위 크기 설명
accelX Int16 -32,768 ~ 32,767 2 Byte 가속도 X
accelY Int16 -32,768 ~ 32,767 2 Byte 가속도 Y
accelZ Int16 -32,768 ~ 32,767 2 Byte 가속도 Z
gyroRoll Int16 -32,768 ~ 32,767 2 Byte 자이로 Roll
gyroPitch Int16 -32,768 ~ 32,767 2 Byte 자이로 Pitch
gyroYaw Int16 -32,768 ~ 32,767 2 Byte 자이로 Yaw
angleRoll Int16 -32,768 ~ 32,767 2 Byte 자세 Roll
anglePitch Int16 -32,768 ~ 32,767 2 Byte 자세 Pitch
angleYaw Int16 -32,768 ~ 32,767 2 Byte 자세 Yaw



Altitude

고도 데이터

class Altitude(ISerializable):

    def __init__(self):
        self.temperature    = 0
        self.pressure       = 0
        self.altitude       = 0
        self.rangeHeight    = 0
변수 이름 형식 범위 크기 설명
temperature Float32 - 4 Byte 온도(℃)
pressure Float32 - 4 Byte 압력
altitude Float32 - 4 Byte 압력을 해발고도로 변환한 값(m)
rangeHeight Float32 - 4 Byte 거리센서에서 출력한 높이 값(m)



Flow

옵티컬 플로우로 계산한 상대 위치 값

class Flow(ISerializable):

    def __init__(self):
        self.x     = 0
        self.y     = 0
변수 이름 형식 범위 크기 설명
x Float32 - 4 Byte X축(m)
y Float32 - 4 Byte Y축(m)



MotorBlock

모터 블럭

class MotorBlock(ISerializable):

    def __init__(self):
        self.rotation   = Rotation.None_
        self.value      = 0
변수 이름 형식 범위 크기 설명
rotation Rotation - 1 Byte 모터 회전 방향
value UInt16 0 ~ 4095 2 Byte 모터 회전 속도



Motor

모터 전체 제어

모터 순서는 왼쪽 앞부터 시계 방향입니다.

class Motor(ISerializable):

    def __init__(self):
        self.motor      = []
        self.motor.append(MotorBlock())
        self.motor.append(MotorBlock())
        self.motor.append(MotorBlock())
        self.motor.append(MotorBlock())
변수 이름 형식 범위 크기 설명
motor[0] MotorBlock - 3 Byte 왼쪽 앞 모터
motor[1] MotorBlock - 3 Byte 오른쪽 앞 모터
motor[2] MotorBlock - 3 Byte 오른쪽 뒤 모터
motor[3] MotorBlock - 3 Byte 왼쪽 뒤 모터



MotorSingle

한 개의 모터 제어

class MotorSingle(ISerializable):

    def __init__(self):
        self.target     = 0
        self.rotation   = Rotation.None_
        self.value      = 0
변수 이름 형식 범위 크기 설명
target UInt8 0 ~ 3 1 Byte 동작 대상 모터
rotation Rotation - 1 Byte 모터 회전 방향
value UInt16 0 ~ 4095 2 Byte 모터 회전 속도



e_drone for python

  1. Intro
  2. System
  3. Protocol
  4. Drone
  5. Examples - Ping
  6. Examples - Information
  7. Examples - Pairing
  8. Examples - Control
  9. Examples - Sensor
  10. Examples - Motor
  11. Examples - Setup
  12. Examples - Buzzer
  13. Examples - Vibrator
  14. Examples - Light
  15. Examples - Display
  16. Examples - Input
  17. Examples - Error


Index