前々回からArduinoを使い始めてArduinoのすばらしさを実感しております。
いままでPICマイコンで苦労していたハンダ付けや、自ら勉強してプログラムしなければならなかった制御などをArduinoならあっという間にやってくれます。
これなら挫折している電動オクルーダーの自作もサクッと作れそうです。
ですので、今回は2つの可変抵抗からPID制御を行いステッピングモーターを制御しようと思います。
ちなみにですがPICマイコンでPID制御を行う為に結構苦労しました。
PICマイコンならシリアル通信をしようと思うとコンフィグレーションなどたくさん設定しないといけませんし、PCとのレベルシフトなどやる事だらけです、Aruduinoなら2~3行プログラムをかくだけで実現しちゃいます。
もっと早くArduinoにすればよかった・・・
こちらがArduinoでシリアル通信を試した記事です。
まずは前回までのおさらい
何をしたいのかというと・・・
過去の記事をご参照あれ
今回のやる事
今回やる事はステッピングモーターをPID制御によって動かす事です。
どうやって動かすかというと、可変抵抗をA\D変換した0‐255の値を目標値にします。
そんでステッピングモータで自作したリニアアクチュエーターの位置をスライド可変抵抗による現在値を確認し、
目標値と現在値偏差からPID制御を行い位置制御を行うという壮大なものです。
文章にするといまいちですが、そこは私。
ちゃんと絵をかきました。↓こういうことです。
PID制御を行うハード
とりあえず、完全自作したリニアアクチュエーターにリニアタイプの可変抵抗をとりつけました。
取り付け方は普通にホットボンドを使用!!
動きはこんな感じ↓
AruduinoでPID制御を行う
本題のPID制御ですが、これも結構簡単です。
とりあえずステッピングモーターを使ったPID制御をスケッチ書くとこんな感じ↓
#include <Stepper.h>
#define STEPS 400 //使用するモータのステップ数
// ピン番号を指定して、stepperクラスのインスタンスを生成
Stepper stepper(STEPS, 11, 9, 10, 8);bool LED;
double target,Kp=1.0,Ki=0.7,Kd=0.3;
double vol,MVn=0,MVn1=0,en=0,en1=0,en2=0;
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600); // initialize Serial communication
while (!Serial) {
digitalWrite(13, LED);
delay(200);
LED = 1 – LED;
}digitalWrite(13, LED);
stepper.setSpeed(90); // スピードを90RPMに
}void loop() {
for (int i = 0; i < 10; i++) {
vol += analogRead(0);
}
vol = vol / 10;for (int ii = 0;ii<10;ii++) {
target += analogRead(1);
}
target = target /10;
PID();
stepper.step(MVn);//シリアル通信
serialMonitor();
}inline void PID(){
en2=en1; //前々回の偏差
en1=en; //前回の偏差
en = (target – vol); //今回の偏差
MVn1 = MVn; //前回操作量
MVn=MVn1+Kp*(en-en1)+Ki*en+Kd*((en-en1)-(en1-en2));//PID制御量計算
MVn=constrain(MVn,-100,100);
if(-2<MVn and MVn<2){
MVn=0;
}
}
inline void serialMonitor(){
Serial.print(“MVn=”);
Serial.println(MVn);
//delay(1000);
}
結構複雑そうにみえますが、じつはanalogreadで目標値を決める可変抵抗の値をA/D変換、リニア可変抵抗の現在値をA/D変換します。
その後↓のように偏差からPIDそれぞれの操作量を決定する計算をします。
一応スケッチの最初のほうでPIDそれぞれの定数を決めています。
今回は動きを見ながらKp=1.0,Ki=0.7,Kd=0.3のように決定しました。
本来ならエクセルとかでモーターの速度とか移動距離からこの値を決める事ができます。
inline void PID(){
en2=en1; //前々回の偏差
en1=en; //前回の偏差
en = (target – vol); //今回の偏差
MVn1 = MVn; //前回操作量
MVn=MVn1+Kp*(en-en1)+Ki*en+Kd*((en-en1)-(en1-en2));//PID制御量計算
MVn=constrain(MVn,-100,100);
if(-2<MVn and MVn<2){
MVn=0;
}
}
こんな簡単にPID制御によるステッピングモーター制御ができてしまいました。
一応動画でご確認を↓
これで当初の目的は達成です。
一応なにかケースにarduinoやボリュームを綺麗に配置して電動オクルーダーとして機能させようとおもいましたが、もう少しarduinoで遊んでみたくなったので、それは後日とします。