3D描写ライブラリを公開しました。
磁気シールド
リング型の磁石と磁気式エンコーダを組み合わせて、減速機の減速後の回転角度を直接計測しているのですが、どうもモータの磁石の影響をうけてエンコーダの値が変動してたので、磁気シールドでモータの磁力を遮蔽してみました。


出力軸にリング型の磁石を取り付けていて、ケース側のエンコーダで計測するようにしています。
試してみたのは、磁気シールドシート(日立金属のMS-FR 470-100M-T0、エコロガのMS5000M)です。(MS-FR 470-100M-T0を切り売りしているのが、エコロガのMS5000M)
モータを手で回した時のエンコーダ(14bit)の出力値です。
エンコーダ用磁石は固定しているので、出力値は変動しないのが望ましい状態での計測。
ちゃんとした計測ではないのであくまで参考程度ですが、シートを複数枚重ねるとはっきりと磁気遮蔽の効果がみられます。
また、磁気シールドシート自体も磁石にくっつく素材なので、エンコーダにシールドを近づけると、エンコーダの値が変動します。
最終的には、磁気シールドシートを4枚重ねてモータと減速機の間に挟み込むようにしました。
出力軸のエンコーダ出力値。(モータほぼ一定の速度で回転。)
エンコーダがoff-axis配置なので、非線形な値になっています。
シート入れる前
シート4枚入れた後
エンコーダの値のがたつきが多少改善されました。
本来だと、この出力軸のエンコーダの値をそのまま減速後の回転角度として使用できればよいのですが、off-axis配置で非線形なのと、多少の値のがたつきがあるため、エンコーダの値から一意に出力の回転角度を特定できませんでした。
そのため、出力軸のエンコーダの値とモータ側のエンコーダの値を用いて角度を求めるようにしました。
いろいろ方法はあると思いますが、今のところ以下の方法で回転角度を求めています。
出力軸14bitの上位10bitとモータ側14bitの上位4bitを組み合わせた14bit長のindexを持つテーブルに事前に求めた角度計算用の値を入れておいて、実行時はその値をテーブル引きして角度を求める。
index = (0xFF0 & reducer_14bit) | (motor_14bit >> 10)
angle_14bit = (0x3FFF * rotation_table[index] + motor_14bit) / reduction_ratio