ミニッツレーサのリトラクタブルをサーボで制御しようとしていて、思わぬところで
つまづいていました。
サーボが思ったような動きをしてくれない。
原因は簡単な事です。プログラムが悪い。
それに尽きるのですが、それではどこが悪いか、となると、いろいろと手を尽くして
調べなければなりませんので、ひとりで作ると難航する場合がしょっちゅうです。
そして今回は、いわゆる6gサーボが不調になって、右には回るけれど左に戻ってこないという
たぶんモータ内のブラシが磨耗したのだろうという憶測の元、手持ちにあった4gサーボに
交換しました。
自作のサーボチェッカーで調べておけばよかったのですが、たぶん修理したし動くだろうという事で
繋ぎ代えると、あれ?やっぱり左に戻りません。
プログラムで減算処理がまずかったか、やはり基本は加算処理かと風呂の中でもトイレの中でも
ぶつぶつ呟きながらあれこれ考えていましたが、温まった体は脳への血液量も増えるのか
ひょっとして、と思いました。
4gサーボはコネクタを大きい物に交換しているので、前述のサーボチェッカーに挿すと。。。
このサーボの故障でした;;;;;;;;;;;;;;;;;;;;;;;;;
ダイアルで右左、そしてその時のパルス幅を液晶で表示するようにしていますが、あきらかに
サーボの動きがおかしく、1秒ほどすると、ゆっくり左に戻るという、どういった仕様なのか?と
思うほどの謎の動きをしていました。
ということで、勢いついでに、2gサーボの配線を切り、故障した4gサーボの大きなコネクタを
ケーブルで移植したところ・・・・やっと予定に近い動作をしてくれる事が分かりました。
でも、まだ動きが早すぎて、ゆっくり閉じるリトラクタブルが表現できません。
ウェイトを加えるか、いや待てよ、2度計算させているところを無駄に4回に増やしてと、
それこそ怪しげな事を考えています。
さてさて、ゆっくり動くサーボは出来るのでしょうかねぇ。(をいをい
waitを入れるのも今の言語だとスレッド実行前提なのでよく用意されていますがアセンブラやCのリアルタイム処理だと時間指定もできないので少々面倒ですね。
使えるようならカウンタでの割り込みを使ったりするのがスマートかと思いますが、ほかに処理がないのでまったく必要なく面倒なだけでもありますね、あえて言うなら開く途中で閉めたり(又はその逆)ができそうです。
最初、10F322のDIPタイプで開発予定だったのですが
肝心の対応しているPICライター Pickit3が不調で中を開けると、
それはそれは恐ろしいほどのイモハンダで放置していましたので、すぐには使えないため、PICを代えることにしました。
次にCCPが使えるので、この矩形波はサーボのパルスに最適だろうということで
12F683を使って今ひとつ使いなれていないC言語で制御しようとしていたのですが
慣れていないのがあだで、予定どおりの動作にならない始末でした。
それでも何とか動作するようになりましたが、サーボをゆっくり動作させる妙案が
思いつかず、またいくつか試してみたもののまだ早すぎる動きのため、頭を
抱えてしまいました。
そこでふと思いました。使い慣れた物で作ってから、後から目的のPICで
作り直せばいいじゃないかということで、12F675を出してきました。
以前、リトラクタブルを作った時も変な現象で悩まされたのを思い出しました。
ラジコンに使う普通のサーボですと、PICからのパルスを止めると、サーボは
停止したまま(若干動く場合もありますが)ですが、この手の小型の物は
一定時間後に暴れだします。
逆にずっと同じパルスを出し続けていれば止まっていたのを思い出したので
割り込みなんぞ使わず表の処理だけで一定パルスだけ出すと、なるほど
停止しているので、それから加算処理させると、1度ずつ動作するようになりました。
もう少し遅くということで4回ずつ同じパルスを出してから次の処理にすると
おおよそ2秒ちょっとで右から左に動くようになりました。
しかし。。。動けばOKですが、こんなマヌケな処理方法でよいのかどうか、
疑問といえば疑問ですが。
もうひとつ忘れていました。LEDの制御を(笑
合間にポートをON/OFFさせればいいかっていう調子になってしまいました。
とりあえず予定と違いますが動くようになったので、頭を冷やしてから
他のPICで動くように考えてみます。