2016-07-02 1 views
0

ATMEL ATmega128이있는 Synapse 무선 모듈을 사용하고 있습니다. ADXL345 3 축 가속도계를 연결했는데 I2C를 통해 통신합니다. Synapse 모듈은 스크립팅 언어로 파이썬의 하위 집합을 사용합니다.ADXL345 가속도계 데이터 출력 변환

XYZ 데이터를 읽을 때 나는 6 바이트 배열을 되 찾는다. EC FF EF FF 14 01

출력 데이터는 DATAX0을 최하위 바이트로, DATAx1을 최상위 바이트로하여 2의 보수입니다. 위의 예에서 EC FF는 x 축의 출력입니다.

저는 G 힘으로 변환하는 방법에 어려움을 겪고 있습니다. 데이터 시트는 전체 해상도 모드 (내가 속해 있음)에서 출력 해상도가 g 범위 ( )가 4 mg/LSB 스케일 계수를 유지하기 위해 범위 비트로 설정되면 증가한다고 말합니다.

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

는하지만, 원시의 값이 이해가되지 않습니다

나는 다음과 같은 시도했습니다. 이 두 바이트를 부호있는 정수로 변환하려면 어떻게해야합니까?

추가 정보 내가 ADXL345 읽기 위해 전화를 걸 때 : 그것은 바이트의 문자열이 다시 외부 I2C 디바이스에서 읽을 반환

data = readAdxls(6) 

합니다.

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 문자 코드를 출력합니다.

어느 쪽이든, 누구의 표현이다 2의 보수에 파이썬에서 서명 숫자를 정수로 변환하기 위해, 하나는 다음과 같이 할 것 :

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

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

비록을 실제로 데이터와 그 함수를 호출하는 방법에 관해서는 , 나는 당신의 데이터가 파이썬에서 어떻게 생겼는지를 볼 필요가있다. G-force에서 어떤 종류의 숫자를 기대합니까?

+0

을 곱하면됩니다. ord()를 더 자세히 조사해야합니다. 왜 결과가 의미가 없는지 설명합니다. – cce1911

+0

나는 msb와 lsb를 이동시켜 버렸다. msb << 8 | lsb 그런 다음 아담의 기능을 호출했습니다.팁 고마워. – cce1911

+0

MSB를 LSB와 OR 연결하는 이유는 무엇입니까? 분명히 간단한 '+'를 원한다면 ...? –

관련 문제