NucleoとmbedのWeb IDEと加速度計で傾きアラームをつくる

メイカーの趣味を実生活に役立てるため、傾きに応じてブザーがなる装置をつくることになりました。以下が、ブレッドボードでプロトタイピングしたものの動作イメージ。

使用した部品

以下の部品を使用します。マイコン制御が必要なときにいつも使っているNucleo + mbedの組み合わせです。

  • Nucleo-L432KC (ブレッドボードにさせるCortex-M4マイコンモジュール)
  • 加速度計 LIS3DH(秋月電子のDIPモジュールAE-LIS3DH)
    • この加速度計をI2Cで読み出すためのライブラリはすでにを使うと一瞬です。
    • 3軸の加速度情報がfloat[3]で取得できます。
    • 裏面のサーフェスジャンパを3個ともはんだ付けして、I2Cで読み出せる設定にします。このモジュールのI2Cのアドレスは0x30になります(あとでライブラリのコンストラクタに渡すときに使います)。
  • ブザー (発振回路内蔵で電圧をかけるだけで音がでるもの; 秋月で100円のPB03SD12を使用)
    • NucleoのGPIOピンの出力を直接接続。

配線

ブレッドボードにならべて、以下のようにピンを接続します。

プログラム開発の手順

  1. mbedのウェブ上のIDEで、Nucleo-L432KCをプラットフォームとして追加し、新規プロジェクトを作成。テンプレートは"Display a message on PC using UART"等でOKです。
  2. メニューバーのImportボタン→ 検索フィールドからLIS3DHを検索。Kenji AraiさんLIS3DHライブラリを選択して、ありがたく使わせてもらいます。
  3. main.cppを開いて、以下のようなソースコードを入力します。
  4. Compileをクリック。コンパイルが成功すると、生成された実行形式がダウンロードされる。
  5. NucleoとMacをUSBケーブルで接続。USBディスクとしてマウントされたディスクに、ダウンロードしたバイナリをドラッグドロップすると、バイナリが内蔵ROMに書き込まれ、自動的に実行開始される。
  6. ボードを傾けていき、80度(プログラム内で指定しているthreshold)を超える傾きになると、ブザーがなります。
  7. screenコマンドでシリアルコンソールに接続すると、以下のように計測値がダンプされます(引数のusbmodemNNNNのところは、環境ごとに変わるので、適宜ls等で確認して指定)。「傾き(off angle)」は、(0, 0, 1)というベクトルと、加速度の計測値の内積のarccosで計算しています。浮動小数点演算も三角関数も普通のC++として簡単に記述できて、期待通り動いてくれるのがmbedのいいところですよね。 ```shell screen /dev/tty.usbmodem1413 LIS3DH Ready = 1 X = 9.3359 Y = 0.1961 Z = 2.4320 Off angle 75.4 deg LIS3DH Ready = 1 X = 9.4928 Y = 0.3530 Z = 1.4122 Off angle 81.5 deg LIS3DH Ready = 1 X = 9.2575 Y = 0.1569 Z = 2.9420 Off angle 72.4 deg (screenコマンドの終了はCtrl+A → Ctrl+K → Yを続けて入力) ```
  8. 今回使用したブザーはNucleoのGPIOの3.3Vでならすとちょうどよいくらい(うるさすぎず、でもちゃんと聞こえる)の音量でした。

PCB化とケーシング

  • Eagleのライセンスを買ってしまったので、PCBのデザインをしてみました。
  • 2017年06月03日にElecrowに5枚発注(4.9ドル/送料別)したので、届いたら組み上げて、電池での動作などを試験します。シンガポールへの送料は$14.99なので、送料のほうが高い・・・。
  • ちなみにElecrowの中国→日本と、中国→シンガポールの送料は以下のような感じ(2017年6月5日時点)。日本向けのEMS($12.21)のほうがHong Kong DHL($14.99)より2.5ドル安いですね。Registered AirmailはAliexpressでの買い物のときによく使うのですが、届くまで3週間くらいかかる(ほとんど通関手続きを待つところで時間をくっているみたい)のと、1度$50くらいの買い物が途中で無くなったことがあったので、今回はDHLにしました。
    日本向け送料。
    シンガポール向け送料。
  • ケースは3Dプリンタで作って、服にとめて使えるようにしたいと思っています。