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系開発ボードに搭載されています。