ここから質問投稿すると、最大4000ポイント当たる!!!! >>

Arduino Uno  atmega328pを使っています。

ライントレーサでPID制御を取り入れたいのですが、PID制御のライブラリをどのように使用したらいいのかわかりません。

また、普通にプログラムで書く場合はどのように書いたらいいか教えてください。

A 回答 (1件)

「PID制御のライブラリ」とはどれですか?


普通に書くなら、ここに書けるような内容ではないのでポイントを絞って質問してください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPID制御のプログラミング2

先ほど、PID制御のプログラミングについて質問したのですが、もう少しわからないところがあるので教えてください。
1.ステップ応答から各パラメータを求める方法
  http://www.picfun.com/motor05.htmlのページの一番下のほうに書かれており、
  Kiの値=0.6~0.7/KL、Kdの値=0.3~0.45T/Kとなっています。
  このLとTの単位は[sec]と考えていいのでしょうか。
  KpはLとTで打ち消されて、単位を考える必要ないですが、KiとKdは単位により結果が違います。
2.サンプリングデータにより制御する場合のサンプリング時間について上記アドレスにPID制御のアルゴリズムの説明があるのですが、
  サンプリング時間が考慮されていません。
  サンプリング時間により前回の偏差との差や、積分の場合足しこむ回数が違ってくると思うのですが、どのように補正すればよいですか。
  このときも単位を1[sec]秒として補正すればよいでしょうか。

Aベストアンサー

ヒータで層の温度を一定にする系で、実際にやったことがあるのでアドバイスします。理論的なアドバイスでは有りませんが参考になればと思います。

2.について
参照先URLに紹介されている式では、I制御による変化量は、制御開始からずっと累積されてしまっているのがわかります。
系によると思いますが、おっしゃる通り、この式では積分時間やサンプリング時間を考慮していないので、この式をそのままプログラムに落とすのは、私の場合、あまり実用的では有りませんでした。

そこで、
ki=kp/Ti , kd=kp*Td ですので、  (Ti=積分時間、td=サンプル時間)
n=Ti/Td  (n=サンプル回数) として、
ei= Σe/n (ei=積分時間あたりの偏差の平均)
ed= en - en-1 (ed=前回偏差と今回偏差の差)
とし、
M= kp*( en + ei + ed )
と、操作量を決めてあげました。
このやり方は直感的にわかりやすく使いやすいです。

実際、操作量には上限がありますし、負の値を取れない系もありますので、
早速プログラムを組み始まってしまうのも一つの手だと思います。
ジーグラとニコルズの最適値は、オーバシュート量が25%に達しますので、
私の場合、カットアンドトライで最適値を決める必要がありました。
やってみて気付くことはとても多かったです。

1.についてですが、
LとTの単位はサンプリング時間と同じにするとやりやすいと思います。サンプリング時間の単位が秒であれば、時定数や無駄時間の単位も秒にします。
しかし、実際に計算してみると、これでも時間の単位の違いによって、パラメータは大きく異なってしまうのがわかりますが、これも実際やってみると、秒がいいのか分がいいのか、わかってくると思います。

ヒータで層の温度を一定にする系で、実際にやったことがあるのでアドバイスします。理論的なアドバイスでは有りませんが参考になればと思います。

2.について
参照先URLに紹介されている式では、I制御による変化量は、制御開始からずっと累積されてしまっているのがわかります。
系によると思いますが、おっしゃる通り、この式では積分時間やサンプリング時間を考慮していないので、この式をそのままプログラムに落とすのは、私の場合、あまり実用的では有りませんでした。

そこで、
ki=kp/Ti , kd=kp...続きを読む

QライントレースロボットのPID制御を用いての姿勢制御について

 ライントレースロボットの姿勢制御をプログラミングで行っているのですが、その時にPIDのゲインを変えてどんな動きをするか試してみました。Pの動作はわかるのですが、IとDの動作がよくわかりません。
 Iのゲインを少し上げるとロボットは直線でも車体が横にぶれながら走行します。また、Dは少し上げた程度では変わらないのですが、大きく上げるとIと同じように直線でも横にぶれてしまいます。
 具体的には、P、I、Dを200、0、200ならスムーズに走行できたコースでも200、2、200ならぶれてしまいます。また、200、0、3000でもぶれてしまいます。このような結果なのですがこのときのIとDは何に影響しているのでしょうか?
 まだ、未熟者ですのでヘタクソな質問かもしれませんが真剣に悩んでます。
宜しくお願い致します。

Aベストアンサー

お礼をありがとうございます。補足に回答します。
>「D動作は、微分ですから、偏差の起こり始めに効きますから…」
言葉がはしょってあってわかりにくかったでしょうか。
P動作が偏差量に比例して制御しようとするのに対して、D動作は、偏差があっても一定で変化が無ければ働きません。偏差に変化があったときだけ制御しようとします。
たぶん、曲がり角では、偏差量が増加して微分値がでるので、ここで効くことが期待できそうと思いました。
因みにI動作は、偏差が少しでもあれば、それを蓄積する感じで、あくまで働きます。

QPIDの調整のコツ

PIDの現場での調整のコツを教えていただけませんか?
教材ではいろいろ書いていますが
タッチパネルPLCでは現状が見えるだけで目視確認しかできませんので
教材で書いてあるようなことは役に立ちません。
現状ではやみくもにトライアンドエラーを繰り返しています。

Aベストアンサー

応答の速い系だとどんなパラメータでもそこそこですが、温度調節のように応答が遅いと結構面倒ですよね。

PID制御はP(比例制御)が基本ですが、それだけ必ず目標値との間にオフセットができてしまうので、それをリセットするためにI(積分)を入れるわけです。Dはスピードアップのためで、一旦値が落ち着いてしまえば全く効きません。このことを踏まえて、私は次のようにやっています。

まず、IもDも使わずにPだけにして、観測値がオーバーシュートしないで一定値に近づく位の値を探します。これくらいであれば現状だけしか見えなくてもできると思います。この段階では目標値との間にオフセットがあるはずなので、次に少しずつIを増やしていき、オフセットがだんだん小さくなる様子を観察します。あまりIを入れすぎると発振してしまうのでオフセットが消えたら適当なところでやめます。Dはほとんど使いません。

これだけだと「最適」ではありませんが、後は微調整でなんとかなると思います。

Qステップ応答法と限界感度法:(PID制御)

インターネットで調べましたがピンとくる説明に出会えませんでした。
それぞれどのような制御法なのでしょうか。
わかりやすい説明をしていただくと助かります。

Aベストアンサー

いずれも制御理論のオーソドックスな方法で解説など山のように出ています。
自分で納得できる説明は自分で探しましょう。
下記は一例です。


ステップ応答法
http://alk.fam.cx/tfunc_030.html

PID制御
http://ja.wikipedia.org/wiki/PID%E5%88%B6%E5%BE%A1

Qモータの速度制御

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

Aベストアンサー

(レシプロ測定という名称は、もしかしたら某測定器メーカだけが使ってる用語かも、、。)

測定方法の概要は以下のとおりです。
1. カウンタを2つ(AとB)、タイマーを一つ(これはサンプリング周期をセット)用意する。
2. カウンタAにはエンコーダからのパルスを入力、Bには基準周波数(1MHzとか、10MHzとか)を入力
3.測定開始信号直後の、エンコーダのパルス立ち上がりで、カウンタA,B、タイマーをスタート
4.タイマーの終了後、最初のエンコーダパルス立ち上がりでカウンタA、Bを停止(カウンタAは最後の立ち上がりをカウントしないようにする。カウントする場合には、1をカウント値から引く)
5. 周波数は、(カウンタAの値)/(カウンタBの値)*(カウンタBの入力周波数)

要は、エンコーダパルス整数周期(>サンプリング間隔)分の周期測定をカウンタBで行う という測定です。
で、問題になるのが、3.と4.の処理です。エンコーダの立ち上がりでカウンタの動作を制御する必要があります。これが実現できれば、現状のシステムでも可能かと思います。

留意点がいくつかあって、
1.測定分解能は、カウンタBの入力周波数とサンプリング間隔でほぼきまる。(最高周波数が1MHzのカウンタで間隔0.1msだと、1%程度の分解能しか得られない)
2. エンコーダ出力パルスの周期が長いと、測定周期が長くなる。
3. 最低サンプリング間隔は タイマ設定時間+エンコーダパルス幅*2 程度となり、また測定時間は若干ばらつく(エンコーダパルスの周期、スタート信号のタイミングにより)

ご参考になれば。

(レシプロ測定という名称は、もしかしたら某測定器メーカだけが使ってる用語かも、、。)

測定方法の概要は以下のとおりです。
1. カウンタを2つ(AとB)、タイマーを一つ(これはサンプリング周期をセット)用意する。
2. カウンタAにはエンコーダからのパルスを入力、Bには基準周波数(1MHzとか、10MHzとか)を入力
3.測定開始信号直後の、エンコーダのパルス立ち上がりで、カウンタA,B、タイマーをスタート
4.タイマーの終了後、最初のエンコーダパルス立ち上がりでカウンタA、Bを停止(カウンタAは最後の...続きを読む

Qジャイロセンサーの繰り返し誤差の補正について

マイコン初心者です。
SH7144のA/Dコンバーターにジャイロセンサーを接続し、ジャイロの出力を積分して、角度を求めようとしました。下記のコードで、積分値は出せたのですが、ジャイロを一度傾けて元に戻しても初期値に戻らず、オフセットが残ってしまいます。積分前の出力を見ると、CW側にジャイロを回すと、CW側に値が振れた後にCCW側へ少し値が振れているようなので、角速度のデータから来る誤差じゃないかと自分では仮説を立ててみたものの、その補正のところでつまづいてしまいました。
質問はCだけの問題ではないかもしれませんが、組み込みでジャイロセンサーを扱った経験のある方がいましたら、ご教授をお願いいたします。
ジャイロセンサーは村田製作所製圧電振動ジャイロ、ジャイロスターを使用し、カタログに載っているハイパスフィルタとローパスフィルタを通して、SH7144のA/Dコンバーターへ接続しています。
・ジャイロスターのカタログ
ttp://www.murata.co.jp/catalog/s42.pdf
角速度はコンペアマッチタイマを使用し、ノイズ対策のためにCMT0で角速度の平均値を計算しています。CMT0は0.8msecごとにで割り込みが発生するように設定し、main()ではタイマのカウンタを開始するコードのみを書いています。下記にCMT0割り込みのコードを示します。
void int_cmi0(void)
{
unsigned static int t_ave = 0;
static short int adc0_buffer[3] = {0, 0, 0};
unsigned short int i;

unsigned static short int count0 = 1;

adc0_buffer[0] = adc0_buffer[0] + AD0.ADDR0.BYTE;
adc0_buffer[1] = adc0_buffer[1] + AD0.ADDR1.BYTE;
adc0_buffer[2] = adc0_buffer[2] + AD0.ADDR2.BYTE;

t_ave++;
if( t_ave > 100) //AD0のADDR0~2の100回平均を求めています
{

for(i = 0; i < 3; i ++)
{
data_adc0[i] = (adc0_buffer[i] / t_ave) - 109; //"109"は静止時の出力電圧を示しています

if(-3 <= data_adc0[i] && data_adc0[i] <= 3) //平均しても振れてしまう値の分をカットしています
{
data_adc0[i] = 0;
}

adc0_buffer[i] = 0;

if(count0 > 89) //電源投入時にdata_adc0[]の値が安定しないため、最初の10個のデータを捨てています。
{
count0 = 100;
}
else
{
count0++;
data_adc0[i] = 0;
}
}
t_ave = 0;
}
CMT0.CMCSR.BIT.CMF = 0;//コンペアマッチフラグをクリア

}
角度は、CMT1を使用し、8msecの間隔で割り込みを発生させ計算しています。最終的な計算結果は、SH7144のSCIを使用して、PCのハイパーターミナルに表示しています。
void int_cmi1(void)
{
static short int adc0_buffer_s[3] = {0, 0, 0}; //角速度の初期値を入れるバッファです
 unsigned static short int count1 = 1;
 short int i;

for(i = 0; i < 3; i ++)
{
data_adc0i[i] =data_adc0i[i] + ((adc0_buffer_s[i] + data_adc0[i]) / 2); //積分を行う部分です。最終的に制御用のゲインにしようと考えているので、時間項8msecは明記していないです。
adc0_buffer_s[i] = data_adc0[i];

if(count1 > 89) //角速度と同様最初の10個のデータは0にしています
{
count1 = 100;
}
else
{
count1++;
data_adc0i[i] = 0;
}
}
CMT1.CMCSR.BIT.CMF = 0;//コンペアマッチフラグをクリア

}
main()では、各機能のイニシャライズと各CMTのカウンタ動作を開始するコードのみを書いています。ハイパーターミナルで動作が見れているので、各機能は動作していると思います。
void main(void)
{
initIO(); //各機能のイニシャライズです。
initINT();
initSCI();
initADC();
initCMT();
CMT.CMSTR.BIT.STR0 = 1;//CMT0カウント開始
CMT.CMSTR.BIT.STR1 = 1;//CMT1カウント開始
while(1);
}

マイコン初心者です。
SH7144のA/Dコンバーターにジャイロセンサーを接続し、ジャイロの出力を積分して、角度を求めようとしました。下記のコードで、積分値は出せたのですが、ジャイロを一度傾けて元に戻しても初期値に戻らず、オフセットが残ってしまいます。積分前の出力を見ると、CW側にジャイロを回すと、CW側に値が振れた後にCCW側へ少し値が振れているようなので、角速度のデータから来る誤差じゃないかと自分では仮説を立ててみたものの、その補正のところでつまづいてしまいました。
質問はCだけの問題...続きを読む

Aベストアンサー

ANo.1~3=Interestです。
ちょっと考えてみたのですが、手順を踏んで問題を切り分けて考えたほうがいいかなぁと。

(1) サーボモータを動かさない状態でジャイロの出力から正しく姿勢が求まることを確認する。
(2) 回路的にノイズを抑制できないのであれば、(1)にノイズ除去/平滑化の仕組みを盛り込む。

> ノイズの周波数の件ですが、手元にスペアナがない+本格的な周波数解析も初めてなので、
> これもまた自信がないのですが、サンプリング周波数1.25kHz(0.8msec)でSH2のA/Dを使って
> サンプリングしてscilabで、離散フーリエをかけてみました。

がんばりましたね~。うちのデジタルオシロにはFFTが付いているのでそんなものすぐに測れるだろうと思っていましたが、無ければ無いなりに工夫しましたね。驚きました。scilabというのも初めて知りました。

さて、±15mVのノイズですが、ムラタのジャイロスターの感度が0.67mV/deg/sec ということからすると、5deg/secぐらい狂ってしまう大きなノイズなのですね。ふと私の手持ちのジャイロの感度がどれくらいか調べてみたところ、
 IDG-300の場合、   2.0 mV/deg/sec
 HS-EG3(司21)の場合、25.0 mV/deg/sec
と、ジャイロスターと比較するとノイズに対してかなり寛容だということがわかりました。(反面、ダイナミックレンジが狭いのですが。)結構違うんですね。

参考
http://strawberry-linux.com/catalog/items?code=18026
http://www.mecharoboshop.com/Products/STLJapan/tukasa21

ANo.1~3=Interestです。
ちょっと考えてみたのですが、手順を踏んで問題を切り分けて考えたほうがいいかなぁと。

(1) サーボモータを動かさない状態でジャイロの出力から正しく姿勢が求まることを確認する。
(2) 回路的にノイズを抑制できないのであれば、(1)にノイズ除去/平滑化の仕組みを盛り込む。

> ノイズの周波数の件ですが、手元にスペアナがない+本格的な周波数解析も初めてなので、
> これもまた自信がないのですが、サンプリング周波数1.25kHz(0.8msec)でSH2のA/Dを使って
> サンプリングし...続きを読む

QP制御、PI制御、PID制御それぞれメリット、デメリットを教えてくれま

P制御、PI制御、PID制御それぞれメリット、デメリットを教えてくれませんか?
レポート課題で困っています。調べてみたが良くわかりませんでした。

Aベストアンサー

制御の基本は、P(比例)動作ですが、P動作だけでは通常オフセット(目標値との残留偏差)が生じます。このため、P動作のオフセットを無くすため、I(積分)動作を加え、設定値との偏差をなくすようにします。また、D動作を加えることにより、偏差を単時間に修正することができますが、積分時間を短く設定しすぎると、ハンチングが起きやすく、安定した制御が得られなくなります。D(微分)動作は、偏差の少ないうちに大きな修正動作を加え、制御結果が大きく変動するのを防ぐことができるます。ただし、微分時間を長く設定しすぎると、小さな変化に対しても、大きな出力が出てしまう為、ハンチングが生じ、制御性が安定しなくなります。

詳しくは、以下のURLを参照のこと。

参考URL:http://www.compoclub.com/products/knowledge/jidou_seigyo/jidou_seigyo4.html

Qエクセルで式からグラフを作成するには?

エクセルで折れ線グラフを作成したいのですが、
データ表からではなく式から作る方法ってあるんでしょうか?
y=ax+bとY=a/xの場合なんですが・・・。

Aベストアンサー

 近似曲線なら、データ系列を右クリックして、「近似曲線の追加」でできます。

 データではなく、数式からグラフを作成するには、このようなソフトを使うと便利です。
 印刷もできますし、数式を頼りにするのなら、このようなソフトのほうが仕上がりがいいです。

参考URL:http://t16web.lanl.gov/Kawano/gnuplot/

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qポテンショメータとは?

題名のとおりポテンショメータとは何かを教えてください。
インターネットで調べてはいるのですが、可変抵抗器といわれてもいまいちイメージがつかず困っております。
あまり回路やコンピュータに詳しくないもので、ポテンショメータが何ものであるのかよくわかりません。
私のような知識のないものでもわかるように、どなたかご教授お願いいただけませんか??

Aベストアンサー

詳しく解説しています。
要は可変抵抗器で、可変度合いを電圧で検出し、可変位置を知る機械です。
例えば遠隔で操作し、アンテナの方向を変えた場合に、アンテナがどちらの方向を向いているか、ポテンシャルメーターがあれば読めます。

http://www.cqpub.co.jp/toragi/TRBN/contents/2005/tr0511/0511denshi8.pdf#search='%E3%83%9D%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%A8%E3%81%AF'


人気Q&Aランキング