加速度センサー(LIS3DH)を使う
LIS3DHという加速度センサーを使う方法を説明します。
準備
ラズパイとLIS3DHは、I2Cという仕掛け(通信メカニズム)を使ってデータをやりとりします。なので、まずラズパイがI2Cを使えるように設定します。ラズパイの画面左上にあるラズベリーのアイコンをクリックし、Preferencesを選択、さらにRaspberry Pi Configurationを選択します。小さなウィンドウが表示されるので、その中の「Interfaces」のタブを選択し、「I2C」をon/enabledにします。ラズパイをリブート(再起動)するかどうか聞かれたら、Yes/OKを選んでリブートしてください。
ラズパイとの接続
次に、ラズパイとセンサーボードをワイヤーで接続します。ラズパイの電源がオフになっている状態でやってください。ワイヤーの接続が終わったらラズパイの電源を入れます。ワイヤーをラズパイから外すときは、ラズパイの電源をオフにしてからやってください。
センサーボードには2つのコネクターが付いています。どちらにワイヤーを差し込んでもよいのですが、ここでは向かって左側のコネクターを使います(以下の写真で赤く囲った部分)。つまりボードを以下のように机の上に置いた状態で、左側にあるコネクターを使ってください。
ラズパイ側(GPIOのピン)とワイヤーの接続方法は以下の図の通りにしてください。
ワイヤーの接続が終わったら、ラズパイのTerminalを開き、次のコマンドを実行します。
i2cdetect -y 1
その結果が以下の写真のようになることを確認してください。数字の18が表示されれば、センサーが正しくラズパイに接続されているということです(ラズパイとセンサーがI2Cで通信できる状態になっている)。
センサーの動作テスト
センサーから加速度のデータを読み取るプログラムがaccel-read.pyです。lis3dh.pyを同じフォルダに置いて動かしてください。このプログラムは、1秒に1回センサーから加速度を読み取ってプリントします。これをずっと続くので、止めるにはCtrl-Cしてください。
センサーからデータを読み取るには、まず関数LIS3DH()
を使ってセンサーの準備をします。
sensor = LIS3DH()
x, y, z = sensor.readG()
関数LIS3DH()
は、センサーとのやり取りをする「通信口」のようなものを返します。ここでは、それが変数sensor
に入っています。その通信口を使って関数readG()
を呼ぶと、センサーから加速度データを読みとられ、X軸方向、Y軸方向、Z軸方向の加速度が返されます。上の例では、それが変数x
、y
、z
に入っています。加速度のデータは0から1の小数で単位はGです。
X軸、Y軸、Z軸の方向は、センサーのボードの上に書いてあります(下の写真の中で黄色く囲った部分)。それぞれの軸のプラスの方向は下の写真に書いた通りです。
センサーボードを水平にすると(例えば水平な机の上に置いて、ボードが机から浮き上がらないように指で軽く押した状態)、Z軸のプラスの方向は下向きになります。床や地面の方向(地球の方向)がZ軸のプラス方向です。逆に、天井や空を向く方向がZ軸のマイナス方向です。センサーボードを水平にしてこのプログラムを動かすと、Z軸方向の加速度は+1、Z軸方向とY軸方向の加速度は0がプリントされます。センサーボードが完璧に水平ではなかったり、センサーデータに誤差があるなどの理由で、加速度の数値はぴったり1や0にはならないです。だいたい1と0の数字がプリントされれば成功です。
加速度と力
加速度とは、1秒間に速度がどれだけ変化するか(速度の変化率)を表しています。速度が速くなれば加速度はプラスの値、速度が遅くなれば加速度はマイナスの値、速度が変わらなければ加速度はゼロです。
物体が「力(force)」を受けると、その物体には加速度が生じます。例えば、机の上に置いてある物(例えば消しゴム)を指で押すと、その消しゴムは動きます。「指で押す」というのは、その消しゴムに力をかけた(消しゴムが力を受けた)ということです。消しゴムは最初動いていなかったので、最初の速度はゼロです。また、力を受けなければ、消しゴムはずっと動かないままなので(速度が変わらないので)、加速度もゼロです。この消しゴムに力がかかって動くと、速度はプラスの値になります。ゼロだった速度がプラスの値に上がる(増える)ので、このとき加速度はプラスの値になります。
消しゴムを指で押すのをやめると、消しゴムは止まります。プラスの値だった速度が減るので、このとき加速度はマイナスの値になります。消しゴムは机の表面から摩擦力(friction force)を受けるので、その力によってマイナスの加速度が生じます。このように、物が力を受けると、その物には(プラスかマイナスの)加速度が生じます。逆に言えば、物が加速度を持っているということは、その物体に力がかかっているということです。
指で消しゴムを押すとき、ちょっと軽く押すだけの場合と、ぐいっと強く押す場合を考えてください。強く押す方が、消しゴムは速く動きます。どちらの場合も最初の速度はゼロですが、強く押す場合の方がより大きな速度へ変化します。速度の変化率が大きいということは、加速度が大きいということなので、強く押す方が加速度が大きくなります。このように、物の加速度は、その物にかかる力によって変わります。ひとことで言えば、加速度は力に比例します。
もし物理でF = maという式を習っていれば、この式が「加速度は力に比例する」ことを表しています。Fは力(force)、mは質量(重さ、mass)、aは加速度 (acceleration)です。この式を変形して、a = F/mとすれば、加速度が力に比例していることが分かります。
加速度が測っているもの
物が加速度を持っているということは、その物に力がかかっているということです。この力を測って、その力の量から加速度を計算するのが加速度センサーの仕事です。加速度センサーの中身はセンサーごとに(センサーを作る会社ごとに)違いますが、多くのセンサーには「力を測るセンサー」が中に入っていると考えてください。
センサーの内部を単純化したのが以下の図です。センサー内では、棒の先に重りがついていると考えてください。この棒には「ひずみゲージ(strain gauge)」が貼ってあって、棒がどのくらい曲がっているかを測ります。
この図のセンサーに、左方向の力をかけるとします。すると棒が右側へ曲がります。力の大きさによって棒の曲がり方も変わります(力が大きいほど棒も大きく曲がる)。加速度センサーは、この棒がどれだけ曲がっているかを測って力の大きさを計算しています。そして、a = F/mの式を使って、力の量から加速度を求めています。
この棒(とその先についている重り)は、加速度センサーの中に3つあって、それぞれX軸、Y軸、 Z軸方向の力を測っています。上の図では水平方向の力を測っています。以下の図では垂直方向の力を測っています。
垂直方向には常に重力がかかっているので、センサー内の棒は常に下方向へ曲がっています。つまり、下方向への(地球の方向への)加速度が生じています。この加速度のことを「重力加速度」(重力によって生じる加速度、gravitational acceleration)といいます。地球上のすべての物には常に重力加速度が生じています。なので、まったく動いていない時でも、加速度センサーは重力加速度を感知して(senseして)います。先ほどaccel-read.pyを使ったとき、加速度センサーがZ軸方向に約+1の加速度を測りました。これが重力加速度です。
加速度の単位
加速度センサーが使う単位は通常Gです。「ジー」と読みます。これは、測った加速度が重力加速度の何倍かを表す単位です。1Gとは重力加速度と同じ加速度、2Gとは重力加速度の2倍の加速度です。先ほどaccel-read.pyを使ったとき、加速度センサーがZ軸方向に約+1の加速度を測りました。これはZ軸のプラス方向へ約1Gの加速度を感知したということです。
1Gというのは、正確にいうと9.806 m / s^2のことです。m / s^2は、メートルを秒の2乗で割った単位です。速度の単位はm/sで、加速度は速度の変化率なのでm / s^2となります。科学的にはこれが正式な加速度の単位です。プログラムでセンサーから加速度を読むとき、以下のようにすると単位はGになります。
sensor = LIS3DH()
x, y, z = sensor.readG()
一方、以下のようにすると、単位はm / s^2になります。
sensor = LIS3DH()
x, y, z = sensor.read()
加速度センサーが測る加速度
加速度センサーは、動いていない時でも重力加速度を常に感知しています。そして、センサーが動くと、その動きによって生じる加速度も感知します。センサーはこの2種類の加速度を両方同時に感知します。
以下のようにセンサーボードを水平な机の上に置いて、太い青い矢印の方向に動かすとします。
このとき、センサーはX軸に対してプラスの加速度を感知します(X軸のプラスの方向へ力がかかるので)。また同時に、Z軸に対してプラスの加速度(重力加速度)を感知します。Y軸方向への動きはないので、Y軸に対する加速度はゼロになります。また、センサーボードを太い青い矢印とは逆の方向へ動かすと、X軸に対してマイナスの加速度を感知します(X軸のマイナスの方向へ力がかかるので)。Z軸に対してはプラスの加速度(重力加速度)、Y軸に対しては加速度ゼロを感知します。
このことを、実際にaccel-read.pyを動かして確かめてください。センサーボードを水平な机の上に置いて、X軸に対してセンサーボードを押したり引いたりするのをくり返してください。X軸に対して加速度がプラスになったりマイナスなったりするのがくり返され、その間Z軸に対しては約1G、Y軸に対しては約0Gの加速度のままになります。現在、加速度データを1秒ごとに読み取っていますが、これの間隔を短くすると加速度の値の変化が見やすくなるかもしれません。
また、ある程度速くセンサーボードを動かさないと加速度の値に変化がでません。1Gは9.806 m/s^2です。つまり、止まっていた物(速度ゼロだった物)が1秒間で速度9.806 m/sになるということです。時速で言えば、1秒で0 km/hから35 km/hになる加速、つまり3秒くらいで0 km/hから100 km/hになる加速です。ですので、センサーボードをかなり速く動かしても、1Gを超すのは簡単ではありません。
加速度センサーを使って傾きを測る
加速度センサーは常に重力加速度を感知します。そして、重力加速度の方向は一定です(常に地球の中心部を向いている)。この性質を応用すると、センサーボードの傾きを計算できます。
これまではセンサーボードを以下のように水平な机の上に置いていました。Z軸のプラスの方向が下を向いていた(地球の中心部を向いていた)ので、重力加速度はZ軸に対してプラスの値として感知されました。
今度は、以下のようにセンサーボードを机の上に(垂直に)立ててください。こうすると、座標系(coordinate system)が回転して軸の向きが変わります。Y軸のプラス方向が下を向くようになります。この場合、重力加速度はY軸方向のプラスの値として感知されます。X軸、Y軸に対して加速度はゼロとなります。
このように、センサーボードの向き、傾きが変わると、それに応じてX軸、Y軸、Z軸の方向が変わり、重力加速度がどの軸で感知されるかが変わります。これを調べるとセンサーボードの向き、傾きが分かります。Z軸方向で+1Gならセンサーボードの表面が上を(空の方を)向いているということで、Z軸方向で-1Gならセンサーボードの表面が下を(地球の方を)向いているということです。上記写真のように机に対して垂直にボードを立てるとY軸方向で+1Gとなり、上下逆さまにするとY軸方向で-1Gとなります。実際にaccel-read.pyを使って試してみてください。
スマートフォンを使うときに、画面の向きに応じてアプリが回転するものがあります。例えば、画面を縦長にしてスマホを持っているときと横長にして持っているときでは、写真アプリの表示方法が変わります。あの機能は、スマホ内の加速度センサーを使って画面の向きを調べて実現しています。また、画面を下向きにして置いておくとバッテリー消費を抑える機能が働く「フェイスダウン機能」も加速度センサーを使って実現されています(加速度センサー以外に照度センサーや近接センサーも一緒に使っているようです)。