ADXL345 x Raspberry Pi をシェルスクリプトで利用する
表題の組み合わせでは Python を使うのが定番だと思いますが、 Raspberyy Pi Zero WH に ADXL345 を取り付けてスパイスボトルに詰め込んだときに 「ちょっとしたツールとして利用するならシェルスクリプトの方が取り回しが良いかな」ということで、 シェルスクリプトから ADXL345 を利用することにしました。
その後、とくにメンテナンスもしていなかったのですが、 少し前に ADXL345 関連のスクリプトを少し整理したので、 よい機会なので gist に張り付けておきます。
前提
- Raspbian Buster 以降(それより前のバージョンでは gpio や i2c 関連のツールの追加インストールや root の権限が必要になるかもしれません)
- ADXL345 は I2C のチップアドレス
0x1D
から利用でき、INT1 は Raspberry Pi の GPIO 4 に接続されている。
加速度を取得
タクトスイッチを押したときに、筐体の向きによって処理を変更しようかと思って作ったものです。
既知の問題としては、
i2cget
で WORD 単位で値を読みだしているので(3軸まとめて読みだせていない)、実際の測定結果とはズレが出ているかもしれません。
ダブルタップ検出
以下のように「ラズパイを収めたケースがダブルタップされた」を検出するために作りました。
echo "double tap"
のところに実際の処理を記述します。
既知の問題としては、INT_SOURCE
の読みだしで INT1_PIN
の割込みがクリアされた後、gpio -g wfi "${INT1_PIN}" rising
が実行される前に割込みが発生すると、スクリプトがスタックしてしまいます。
電源オンのままのラズパイをポケットに入れて走ったときにスタックしたことがありますが、 普段はあまり気にする必要はないかと思います (ちなみに、ウエストパックに入れて走った場合はある程度固定されているからか、スタックしませんでした)。
問題点
個々のスクリプトによる既知の問題の他に、スクリプトを同時に実行したときに問題が出る可能性があります。
例えば、後から実行されたスクリプトが ADXL345 の設定を異なる値に上書きするような場合には、注意が必要です(今回のスクリプトでは同時に使っても問題は出ないと思います)。
まとめ
ダブルタップ検出は頻繁に使っていますが、(既知の問題を除いて)とくに問題なく利用できています。
速度を要求されるような場面でなければ、gpio や i2c を使うときの選択肢としてシェルスクリプトも入れておくと良いかもしれません。