В: Проблема Python с преобразованием 32-битной длинной подписи в массив 7-битных значений
Я изо всех сил пытаюсь решить проблему с Python и Firmata, так как для этого требуется преобразование 32-битной длины в массив 7-битных (стиль midi) int. У меня есть 2 варианта, ни один из них не работает, похоже, обе функции отправляют мусорное значение "position". Мотор запускается и продолжает вращаться бесконечно, количество шагов не требуется. Другие функции, для которых это не требуется, работают нормально. Как это решить? Заранее спасибо.
Из документации:
Stepper to (absolute move)
Moves a stepper to a desired position based on the number of steps from the zero position.
The position is specified as a 32-bit signed long.
0 START_SYSEX (0xF0)
1 ACCELSTEPPER_DATA (0x62)
2 to command (0x03)
3 device number (0-9)
4 position, bits 0-6
5 position, bits 7-13
6 position, bits 14-20
7 position, bits 21-27
8 position, bits 28-32
9 END_SYSEX (0xF7)
Версия № 1
def accStepFmt_MoveTo(brd, dev_no, pos):
cmd = bytearray([acc.ACCELSTEPPER_TO, dev_no])
pos7bit = encode7bit(pos)
cmd.extend(pos7bit)
brd.send_sysex(acc.ACCELSTEPPER_DATA, cmd)
def encode7bit(v):
values = [v & 127]
v >>= 7
while v:
values.insert(0, v & 127 | 128)
v >>= 7
return values
Версия № 2
def accStepFmt_MoveTo(brd, dev_no, pos):
s = bin(pos)[2:].zfill(32)
cmd = bytearray([acc.ACCELSTEPPER_TO, dev_no,
int(s[0:6], 2), int(s[7:13], 2), int(s[14:20], 2),
int(s[21:27], 2), int(s[28:32], 2)])
brd.send_sysex(acc.ACCELSTEPPER_DATA, cmd)