The Gramophone is a Raw-HID (Human Interface Device). It can send and receive 64 byte long packets (byte arrays). Numbers that take up multiple bytes are encoded in a little endian manner.

If you are implementing communication in Python you can use the GramophoneTools.Comms.Gramophone.Packet class to construct a packet.

Note: Some communication modules require a 65 byte long packet. In this case the extra byte should be in the begining and equal to 0.

Packet structure

Each of the sent and received packets have a the following structure:

packet[0:2] - Target
The 2 byte adress of the target of the packet. Can be anything. The response packet will have this as its Source
packet[2:4] - Source
The 2 byte adress of the source of the packet. Can be anything. The response packet will have this as its Target
packet[4] - MSN
A single byte that can be used for identification. The response packet will have the same MSN.
packet[5] - CMD
The 1 byte ID of the command. See commands below.
packet[6] - Payload length
A single byte that holds the length of the payload. The payload will only be evaluated to whis length.
packet[7:64] - Payload
The payload of the packet.


The possible user commands (values for packet[6]) are the following:

0x00 - Ping
Whatever payload is sent with this command will be sent back as a response.
0x01 - OK response
This is the command sent back after writing a parameter successfuly.
0x02 - FAILED response
This is the command sent back after writing a parameter failed. The payload is the errorcode (see below).
0x04 - Get firmware info
Get information about the firmware. The structure of the reply is explained below.
0x05 - Device state
Check the state of the device. The device should be in 0x01 state for usage. The 0x00 state is for setup.
0x06 - Store
Save persistent variables into the FLASH.
0x07 - Restore
Load persistent variables from the FLASH.
0x08 - Get product info
Get information about the product. The structure of the reply is explained below.
0x0B - Read parameter(s)
Read the value of the parameters given in the payload. The list of parameters are given below. More that one parameter can be read in one command. The order of the values in the response will be the same as the order of the parameters in the payload of this command.
0x0C - Write parameter
Write the parameter given by the first byte of the payload with the value that follows it.

Error codes

The codes received in the payload of a FAILED response packet can be the following:

Unknown command.
Invalid syntax.
Invaid parameter syntax.
Parameter out of range.
Parameter not found.
Packet validation failed.
Access to the parameter was violated (writing read only parameter).


The following parameters can be read or written with the 0x0B and 0x0C commands:

0x01 - VSEN3V3 (float)
Voltage on 3.3V rail.
0x02 - VSEN5V (float)
Voltage on 5V rail.
0x03 - TSENMCU (float)
Internal teperature of the MCU.
0x04 - TSENEXT (float)
External temperature sensor on the board.
0x05 - TIME (uint64)
The time of the internal clock of the device in 0.1 ms steps.
0x10 - ENCPOS (int32)
Encoder position.
0x11 - ENCVEL (float + uint8)
Encoder velocity. The float part is the velocity of the disk, the integer is 1 if the disk is moving or 0 if it is not.
0x12 - ENCVELWIN (uint16)
Encoder velocity window size.
0x13 - ENCHOME (uint8)
Encoder homing. 0 if the encoder is not trying to find the home position, 1 if it is homing and 2 if the home position was found.
0x14 - ENCHOMEPOS (int32)
Encoder home position.
0x20 - DI-1 (uint8)
Digital input 1.
0x21 - DI-2 (uint8)
Digital input 2.
0x30 - DO-1 (uint8)
Digital output 1.
0x31 - DO-2 (uint8)
Digital output 2.
0x32 - DO-3 (uint8)
Digital output 3.
0x33 - DO-4 (uint8)
Digital output 4.
0x40 - AO (float)
Analogue output.
0xFF - LED (uint8)
On board LED state. 0 is off, 1 is on.

Firmware info structure

The firmware information received after sending the 0x04 command has the following structure.

payload[0] (uint8)
payload[1] (uint8)
payload[2:4] (uint16)
payload[4:6] (uint16)
payload[6] (uint8)
payload[7] (uint8)
payload[8] (uint8)
payload[9] (uint8)
payload[10] (uint8)

Product info structure

The product information received after sending the 0x08 command has the following structure:

payload[0:18] (char[18])
payload[18:24] (char[6])
payload[24:28] (uint32)
payload[28:30] (uint16)
Product year
payload[30] (uint8)
Product month
payload[31] (uint8)
Product day