センサを接続してスクリプトを書いてみよう
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」を押すと、スクリプトの書き込みが完了です。