ArduinoでDCモーターの角度制御

このQ&Aのポイント
  • arduinoでDCモーターの角度のフィードバック制御をしたく思っており、エンコーダーで角度を計測しながら、一定時間毎(10ms)にモーターに制御入力を入れたいです。
  • エンコーダーで角度を計測するには外部割り込みが必要で、一定時間ごとにモーターへの電圧を変化させるにはタイマー割り込みが必要だと思います。
  • attachInterrupt(interrupt, function, mode) ; MsTimer2::set(unsigned long ms, void (*f)()) ; MsTimer2::start(); を書けば良いのでしょうか?この場合、タイマー割り込みで実行される関数 void (*f)()の処理中に、外部割り込みのイベントが発生した場合、functionを実行してくれるのでしょうか?また、functionの実行中にタイマー割り込みが入ることもあり得るのでしょうか?この場合、エンコーダによる角度計測がきちんと行われないことになると思うので、どうすれば良いでしょうか?
回答を見る
  • ベストアンサー

ArduinoでDCモーターの角度制御

arduinoでDCモーターの角度のフィードバック制御をしたく思っており、エンコーダーで角度を計測しながら、一定時間毎(10ms)にモーターに制御入力を入れたいです。エンコーダーで角度を計測するには外部割り込みが必要で、一定時間ごとにモーターへの電圧を変化させるにはタイマー割り込みが必要だと思います。この場合どのようなプログラム構成にすれば良いのでしょうか?void setup( )の中に、 attachInterrupt(interrupt, function, mode) ; MsTimer2::set(unsigned long ms, void (*f)()) ; MsTimer2::start(); を書けば良いのでしょうか?この場合、タイマー割り込みで実行される関数 void (*f)()の処理中に、外部割り込みのイベントが発生した場合、functionを実行してくれるのでしょうか?また、functionの実行中にタイマー割り込みが入ることもあり得るのでしょうか?この場合、エンコーダによる角度計測がきちんと行われないことになると思うので、どうすれば良いでしょうか? ご教授のほどどうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • lumiheart
  • ベストアンサー率47% (1097/2289)
回答No.2

DCモータの仕様書をよく読みましょうね いにしえの名機 FA-130は本家では既に絶滅危惧種なんだけれど https://www.monotaro.com/p/0526/3956/?utm_source=Overture&utm_medium=cpc&utm_campaign=880162_6493296903&utm_content=80894682914&utm_term=b_381658354020_x_dsa-1212116371400&yclid=YSS.1000403920.EAIaIQobChMIv7fB043i7wIVCWoqCh0eJwQREAAYAiAAEgLz1fD_BwE&gclid=CI-fgNiN4u8CFQUSvAodSXQPLg&gclsrc=ds 1.5V 8600rpm https://product.mabuchi-motor.co.jp/detail.html?id=11 8600rpmとは1秒間で143回転する! 1ミリセカンドで51度回る もちろん速度制御無しでの全速回転ですけど では、PWMで電圧落としたら1rpmで回せるか? 答え:回せません 単純計算で1/8600V=0.16ミリボルト 圧倒的にトルク不足でベアリング抵抗にすら勝てず回らない じゃあと160ミリボルトくらいに挙げるとイキナリ100rpmくらいで回ってしまう 答え:不感帯 https://www.m-system.co.jp/mstoday/backnum/2012/04/mame/index.html それを回避するために、高速応答は必須 どーゆー事か? 100ミリボルトを0.1ミリセカンドくらいの短時間印加して 2度回転しちゃって行き過ぎたのでマイナス80ミリボルトで逆転させて、、、 ってゆーよーに正転逆転を高速で繰り返して極低速運転が可能になる よーするにゆっくり回すのはとっても困難 安価なオープンループドライバで速度制御できるのは1/100くらいの速度まで つまり、100rpm以下で回すのは不可能レベル タミヤ ギアボックス https://www.tamiya.com/japan/products/70167/index.html https://www.tamiya.com/japan/products/72007/index.html 産業ロボット向けサーボモータは0.1rpmでも安定的に回せる https://www.mitsubishielectric.co.jp/fa/products/drv/servo/pmerit/index.html https://www.e-mechatronics.com/product/servo/sgmx/motors/sgmxj/index.html https://www.renesas.com/jp/ja/application/industrial/48v-position-control-solution 但し、高価! 高価なれどコスパ最高なので、お値打ちとも謂える

octopass
質問者

お礼

ありがとうございます!大変勉強になりました。なるほどDCモーターは不感帯があるので、低速回転は難しいのですね。ありがとうございました!

その他の回答 (1)

  • lumiheart
  • ベストアンサー率47% (1097/2289)
回答No.1

問答無用でモータドライバのエンコーダフィードバック付きのやつ https://www.switch-science.com/catalog/3169/ 安価なモータドライバにはエンコーダフィードバックが憑いて無い https://www.switch-science.com/catalog/3935/ >一定時間毎(10ms)にモーターに制御入力を入れたいです そんな低速じゃあ無理だって何度も書いてるんだけど無視されてる https://www.switch-science.com/catalog/3459/ 「ソフトウェアの特徴」 「位置/速度制御を行う加速度メジャーループ(制御周期200 us)と電流マイナーループ(制御周期50 us)」

octopass
質問者

お礼

ご回答ありがとうございます。なるほどモータドライバのエンコーダフィードバック付きのやつというものがあるのですね。とても助かります。サンプル時間については、別の質問サイトで1msでDCモーターをフィードバック制御したいと書いたら、 「>一定時間毎(1ms)にモーターに制御入力を入れたいです この時点で破綻していると思います。モーターの反応速度はそんなに速くありません。時定数を適切に設定しないと、制御系はまともに動きません。 まぁ、そもそも >DCモーターの角度のフィードバック制御 という話自体「無茶」な感じがありますが。どれだけの減速比のギアをいれるのでしょう?」 と言われました。。。でもやはり、回答者様の言う通り、1msの方が良いのでしょうか?

関連するQ&A

  • DCモーターの角度制御

    DCモーターを角度制御したいのですがどのようにしたら良いのかわかりません.(どういったものが必要なのかなど) 角度制御は,例えばモーターが時計回りにθ1回転したら,スイッチなど外部からの入力をしないで反時計回りにθ2回転する,というようにしたいです. 宜しくお願いします.

  • Arduinoによるモーター制御

    Arduino microとモータードライバを用いてモーターを制御しようと考えています。なるべくモーター制御機構を小さくしたいので外部電源を取り付けたくないのですが、外部電源がない場合Arduinoがショートしてしまうことはありますでしょうか? また、どれくらいの電圧、電流だと大丈夫なのかを調べるにはどのように計算をすればいいのでしょうか?

  • DCモータのトルク制御とは?

    DCモータの回転数を制御する場合、モータに印加する電圧の大きさを調整しますよね。 DCモータのトルクを制御する場合は、何を調整しているのでしょうか? もちろん、トルクの大きさを変えるということは電流の大きさを変えるということだと思いますが、電流の大きさはどうやって変えるのでしょうか?電流の大きさというのは、モータに掛かる負荷によって決定されてしまうのではないのでしょうか? 一定の負荷が掛かる負荷器にDCモータを繋いでトルク(電流値)を制御する場合、その電流の大きさはどのようにして調整されるのでしょうか?

  • モータの制御

    実験装置の一部として、ステッピングモータをクローズドループで制御したいと考えています。外部信号を取り込んでこの信号の増加、減少に応じてモータの正、逆回転、停止を制御したいのですが、このような場合どのような制御装置が必要でしょうか。通常のドライバではあらかじめ決まった動きしかできないのでダメだと言われました。よく温度制御コントローラで温度をモニターしておいて、ヒーターのON/OFFを切り替えるというものがありますがイメージ的にはああいう感じのものだと思います。ただ、ON/OFF制御では誤差が大きいのでできればPID制御したいと考えています。ちょっと小耳にはさんだのですが、光学式エンコーダというのはこういう制御に使う装置でしょうか?この辺りももし御存じの方がいらっしゃいましたらお願い致します。

  • DCモータの逆起電力による速度制御

    DCモータをエンコーダやタコジェネ等のセンサを使用しないで 逆起電力をフィードバックして速度制御する方法を調べています。 モータはDC24V 20W クラスで 速度制御IC等は使えません。 私の調べたかぎりでは大容量のものはありませんでしたが・・・。 モータ専門メーカで製造している逆起電力による速度制御装置の ブロック図をみればモータの端子電圧から逆起電力を検出して フィードバックしていることはわかるのですが どのようにして逆起電力を検出しているかはわかりません。 原理的には下記HPに記載されているようなものでしょうか? http://www.picfun.com/P12F/p12f06.html ご存じの方、ご教授をお願いします。

  • モータの速度制御

    ロータリーエンコーダ(インクリメンタル型)を用いて速度を計測しようとしています。 この場合、ソフト上でロータリーエンコーダから出力されるパルスをカウントし、カウント値を角度に直して(角度(t)-角度(t-1))/サンプリング間隔 で速度は算出できると思いますが、算出結果をプロットしてみるとノイズのような波形になってしまいます。 どうしたちゃんとした速度が算出できるのでしょうか?素人なので文章の意味がわかりにくいと思いますがよろしくお願いします。

  • ギヤードモータとarduino

    ギヤードモータとarduino 皆さま,こんにちは. 私は現在,arduinoというマイコンボードから,380k75というギヤードモータを PWM制御しようと考えています. そこで,このモータのドライバについて,現在悩んでおります 一般に入手できるモータドライバを使うと,流れる電流値が大きいため 耐久性に難がありそうです. また,ラジコン用のアンプも考えていますが,この場合は,電源は 7.2vバッテリーを使うしかないのでしょうか? 使用目的として,エンコーダから位置を取得してフィードバック制御を かけようと考えており,その使用時間が長いため,出来れば有線の電源から 動かしたいと考えています. あまりに初心者な質問で恐縮ですが,皆様のお力をお借りしたいと思います. よろしくお願いいたします.

  • モーター制御について教えて下さい。

    初心者ですが、モーター制御で良くわからない点があり、教えて下さい。 ACサーボモーターを使用してトルク制御を行なおうと考えています。 具体的には、ある原点位置から ・角度θ1の位置に至ったら、トルクT1を出力 ・角度θ2の位置に至ったら、トルクT2を出力 (省略) ・角度θxの位置に至ったら、トルクTxを出力 といった出力を連続して行なうことを考えています。 (トルクはフィードバック制御を行なう) ある位置で定義したトルクを超える負荷が掛かると、次の位置に至り、その位置で定義したトルクを超える負荷が掛かるとまた次へ。。。 といった単純な仕組みを考えています。 そこで、良くわからない点というのが、角度θ1からθ2に至る時の軸の回転速度がどの様になるのかです。 例えば、トルクT1が大きい状態からトルクT2が小さい状態へ変化する時、モーター軸の回転速度は負荷イナーシャによって決まる物でしょうか? 速度は制御するわけではないので、単純に考えるとイナーシャの大きさとトルクの変化量によって決まるのかと思うのですが。。。 できれば、このトルク制御をベースに、θ1からθ2に変化する時の速度を増減させる様な事をしたいのですが、原理的に可能でしょうか? (特に、トルクが大きい状態から小さい状態へ変化する時の速度を大きくコントロールしたい) 色々資料を見ていますが、トルク制御をした場合の速度変化をどう考えれば良いか、トルク制御をベースに速度も制御することが可能なのかを明記している資料も事例も無さそうなので、ご教示いただけると幸いです。

  • PLCでのDCブラシレスモータの正確な位置制御

    DCブラシレスとPLCをつなげて位置制御をする予定です。 ブラシレスは、エンコーダ内臓で、また、起動、停止がスムーズになるように加減速機能がついています。私が考えている制御は簡単で、 (1)PLCよりブラシレスの起動SWをON し、ブラシレスを起動(回転)  (2)ブラシレスからのエンコーダをPLCでうけとり、ブラシレスの現在角度取得  (3)エンコーダが目的の角度にきたら、PLCでブラシレスの停止 ここで、問題は、(3)のところです。エンコーダが目的の角度にきてからブラシレス を停止させても、ブラシレスの減速機能により、若干オーバーランして停止 するはずです。この場合、このオーバーランを加味して、目的の角度にぴたりと停止 させるには、PLCでどのような制御をすればよいでしょうか? やはり、目的の角度の少し前で停止させるしかないでしょうか?しかし、その場合は、 ブラシレスに繋げる負荷により、オーバランの距離が変わってしまい、正確な制御は無理なきがします。無難に、ステッピングモータをつかうしかないでしょうか? なお、ブラシレスの加減速は、無効にできません。

  • DCモーター2つを制御する際の障害について

    マイコンの勉強がてら、赤外線ラジコンを制作しようと試みているのですが、モーター制御で躓いてしまい、質問させて頂きました。 秋月電子で購入したモータードライバDRV8832を2つ用いて、FA-130の制御をしようと試みています。 本モータードライバは障害検知機能があり、過電流、電圧降下、温度上昇で、出力を停止するようです。 このドライバを用いで、2つのモーターの正転⇔逆転(動作反転時は10ms待機)を1秒単位で繰り返すプログラムを作成し、動かしてみたところ、何回か動作を繰り返した後、片方のモーターが障害検知して、動作停止してしまいます。 試しに、1つのモーターのみを接続した場合は、障害が発生することなく、回り続けました。 また、モーターはギアを噛まして車輪に接続しているのですが、この車輪を外してモーターだけで動かした場合は、 2つ同時に回して障害が起こることはありませんでした。 電圧降下を疑って、ドライバにコンデンサを追加してみましたが、特に改善はされず、温度についても触った限り高温になっている感じではありません。 モーターの反転時に高負荷がかかり、消費電流が増えていることは理解できるのですが、モーター1つでは正常に動くのに、2つ駆動だと障害が発生する理由が分からず、行き詰ってしまいました。 お知恵を頂けると幸いです。