らずらいと姫の挑戦日記(第57回)~モータを動かそう③~
2019-05-29
55回と56回の2回にわたりモータを動かすことを行ってきました。
おさらいにはなりますがモータを動かすまで
1.ボリュームの変化を読み取る
2.ボリュームの値をモータの角度に使用する
3.2.で使用したプログラムに複数の仕事をさせるとおかしくなる…
の3回の流れになります。今回は複数の仕事をさせるとおかしくなることを見てみたいと思います。
プログラムに複数の仕事をさせるとおかしくなることを確認する
初めになぜ複数の仕事をさせてみようと思ったのかというと、前回のプログラムには弱点があり、もう一仕事させると動かしていないときに勝手に動くということが起こります。その時の動画がありますのでこちらをご覧ください。
無線処理を行うと誤動作する原因
モータの処理を行いながら、無線の受信処理を行うと、このようにサーボモータへの信号の時間がずれてしまう可能性があります。パソコンなどでも良くありますが、裏で何か仕事があると操作の時の反応が悪くなってしまうというのは皆さんも経験があるはずです。今回はこれと同じようなことが起こっています。サーボモータのように確実に正確なパルス幅を出してあげる必要があるサーボモータの処理をソフトウエアだけで行ってしまったのが原因です。
今回使用したプログラムは以下になります。
[code language=”c”]
void setup() {
// put your setup code here, to run once:
pinMode(8,OUTPUT);
digitalWrite(8,LOW);
SubGHz.init();//モジュールの初期化
SubGHz.begin(36,0xabcd,100,20);//モジュールの初期設定
SubGHz.rxEnable(NULL);//データ受信を可能にする
}
void loop() {
int volt;
int servo;
volt = analogRead(A0);
servo = map(volt,0,1023,900,2400);
digitalWrite(8,HIGH);
delayMicroseconds(servo);
digitalWrite(8,LOW);
delayMicroseconds(40000);
// put your main code here, to run repeatedly:
}
[/code]
このプログラムを実行すると無線の処理と角度を調整するパルス波を作る動作が重なったとき、無線処理が優先されて、うまく角度調整を行えない時間がたびたび発生し、動画の最初のような動きを行ってしまうようです。
無線の処理に邪魔をされて希望通りに毎回ちゃんとパルス波形をつくってあげられないことが安定して動かない原因ですね。(-“-)
無線処理を行っていても誤動作させない対策
では誤動作を起こさないようにするにはどうすればよいでしょうか?
今回のサーボモータの場合、パルス幅をしっかりと出して上げれば良いのです。この解決策として、今回はハードウエアによるモータ制御ができる専用のライブラリを使用します。
ハードウエアはあらかじめ決められた動作しかすることができないのですが、設定したとおり確実にお仕事をしてくれます。サーボモータの制御はハードウエアを利用したほうが安定して駆動できるというわけです。
ソフトウエアは周りの状況を見ながら動くことができる「人間」、ハードウエアは決まった仕事なら正確で早くこなす「ロボット」と言ったところでしょう。
ここで書いたプログラムは以下になります。
[code language=”c”]
#include "sarvo_control2_ide.h" // Additional Header
void setup() {
// put your setup code here, to run once:
hsv.init(1,10000);//内臓のタイマーの指定と周波数の設定
hsv.attach(0,8);//使用するタイマーに8端子を入力
hsv.start();//制御を開始
SubGHz.init();
SubGHz.begin(36,0xabcd,100,20);
SubGHz.rxEnable(NULL);
}
void loop() {
// put your main code here, to run repeatedly:
int volt;
volt=analogRead(A0);
hsv.write(0,map(volt,0,1023,900,2400));
//タイマーで900μsから2400μsまでの間の時間の電圧を出力
hsv.update();//時間を反映させるための関数
delayMicroseconds(40000);
}
[/code]
このプログラムを読み込んで動かすと最初の動画の後半のように誤動作しなくなります。
お疲れ様でした。なんだか思い通りにサーボモータを扱えそうな気がしてきましたね!最後までお付き合い頂きありがとうございました(^^)