チューニングダイアルに使うことを想定して、ホールセンサの原理によるマグネットロータリポジションセンサを試用してみました。比較的安価に解像度の高いロータリエンコーダとして使えるようです。チップとマグネットをうまく組み合わせるために少し工夫しましたので、参考にまで紹介します。
電子部品として入手可能なロータリエンコーダは、24ステップ程度のものが多く、チューニングダイアルとして使うためにはステップ数が全然不足で物足りません。できれば400~1000ステップ程度の解像度が欲しいところですが、これを実現するには光学スリットとフォトインタラプタが使われることが多いようです。
光学式ロータリエンコーダは、機械向けのセンサとして市販されているものがあります。機械軸に接続して角度を検出するためのものですが、軸が6mmなのでそのままダイアルにも使えそうです。
このセンサを使ってみようと入手してあったのですが、
- サイズが少々大きい
- 3.3Vで動作できない(4V程度が必要。仕様は5V)
- 消費電流が大きい(内部LEDの消費?)
と、いくつか気になる欠点がありました。特に昨今のMCUベースで使うには、5Vを用意するのは面倒で、結局使わずに放置してしまいました。
そんなところに、回転検出向けのホールセンサが市販されているのを知りました。外形は普通の8ピンSOICなチップですが、マグネットを近づけると、その磁界の方向をセンスできるのです。しかも解像度は12ビット4096ステップと充分です。こんなネオジムマグネットとセットにしてチップが売られていました。このマグネットは半径方向に磁化されているため、写真のようにくっつきます。このマグネットをチップの真上で水平に回転させて、磁気の方向を読み取るわけです。
このチップを使うためには、マグネットを回転軸に取り付けて、チップの真上で回転するよう、機械的な工作が必要になります。なるべく簡単に済む方法をしばらく考えました。可変抵抗を分解して軸を取り出して使う方法など検討しましたが、イマイチです。結局、回転軸にベアリングを使うのを試してみることにしました。3Dプリンタで、ベアリングホルダを作れば比較的簡単に済むという作戦です。
使うミニチュアベアリングは606ZZという、軸が入る内径が6mm、外形17mm、厚みが6mmのものです。標準品なので安価に入手できます。このベアリングが固定できるホルダをSketchupでデザインします。注意としては、3Dプリントには誤差がありますので、ベアリングが嵌る穴を少し大きめに17.4mmとしてみました。ABSの二つのパーツを組み合わせ、ベアリングを嵌めてから、ネジで結合するという想定です。そのためのネジ穴も四隅に用意します。
STLファイルをgistに上げておきました。
これを3Dプリントします。
できあがった部品にベアリングを嵌めるため、内側を若干削ります。さすがに手では入らないので万力を使って軽く圧入しました。一方、軸は24mmの長さにアルミ棒をカットしました。右に見える丸いのがネオジムマグネットです。直径が6mmで軸と同じ大きさでした。
軸の固定をどうしようか悩みましたが、結局、軸とベアリングのインナーをグルーガン(ホットスティック)で接合してしまうことにしました。インナー内面を脱脂清掃してからベアリングと軸を予熱、溶かしたグルーをなすりつけ、軸を入れて固定してしまいます。マグネットもグルーガンで取り付けました。機械的な力が掛かるわけでは無いので、これで充分なようです。
組み合わせるとこんな感じになります。
パーツを固定するための穴は、そのままでは使えませんので、2mmのドリルをでさらって綺麗にしておきます。この穴に通すため2mmのボルトを用意しました。
チップの準備ですが、基板にカプトンテープを貼り、チップを載せてウレタン線で配線しました。ホルダを固定するための穴も開けておきます。チップからは、I2Cでデジタル的に入出力可能なのに加えて、回転角に比例したアナログ電圧も取り出すことが可能です。
この写真ではホルダの裏側が見えていますが、軸の中心に取り付けられているマグネットが見えています。
先ほどのベアリングホルダをネジで基板に共締めして取り付けます。チップの真上にマグネットがかぶさるような配置になります。回転軸がチップの真上に来ることがポイントです。
さて、チップの制御ですが、チップベンダーから、Arduinoのシールドとライブラリ、サンプルコードが配布されています。これを使ってさくっと試してみました。SparkFun Pro Micro(3.3V 8MHz)を持ってきて、先ほどの基板に配線します。電源のI2Cの計4本です。
サンプルプログラムを元に、回転角を連続で取得して表示するようなシンプルなコードにしてみました。面倒はライブラリがやってくれるので、コードはこれだけです。
これをPro Microに書き込んで実行すると、シリアルからこんな結果が得られます。軸を廻すと、数値が変化します。最初が12ビットの整数値、後ろが角度に変換した結果です。
というわけで、無事動かすことができました。消費電流も小さく、マイコン向きだと思います。I2Cのデジタル入力で試しましたが、もちろんアナログをADCに入れても使えると思います。
チップはかなり前に入手していたのですが、今回ようやく試すことができました。思った通りに使えそうな印象です。
今回使ったベアリングはミニチュアですが、チップのサイズに比べると少々大きめでした。もう少し小さく作れないかと考えています。
リファレンス
- AS5600メーカー商品ページ https://ams.com/jpn/node_78/node_377/node_386/AS5600
- オフィシャルなArduinoのシールドとサンプルコードhttps://ams.com/eng/Support/Demoboards/Magnetic-Position-Sensors/Angle-Position-On-Axis/AS5600-POTUINO
- 使用したベアリングホルダSTLファイル https://gist.github.com/edy555/20f4d5a0c9a82ba5925b88afb8821180