ROHM製のとっても小さな加速度センサICです。
弊社のいくつかの製品で使用しています。SENSOR-PLUSの基板の中央に搭載されているのがKXTJ3-1057で、縦横それぞれ2mmの大きさです。
機能概要
KXTJ3-1057の機能概要は以下の通りです。
- 3軸の加速度センサーです。
- 感度は2,4,8,16gを切り替えることができます。
- 分解能は、14,12,8ビットを切り替えることができます。
- データーレートは、0.78Hzから1600Hzまで切り替えることができます。
- インターフェースはI2Cです。
Arduinoでの利用
ライブラリマネージャで[KXTJ3-1057]と入力すると、現時点では1つのライブラリが登録されています。バージョンナンバーが0.0.1とちょっと気がかりな感じもしますが使用することができます。
このライブラリの利用例は、以下のページでご確認ください。
また、インストールに少し手間がかかりますが、以下のページの下方のリンクから、Arduino用のライブラリをダウンロードできます。
MicroPythonでの利用
MicroPython用の適当なドライバが見つけられなかったので、作成したドライバを以下に示します。開発基板の/libフォルダに登録してご利用ください。
"""
KXTJ3-1057 Driver
for MicroPython
Version 1.0
Copyright 2023 K.Kakizaki
https://www.rohm.co.jp/sensor-shield-support/kxtj3-1057
https://kionixfs.azureedge.net/en/datasheet/KXTJ3-1057-Specifications-Rev-5.0.pdf
https://kionixfs.azureedge.net/en/document/AN065-Getting-Started.pdf
https://kionixfs.azureedge.net/en/document/TN017-Power-On-Procedure.pdf
The following page/code was used as a reference.
https://docs.firialabs.com/_modules/CB3/kxtj3.html
"""
from micropython import const
import time
class KXTJ3:
CTRL_REG1 = const(0x1B)
CTRL_REG2 = const(0x1D)
DATA_CTRL_REG = const(0x21)
XOUT_L = const(0x06)
XOUT_H = const(0x07)
YOUT_L = const(0x08)
YOUT_H = const(0x09)
ZOUT_L = const(0x0A)
ZOUT_H = const(0x0B)
def __init__(self, i2c, addr=0x0E):
self._i2c = i2c
self._addr = addr
self._buffer1 = bytearray(1)
self._buffer2 = bytearray(2)
self._buffer6 = bytearray(6)
self._gsel = {2:0b000_00,4:0b010_00,8:0b100_00,16:0b001_00}
self._hsel = {1:0b1001,3:0b1010, 6:0b1011,12:0b0000,25:0b0001,50:0b0010,100:0b0011,200:0b0100,400:0b0101,800:0b0110,1600:0b0111}
self._range = 2
self._rate = 50
self.reset()
def getX(self):
return self._getAccel(KXTJ3.XOUT_L)
def getY(self):
return -self._getAccel(KXTJ3.YOUT_L)
def getZ(self):
return self._getAccel(KXTJ3.ZOUT_L)
def _getAccel(self, reg):
self._read_multiple_registers(reg, self._buffer2)
g = (self._buffer2[1] << 8) | self._buffer2[0]
g = (g & 0x7fff) - (g & 0x8000)
return g
def getXYZ(self):
self._read_multiple_registers(KXTJ3.XOUT_L, self._buffer6)
x = (self._buffer6[1] << 8) | self._buffer6[0]
y = (self._buffer6[3] << 8) | self._buffer6[2]
z = (self._buffer6[5] << 8) | self._buffer6[4]
x = (x & 0x7fff) - (x & 0x8000)
y = (y & 0x7fff) - (y & 0x8000)
z = (z & 0x7fff) - (z & 0x8000)
return (x, -y, z)
def dump_axes(self):
print("X={}, Y={}, Z={}".format(*self.getXYZ()))
def setRange(self, range):
self._range = range
if range in self._gsel:
v = self._gsel[range]
print(v)
else:
self._range = 2
v = self._gsel[self._range]
self._reg1 = (self._reg1 & 0b111_000_11) | v
self._write_register(KXTJ3.CTRL_REG1, self._reg1)
return self._range
def getRange(self):
return self._range
def setRate(self, rate):
self._rate = rate
if rate in self._hsel:
v = self._hsel[rate]
else:
self._hsel._rate = 50
v = self._hsel[self._rate]
self._dc_reg = (self._reg1 & 0b111_000_11) | v
self._write_register(KXTJ3.DATA_CTRL_REG, self._dc_reg)
return self._rate
def getRate(self):
return self._rate
def reset(self):
# Go to stand-by mode
self._write_register(KXTJ3.CTRL_REG1, 0)
self._write_register(KXTJ3.CTRL_REG2, 0)
self._write_register(KXTJ3.CTRL_REG2, 0x80)
time.sleep_ms(2) # Software Reset Time max
# Stand-by, High-Res, Interrupts-Off, 2g, Wakeup-Disabled
self._write_register(KXTJ3.CTRL_REG1, 0b_0_1_0_000_0_0)
self._dc_reg = 0b_0000_0010 # default 50Hz
self._write_register(KXTJ3.DATA_CTRL_REG, self._dc_reg)
# Back to operational mode
# Stand-by, High-Res, Interrupts-Off, 2g, Wakeup-Disabled
self._reg1 = 0b_1_1_0_000_0_0
self._write_register(KXTJ3.CTRL_REG1, self._reg1)
def _write_register(self, reg, value):
self._buffer2[0] = reg
self._buffer2[1] = value
self._i2c.writeto(self._addr, self._buffer2)
def _read_multiple_registers(self, start, buffer):
self._buffer1[0] = start
self._i2c.writeto(self._addr, self._buffer1,False)
self._i2c.readfrom_into(self._addr, buffer)
ドライバの利用例は以下のページでご確認ください。
搭載製品
上記のほかに、UNO-PLUS系開発ボード、SLIM-PLUS系開発ボードに搭載されています。