В: Проблема 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)

0 ответов

Другие вопросы по тегам