2016-07-02 8 views
0

Я использую беспроводной модуль Synapse, на котором есть ATMEL ATmega128. Я подключил к нему 3-х осевой акселерометр ADXL345, и я общаюсь с ним через I2C. Модуль Synapse использует подмножество python в качестве языка сценариев.ADXL345 Преобразование данных с акселерометром

Когда я прочитал данные XYZ, я возвращаю массив из 6 байтов. EC FF EF FF 14 01

Выходные данные представляют собой два дополнения к DATAx0 в качестве младшего значащего байта, а DATAx1 - как самый старший байт. Таким образом, в приведенном выше примере EC FF является выходом для оси x.

Я изо всех сил пытаюсь превратить это в силу G. Техническое описание говорит в режиме полного разрешения (в котором я участвую) разрешение вывода увеличивается с диапазоном g , установленным битами диапазона для поддержания масштабного коэффициента 4 мг/LSB.

Я попытался следующие:

x0 = ord(data[0]) 
x1 = ord(data[1]) 
raw = x0+(256*x1) 

но стоимость сырья не имеет никакого смысла. Как преобразовать эти два байта в целое число со знаком?

Дополнительная информация Когда я делаю вызов читать ADXL345:

data = readAdxls(6) 

он возвращает строку байтов считаны из внешнего устройства I2C.

Xlsb = data[0] # EC - 236 
Xmsb = data[1] # FF - 255 
Ylsb = data[2] # EF - 239 
Ymsb = data[3] # FF - 255 
Zlsb = data[4] # 14 - 20 
Zmsb = data[5] # 01 - 1 

Так XLSB является наименее значимым байт и Xmsb является наиболее значимым байт. Это целые числа

Я предполагаю, что я просто не понимаю дополнение двоеточия и как объединить эти 2 целых числа/байты в целое число со знаком.

+0

Насколько полно это подмножество? Можете ли вы использовать модуль 'struct'? – MaxNoe

+0

Нет, модуль struct не является частью языка. FWIW, нет поддержки для поплавков. Он рассчитан на очень легкий вес. – cce1911

+0

Прошу прощения, но если два байта являются EC и FF, будучи вторым самым значительным, правильный порядок - FF EC. Поэтому для преобразования вам просто нужно: (большинство << 8 | наименее) Это даст вам необработанные данные, а затем умножьте его на выбранное разрешение датчика. Если вы переходите на максимальное разрешение, просто умножайтесь на 0,0039 – Lornioiz

ответ

0

Я не уверен, что вы делаете с ord() там ... ord(c) принимает c, один символ и выводит свой код символа ASCII.

В любом случае, для преобразования числа, чье представление в виде дополнения до двух до целого числа в Python, можно было бы сделать что-то вроде этого:

def tc(val, bits): 
    if val >= 2**(bits-1): 
     return val - (2**bits) 
    return val 

>>> tc(0xECFF, 16) 
-4865 

Хотя, как о том, как на самом деле назвать эту функцию с вашими данными , Мне нужно будет увидеть, как выглядят ваши данные в Python. Какие числа вы ожидаете увидеть для G-force?

+0

Мне следовало бы взглянуть на ord() более внимательно. Это объясняет, почему результат не имеет смысла. – cce1911

+0

Я закончил тем, что переместил msb тогда И lsb. msb << 8 | lsb Затем я назвал функцию Адама.Спасибо за совет. – cce1911

+0

Как вы идете в MSB на LSB? Наверняка вам нужен простой '+' ...? –