CodeZine(コードジン)

特集ページ一覧

USBケーブル1本で組み込みLinuxにトライ! 「BeagleBone Green」でセンシングしてみよう

IoT Starter Studio 第20回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2017/07/27 14:00

目次

センサを接続してスクリプトを書いてみよう

 SSHログインができたら、早速センサを接続してみましょう!

 今回は、Grove端子のI2C接続の3軸加速度センサ(±16g)(型番:SKU 101020054)を使います。I2C接続では、他の種類のセンサであっても基本は同じなので、この記事を参考にして是非いろいろなセンサを試してみてくださいね。

 このセンサは「I2C」という通信規格を利用するセンサなので、上の図の位置にあるGrove端子に接続します。

 もう一方の端子は「UART」という回路に内部的につながっていて、「シリアル通信」という通信規格を利用するものなので、今回は利用しません。間違えないように気をつけてください。

 Grove端子にセンサを接続したら今度はパソコン側に戻り、Terminalでi2cdetect -y -r 1と入力してEnterを打ってみましょう。すると表のようなものが表示されます。

 この中で数値がひとつだけ、「53」と表示されているのがおわかりでしょうか? これはI2Cにおける、3軸加速度センサにアクセスするための「アドレス」です。もしも他の種類のセンサを使っている場合、別の数値になります。

 この数値は後の「スクリプト」内で使われます。今回は確認のみですが、センサを使ったプログラミングを行う際は、この「アドレス」を覚えておく必要があります。

 センサが接続できればあとは自由にスクリプトを書くことができます。今回は公式のサンプルスクリプトをコピー&ペーストで利用してみます。

 Seeed Studio公式Wikiの「Grove - 3 Axis Digital Accelerometer(±16g)」にアクセスし、ページ中ほどにある「With BeagleBone Green」の項目を探します。そして、その直下にあるソースコードをコピーします。

import smbus
import time

bus = smbus.SMBus(1)

# ADXL345 device address
ADXL345_DEVICE = 0x53

# ADXL345 constants
EARTH_GRAVITY_MS2   = 9.80665
SCALE_MULTIPLIER    = 0.004

DATA_FORMAT         = 0x31
BW_RATE             = 0x2C
POWER_CTL           = 0x2D

BW_RATE_1600HZ      = 0x0F
BW_RATE_800HZ       = 0x0E
BW_RATE_400HZ       = 0x0D
BW_RATE_200HZ       = 0x0C
BW_RATE_100HZ       = 0x0B
BW_RATE_50HZ        = 0x0A
BW_RATE_25HZ        = 0x09

RANGE_2G            = 0x00
RANGE_4G            = 0x01
RANGE_8G            = 0x02
RANGE_16G           = 0x03

MEASURE             = 0x08
AXES_DATA           = 0x32

class ADXL345:

    address = None

    def __init__(self, address = ADXL345_DEVICE):
        self.address = address
        self.setBandwidthRate(BW_RATE_100HZ)
        self.setRange(RANGE_2G)
        self.enableMeasurement()

    def enableMeasurement(self):
        bus.write_byte_data(self.address, POWER_CTL, MEASURE)

    def setBandwidthRate(self, rate_flag):
        bus.write_byte_data(self.address, BW_RATE, rate_flag)

    # set the measurement range for 10-bit readings
    def setRange(self, range_flag):
        value = bus.read_byte_data(self.address, DATA_FORMAT)

        value &= ~0x0F;
        value |= range_flag;
        value |= 0x08;

        bus.write_byte_data(self.address, DATA_FORMAT, value)

    # returns the current reading from the sensor for each axis
    #
    # parameter gforce:
    #    False (default): result is returned in m/s^2
    #    True           : result is returned in gs
    def getAxes(self, gforce = False):
        bytes = bus.read_i2c_block_data(self.address, AXES_DATA, 6)

        x = bytes[0] | (bytes[1] << 8)
        if(x & (1 << 16 - 1)):
            x = x - (1<<16)

        y = bytes[2] | (bytes[3] << 8)
        if(y & (1 << 16 - 1)):
            y = y - (1<<16)

        z = bytes[4] | (bytes[5] << 8)
        if(z & (1 << 16 - 1)):
            z = z - (1<<16)

        x = x * SCALE_MULTIPLIER
        y = y * SCALE_MULTIPLIER
        z = z * SCALE_MULTIPLIER

        if gforce == False:
            x = x * EARTH_GRAVITY_MS2
            y = y * EARTH_GRAVITY_MS2
            z = z * EARTH_GRAVITY_MS2

        x = round(x, 4)
        y = round(y, 4)
        z = round(z, 4)

        return {"x": x, "y": y, "z": z}

if __name__ == "__main__":
    # if run directly we'll just create an instance of the class and output
    # the current readings
    adxl345 = ADXL345()

    while True:
        axes = adxl345.getAxes(True)
        print "ADXL345 on address 0x%x:" % (adxl345.address)
        print "   x = %.3fG" % ( axes['x'] )
        print "   y = %.3fG" % ( axes['y'] )
        print "   z = %.3fG" % ( axes['z'] )
        time.sleep(2)

 Terminalに戻り、「vim」というエディタを用いて「accelerometer.py」という名前でスクリプトファイルを保存します。vim accelerometer.pyと入力してEnterを押すと、下のような画面が出てきます。

 iキーを押すと、下のほうの表示が「-- INSERT --」に変わるので、先ほどのソースコードをペーストします。

 完了したらescキーを押して「-- INSERT --」の表示が消えたのを確認し、:wqと入力して「Enter」を押すと、スクリプトの書き込みが完了です。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:IoT Starter Studio

もっと読む

著者プロフィール

  • うこ(dotstudio株式会社)(ウコ)

     ハードウェアの試作からバックエンドシステム設計まで幅広く手がけるエンジニア。ヒトとテクノロジーの融和をモノづくりを通して表現することを目指し日々活動している。dotstudio株式会社で様々なエンジニアリング業務に携わりつつ、駆け出しの研究者としてヒトの知能と身体の関係を明らかにする研究にも取り組...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5