無線ブログ集
メイン | 簡易ヘッドライン |
MODEL 1200FXローテーターその28 (2022/11/6 11:13:14)
今までのローテーターの停止の方法を再度考え直してみました。なぜかと言うと、収束する方法で静止させる方法はローテーターに対しては回転機構のギヤの破壊行為となる危険性があるということが気になっていたからです。基本に忠実にローテーターの現在のコントロール方法で静止するまでのステップを全部まとめると、収束動作無しで止まる様な問題とならないケースもなかにはありますが、設定ポイントの角度を超えてしまったケースでは反対方向へと必ず収束動作をしてしまいます。コレは設計仕様です。改善するとしたら、きちんと停止させてからの反対方向への回転をさせるのがギヤを破壊しない良い方法であると分っています。ただし、スケッチ的には出来ますが、静止するまではまた、戻り角度オーバーしたりとかの動作も予想されるので、静止まで時間がかかる事が当然想定されます。停止をいれた方法では、少し検討と確認が必要となりそうです。現在の収束仕様ではCW方向も、CCW方向もポートに繫いだスィッチングトランジスタでON/OFF制御のDC電圧で動作回転させています。回転している時は、同じ電圧ですので静止直前も回転しているときも同じ回転スピードです。目的の角度の±7°ぐらい手前で回転信号の長さを変えて0°になるまでの差分でだんだんと短い電圧を掛けて制御するようにしていましたがやはり同じ電圧なので多少の長さ調整では、モーターがフル回転なのでオーバーランしてしまう事が多い様です。
例の如くハードウェアは既に基板化して出来ていますので、やるとするならばソフトウェアでの対応になります。ということで、ソフトウエアでスケッチを考える必要が出来てきました。言葉でやりたい事をまとめるとすると、目的の設定角度を超えないで止める別の方法を考えれば良いと言うことです。とても簡単明瞭です。文字にした形も無い方法は紛れも無くやりたい事そのものですが何をどうするという具体的な事がまだありません。コレを実現したいので、先ずは使っているESP32DevKitCの機能で対応使用出来るフィチャーがないかを調べてみました。ネットでも調べている内にLEDの明るさを制御する方法の解説がありました。いわゆるPWMでパワーコントロールする方法です。モーターへかける電圧をONしている時間とOFFしている時間のDuty比(比率)を変えて回転を早くしたり、遅くしたりが出来る方法として応用出来そうです。コレを使って見ることにしました。うってつけの方法になりそうです。早速自作の試験ボードとブレッドボードで現在のローテーター回転制御している同じポートで配線して確認です。その前にESP32DevKitCのどのポートがPWM制御出来るかを仕様から確認しました。いま使っている回転制御のポート04と22はPWM可能でした。因みに、全部ではありませんが、殆どのポートはPWM制御出来るようです。(自分が使いたい、または、使っているポートのPWM対応は必ず確認は必要です。)
■試験中の04 と22のポートにLEDを繫いで光り具合を確認しました。
■テスト様にスケッチした簡単なDUTY比での明るさ確認用スケッチです。
//PMW TEST for IMPULUVING NO CONVERGENCE BEHAVIOR OF CCW & CW ROTATION
// 1200FX EMOTATOR UDP CONTROL
//
const int ccwPin = 22;
const int cwPin = 04;
void setup() {
// put your setup code here, to run once:
// (ch,freq ,bit)
ledcSetup(0,12800,8);// 0channel setting
ledcSetup(1,12800,8);// 1channel setting
// (PortNo,ch)
ledcAttachPin(ccwPin,0);// 22 attach 0channel
ledcAttachPin(cwPin,1); // 4 attach 1channel
}
void loop() {
// put your main code here, to run repeatedly:
//ledcWrite(0,64);// ON 64:256 -> 1:4
// (ch,Dutyratio)
ledcWrite(0,128); // ON 128:256 -> 1:2
delay(100);
ledcWrite(0,0); // OFF
ledcWrite(1,128); // always ON 1:2
delay(100);
}
// 1200FX EMOTATOR UDP CONTROL
//
const int ccwPin = 22;
const int cwPin = 04;
void setup() {
// put your setup code here, to run once:
// (ch,freq ,bit)
ledcSetup(0,12800,8);// 0channel setting
ledcSetup(1,12800,8);// 1channel setting
// (PortNo,ch)
ledcAttachPin(ccwPin,0);// 22 attach 0channel
ledcAttachPin(cwPin,1); // 4 attach 1channel
}
void loop() {
// put your main code here, to run repeatedly:
//ledcWrite(0,64);// ON 64:256 -> 1:4
// (ch,Dutyratio)
ledcWrite(0,128); // ON 128:256 -> 1:2
delay(100);
ledcWrite(0,0); // OFF
ledcWrite(1,128); // always ON 1:2
delay(100);
}
上記の簡単なスケッチでDUTYの確認です。
詳細な設定はしらべてもらうとして、まとめると下記になります。
1.使うポートを定義します。
2.void setup()ルーチンにチャンネルと周波数と制御するbitを設定します。
3.同じルーチン内に使用するポートとチャンネルをアタッチします。
4.void
loop()ルーチンにはledcWrite(チャンネル,*)で*に0から256最大のうちから設定
*が0だと出力OFF、256だとフル出力、128だと50%DUTY比で出力
(設定最大は256なので128では50%のDUTY比率の出力です。)
■テスト中の波形50%DUTY
上の矩形波形は常時出力している様に見えますが、出力矩形波はON/OFFしています。
下の矩形波は連続出力です。
このスケッチを応用して組み入れてます。
考えている動作は以下になります。
他の位置から目的の設定角度へスタート開始時は次のコマンドでDC電圧でフルにローテーターモーター回転動作します。
ledcWrite(0,256);
CW方向、及びCCW方向回転時どちらも、現状の角度と目的設定角度の差分角度が±10°手前になったらスピードが遅くなるようにDC電圧をフルから比率12:256のDUTY比でパワーを下げるようにパワーコントロール開始します。スピードが遅くなったことでオーバーラーンはしないで停止する様にこのコマンドスケッチを入れました。
ledcWrite(0,12);
幾つかのDUTY比(128、64、32、16)のコマンドスケッチを入れたサブルーチンを作りパワーを減少する方向で試しましたが、あまりローテーターの回転スピードの下降変化は感じられませんでした。上記のコマンドスケッチ12の比率だと遅くなったと十分感じられましたので、上記のledcWrite(0,12)にしています。停止確認も期待通りでした。オーバーランはせずに停止してくれました。
上記のコマンドを入れた実際のサブルーチンは下記になります。
//************************************************
//■CW方向フル回転時
void RotCWHS(){ // port04 ch1, HS : High - Speed
CW
//PWM out
ledcWrite(1,256);// CW ON
ledcWrite(0,0); // CCW OFF
}
//PWM out
ledcWrite(1,256);// CW ON
ledcWrite(0,0); // CCW OFF
}
//■CW方向スロー回転時
void RotCWSS(){ // port04 ch1 SS : Slow - Speed CW
//PWM out
void RotCWSS(){ // port04 ch1 SS : Slow - Speed CW
//PWM out
ledcWrite(1,12);// CW ON
ledcWrite(0,0); // CCW OFF
}
ledcWrite(0,0); // CCW OFF
}
//*************************************************
//■CCW方向フル回転時
void RotCCWHS(){ // port22 ch0 HS : High - Speed
CCW
//PWM out
ledcWrite(0,256);// CCW ON
ledcWrite(1,0); // CW OFF
}
//PWM out
ledcWrite(0,256);// CCW ON
ledcWrite(1,0); // CW OFF
}
//■CCW方向スロー回転時
void RotCCWSS(){ // port22 ch0 SS : Slow - Speed CCW
//PWM out
ledcWrite(0,12);// CCW ON
ledcWrite(1,0); // CW OFF
}
//PWM out
ledcWrite(0,12);// CCW ON
ledcWrite(1,0); // CW OFF
}
//*************************************************
上記のサブルーチンを角度差分のSelect case
で±10前から±1°までにスピードスローとなるサブルーチンを入れます。勢い良く回転してきたHS回転を10°手前にてSS回転でスローにするとゆっくりブレーキがかかった様に丁度いいタイミングで勢いが弱まってcase0:のルーチンの停止コマンドスケッチ下記で停止します。
Select case の0°では停止のルーチン下記ルーチンの RotSTOP();
を入れます。
//■停止ルーチン
void RotSTOP(){
//PWM out
ledcWrite(1,0); // OFF port 04
ledcWrite(0,0); // OFF port 22
delta=0;
delta2=0;
}
//PWM out
ledcWrite(1,0); // OFF port 04
ledcWrite(0,0); // OFF port 22
delta=0;
delta2=0;
}
上記の電圧PWM制御方式を採用しDUTY比率を下げる事によりローテータ制御SWのON時間の平均が下がります。ON/OFF制御の平均値ON時間コントロールにて結果、モータースピードが遅くなります。遅くなった回転ではオーバーラーンセずに停止する事が出来るようになります。
電圧のPWMのDUTY比率を変える(下げる)事で解決です。モーター回転数はCWスイッチ、CCWスイッチをPWM制御にて制御する事で、間違いなく下げる事ができました。止まる時は目的の設定角度に近づいて、ゆっくりスーッと止まる感じになりました。とにかくハードウェアの変更対応をしなくて済み、ソフトウエアのみの対策で上手く行きましたので、ひとまずギヤを壊す制御ではなくなり安心する事が出来ました。結果としては、まずまず、大成功と言えると思います。Hi
!
厳密に言うと停止してても現状の停止した角度と目的設定角度と差分値がある場合では、極小の電圧パルスがでています。回転出来ない様な微小パワーレベルなので0に等しいと言えます。オシロスコープでは確認出来ます。LEDも少しチカッと光っているかな程度です。この程度のパルス電圧だけではローテーターは回転しないので良しとしています。
UDP通信のデバッグは継続しています。
つづく?
execution time : 0.020 sec