Hahaha! What a non-achievement!!!***
I have claimed the 512th post!
And the 64th!
It seems my power of 2 game is strong!
***: just to be 100% clear, this is ~totally~ meant as a joke!
Hahaha! What a non-achievement!!!***
I have claimed the 512th post!
And the 64th!
It seems my power of 2 game is strong!
***: just to be 100% clear, this is ~totally~ meant as a joke!
hahah! @scharette Donāt worry I donāt get offended that easily
On the topic of controllers following seems quite cool and very usefulā¦
Please have a look if you havenāt played with this, looks useful. Basically, it has a graphical editor online and it generates you a source code. The GUI is stored in the Arduino sketch. What happens next is you take a HC-05 Bluetooth module and connect it to your Arduino on a serial port (hardware or software ). It supports both and has few configuration options which allows you to use wifi as well. You get their app and install it on your phone. The GUI then gets uploaded over BT which is in your sketch and you can use your phone to control your BOT.
This seems fantastic. If you want an extra joystick, extra slider just edit your design onlineā¦ Download the source. Integrate your code and you are ready to go.
I am trying this out now. Not sure what I would try this out onā¦ May be a single servo would do for nowā¦
Iāve learned the hard way a long time agoā¦ it is better to be overly clear than not! Especially onlineā¦ hahaha!
@kurte - Many thanks for the work on the Lynxmotion LSS Library and sorry for not having taken care of your PR before. Yesterday i merged and released, it is now available as 1.4.0 in Arduino IDE.
Thanks,
Care package arrived today :D. Will hopefully have to chance to play more later today.
So far I have seen that I can talk to the servos. Next up need to talk to XBee.
But if I remember correctly it is sort of screwyā¦ There is a solder jumper on what get routed to Arduino Headers D9 pin. Either D9 or D7 routed through to 5vā¦
The reason for this is the XBee is on Pins 8 and 9, but on a Teensy 4.1 we pins 7 and 8 are a hardware Serial port, so prefer to use itā¦ So on mine I will be doing a little solder jump from the 7 side to center.
Another Note, which I have not tried out yet. on this board, is you often donāt like to mix +5vs on a board from two different sources, Which I have done so farā¦ That is if you have it plugged into USB, than we have +5v from USB, and if you have it plugged into Wallwart or battery. Than that goes through a Voltage regulator (actually DC to DC converter) and generates +5vā¦ Which for example could try to back-feed your USB
So often times we try to avoid it. So this board was set up to do it very basically. You can cut the VIN to VUSB connection on the bottom of the Teensy 4.1 board. This is shown near the bottom right of the back of the new T4.1 product cardā¦
So then it VIN and VUSB are not connected. When it it connected. But there is a 2 pin connector near where you plug in the USB that allows you to reconnect.
I typically use a simple shunt, like the ones used to make choices on the LSS Servo adapter board.
More later.
Encouraging news!
Thanks for the details. Havenāt looked at the design files yetā¦
I should be receiving a board shortly, so Iāll be probing around for sure!
Thanks for the warning! Iāll make sure to be careful with that!
Another quick update:
I did the solder blob under the Teensy to connect Pin 7 to the PIN 9 on Arduino shield pins. Also cut VIN/VUSB trace as I mentioned and have on shuntā¦
I updated the first cut translation of Phoenix code to LSS code from awhile ago, and edited the hex.cfg file to set sound to pin 36. There was already a shunt connecting that pin to the sound input.
I then built and downloaded. And code started up. This code has the flash all of the Servo LEDS when controller not connected, which needs to be toned down
My LSS board already had a paired XBee in it. So I then turned on Commander and played start up 3 notes which let me know the controller connected and it sort of tried to bring legs to startup positionā¦ Which were all wrongā¦
Trying to remember what code was doing at that time. I know we were talking back then on tell system what the zero point isā¦ Donāt remember if legs at 90 degrees or laying out flatā¦ I am sure I would need to redo as new processor board and ā¦
But at least some things are talking to each other!
Currently code is still in my LSS Test code github: https://github.com/KurtE/LSS_Test_sketches/tree/master/LSS_Phoenix
Will soon try to make a version to move over to beta github project. But would like to maybe start of with doing the merge of some of this with @zentaās code base
Do you mean to say that by default when an LSS is in RC servo/PWM mode and not receiving a signal itās LED starts flashing (short red, short break, short red, long break)?
If so, I think I had a special version of the firmware where this was turned off. @kurte If thatās whatās bugging you I can look at my backup of .lss.bin files and find it for you! Though Iām still waiting for LSS to arrive so youāll have to test it yourself!
Ah! So neat!
Nope, I have code to remind me the servos are still poweredā¦
and the idle code has stuff to cycle through servosā¦
//--------------------------------------------------------------------
static uint8_t g_iIdleServoNum = (uint8_t)-1;
static uint8_t g_iIdleLedState = 1; // what state to we wish to set...
void ServoDriver::IdleTime(void)
{
// Each time we call this set servos LED on or off...
g_iIdleServoNum++;
if (g_iIdleServoNum >= NUMSERVOS) {
g_iIdleServoNum = 0;
g_iIdleLedState++;
if (g_iIdleLedState > 7) g_iIdleLedState = 0;
}
myLSS.setServoID(cPinTable[g_iIdleServoNum]);
myLSS.setColorLED((LSS_LED_Color)g_iIdleLedState);
}
``
Not very exciting but you won't mistake it for being powered off :D
@dialfonzo and others:
First minor issue with board, wonāt impact the primary functionality.
The QwiiC (Stema QT) connectors are the wrong ones for the wiring, that is the connector I setup on the schematic and layout matches the Sparkfun one, which turns out the other one reverses the cableā¦
Easier to showā¦ I plugged one into the one and then sort of held one with a Sparkfun connector sort of next to it where you can see the solder pads coming out toward the rightā¦ You will see the two yellow wires are near each other.
I will fix one or both of mine by replacing the connector
I believe the proper one is this one from Sparkfun:
Still need to play more.
Good to know, not sure i will use that connector myself at the moment.
And sorry for my bad hand soldering, those have been made manually.
Iād remove one connector and soldered a reversed cableās wires directly to the PCBā¦
Both connectors came off without too much hassle. Just removed solder from front two bigger pads, and then touch each pin with solder iron and was able to lift off. Again I used the ones from Sparkfunā¦ Luckily I had three of them. So just soldered them on. First verified I did not short it outā¦ (I had a short between +3.3v and gnd), so cleaned up my solderingā¦
Yep all hand soldering
I was then able to verify I could plug in an SSD1306 128x64. In the other Wire buss I connected in one of the Sparkfun keypads, which wire sniffer program found.
I will probably set up some of the code now, to optionally output stuff to SSD13ā¦ Earlier I had it with my kitchen sink board output to an Adafruit ST7789 display, things like which mode, which gaitā¦
So more adaptingā¦ Need to remember if I put in a Voltage divider (oops, yep) looks like I moved it to a non-analog pin (38), which does not help much wonder how hard to patchā¦
Never mind - Pin 38 is A14ā¦ So should work!
EDIT2: Appears like the voltage divider is working:
Debug run:
Program Start
Servo(0): 8 -5
Servo(1): 14 1
Servo(2): 2 0
Servo(3): 7 1
Servo(4): 13 4
Servo(5): 1 -1
Servo(6): 10 553
Servo(7): 16 544
Servo(8): 4 556
Servo(9): 9 -549
Servo(10): 15 -543
Servo(11): 3 -545
Servo(12): 12 -278
Servo(13): 18 -225
Servo(14): 6 -282
Servo(15): 11 277
Servo(16): 17 264
Servo(17): 5 277
Commander Init: 38400
Arduino Phoenix Monitor
D - Toggle debug on or off
X - Show XBee Info
V - Voltage
M - Toggle Motors on or off
T - Test Servos
P - Servo Positions
S - Track Servos
O - Enter Servo offset mode
Serial Cmd Line:V<eol>
Voltage: 1218
Raw Analog: 753
From Servo 2: 12129
Serial Cmd Line:P<eol>
Servo positions shown by leg joints
(Rear)
T F C | C F T
-278 553 -5 | 1 -549 277
-225 544 1 | 4 -543 264
-282 556 0 | -1 -545 277
Thought I would take a break and go back and look at a few basic things, like how to use the servos
So for the heck of it, I was wondering how long it would take to tell 18 servos their new positions with times, and then maybe query them back for position, temp and voltageā¦
So some quick and dirty code:
void MoveAllServos(void) {
// first move all to center and on
AllServosCenter();
static int MIN_SERVO_POS = -200;
static int MAX_SERVO_POS = 200;
int servo_angle = 0;
int servo_increment = 5;
int positions[NUM_SERVOS];
int voltages[NUM_SERVOS];
int temps[NUM_SERVOS];
int index_print = 0;
Serial.println("Move All servos: Enter any key to exit");
while (Serial.read() != -1);
while (!Serial.available()) {
elapsedMicros em = 0;
servo_angle += servo_increment;
if (servo_angle >= MAX_SERVO_POS) servo_increment = -5;
if (servo_angle <= MIN_SERVO_POS) servo_increment = 5;
for (int j = 0; j < NUM_SERVOS; j++) {
myLSS.setServoID(pgm_axdIDs[j]); // So first is which servo
myLSS.moveT(servo_angle, 100);
}
uint32_t time_send_positions = em;
for (int j = 0; j < NUM_SERVOS; j++) {
myLSS.setServoID(pgm_axdIDs[j]); // So first is which servo
positions[j] = myLSS.getPosition();
voltages[j] = myLSS.getVoltage();
temps[j] = myLSS.getTemperature();
}
uint32_t time_loop = em;
// Now lets look how long it took plus print out some of it...
Serial.printf("%u %u (%u) P:%d V:%u T:%u ", time_send_positions, time_loop, 1000000/time_loop,
servo_angle, voltages[index_print], temps[index_print]);
if (++index_print == NUM_SERVOS) index_print = 0;
for (int j = 0; j < NUM_SERVOS; j++) {
if (positions[j] != servo_angle) Serial.printf(" %u:%d", j, positions[j]);
}
Serial.println();
while (em < 100) ;
}
}
Which is up in my LSS Test project:
Test output:
0 - All Servos off
1 - All Servos center
2 - Set Servo position [<Servo>] <Position> [<Time>]
3 - Set Servo Angle
4 - Get Servo Positions
5 - Find All Servos
9 - Print Servo Values
b - Baud <new baud>
t - Toggle track Servos
h - hold [<sn>]
f - free [<sn>]
m - move all servos
r - Reboot [<sn>]
:
Cmd: m
Move All servos: Enter any key to exit
4799 64202 (15) P:5 V:12138 T:451 0:157 1:156 2:159 3:157 4:156 5:156 6:154 7:155 8:154 9:159 10:155 11:155 12:155 13:154 14:154 15:149 16:154 17:155
4884 64372 (15) P:10 V:11889 T:404 0:157 1:155 2:158 3:156 4:156 5:155 6:148 7:153 8:151 9:153 10:144 11:149 12:143 13:143 14:145 15:135 16:137 17:145
4842 64451 (15) P:15 V:11913 T:388 0:143 1:146 2:140 3:125 4:144 5:135 6:113 7:136 8:126 9:122 10:113 11:120 12:102 13:104 14:115 15:92 16:100 17:111
4842 63548 (15) P:20 V:11918 T:464 0:101 1:117 2:102 3:69 4:108 5:99 6:59 7:99 8:86 9:70 10:67 11:78 12:46 13:55 14:71 15:35 16:52 17:65
4885 162392 (6) P:25 V:11656 T:382 0:41 1:75 2:54 3:6 4:61 5:54 6:0 7:27 8:20 9:-2 10:-18 11:22 12:23 13:-13 14:19 15:27 16:-18 17:20
4842 63596 (15) P:30 V:12044 T:414 0:-20 1:28 2:22 3:23 4:24 5:24 6:23 7:26 8:20 9:-5 10:-18 11:25 12:23 13:-12 14:19 15:28 16:-15 17:20
4842 63236 (15) P:35 V:11979 T:444 0:-12 1:28 2:29 3:21 4:25 5:26 6:30 7:28 8:20 9:5 10:-9 11:34 12:32 13:-5 14:20 15:31 16:-5 17:18
4843 63003 (15) P:40 V:11966 T:369 0:-5 1:28 2:36 3:28 4:33 5:38 6:39 7:35 8:21 9:11 10:0 11:38 12:38 13:-5 14:21 15:41 16:3 17:20
4842 63603 (15) P:45 V:11990 T:387 0:6 1:29 2:40 3:26 4:58 5:40 6:42 7:41 8:21 9:30 10:16 11:43 12:41 13:8 14:22 16:20 17:24
4842 63872 (15) P:50 V:12057 T:475 0:28 1:32 2:45 3:27 4:57 5:47 6:51 7:46 8:32 9:47 10:35 11:49 12:46 13:30 14:31 15:48 16:38 17:38
4842 163625 (6) P:55 V:12085 T:380 0:49 1:41 2:50 3:41 4:57 5:49 6:51 7:50 8:45 9:51 10:0 12:56 13:51 14:52 16:58 17:52
4843 63376 (15) P:60 V:11969 T:414 0:49 1:53 2:55 3:50 4:57 5:55 6:56 7:56 8:53 9:55 10:57 11:56 12:57 13:53 14:57 16:58 17:56
4885 63164 (15) P:65 V:12092 T:485 0:49 1:58 2:60 3:66 4:57 5:61 6:60 7:62 8:61 9:61 10:64 11:64 12:62 13:55 14:62 15:62 17:66
4843 63055 (15) P:70 V:12027 T:384 0:49 1:66 2:67 3:66 4:57 5:65 6:69 7:66 8:68 9:69 10:68 11:67 12:68 13:56 15:73 16:69 17:68
4842 63688 (15) P:75 V:12093 T:413 0:49 1:71 2:69 3:68 4:57 5:71 6:69 8:74 9:71 10:73 11:74 12:74 13:56 14:76 15:74 17:76
4842 63386 (15) P:80 V:11998 T:473 0:52 1:76 2:76 3:79 4:61 5:78 6:79 7:76 8:75 9:78 10:77 11:78 12:77 13:56 14:77 15:78 17:79
4842 63118 (15) P:85 V:11993 T:383 0:66 1:81 2:80 3:75 4:75 5:80 6:80 7:83 8:84 9:83 10:83 11:82 12:82 13:57 14:88 15:80 16:84 17:83
4883 63527 (15) P:90 V:12002 T:422 0:82 1:85 2:86 3:95 4:85 6:87 7:88 8:89 9:87 10:89 12:89 13:64 14:92 15:88 16:89 17:88
...
5563 64174 (15) P:-85 V:12080 T:415 0:-86 1:-88 2:-94 3:-92 4:-88 5:-89 6:-93 7:-86 8:-90 9:-87 10:-86 12:-96 13:-101 14:-84 15:-95 16:-87 17:-84
5604 64868 (15) P:-80 V:11981 T:476 0:-86 1:-88 3:-88 4:-83 5:-85 6:-84 7:-82 8:-85 9:-79 10:-84 11:-83 12:-96 13:-86 14:-84 15:-69
5605 64884 (15) P:-75 V:12009 T:386 0:-81 1:-74 2:-80 3:-77 4:-78 5:-79 6:-80 7:-77 8:-78 9:-79 10:-74 11:-77 12:-87 13:-86 14:-69 15:-68 16:-74 17:-77
5562 64538 (15) P:-70 V:12018 T:424 0:-75 1:-74 2:-80 3:-80 4:-74 5:-74 6:-67 7:-71 8:-73 9:-71 10:-68 11:-71 12:-67 13:-86 14:-69 15:-84 16:-73 17:-67
5605 64714 (15) P:-65 V:12023 T:455 0:-68 1:-73 2:-71 3:-60 4:-69 5:-70 6:-71 7:-68 8:-67 10:-68 11:-69 12:-64 13:-84 14:-69 15:-80 16:-63
5605 64912 (15) P:-60 V:11970 T:407 0:-66 1:-61 2:-50 3:-66 4:-64 5:-64 6:-70 7:-64 8:-63 9:-65 10:-64 11:-62 12:-64 13:-84 14:-58 15:-74 16:-61 17:-65
5562 64886 (15) P:-55 V:12094 T:391 0:-59 1:-60 2:-50 3:-56 4:-59 5:-59 6:-57 7:-57 8:-57 9:-58 10:-58 12:-58 13:-84 15:-69 16:-59 17:-52
5563 163869 (6) P:-50 V:12120 T:469 0:-55 1:-56 3:-57 4:-53 5:-54 6:-54 7:-56 8:-54 9:-54 10:-53 11:0 12:-53 13:-54 14:-55 15:-52 16:-47 17:-51
And it is interesting that the position I asked to go to can be reasonably far away from reported position. Probably should just print out all positions, and not drop out those who matchā¦
But for example on the last line the 11th servo showed current position of 0 and I told it to to to -50 ā¦
Again just getting feel for servos.
But just asking the 18 servos to move takes about 5.5ms. Adding the query functions. bumps it up to about 65ms
So with this type code, I can get about 15 iterations per second.
Next question to self is if one step is broken up into N moves of the 3 servos on a leg like 50, can we get all of those moves to transition to be smoothā¦ Obviously need different code in loop if we would like to get at least one step per second probably moreā¦
More to play with.
Not sure how much of interest this is, but was curious to see the timing of the different command/queryā¦
So hooked up Logic Analyzer and ran the output again:
And as expected there are pretty large gaps in time for each query as you can see:
It then goes through and does three query functions for each servo. You can see a gap between the end of the transfer to the servo and the response, which is longer than the time to transmit the query and several of the responses have a gap of time in the response:
Example: the output of the command #1QV\r at baud 250000 takes about 196us,
then there is a delay in the response of about: 396us
Then first part of response: *1QV takes about: 152us
Then another gap of about: 182us
Then the actual response: 11936\r which again about: 232us
So the one round trip took: 1172us
And likewise similar timing on the QT (Query temperature command), of about: 1003us
I heard that maybe this can be sped up by doing all of the appropriate query commands for a single servo as one output and wait for responsesā¦ Note: I hacked in code to see how well it might work:
// BUGBUG:: quick test to see how long it would take with 3 query in one...
em = 0;
for (int j = 0; j < NUM_SERVOS; j++) {
myLSS.setServoID(pgm_axdIDs[j]); // So first is which servo
Serial1.printf("#%uQD\r#%uQV\r#%uQT\r", pgm_axdIDs[j], pgm_axdIDs[j], pgm_axdIDs[j]);
uint8_t cnt_left = 3;
elapsedMicros em_timeout;
while (cnt_left && em_timeout < 5000) {
if (Serial1.read() == '\r') cnt_left--;
}
}
Serial.printf("TQS:%u\n", (uint32_t)em);
It might help a bit, but still large gapsā¦
Here is logic analyzer outputā¦
So not sure how much it would make sense to add in combined query functionsā¦
Again not sure how interesting this information is.
Good morning @dialfonzo @scharette @cbenson and all:
Note: that same test program mentioned above, has a section where I try to print out all of the servo values using a table:
Again nothing special, I assume you have a similar test:
const LSSQLIST query_list[] = {
{LSQ_S16, LSS_QueryStatus},
{LSQ_S16, LSS_QueryOriginOffset},
{LSQ_S16, LSS_QueryAngularRange},
{LSQ_S16, LSS_QueryPositionPulse},
{LSQ_S16, LSS_QueryPosition},
{LSQ_S16, LSS_QuerySpeed},
{LSQ_S16, LSS_QuerySpeedRPM},
{LSQ_S16, LSS_QuerySpeedPulse},
{LSQ_S16, LSS_QueryMaxSpeed},
{LSQ_S16, LSS_QueryMaxSpeedRPM},
{LSQ_S16, LSS_QueryColorLED},
{LSQ_S16, LSS_QueryGyre},
{LSQ_S16, LSS_QueryID},
{LSQ_S16, LSS_QueryBaud},
{LSQ_STR, LSS_QueryFirstPosition},
{LSQ_STR, LSS_QueryModelString},
{LSQ_STR, LSS_QuerySerialNumber},
{LSQ_S16, LSS_QueryFirmwareVersion},
{LSQ_S16, LSS_QueryVoltage},
{LSQ_S16, LSS_QueryTemperature},
{LSQ_S16, LSS_QueryCurrent},
{LSQ_S16, LSS_QueryAnalog},
{LSQ_S16, LSS_QueryAngularStiffness},
{LSQ_S16, LSS_QueryAngularHoldingStiffness},
{LSQ_S16, LSS_QueryAngularAcceleration},
{LSQ_S16, LSS_QueryAngularDeceleration},
{LSQ_S16, LSS_QueryEnableMotionControl},
{LSQ_S16, LSS_QueryBlinkingLED}
};
void PrintServoValues(void) {
int32_t wID;
if (!FGetNextCmdNum(&wID))
return;
Serial.printf("\nServo %u values\n", wID);
for (uint8_t i = 0; i < (sizeof(query_list) / sizeof(query_list[0])); i++) {
// Variables
int16_t value = 0;
// Ask servo for status; exit if it failed
elapsedMicros em = 0;
if (!(LSS::genericWrite(wID, query_list[i].str, LSS_QuerySession)))
{
Serial.printf(" Failed genericWrite %s\n", query_list[i]);
break;
}
// Read response from servo
if (query_list[i].lsqrt == LSQ_S16) {
value = (int16_t) LSS::genericRead_Blocking_s16(wID, query_list[i].str);
uint32_t delta_time = em;
LSS_LastCommStatus comm_status = myLSS.getLastCommStatus();
if (comm_status != LSS_CommStatus_ReadSuccess) {
Serial.printf(" %s - %d failed(%d) t:%u\n", query_list[i].str, value, (uint32_t)comm_status, delta_time);
} else {
Serial.printf(" %s - %d t:%u\n", query_list[i].str, value, delta_time);
}
} else {
const char *valueStr = LSS::genericRead_Blocking_str(wID, query_list[i].str);
uint32_t delta_time = em;
LSS_LastCommStatus comm_status = myLSS.getLastCommStatus();
if (comm_status != LSS_CommStatus_ReadSuccess) {
Serial.printf(" %s - %s failed(%d) t:%u\n", query_list[i].str, valueStr, (uint32_t)comm_status, delta_time);
} else {
Serial.printf(" %s - %s t:%u\n", query_list[i].str, valueStr, delta_time);
}
}
}
}
I simple run against one servo, the output shows:
Cmd: 9 3
Servo 3 values
Q - 1 t:756
QO - 0 t:829
QAR - 1800 t:1064
QP - 1668 t:1097
QD - 152 t:901
QWD - 0 t:910
QWR - 0 t:926
QS - 0 t:833
QSD - 360 t:967
QSR - 60 t:932
QLED - 0 t:1017
QG - 1 t:829
QID - 3 t:910
QB - -12144 t:1471
QFD - DIS t:1649
QMS - LSS-ST1 t:1140
QN - 141464319601614485 t:1542
QF - 368 t:926
QV - 12006 t:1140
QT - 368 t:1023
QC - 0 t:896
QA - 0 failed(2) t:99042
QAS - 0 t:894
QAH - 4 t:1117
QAA - 100 t:958
QAD - 100 t:974
QEM - 1 t:893
QLB - 0 failed(2) t:99142
A few of these are under a millisecond, but most are near that or above. Also timeout appears to be near 100ms
And you can see similar gaps of time:
Also there are times I am wondering how accurate your baud rates are? For example last year when I was initially playing with this I was trying to run at .5MB, i.e. 500000 I was running into issues so I reduced this to 250000
But sometimes I get bad resultsā¦ Example I did the 9 command a few times in succession on different servos and sometimes I get failures to read in things like the model number or serial number, again like:
Servo 3 values
Q - 1 t:714
QO - 0 t:822
QAR - 1800 t:1030
QP - 1668 t:942
QD - 152 t:896
QWD - 0 t:885
QWR - 0 t:899
QS - 0 t:838
QSD - 360 t:1008
QSR - 60 t:968
QLED - 0 t:1033
QG - 1 t:890
QID - 3 t:998
QB - -12144 t:1558
QFD - DIS t:1623
QMS - LSS-ST1 t:1229
QN - (null) failed(2) t:100747
QF - 368 t:916
QV - 12004 t:1158
QT - 375 t:1208
QC - 0 t:887
QA - 0 failed(2) t:99811
QAS - 0 t:895
QAH - 4 t:883
QAA - 100 t:965
QAD - 100 t:1003
QEM - 1 t:886
QLB - 0 failed(2) t:99347
And looking at the Logic analyzer for the QN I see things like framing errors:
So not sure yet if I should keep reducing the Baud rate and/or can we accurately compute what actual baud rate the servo is using when I ask for 250K?
I think this is quite interesting. I started off doing this but at a lower baud using my Arduino here - >Lynxmotion SES V2 Hexapod Robot. If my maths is right, that is around 0.56ish degrees in 1ms(round trip) So, approx 0.5 degree motion would be elapsed before we get the position value (if this was the last one requested). It would be certainly nice to get the data quickly but I think it might be down to the ADC sampling the various analog values and then packing it in which might have taken some time.
If we combine the queries this certainly tells us that the we want to ask the interesting things first i.e. position then current followed by the restā¦ I guess. Howeverā¦ quite an interesting test to try outā¦