Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| en:dev:tailcontrol-command-protocol [2026/08/02 16:17] – darkgrue | en:dev:tailcontrol-command-protocol [2026/08/03 19:18] (current) – darkgrue | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Introduction | + | ====== TailControl Command Protocol ====== |
| - | These instructions do not purport to cover all details or variations of the product and do not claim to provide for every possible contingency in connection with installation, | ||
| - | For the purposes of this manual, “left” and “right” references will refer to the MiTail’s orientation when worn on the body, relative to the wearer. So, the “left” side is the side of the MiTail | + | Command list for the Tail Company TailControl firmware. TailControl |
| + | All commands are case-sensitive. Trailing whitespace (e.g., `NULL`, `CR`, etc.) are ignored. The space between a command keyword and the parameters is mandatory. | ||
| - | ===== MiTail Case ===== | + | <WRAP round todo 90%> |
| + | **IMPORTANT NOTICE:** TailControl and the TailControl Protocol is still under development. Some commands and features described here relate to a future release and are subject to change. | ||
| + | </ | ||
| - | The MiTail case is injection-molded ABS. Replacements may be ordered from The Tail Company, or installed by a repair depot. | ||
| + | ===== Bluetooth Low Energy (BLE) ===== | ||
| - | ==== Case Screws ==== | + | The hardware platform uses the "Just Works" Bluetooth Low Energy (BLE) pairing method to connect. If Conference Mode ([[# |
| - | There are eight Phillips-head self-tapping screws holding the case together. In addition to a serial number foil may be present that must be cut or removed to open the case. One of the screws is behind the left actuator cable, and is easy to miss. | ||
| - | {{ : | + | ===== Device Advertisement ===== |
| + | Device name is one of the following: | ||
| - | ==== Case Replacement ==== | + | * '' |
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| - | Replacing | + | TailControl will uses the same Service and Characteristics UUIDs across all supported products: '' |
| - | <WRAP round tip 90%> | + | * RX Characteristic is '' |
| - | Before starting, read all the sections of this guide. Take photos or videos of your disassembly, | + | * TX Characteristic is '' |
| + | * Battery Voltage is '' | ||
| - | This requires that the case be opened, the two batteries taken out of the case (they may stay attached to the control board), the control board removed from the case half, the four servo frame mount screws be removed to free both servos | + | <WRAP round important 90%> |
| + | For tail-series | ||
| + | </ | ||
| - | The disassembly is then reversed. Note the procedure in [[# | ||
| + | ===== TailControl Device Indicators ===== | ||
| - | ===== Installing the Control Board ===== | ||
| - | Early production issues with the power button and/or USB-C connector mechanically separating from the control board were corrected with hot glue to protect the connector. | + | ==== Blue LED ==== |
| - | <WRAP round important 90%> | + | The Blue LED (D4) has five states: |
| - | Assembly of the control board can be made easier by reaming out the case hole for the button to be slightly larger. This can help prevent the button from being broken off the board and requiring a full board replacement. | + | |
| - | </ | + | |
| - | Check for plastic swarf on the interior of the case edge around | + | - **Off** when powered off. |
| + | - **Blink | ||
| + | - **Fade-off** when BLE is disconnected and Autonomous Mode (either iOS Casual Mode or No-phone Mode, [[# | ||
| + | - **Constant on** when BLE is connected. | ||
| + | - **Fade-on** when BLE is connected and Autonomous Mode is active. | ||
| + | - **Blink fast three times** when the button is held for more than 3 seconds (but less than 13), indicates | ||
| + | | ||
| - | {{ : | ||
| - | Firmly squeezing the sides of the case to cause the button-facing edge of the case to bow out slightly can afford a small amount of extra space to manipulate the control board into place. | + | ==== Red LED ==== |
| - | {{ :en: | + | For v3.2 through v3.5 tail-series controller hardware, the Red LED (D5) has four states: |
| - | <WRAP round tip 90%> | + | - **Off** during normal operation. |
| - | When reassembling the case halves, pay close attention that there is a slot for engaging the PCB board on the other half of the case as well. This will sometimes keep the halves from mating completely, and should not be forced. Offsetting the case forward or backwards from the belt attachment lug and seating that end first may assist in getting the PCB to seat correctly in the case slot. Check for swarf in the PCB slot, or hot glue traces | + | - **Breathing** while charging. |
| - | </ | + | - **Constant |
| + | | ||
| - | {{ :en: | + | For v3.6 tail-series controller hardware, the Red LED (D5) has two states: |
| + | - **Off** when charging is disconnected and when charging complete. | ||
| + | - **Constant on** when charging. | ||
| + | | ||
| + | For the ClawGear and EarGear 2, the Red LED has two states: | ||
| - | ===== Installing Batteries ===== | + | - **Off** when charging is disconnected. |
| + | - **Constant on** when charging. | ||
| - | The MiTail Battery is a 3.7V, 3000 mAh, 103665 (approximately 10 x 36 x 65 mm) LiPo battery with a "JST PH 2-pin" connector. There are two of them. | + | **Note:** Unlike the DIGITAiL, ClawGear, EarGear |
| - | {{ : | ||
| - | <WRAP round tip 90%> | + | ==== Green LED ==== |
| - | FAA rules on installed batteries are that devices containing lithium batteries (laptops, phones, and also tails) can be checked, but carry-on is preferred to prevent damage/ | + | |
| - | </ | + | |
| - | The positive lead for the batteries | + | The Green LED (D8) is only present on v3.2 through v3.5 tail-series controller hardware, and is not visible from outside |
| - | {{ : | + | - **Constant on** is charge in progress. |
| + | - **Off** is charge completed. | ||
| + | - **Blink on-off** indicates a fault condition. | ||
| - | The plugs can be difficult to remove from the board. It’s suggested to pull out and slightly down towards the board (somewhat of a slight rolling motion) helps the plugs release better, instead of pulling straight back. | + | The ClawGear |
| - | The foam pad faces towards the other battery, but it's not structurally critical. Both batteries are constrained fully in the slots in the ABS case (and care should be taken not to crush the battery ends or wires when closing the case), and won't come in contact with each other or the metal rod around the spine. | ||
| - | <WRAP round important 90%> | + | ==== Automatic Actions ==== |
| - | Be aware that, although the JST-PH 2.0 connectors used on the batteries and across industry are polarized, the polarity that any one battery is set up for is EXTREMELY RANDOM. Positive and negative should be correctly indicated by red and black wires, but the position of the wires in the connector may not be correct for the MiTail (or whatever device you plan on using the battery in), because there' | + | |
| - | </ | + | |
| + | TailControl will automatically shut down the device if there is no BLE connection for '' | ||
| - | ===== Testing Servos ===== | + | Additional automatic actions are described in [[en: |
| - | Servo failures can cause the tail not to move (or to curve to one side because one servo is not working), to stop moving after a certain time of operation (thermal issues), or the controller to shut down or reboot (brownout of the ESP32). | ||
| - | Servos should be tested separately from the control board to ensure that they are operational. An inexpensive tester, such as the [[https:// | + | ===== Servo-Based Moves (ClawGear, EarGear 2, MiTail, MiTail Mini, FlutterWings) ===== |
| - | {{ : | + | Move commands return ''< |
| - | <WRAP round tip 90%> | + | A command will return '' |
| - | Long-term testing | + | |
| - | </ | + | |
| + | A new command that is received before the currently executing command is finished will immediately end the current command and start the new one. | ||
| - | ===== Installing Servos ===== | + | Easing functions are as per the ServoEasing libary [[https:// |
| - | The tails use two 5521MG-equivalent 180 Degrees 20KG digital (PWM, **not ** serial) servos. They are 4.5-6.4VDC standard hobby servos: | + | | **TAILHM** | **H**o**M**e position | |
| + | | **TAILS1** | **S**low wag **1** | | ||
| + | | **TAILS2** | **S**low wag **2** | | ||
| + | | **TAILS3** | **S**low wag **3** | | ||
| + | | **TAILFA** | **FA**st wag | | ||
| + | | **TAILSH** | **SH**ort wag | | ||
| + | | **TAILHA** | **HA**ppy wag | | ||
| + | | **TAILER** | **ER**ect | | ||
| + | | **TAILEP** | **E**rect **P**ulse | | ||
| + | | **TAILT1** | **T**remble **1** | | ||
| + | | **TAILT2** | **T**remble **2** | | ||
| + | | **TAILET** | **E**rect **T**rem | | ||
| + | | **TAILU1** | **U**ser defined **1** | | ||
| + | | **TAILU2** | **U**ser defined **2** | | ||
| + | | **TAILU3** | **U**ser defined **3** | | ||
| + | | **TAILU4** | **U**ser defined | ||
| - | {{ : | ||
| + | ===== Stepper-Based Moves (Not Currently Used) ===== | ||
| - | ==== Servo Connections ==== | + | Move commands return ''< |
| - | Internally, the firmware refers to the servos as Servo 1 (the " | + | A command will return '' |
| - | {{ : | + | A new command that is received before the currently executing command is finished will immediately end the current command and start the new one. |
| - | The board servo connectors are designated as below: | + | | **TAILHM** | **H**o**M**e position | |
| + | | **MOVE1** | **MOVE** **1** | | ||
| + | | **MOVE2** | **MOVE** **2** | | ||
| + | | **MOVE3** | **MOVE** **3** | | ||
| + | | **MOVE4** | **MOVE** **4** | | ||
| + | | **MOVE5** | **MOVE** **5** | | ||
| + | | **MOVE6** | **MOVE** **6** | | ||
| + | | **MOVE7** | **MOVE** **7** | | ||
| + | | **MOVEU1** | **MOVE** **U**ser defined **1** | | ||
| + | | **MOVEU2** | **MOVE** **U**ser defined **2** | | ||
| + | | **MOVEU3** | **MOVE** **U**ser defined **3** | | ||
| + | | **MOVEU4** | **MOVE** **U**ser defined **4** | | ||
| - | {{ : | ||
| - | The " | + | ===== ClawGear-only Commands ===== |
| - | The visible shiny edge of the servo connectors go up (facing the viewer, away from the PCB): | + | | **CLAPMODE** | Starts Clap Mode (and disables Tilt Mode, if enabled), returns '' |
| + | | **STOPCLAP** | Stops Clap Mode, returns '' | ||
| + | | **STOPTILT** | Stops Tilt Mode, returns '' | ||
| + | | **TILTMODE** | Starts Tilt Mode (and disables Clap Mode, if enabled), returns '' | ||
| - | {{ : | + | ===== EarGear 2-only Commands ===== |
| - | Avoid connecting the servos to the LED pins on the end of the header block. These pins are reserved for the Glow Tip LEDs. | + | | **LISTENMODE** | Starts Listen Mode ([[#Listen Mode|see below]]), returns '' |
| + | | **STOPLISTEN** | Stops Listen Mode ([[#Listen Mode|see below]]), returns '' | ||
| + | | **STOPTILT** | Stops Tilt Mode ([[#Tilt Mode|see below]]), returns '' | ||
| + | | **TILTMODE** | Starts Tilt Mode ([[#Tilt Mode|see below]]), returns '' | ||
| - | <WRAP round tip 90%> | ||
| - | Before removing the servo cables, it’s recommended to mark the Servo 2 cable (closest to the PCB) with a black marker stripe for reference, as it’s easy for the cables to get confused and difficult to trace the cables when they are bundled. | ||
| - | </ | ||
| - | If a " | + | ===== Glow Tip LED Patterns ===== |
| - | {{ : | + | LED pattern commands return ''< |
| - | Remove the pulley from the old servo, dismount the old servo and mount the new servo in it's place, | + | A command will return '' |
| + | A new command that is received before the currently executing command is finished will immediately end the current command and start the new one. | ||
| - | ===== Installing Cable Pulleys / Servo Horns ===== | + | | **LEDOFF** | **LED**s **OFF** | |
| + | | **LEDREC** | **REC**tangle wave pattern (blink 1 second on, 1 second off) | | ||
| + | | **LEDTRI** | **TRI**angle wave pattern (fade in 1 second, fade out 1 second) | | ||
| + | | **LEDSAW** | **SAW**tooth wave pattern (fade in 2 seconds, off) | | ||
| + | | **LEDSOS** | Morse **SOS** pattern | | ||
| + | | **LEDBEA** | **BEA**con (100ms on every 2 seconds) | | ||
| + | | **LEDFLA** | **FLA**me | | ||
| + | | **LEDSTR** | **STR**obe | | ||
| + | | **LEDUS1** | **US**er defined **1** | | ||
| + | | **LEDUS2** | **US**er defined **2** | | ||
| + | | **LEDUS3** | **US**er defined **3** | | ||
| + | | **LEDUS4** | **US**er defined **4** | | ||
| - | There are seven screws holding the pulley assembly halves together. Three are at the edge, near the cable slot. And four more that hold the servo horn to the pulley. All seven must be removed or loosened to free the cable from the pulley (which is required if the case is being replaced). The screws are M3 × 5.75 mm, Pozidriv PZ1 drive, 7.75 mm overall length. | ||
| - | <WRAP round important 90%> | + | ===== RGB LED Commands ===== |
| - | Note that the pulley screws | + | |
| + | RGB support is new with the introduction of the ClawGear, and support is experimental on other hardware. | ||
| + | |||
| + | All **RGB**'' | ||
| + | |||
| + | | **RGBOFF** | **RGB** LEDs **OFF**, returns '' | ||
| + | | **RGBBRT** | Set **RGB** **BR**igh**T**ness percentage in NVS and running configuration (e.g., '' | ||
| + | | **RGBCHS** | **RGB** **CH**a**S**e; | ||
| + | | **RGBCLN** | **RGB** **CY**lo**N**; | ||
| + | | **RGBDMO** | **RGB** **DE**m**O**; | ||
| + | | **RGBFDE** | **RGB** **F**a**DE**; | ||
| + | | **RGBFIR** | **RGB** **FIR**e; fire effect (e.g., '' | ||
| + | | **RGBRBW** | **RGB** **R**ain**B**o**W** pattern (e.g., '' | ||
| + | | **RGBSLD** | **RGB** **S**o**L**i**D**; | ||
| + | | **RGBSNO** | **RGB** **SNO**w; snow effect; optionally takes a hue color (in RGB Hexidecimal, | ||
| + | | **RGBTST** | **RGB** **TE**s**T**; | ||
| + | | **RGBTWK** | **RGB** **TW**in**K**le; | ||
| + | | **RGBWPE** | **RGB** **W**i**PE**; | ||
| + | |||
| + | |||
| + | ==== RGB Hardware Support ==== | ||
| + | |||
| + | RGB LED support is provided through various headers, depending on the hardware. Certain hardware configurations require amounts of soldering and electronics design skill to modify, and can damage the board if current draw or other limits are exceeded. Mods are performed solely at user's risk. | ||
| + | |||
| + | |||
| + | ==== ClawGear ==== | ||
| + | |||
| + | The ClawGear supports a **maximum** of 42, 5 VDC, WS2811-protocol RGB LED pixels on the Servo 2 connector: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ==== MiTail ==== | ||
| + | |||
| + | The MiTail supports **externally-powered**, | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ==== MiTail Mini ==== | ||
| + | |||
| + | The MiTail Mini supports a **maximum** of 42, 5 VDC, WS2811-protocol RGB LED pixels on the Servo 2 connector: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ===== Other Commands ===== | ||
| + | |||
| + | | **AUTOMODE** | **AUTO**nomous **MO**de ([[# | ||
| + | | **DSSP** | **D**irectly **S**et **S**ervo **P**osition ([[# | ||
| + | | **HWVER** | Returns **H**ard**W**are **VER**sion; | ||
| + | | **PING** | Keepalive heartbeat (from application), | ||
| + | | **SETPUSSKEY** | **SET** **P**a**SSKEY**; enable Conference Mode, returns '' | ||
| + | | **SHUTDOWN** | **SHUT DOWN** the unit (will lose the BLE connection), | ||
| + | | **STOPAUTO** | **STOP AUTO**nomous Mode, returns '' | ||
| + | | **STOPNPM** | **STOP** **N**o-**P**hone **M**ode and disables it in NVS configuration; | ||
| + | | **USERMOVE** | Set user-defined move ([[# | ||
| + | | **STOPPUSSKEY** | **STOP** **P**a**SSKEY**; | ||
| + | | **USERLEDS** | Set user-defined Glow Tip pattern ([[# | ||
| + | | **VER** | Returns the firmware **VER**sion number; (e.g., '' | ||
| + | |||
| + | |||
| + | ===== Developer Commands (use at own risk) ===== | ||
| + | |||
| + | | **BATT** | **BATT**ery percentage, returns | ||
| + | | **READCONF** | **READ** running **CONF**iguration; | ||
| + | | **WRITECONF** | **WRITE** **CONF**iguration to NVS and set running configuration to match (e.g., '' | ||
| + | | **SETDISCONNECTEDCOUNT** | **SET** BLE **DISCONNECTED** power off **COUNT**down parameter in NVS and running configuration (in minutes, '' | ||
| + | | **SETHOLDONSTOP** | **SET** whether servo **HOLD** is maintained when the servos **STOP** in NVS and running configuration (maintains servo PWM when not moving, default for EarGear 2); returns '' | ||
| + | | **UNSETHOLDONSTOP** | **UNSET** servo **HOLD** when the servos **STOP** in NVS and running configuration (servo PWM is dropped when not moving, default for tail-based devices and ClawGear); returns '' | ||
| + | | **SETHOME** | **SET** **HOME** position (0 through 8) for each servo (e.g., '' | ||
| + | | **SETLISTENMOVES** | **SET** internal **LISTEN** Mode **MOVES** to play on a listen event in addition to sending event notifications in NVS and running configuration; | ||
| + | | **SETRGB** | **SET** **RGB** configuration in NVS and running configuration; | ||
| + | | **UNSETLISTENMOVES** | **UNSET** internal **LISTEN** Mode **MOVES** to play on a listen event in NVS and running configuration, | ||
| + | | **SETTILTMOVES** | **SET** internal **LISTEN** Mode **MOVES** to play on a tilt event in addition to sending event notifications in NVS and running configuration; | ||
| + | | **UNSETTILTMOVES** | **UNSET** internal **LISTEN** Mode **MOVES** to play on a listen event in NVS and running configuration, | ||
| + | | **OTA** | Starts firmware **O**ver **T**he **A**ir update process (e.g., '' | ||
| + | | **FORMATNVS** | **FORMAT** **NVS** (erase all contents of the default NVS partition, including BLE bonds), returns '' | ||
| + | | **READNVS** | **READ** **CONF**iguration from NVS; returns space-delimited configuration parameters stored in NVS (e.g., '' | ||
| + | | **REBOOT** | **REBOOT**; returns '' | ||
| + | | **TASKU** | Prints to the hardware serial console the minimum amount of remaining stack space that was available to the task since the task started executing (high water mark), returns '' | ||
| + | |||
| + | |||
| + | ===== Directly Set Servo Position ===== | ||
| + | |||
| + | DSSP (Directly Set Servo Positions) allows a single-position move to be commanded and executed immediately. This is faster (and simpler) than defining a '' | ||
| + | |||
| + | The syntax is similar to '' | ||
| + | |||
| + | **DSSP [E< | ||
| + | |||
| + | ^ Prefix ^ Parameter Type ^ Range of Values for Moves ^ | ||
| + | | **E** | Easing function to apply to Servo 1 | Default is Linear (no easing), if not specified.\\ This is the decimal representation of the (hexadecimal) easing type enumeration, | ||
| + | | **F** | Easing function to apply to Servo 2 | (Same as **E**) | | ||
| + | | **A** | Point for Servo 1 | <0 ... 8>\\ 0 -> 25 degrees\\ 1 -> 41 degrees\\ 2 -> 58 degrees\\ ...\\ 8 -> 160 degrees | | ||
| + | | **B** | Point for Servo 2 | (Same as **A**) | | ||
| + | | **L** | Time between the current Servo 1 point and the next in ticks (in 20 ms increments)\\ **L** will move from the current position to the next, over the time specified | 0 ... 127 (time * 20 ms) | | ||
| + | | **M** | Time between the current Servo 2 point and the next in ticks (in 20 ms increments)\\ **M** will move from the current position to the next, over the time specified | (Same as **L**) | | ||
| + | | **H** | Move to home position at end of move | 0 = false (default), 1 = true | | ||
| + | |||
| + | **Notes: | ||
| + | * Parameters of type **A**, **B**, **E**, **F**, **H**, **L**, and **M** can appear in any order (e.g., '' | ||
| + | * Parameters can be separated by any character that is not a number | ||
| + | * Depending on the tail and position, it can sag out of the commanded position when servo power is released at the end of the DSSP move. This may cause a visual defect of jerking back into the previous position when the next move starts. | ||
| + | |||
| + | |||
| + | ==== DSSP Example ==== | ||
| + | |||
| + | **DSSP E130F130 A1B7 L75M75 H1**\\ | ||
| + | **DSSP A1B7 L75M75 H1**\\ | ||
| + | |||
| + | |||
| + | ===== User-defined Moves and Glow Tip Patterns ===== | ||
| + | |||
| + | Up to 4 user-defined move definitions and 4 Glow Tip LED patterns can be sent over the BT/BLE connection | ||
| + | presets (callable with the '' | ||
| + | |||
| + | The two instructions used to send a move or a Glow Tip LED pattern definition follow the same syntax and consist of a | ||
| + | keyword ('' | ||
| + | defines the type of parameter (see table, below). | ||
| + | |||
| + | **USERMOVE U< | ||
| + | |||
| + | ^ Prefix ^ Parameter Type ^ Range of Values for Moves ^ | ||
| + | | **U** | User preset number | <1 ... 4> | | ||
| + | | **E** | Easing function to apply to Servo 1 | Default is Linear (no easing), if not specified.\\ This is the decimal representation of the (hexadecimal) easing type enumeration, | ||
| + | | **F** | Easing function to apply to Servo 2 | (Same as **E**) | | ||
| + | | **A** | Point for Servo 1 | <0 ... 8>\\ 0 -> 25 degrees\\ 1 -> 41 degrees\\ 2 -> 58 degrees\\ ...\\ 8 -> 160 degrees | | ||
| + | | **B** | Point for Servo 2 | (Same as **A**) | | ||
| + | | **L** | Time between the current Servo 1 point and the next in ticks (in 20 ms increments)\\ **L** will move from the current position to the next, over the time specified | 0 ... 127 (time * 20 ms) | | ||
| + | | **M** | Time between the current Servo 2 point and the next in ticks (in 20 ms increments)\\ **M** will move from the current position to the next, over the time specified | (Same as **L**) | | ||
| + | | **H** | Move to home position at end of move | 0 = false (default), 1 = true | | ||
| + | |||
| + | **USERLEDS U< | ||
| + | |||
| + | ^ Prefix | ||
| + | | **U** | User preset number | <1 ... 4> | | ||
| + | | **P** | Number of points in the Glow Tip pattern | <1 ... 32> | | ||
| + | | **N** | Number of cycles (times the pattern will be repeated) | <0 ... 255> | | ||
| + | | **A** | Brightness point for Glow Tip | <0 ... 8>\\ 0 -> LEDs off\\ ...\\ 4 -> 50% intensity\\ ...\\ 8-> LEDs max intensity | | ||
| + | | **S/L** | Time between the current point and the next (in 20 ms increments)\\ **S** will wait in the current position, then move to the next when the time has elapsed\\ **L** will gradually move from the current position to the next, over the time specified | 0 ... 127 (time * 20 ms) | | ||
| + | |||
| + | **Notes: | ||
| + | * Parameters of type **A**, **B**, **E**, **F**, **H**, **L**, **M**, and **S** can appear in any order (e.g., `EEAABBSS`, `ABAEBESS`, etc.). | ||
| + | * Parameters can be separated by any character that is not a number | ||
| + | * Note the upper limit on the **P** parameter (and the consequential limit of moves in a move or LED pattern). | ||
| + | * There is a **128-character limit** on the serial input buffer. | ||
| + | |||
| + | Position limits on the tail can be visualized as such: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ==== USERMOVE Examples ==== | ||
| + | |||
| + | |||
| + | === Example 1 – Slow Wag 1 (same as the '' | ||
| + | |||
| + | Both servos move from 143° to 41° (position 7 to 1) and back, for 3 times; each cycle is (75 + 75) * 20 ms = 3 s long. | ||
| + | |||
| + | **USERMOVE U1 P2 N3 E0E66 F0F66 A7A1 B7B1 L75L75 M75M75 H1** | ||
| + | |||
| + | * **U1** Store into user preset 1 | ||
| + | * **P2** The move consists of 2 points | ||
| + | * **N3** Repeat the sequence 3 times | ||
| + | * **E0E66** Servo 1 move to Position 1 has no easing, move to Position 2 uses EASE_CUBIC_OUT (0x42) | ||
| + | * **F0F66** Servo 2 move to Position 1 has no easing, move to Position 2 uses EASE_CUBIC_OUT (0x42) | ||
| + | * **A7A1** Servo 1 moves from 7 to 1 (143° to 41°) | ||
| + | * **B7B1** Servo 2 moves exactly as Servo 1 | ||
| + | * **L75L75** Position 2 is reached in 75 * 20 ms = 1.5 s; return to Position 1 in the same time | ||
| + | * **L75L75** Position 2 is reached in 75 * 20 ms = 1.5 s; return to Position 1 in the same time | ||
| + | * **H1** Home at end of move | ||
| + | |||
| + | |||
| + | === Example 2 – Test Servos === | ||
| + | |||
| + | Moves servos in steps of 90° every 2 seconds; Servo 2 is delayed by 90°. | ||
| + | |||
| + | **USERMOVE U2 P4 N3 A4A8A4A0 B4B8B4B0 L100L100L100L100 M100M100M100M100 H1** | ||
| + | **TAILU2** | ||
| + | |||
| + | * **U2** Store into user preset 2 | ||
| + | * **P4** The move consists of 4 points | ||
| + | * **N3** Repeat the sequence 3 times | ||
| + | * **A0A4A8A4** Move Servo 1 90° at a time, starting from 0° | ||
| + | * **B4B8B4B0** Move Servo 2 90° at a time, starting from 90° | ||
| + | * **L100L100L100L100** Each Servo 1 move takes 100 * 20 ms = 2 s to complete | ||
| + | * **M100M100M100M100** Each Servo 2 move takes 100 * 20 ms = 2 s to complete | ||
| + | * **H1** Home at end of move | ||
| + | |||
| + | <WRAP round info 90%> | ||
| + | Because no easing parameters ('' | ||
| </ | </ | ||
| - | ==== Pulley Calibration / Resetting Servo Home Position ==== | ||
| - | To do this correctly, first power up the PCB with the new servo attached directly to the board. That will center or " | + | ==== USERLEDS Examples ==== |
| - | {{ : | ||
| + | === Example 1 – Beacon (same as the '' | ||
| - | ===== Glow Tip - Installing LED Lights ===== | + | The Glow Tip LEDs light up for 100 ms every 1 s (Airbus A320 tail strobe). |
| - | The tails use 3 or 4 5V SMD 3528 LED strip lights, connected to the first pair (closest to the edge of the board) of pins on J5 (positive pin is up, negative pin is closest to the PCB). | + | **USERLEDS U1 P2 N5 A8A0 S5S50** |
| + | **LEDUS1** | ||
| - | {{ : | + | * **U1** Store into user preset 1 |
| + | * **P2** The pattern consists of 2 brightness points | ||
| + | * **N5** Repeat pattern 5 times | ||
| + | * **A8A0** Start at full brightness, then turn off | ||
| + | * **S5S95** On for 5 * 20 ms = 100 ms; off for 50 * 20ms = 1 s | ||
| + | === Example 2 – Fade in/out (similar to '' | ||
| - | ===== Board-level Repairs and Modifications ===== | + | The Glow Tip LEDs light up slowly, then dim until completely off; this is repeated 3 times. |
| - | The tail PCB uses small surface-mounted components, and is not generally considered | + | **USERLEDS U2 P2 N3 A0A8 L100L100** |
| + | |||
| + | * **U2** Store into user preset 2 | ||
| + | * **P2** | ||
| + | * **N3** Repeat pattern 3 times | ||
| + | * **A0A8** Start off, finish at full brightness | ||
| + | * **L100L100** Each brightness point is reached in 100 * 20 ms = 2 s | ||
| + | |||
| + | |||
| + | ===== Conference Mode ===== | ||
| + | |||
| + | Conference mode pairs the user's phone with the TailControl device and establishes | ||
| + | |||
| + | * **Authentication: | ||
| + | * **MITM (Man In The Middle):** process by which a third device impersonates the other two legitimate devices, in order to fool them into connecting to it. Both BLE central and peripheral will connect to the malicious device, which in turn routes the communication between the other two devices. | ||
| + | * **Replay Attack:** a type of network attack in which an attacker captures a valid network transmission and then retransmits it later. The main objective is to trick the system into accepting the retransmission of the data as legitimate. | ||
| <WRAP round important 90%> | <WRAP round important 90%> | ||
| - | Users who are experienced with surface-mount board rework may attempt | + | Do **NOT** |
| - | </ | + | |
| - | The most likely repair would be to replace the USB connector or a damaged tactile switch, which are reinforced with hot glue. Removal of the hot glue is possible, but requires care to prevent components from being removed from the board, along with the glue. The best method to remove the hot glue is high-concentration Isopropyl alcohol (IPA), also known as rubbing alcohol. Soak a Q-Tip in rubbing alcohol, and working your way from the edges in, brush the dried glue gently with the Q-Tip. As the alcohol weakens the adhesive, lift the edge and peel the hot glue away from the board surface, reapplying the alcohol as resistance is met from the glue. | ||
| + | ==== Enabling Conference Mode (Pairing and Binding) ==== | ||
| - | ===== Charging ===== | + | Pairing is performed with a 6-digit number entered on each of the devices. In the case of TailControl, |
| - | Some versions of tail-series controller hardware require specific charging support. The version of hardware can be determined by looking at the "About your gear" in The Tail Company App, the " | + | **SETPUSSKEY < |
| + | The device will then reboot after 3 seconds. Conference Mode is then enabled, and pairing proceeds. The user's phone (or other device) will prompt for the passkey (which was set earlier), and the bond will be established on both devices. After that, the passkey or a previous bond (up to 3 can be stored) will be required to connect to the device. | ||
| - | ==== USB Power Delivery (USB PD) ==== | ||
| - | MiTail hardware versions v3.2 through v3.5 require a USB Power Delivery | + | ==== Disabling Conference Mode ==== |
| + | |||
| + | Conference Mode can be disabled by sending the '' | ||
| + | |||
| + | **STOPPUSSKEY** | ||
| + | |||
| + | The device will then reboot after 3 seconds. If the bond needs to be removed or reset, see [[en: | ||
| + | |||
| + | |||
| + | ==== Unbinding / Factory Reset ==== | ||
| + | |||
| + | Resetting/ | ||
| + | |||
| + | There are two different methods of factory-resetting | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | - At approximately 3 seconds, the blue LED will flash three times and turn off. Continue to hold without releasing the button. If you wish to cancel | ||
| + | - Ten seconds after the triple-flash (13 seconds total of continuous holding), the blue LED will blink quickly continuously, | ||
| + | |||
| + | <WRAP round info 90%> | ||
| + | Note that the bond will also need to be removed on the phone or other device as well, or it will attempt to continue to use the bond (which will fail, because those stored credentials are no longer valid). | ||
| + | |||
| + | * On Android, enter Settings, Connections, | ||
| + | * On iOS, enter Settings, Bluetooth and find the device to remove under "My Devices" | ||
| - | <WRAP round tip 90%> | ||
| - | If the MiTail red LED is not " | ||
| </ | </ | ||
| - | | {{ : | ||
| - | | This **WILL NOT** charge a MiTail (but will charge an EarGear 2).\\ Even though this is a PD charger, it's using a USB-A to USB-C cable,\\ and the tail and charger can't negotiate. | ||
| + | ===== Listen Mode ===== | ||
| - | ==== " | + | Listen Mode is only available on the EarGear 2. When Listen Mode is active, a detected sound above ambient will trigger a random move and a '' |
| - | MiTail | + | Development support for basic sound localization for future |
| + | '' | ||
| + | '' | ||
| - | ===== Indicator Lights ===== | + | Triggering by Listen Mode is inhibited when the ears are in motion, as well as a 3-second counter that runs once a sound trigger has finished executing a move. |
| - | The following visual indicators are presented by the firmware on the board: | ||
| + | ===== No-phone Mode ===== | ||
| - | ==== Blue LED ==== | + | Perform random moves while disconnected from a BLE client, selected from any of three groups as below; interval between moves varies randomly from T1 to T2. This feature is comparable to Casual Mode in the app. |
| - | The Blue LED (D4) has five states: | + | **AUTOMODE G< |
| - | - **Off** when powered off. | + | The tail will select a random move from the specified group(s), pausing |
| - | - **Blink on-off** when BLE is disconnected. | + | |
| - | - **Fade-off** when BLE is disconnected and Autonomous Mode (either iOS Casual Mode or No-phone Mode) is active. | + | |
| - | - **Constant on** when BLE is connected. | + | |
| - | - **Fade-on** when BLE is connected and Autonomous Mode is active. | + | |
| - | - **Blink fast three times** when the button is held for more than 3 seconds (but less than 13), indicates the device is ready to power off when the button is released. | + | |
| - | - **Blink fast continuously** when the button is held for more than 13 seconds, indicates | + | |
| + | No-phone Mode is suspended (after completing any ongoing move) if a BLE connection is made. It will resume after BLE is disconnected. | ||
| - | * Red LED: Slow breathing = tail is charging (when connected to USB PD power). | + | ^ Group ^ Move Group Name ^ Move List ^ |
| - | * Red LED: Solid on = charge complete (when connected to USB PD power). | + | | 1 | Calm and Relaxed | Slow Wag 1, Slow Wag 2, Slow Wag 3 | |
| + | | 2 | Fast and Excited | Fast Wag, Short Wag, Happy Wag, Erect | | ||
| + | | 3 | Frustrated and Tense | Tremble 1, Tremble 2, Tremble Erect, High Wag | | ||
| - | * Blue LED: Blinking = ready to connect. | + | The parameter order is not important, except that the three '' |
| - | * Blue LED: ON = MiTail | + | |
| - | | + | ^ Prefix |
| + | | **G** | Move Group (see table above) | <1 ... 3> | | ||
| + | | **T1** | Minimum random pause between moves in 1-second increments | <1 ... 240> (1 s ... 4 min) | | ||
| + | | **T2** | Maximum random pause between moves in 1-second increments | <1 ... 240> (1 s ... 4 min) | | ||
| + | | **T3** | Delay to wait for BLE connection before starting NPM | <25**1** ... 25**4**> (1 ... 4 min) | | ||
| - | ==== Red LED ==== | + | No-phone Mode (NPM) will cause the tail to delay one to four minutes (based on the setting of the third '' |
| - | For v3.2 through v3.5 tail-series controller hardware, the Red LED (D5) has four states: | + | No-phone Mode is suspended |
| - | - **Off** during normal operation. | + | **STOPNPM** |
| - | - **Breathing** while charging. | + | |
| - | - **Constant on** when charging is complete. | + | |
| - | - **Short flash** on, followed by pause to indicate a low (<= 10%) battery condition. | + | |
| - | For v3.6 tail-series controller hardware, the Red LED (D5) has two states: | + | Stops No-phone mode and disables it in NVS configuration. |
| - | - **Off** when charging is disconnected and when charging complete. | ||
| - | - **Constant on** when charging. | ||
| - | | ||
| - | **Note:** Unlike the DIGITAiL, MiTail, and MiTail Mini **can** be used while charging. | ||
| + | ==== No-phone Mode Example ==== | ||
| - | The Green LED (D8) is only present on v3.2 through v3.5 tail-series controller hardware, and is not visible from outside the device case. The LED is a visual indicator for the '' | + | **AUTOMODE T15T60T243 G1G2** |
| - | | + | * **T15** 15-second minimum random pause between moves |
| - | | + | * **T60** 60-second (1 minute) maximum random pause between moves |
| - | | + | * **T240** 3600-second (240 * 15 = 3600 s = 1 hour) total duration of Autonomous Mode |
| + | * **G1G2** Randomly select | ||
| - | ===== Function Check ===== | + | ===== Tilt Mode ===== |
| - | The MiTail should be checked with the tail oriented as if hanging from the belt mount. Testing the tail with it horizontal | + | Tilt Mode is only available on the ClawGear and EarGear 2. When Listen Mode is active, a detected sound above ambient |
| - | * Test fast and slow moves. Tail should move **symmetrically** and **smoothly**. | + | Triggering by Tilt Mode is inhibited when the ears are in motion, as well as a 3-second counter |
| - | * If a Glow Tip is present, test that the tip lights up and animates correctly. | + | |
| - | * Test that the tail charges and indicates charging and end-of-charge correctly. | + | |
| - | == Copyright | + | == Copyright |
