前々回からArduinoを使い始めてArduinoのすばらしさを実感しております。

Arduinoでステッピングモーターを回す

Arduinoでシリアル通信

 

いままでPICマイコンで苦労していたハンダ付けや、自ら勉強してプログラムしなければならなかった制御などをArduinoならあっという間にやってくれます。

これなら挫折している電動オクルーダーの自作もサクッと作れそうです。

 

ですので、今回は2つの可変抵抗からPID制御を行いステッピングモーターを制御しようと思います。

ちなみにですがPICマイコンでPID制御を行う為に結構苦労しました。

 

 

PICマイコンならシリアル通信をしようと思うとコンフィグレーションなどたくさん設定しないといけませんし、PCとのレベルシフトなどやる事だらけです、Aruduinoなら2~3行プログラムをかくだけで実現しちゃいます。

もっと早くArduinoにすればよかった・・・

こちらがArduinoでシリアル通信を試した記事です。

 

まずは前回までのおさらい

何をしたいのかというと・・・

過去の記事をご参照あれ

 電動オクルーダーをつくりたい その1

 電動オクルーダーの制作 その2

 電動オクルーダーの制作 その3

 電動オクルーダーの制作 その4

 

今回のやる事

 今回やる事はステッピングモーターを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で遊んでみたくなったので、それは後日とします。

スポンサードリンク