ミニ四駆モーター用エンコーダ基板の製作(2)
Posted by arms22 on 2017年07月09日

前回の続き。Arduinoを使ってミニ四駆モータに単三電池2本を直列につないでエンコーダパルスのカウント動作を確認しました。0.5秒毎にパルスのカウント数から求めたRPM(1分あたりの回転数)をシリアルで出力させています。その時の値は約17000RPM、製品ページでは12200〜14400RPMと記載されていて、少し高めに出ていますが無負荷時の回転数としては妥当(?)な値かな、、
Arduinoとの接続
5V -> VCC
pin8 -> A
pin9 -> B
GND -> GND
エンコーダ基板のA/B出力をArduinoの8番・9番ピンに接続します。スケッチ
loop関数で8番・9番の入力の変化を監視しています。今回の動作条件では1秒間に5800回程度、入力が変化するのでこれより早い周期で入力を監視する必要があります。タイマー割り込み等を使って一定周期(10K〜20KHz)で監視した方が他の処理で入力の変化を取りこぼすことがないので良いですね。
関連記事
ミニ四駆モーター用エンコーダ基板の製作(1)
ELM - 接点入力と処理のコツ - ロータリー・エンコーダの使い方
ミニ四駆モーター用エンコーダ基板の製作(1)
Posted by arms22 on 2017年07月02日

ミニ四駆用のモーターで回転数制御する為にエンコーダ基板の製作をはじめました。最近のミニ四駆のモーターには両軸タイプのものが販売されていて、簡単にエンコーダを取り付けることができるんじゃないかと思っています。ミニ四駆のモーターは単価が安いですし、エンコーダを取り付けることができれば色々な場面で使えるモータになる、と考えています。
製作中のエンコーダ基板をタミヤのトルクチューン2モータPro(両軸)に取り付けたところ。
これまでに2枚のエンコーダ基板を試作しました(試作1=緑、試作2=赤)。
試作1

先日紹介したフォトリフレクタ「NJL5901AR-1」を2つ搭載しただけの基板です。フォトリフレクタのコレクタ出力を4.7k抵抗でプルアップしています。

試作1の出力波形。位相差は十分だけど波形が鈍っています。シュミットトリガ付きの入力ポートを持つマイコンならそのまま使っても平気かもしれん。

少し拡大したところモーターのノイズがのっていることが確認できた。これは何か対策しないと。。
試作2

波形の鈍り・ノイズが気になるので試作2ではシュミットトリガ付きのバッファを入れるようにしました。フォトリフレクタのエミッタ出力を4.7k抵抗でプルダウンしてバッファに入力しています。

試作2の波形。エッジがしっかりでて扱いやす信号になりました。

ノイズは相変わらず。。シュミットトリガ入れてもこのノイズは取りきれないみたい。ソフトウェアでポーリングする分には問題ないかもしれない。
エンコーダディスク

ディスクの形状や窓の数を変えていくつか試作してみました。ディスクの光の反射率はやはり重要でABSのピュアホワイトが一番綺麗な波形がでました。またABSの黒だと波形が出力されないことがわかりました。ABS黒は光をよく吸収ようなので基板全体を覆うケースに使うと良さそうです。
はんだづけの様子
最後のエンコーダ基板のはんだづの様子を載せておきます。
小型フォトリフレクタ「 NJL5901AR-1」のはんだ付け
Posted by arms22 on 2017年06月18日

少し前から秋月電子で取り扱いが始まったJRCの小型フォトリフレクタ「 NJL5901AR-1」、表面実装タイプのフォトリフレクタでパッケージサイズが1.3×1.6×0.6mmと非常に小さく、またリードが部品側面に露出しておらずリフロー装置を使わずに実装するのが難しい部品です。
今回パッドサイズを推奨0.4×0.6mmから0.4×0.9mmに変更することではんだゴテを使って実装することができたので、その様子を動画として公開します。NJL5901AR-1を買ったはいいもののあまりの小ささに心が折れてしまった方の参考になれば幸いです。
表面実装小型フォトリフレクタ NJL5901AR-1 (2個
床拭きロボットの製作(6)- DCモータのトルク制御
Posted by arms22 on 2017年04月16日

床拭きロボットに必要かどうかはおいといて、DCモータのトルク制御を行ってみたいと思います。まずはその準備としてDCモータの逆起電力を測定し、逆起電力定数を求めてみました。今回はDCモータの逆起電力の測定方法、逆起電力定数の求め方について書きます。またトルク制御になぜ逆起電力の測定が必要なのかDCモータ特性の解説とともに簡単にまとめておきます。
ちなみにちゃんとしたメーカ製モータの場合、逆起電力定数はカタログスペックとして記載されているので、そもそもこのような作業はいらないはずです。特性がよくわからないモータを使いたい場合などに参考になれば幸いです。
逆起電力測定回路

実験に使用するモータはPololu社のエンコーダ付き20:1ギアードモータで、タミヤのスポーツタイヤを取り付けて測定を行いました。DCモータの端子間電圧をR1・R2抵抗で1/3に分圧してマイコンのアナログピン(A0)に接続します。またこの時の回転速度も必要なのでエンコーダ出力をマイコンのデジタルピン(13と12)に接続します。DCモータのステップ応答を見るためバッテリーをプッシュスイッチを通してモータの+端子に接続します。実際の測定はプッシュスイッチをジャンパー線に置き換えて行いました。
ステップ応答

DCモータに一定の電圧(エネループ6本直列)をかけた時のステップ応答です。回転速度が安定している間(電圧をかけている)の値は無視して、回転速度が降下している間(電圧をオフ)の値に注目します。
回転速度と逆起電力の関係

回転速度が降下中の端子間電圧(逆起電力)と回転速度をグラフにすると比例関係にあることがわかります。近似直線を求めると直線の傾き(0.0051x)が求まります。これが逆起電力定数です。逆起電力定数の単位はVs/radが一般的なので単位変換すると以下の値になりました。
0.009740Vs/rad
DCモータの特性
DCモータのトルクと電流は比例関係にあり次式で表すことができます。比例定数KTをトルク定数と呼びます。
トルク(Nm) = KT(Nm/A) * 電流(A)
DCモータの逆起電力と回転速度は比例関係にあり次式で表すことができます。比例定数KEを逆起電力定数と呼びます。逆起電力は電流の向きとは逆向きに発生し、電流を流れにくくします。
逆起電力(V) = KE(Vs/rad) * 回転速度(rad/s)
またKTとKEは同じ値になることが証明されています。
KT = KE
逆起電力はモータに電圧をかけて回している時も発生しています。モータに電圧をかけている時の端子間電圧と逆起電力の関係は次式で表すことができます。モータは両辺の電圧が釣り合う回転速度で回転します。
端子間電圧(V) = ブラシ接触電圧降下(V) + 巻線抵抗(R) * 電流(A) + 逆起電力(V)
ここでブラシ接触による電圧降下は無視するとして、PWM制御中のトルクは次式で求めることができる、はず。。
端子間電圧(V) = バッテリー電圧(V) * PWMデューティー(%)
逆起電力(V) = KE(Vs/rad) * 回転速度(rad/s)
電流(A) = (端子間電圧(V) - 逆起電力(V)) / 巻線抵抗(R)
トルク(Nm) = KT(Nm/A) * 電流(A)
疑問など
今回実験に使用したギアードモータのギアなし版のカタログスペック。
無負荷回転数 : 6200RPM@6V
起動トルク : 0.15kg-cm@2.4A (0.01471Nm)
上記値から逆起電力定数とトルク定数を計算したところ値が一致しませんでした。
逆起電力定数:0.009241Vs/rad
トルク定数:0.006129Nm/A
逆起電力定数はわりと近い値なんだけれどもトルク定数が66%ぐらいになっています。軸受けやブラシの摩擦の影響なのか、また他の要因なのかよくわかっていません。。
参考記事
2-1-2 回転原理の基礎 | 日本電産株式会社 - Nidec Corporation
2-1-3 DCモータの回転速度と逆起電力 | 日本電産株式会社 - Nidec Corporation
参考書籍
CQ出版
売り上げランキング: 427,890
床拭きロボットの製作(5)- Blynkアプリでリモートコントロール
Posted by arms22 on 2017年03月28日

「ボタン1つで勝手に掃除」というレベルにはまだまだ先が長いのでとりあえずBlynkアプリで操縦できるようにしました。
今回2つの動作モードを用意しました。左右のモータを別々に制御するダイレクトドライブモードと運動モデルに基づくモーションコントロールモードです。モーションコントロールモードはロボットの運動を併進速度・角速度で制御するモードで独立2輪ロボットでよく使われる運動モデルです。詳しくは下記を参照してください。
車輪移動ロボット - 機械知能工学科 - 東北学院大学
実際に走行させてみました。速度が速くて操縦が難しいです。台形加速の制御を入れてないと、、
BlynkアプリのUI

左がダイレクトドライブモード、右がモーションコントロールモードのUIです。ダイレクトドライブモードでは移動速度をパルス/毎秒で左右のモータに直接指令を出します。モーションコントロールモードでは併進速度をmm/毎秒、角速度を角度/毎秒で指令を出し、マイコン側でパルス/毎秒に変換してモータを制御しています。
ソースコード
arms22/blynk_motor_controller
https://github.com/arms22/blynk_motor_controller
関連記事
Blynkを使ってスマートフォンからAdafruit Feather M0 Bluefruit LEを制御する方法
床拭きロボットの製作(2)- DCモータの制御
床拭きロボットの製作(4)- エンコーダパルスの誤差
Posted by arms22 on 2017年03月14日

一定の速度でモータを回した時に速度が少しバラつくので原因を調べてみました。次の図はPID制御をオフにして40%ぐらいの電圧をかけて空転させた時の結果です。横軸は時間(ミリ秒)、縦軸はパルス間隔(マイクロ秒)です。
パルス間隔は徐々に短くなってきて1800〜1750あたりで安定になります。この時50マイクロ秒ほどパルス間隔に変動があります。
速度が安定したあたりを拡大すると振幅が一定周期で現れているのがわかります。また1回転先の結果を重ね合わせてみると振幅がピッタリ一致することも確認できました。どうやらエンコーダの誤差のようです。振幅は常に一定なのでパルス間隔の平均をとって1パルスごとの変動率を求めれば簡単に補正できそうですね。
でも今回は簡単に移動平均をかけて平滑します。パルス間隔を取得するコードに下記の処理を加えます。_pulseWidthが前回までの値で_pulseWidthRawが今回の値。それぞれ0.7と0.3の重みをつけて足しあわせています。
_pulseWidth = _pulseWidth * 70 + _pulseWidthRaw * 30;
_pulseWidth = _pulseWidth / 100;

移動平均をかけた状態でのPID制御の結果です。縦軸の単位がパルス秒に変わっています。速度安定時の制御量の振幅が随分小さくなりました。これで低速時も回転が安定するようになるかも。
参考記事
気まぐれ備忘録 磁気式エンコーダ
床拭きロボットの製作(3)- フィードバック制御でDCモータの回転速度を制御する
Posted by arms22 on 2017年02月26日

フィードバック制御を組み込んで速度制御を行えるようになったので、その制御方法と結果についてまとめておきます。
速度制御

速度指令は1秒あたりのパルス数=パルス秒としました。エンコーダ入力との差分をPID制御器に入力し、PID制御器の演算結果をPWMのデューティーとして使用しています。
PID制御器の出力はPWMデューティー幅に制限し、リセットワインドアップの対策としてPID制御器の出力がPWMデューティーの範囲を超えたら積分の演算を止めるようにしました。
エンコーダからの入力はA相のパルス間隔をタイマーのインプットキャプチャ機能を使って計測し、速度(パルス秒)に変換しています。
制御成績
実験に使用したモータはPololu社のエンコーダ付きギアードモータで、負荷としてタミヤのスポーツタイヤを取り付けています。計測はタイヤを浮かした状態(空転)で行いました。PIDのパラメータはステップ応答法、またステップ応答法の1種であるCHR法で求めました。縦軸は速度(パルス秒)、横軸は時間(ミリ秒)です。
ステップ応答法で求めたPIDパラメータを使用した場合のP制御とPI制御それとPID制御の結果を以下に示します。またCHR法で求めたPIDパラメータを使用したPID制御の結果も以下に示します。
Pololu 20.4:1 金属ギヤードモータ 25Dx50L mm LP 6V 48CPRエンコーダ付き
タミヤ スポーツタイヤセット(56mm径)
P制御 Kp 3.74491

PI制御 Kp 3.37042 Ki 127.66741

PID制御 Kp 4.49389 Ki 280.86830 Kd 0.01798

CHR法(目標追従:0%)Kp 2.24695 Ki 54.80357 Kd 0.00899

CHR法(目標追従:0%)Kp 2.24695 Ki 54.80357 Kd 0.00899 1200ppsから1000pps

ソースコード
ソースコードはgithubで公開しています。
arms22/motor_pid_test: DC motor PID control test code
参考URL
PID制御 - Wikipedia
PID controller - Wikipedia
PID制御 - MATLAB & Simulink
モータの制御法
滑らかで安定したライントレースを実現する (1/2)
センサーの値が一定量変化したら送信する - Wifi温度湿度計の製作(11)
Posted by arms22 on 2017年02月19日

ESP8266 with HDC1000 Module Temperature/Humidity Monitor in Kyoto
ThingSpeakへのセンサーデータの送信間隔を一定間隔(5分)から一定量変化があったら送信するように変更しました。温度変化が激しい朝晩は5〜15分間隔、深夜から朝方にかけては温度がほぼ一定なので数時間間隔で送信しているのがわかります。1日のセンサーデータの送信回数が288回から30回〜40回に減って電池の消費量も大幅に減った、かも。これで半年ぐらい保つかな?
スケッチ
DeepSleepに入るとメインメモリのデータは保持されないので、RTCメモリにセンサーデータをバックアップして次回起動時にRTCメモリから前回データを読み出すようにしました。ThingSpeakへのセンサーデータの送信タイミングは温度±0.5度または湿度±2.0%または電源±0.02V変化があった場合としています。起床間隔は従来どおり5分。
床拭きロボットの製作(2)- DCモータの制御
Posted by arms22 on 2017年01月26日

DCモータを使うのは初めてなのでとりあえず回して感触を掴んでみることにします。タクトスイッチを押すと低速・中速・高速と速度を変えてDCモータが回転するスケッチを書きました。analogWrite関数を使ってモータドライバにPWM波形を入力し速度を調整しています。PWM周波数が732Hzと低く可聴域にあるのでモータからヴーという音が聞こえる。
クイックルワイパーを装備して実際にフローリングを走らせています。本体が軽いせいか思った以上に速度がでています。モータのトルクが足りるか心配だったのですが問題なさそう。2つのモータの回転数は合わせていないので、斜めに走っているのが分かる。
回路図

今回使用するモータは静止電流が2.4A@6Vと少々電流多めなので、モータドライバ(以下、TB6612FNG)の出力を並列にして1つのモータに入力して電流を稼ぐようにしました。TB6612FNGの出力電流の定格は1つのモータにつき最大1Aですが、Peakは3.2A(たぶん2つの出力合わせて)なので回転始めの一瞬だけなら大丈夫と踏んでいます。DCモータは回転数が上がると電流が減るので、実際は並列とかいらんかもしれない。
TB6612FNGの制御ロジック

IN1/IN2で回転方向を指定して、PWMで回転速度を制御します。IN1←H、IN2←LとしてPWMに矩形波を入力するとCW→ショートブレーキ→CW→ショートブレーキ…を繰り返すします。
このロジック表を見るとPWMをH固定にして、IN1またIN2にPWM波形を入力しても制御できるように見える。そうすると制御ピンを1本減らせるんだけど、PWMをH固定にする作例を探してみたけど見つからなかったので、無難に3本使って制御することする。
スケッチ
参考記事
DCモータードライバの使い方
https://trac.switch-science.com/wiki/DCMotorDriver
CQ出版
売り上げランキング: 492,730
床拭きロボットの製作(1)
Posted by arms22 on 2016年12月30日

DCモータのフィードバック制御をやりたくなったので、その実験用に床拭きロボットを作ることにしました。現状、木のフレームにブレッドボードとやっつけ感満載ですが、ある程度仕様が固まってきたらフレームは3Dプリンタで作って、専用の基板も起こしたいと思います。
メインのマイコンモジュールはAdafruit Feather M0 Bluefruit LE、モータドライバはPololu TB6612FNGデュアルモータドライバを採用しました。TB6612FNGの出力は2つありますが、並列にして電流を稼ぐつもり。
Pololuの直径25mmのエンコーダ付きギアードモータにタミヤのスポーツタイヤを付けています。バッテリーはニッケル水素直列6本の7.2Vを予定。ゆくゆくはラジコン用のリチウムイオンバッテリーに置き換えたい。
スポーツタイヤ付属のホイールハブがPololuのモータシャフトに合わなかったので3Dプリンタでホイールハブを作りました。タイヤとホイールも3Dプリンタで作れるといいな。
部品リスト
- Pololu 20.4:1 金属ギヤードモータ 25Dx50L mm LP 6V 48CPRエンコーダ付き
- Pololu 直径25mm金属ギヤードモータ用ブラケット 2個入り
- タミヤ スポーツタイヤセット(56mm径)
- Pololu TB6612FNGデュアルモータドライバ
- Adafruit Feather M0 Bluefruit LE